diff --git a/.gitignore b/.gitignore index ffe8399..7fb25a4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1 @@ -/gowiki -tmp -run.sh -TODO.txt +gowiki diff --git a/COPYRIGHT b/COPYRIGHT index ef3977c..814e69e 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -1,4 +1,4 @@ -Copyright (C) 2021 Marius Schellenberger +Copyright (C) 2016 Marius Schellenberger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json new file mode 100644 index 0000000..ab38ad3 --- /dev/null +++ b/Godeps/Godeps.json @@ -0,0 +1,232 @@ +{ + "ImportPath": "git.giftfish.de/ston1th/gowiki", + "GoVersion": "go1.7", + "GodepVersion": "v74", + "Deps": [ + { + "ImportPath": "git.giftfish.de/ston1th/godrop", + "Comment": "v1.0", + "Rev": "8666e4461c9612e1432f05af6e0abfd716adca36" + }, + { + "ImportPath": "github.com/blevesearch/bleve", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/analysis", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/analysis/analyzers/standard_analyzer", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/analysis/char_filters/html_char_filter", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/analysis/char_filters/regexp_char_filter", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/analysis/datetime_parsers/datetime_optional", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/analysis/datetime_parsers/flexible_go", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/analysis/language/en", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/analysis/token_filters/lower_case_filter", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/analysis/token_filters/porter", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/analysis/token_filters/stop_tokens_filter", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/analysis/tokenizers/unicode", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/document", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/index", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/index/store", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/index/store/boltdb", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/index/store/gtreap", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/index/upside_down", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/numeric_util", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/registry", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/search", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/search/collectors", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/search/facets", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/search/highlight", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/search/highlight/fragment_formatters/html", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/search/highlight/fragmenters/simple", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/search/highlight/highlighters/html", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/search/highlight/highlighters/simple", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/search/scorers", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/bleve/search/searchers", + "Comment": "v0.5.0", + "Rev": "97393d027342f43b17da2f02c090a4e728ac929f" + }, + { + "ImportPath": "github.com/blevesearch/go-porterstemmer", + "Comment": "v1.0.1-9-g23a2c8e", + "Rev": "23a2c8e5cf1f380f27722c6d2ae8896431dc7d0e" + }, + { + "ImportPath": "github.com/blevesearch/segment", + "Rev": "762005e7a34fd909a84586299f1dd457371d36ee" + }, + { + "ImportPath": "github.com/boltdb/bolt", + "Comment": "v1.3.0", + "Rev": "583e8937c61f1af6513608ccc75c97b6abdf4ff9" + }, + { + "ImportPath": "github.com/golang/protobuf/proto", + "Rev": "7cc19b78d562895b13596ddce7aafb59dd789318" + }, + { + "ImportPath": "github.com/gorilla/context", + "Comment": "v1.1", + "Rev": "1ea25387ff6f684839d82767c1733ff4d4d15d0a" + }, + { + "ImportPath": "github.com/gorilla/mux", + "Comment": "v1.1", + "Rev": "0eeaf8392f5b04950925b8a69fe70f110fa7cbfc" + }, + { + "ImportPath": "github.com/gorilla/securecookie", + "Comment": "v1.1", + "Rev": "667fe4e3466a040b780561fe9b51a83a3753eefc" + }, + { + "ImportPath": "github.com/gorilla/sessions", + "Rev": "f7261893ca3ea922c30eabe742c036d2c1de6e0a" + }, + { + "ImportPath": "github.com/russross/blackfriday", + "Comment": "v1.4-31-g2004188", + "Rev": "2004188462c3946efefbdcd91aa83e49b4175bfb" + }, + { + "ImportPath": "github.com/shurcooL/sanitized_anchor_name", + "Rev": "10ef21a441db47d8b13ebcc5fd2310f636973c77" + }, + { + "ImportPath": "github.com/steveyen/gtreap", + "Rev": "0abe01ef9be25c4aedc174758ec2d917314d6d70" + }, + { + "ImportPath": "golang.org/x/crypto/bcrypt", + "Rev": "9477e0b78b9ac3d0b03822fd95422e2fe07627cd" + }, + { + "ImportPath": "golang.org/x/crypto/blowfish", + "Rev": "9477e0b78b9ac3d0b03822fd95422e2fe07627cd" + }, + { + "ImportPath": "golang.org/x/crypto/sha3", + "Rev": "9477e0b78b9ac3d0b03822fd95422e2fe07627cd" + }, + { + "ImportPath": "golang.org/x/net/context", + "Rev": "55cccaa02af1a99c69ba3213e33468628b61be4b" + }, + { + "ImportPath": "golang.org/x/sys/unix", + "Rev": "a646d33e2ee3172a661fc09bca23bb4889a41bc8" + } + ] +} diff --git a/Godeps/Readme b/Godeps/Readme new file mode 100644 index 0000000..4cdaa53 --- /dev/null +++ b/Godeps/Readme @@ -0,0 +1,5 @@ +This directory tree is generated automatically by godep. + +Please do not edit. + +See https://github.com/tools/godep for more information. diff --git a/Makefile b/Makefile index 7a30651..d21289b 100644 --- a/Makefile +++ b/Makefile @@ -1,59 +1,32 @@ CC=go -BUILD=build -v -trimpath -VERSION=$(shell cat VERSION) -GCFLAGS=-gcflags '-e' -LDFLAGS=-ldflags '-buildid=$(VERSION) -X main.version=$(VERSION) -s -w' +BUILD=build -v +LDFLAGS=--ldflags "-s -w" PROGRAM=gowiki -CMD=-o $(PROGRAM) cmd/gowiki/main.go -ENV=GOGC=0 CGO_ENABLED=0 GO111MODULE=on all: $(PROGRAM) setup: - $(CC) install github.com/client9/misspell/cmd/misspell@latest - $(CC) install honnef.co/go/tools/cmd/staticcheck@latest + $(CC) get github.com/tools/godep + $(CC) get github.com/client9/misspell -release: clean gofmt codeqa - $(ENV) $(CC) $(BUILD) $(GCFLAGS) $(LDFLAGS) $(CMD) - -release-vendor: clean gofmt codeqa - $(ENV) $(CC) $(BUILD) -mod=vendor $(GCFLAGS) $(LDFLAGS) $(CMD) - -vendor: clean gofmt - $(ENV) $(CC) $(BUILD) -mod=vendor $(GCFLAGS) $(LDFLAGS) $(CMD) - -$(PROGRAM): clean gofmt - $(ENV) $(CC) $(BUILD) $(GCFLAGS) $(LDFLAGS) $(CMD) +$(PROGRAM): clean codeqa + CGO_ENABLED=0 $(CC) $(BUILD) $(LDFLAGS) clean: $(CC) clean -x +codeqa: templates gofmt misspell golint + gofmt: - $(CC) fmt ./... + gofmt -w . -codeqa: govet misspell staticcheck test - -govet: - $(CC) vet ./... - -update: - $(ENV) $(CC) get -u ./... +golint: + $(GOPATH)/bin/golint . misspell: - $(GOPATH)/bin/misspell cmd/* pkg/* Makefile README.md sri.sh + $(GOPATH)/bin/misspell **/* -staticcheck: - $(GOPATH)/bin/staticcheck ./... +templates: + $(CC) generate -test: -ifeq ($(shell go env GOARCH), $(shell go env GOHOSTARCH)) -ifeq ($(shell go env GOOS), $(shell go env GOHOSTOS)) - $(CC) test ./... -else - $(info skipping tests of other platforms) -endif -else - $(info skipping tests of other platforms) -endif - -.PHONY: setup release release-vendor vendor build clean codeqa gofmt govet misspell staticcheck test +.PHONY: setup build clean templates gofmt misspell golint diff --git a/README.md b/README.md index 711da61..facd9d6 100644 --- a/README.md +++ b/README.md @@ -1,61 +1 @@ # GoWiki - a simple wiki engine written in Go - -## Building - -**Requirements:** - -* Go (golang) >= 1.16 - -Linux: - -``` -make - -or offline - -make vendor -``` - -OpenBSD: - -``` -GOOS=openbsd make - -or offline - -GOOS=openbsd make vendor -``` - -## Install - -See the `scripts/` directory on how to install gowiki on Linux or OpenBSD. - -## Config - -``` -{ - "data_dir": "/var/lib/gowiki", // running directory. data will be stored here - "user": "wiki", // drop privileges to user - "group": "wiki", // drop privileges to group - "listen_addr": "127.0.0.1:8080", // listening
:`
+ for _, f := range frags {
+ html += f
+ }
+ html += ""
+ break
+ }
+ }
+ html += "| Goroutines | -{{.Data.Goroutines}} | -
| Memory usage | -{{.Data.Alloc}} MiB | -
| Memory allocated | -{{.Data.Sys}} MiB | -
| Documents | -{{.Data.Docs}} | -
| Go Version | -{{.Data.GoVersion}} | -
You are about to delete user {{.Data.Username}}.
This will also remove all pages of this user.
| Username | -Flags | -Options | -
|---|---|---|
| {{$item.Username}} | -- {{if $item.Secret}}TOTP{{end}} - {{if eq $item.Locked 3}}Locked{{end}} - {{if $item.Admin}}Admin{{end}} - | -- - | -
| Username | +Admin | +Options | +|||
|---|---|---|---|---|---|
| {{$item.Username}} | + {{if $item.Admin}} +yes | + {{else}} +no | + {{end}} + {{if $admin}} +Edit + Delete | + {{else}} + {{if eq $item.Username $user}} +Edit | + {{else}} ++ {{end}} + {{end}} + |
{{.Msg}}
+You are about to delete the user {{.Data.Username}}
+| Username | +Admin | +Options | +|||
|---|---|---|---|---|---|
| {{$item.Username}} | + {{if $item.Admin}} +yes | + {{else}} +no | + {{end}} + {{if $admin}} +Edit + Delete | + {{else}} + {{if eq $item.Username $user}} +Edit | + {{else}} ++ {{end}} + {{end}} + |
Mastering Programming: From Testing to Performance in Go
- diff --git a/vendor/github.com/bits-and-blooms/bitset/SECURITY.md b/vendor/github.com/bits-and-blooms/bitset/SECURITY.md deleted file mode 100644 index f888420..0000000 --- a/vendor/github.com/bits-and-blooms/bitset/SECURITY.md +++ /dev/null @@ -1,5 +0,0 @@ -# Security Policy - -## Reporting a Vulnerability - -You can report privately a vulnerability by email at daniel@lemire.me (current maintainer). diff --git a/vendor/github.com/bits-and-blooms/bitset/azure-pipelines.yml b/vendor/github.com/bits-and-blooms/bitset/azure-pipelines.yml deleted file mode 100644 index f9b2959..0000000 --- a/vendor/github.com/bits-and-blooms/bitset/azure-pipelines.yml +++ /dev/null @@ -1,39 +0,0 @@ -# Go -# Build your Go project. -# Add steps that test, save build artifacts, deploy, and more: -# https://docs.microsoft.com/azure/devops/pipelines/languages/go - -trigger: -- master - -pool: - vmImage: 'Ubuntu-16.04' - -variables: - GOBIN: '$(GOPATH)/bin' # Go binaries path - GOROOT: '/usr/local/go1.11' # Go installation path - GOPATH: '$(system.defaultWorkingDirectory)/gopath' # Go workspace path - modulePath: '$(GOPATH)/src/github.com/$(build.repository.name)' # Path to the module's code - -steps: -- script: | - mkdir -p '$(GOBIN)' - mkdir -p '$(GOPATH)/pkg' - mkdir -p '$(modulePath)' - shopt -s extglob - shopt -s dotglob - mv !(gopath) '$(modulePath)' - echo '##vso[task.prependpath]$(GOBIN)' - echo '##vso[task.prependpath]$(GOROOT)/bin' - displayName: 'Set up the Go workspace' - -- script: | - go version - go get -v -t -d ./... - if [ -f Gopkg.toml ]; then - curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh - dep ensure - fi - go build -v . - workingDirectory: '$(modulePath)' - displayName: 'Get dependencies, then build' diff --git a/vendor/github.com/bits-and-blooms/bitset/bitset.go b/vendor/github.com/bits-and-blooms/bitset/bitset.go deleted file mode 100644 index c8d8ddb..0000000 --- a/vendor/github.com/bits-and-blooms/bitset/bitset.go +++ /dev/null @@ -1,1767 +0,0 @@ -/* -Package bitset implements bitsets, a mapping -between non-negative integers and boolean values. It should be more -efficient than map[uint] bool. - -It provides methods for setting, clearing, flipping, and testing -individual integers. - -But it also provides set intersection, union, difference, -complement, and symmetric operations, as well as tests to -check whether any, all, or no bits are set, and querying a -bitset's current length and number of positive bits. - -BitSets are expanded to the size of the largest set bit; the -memory allocation is approximately Max bits, where Max is -the largest set bit. BitSets are never shrunk. On creation, -a hint can be given for the number of bits that will be used. - -Many of the methods, including Set,Clear, and Flip, return -a BitSet pointer, which allows for chaining. - -Example use: - - import "bitset" - var b BitSet - b.Set(10).Set(11) - if b.Test(1000) { - b.Clear(1000) - } - if B.Intersection(bitset.New(100).Set(10)).Count() > 1 { - fmt.Println("Intersection works.") - } - -As an alternative to BitSets, one should check out the 'big' package, -which provides a (less set-theoretical) view of bitsets. -*/ -package bitset - -import ( - "bytes" - "encoding/base64" - "encoding/binary" - "encoding/json" - "errors" - "fmt" - "io" - "math/bits" - "strconv" -) - -// the wordSize of a bit set -const wordSize = 64 - -// the wordSize of a bit set in bytes -const wordBytes = wordSize / 8 - -// wordMask is wordSize-1, used for bit indexing in a word -const wordMask = wordSize - 1 - -// log2WordSize is lg(wordSize) -const log2WordSize = 6 - -// allBits has every bit set -const allBits uint64 = 0xffffffffffffffff - -// default binary BigEndian -var binaryOrder binary.ByteOrder = binary.BigEndian - -// default json encoding base64.URLEncoding -var base64Encoding = base64.URLEncoding - -// Base64StdEncoding Marshal/Unmarshal BitSet with base64.StdEncoding(Default: base64.URLEncoding) -func Base64StdEncoding() { base64Encoding = base64.StdEncoding } - -// LittleEndian sets Marshal/Unmarshal Binary as Little Endian (Default: binary.BigEndian) -func LittleEndian() { binaryOrder = binary.LittleEndian } - -// BigEndian sets Marshal/Unmarshal Binary as Big Endian (Default: binary.BigEndian) -func BigEndian() { binaryOrder = binary.BigEndian } - -// BinaryOrder returns the current binary order, see also LittleEndian() -// and BigEndian() to change the order. -func BinaryOrder() binary.ByteOrder { return binaryOrder } - -// A BitSet is a set of bits. The zero value of a BitSet is an empty set of length 0. -type BitSet struct { - length uint - set []uint64 -} - -// Error is used to distinguish errors (panics) generated in this package. -type Error string - -// safeSet will fixup b.set to be non-nil and return the field value -func (b *BitSet) safeSet() []uint64 { - if b.set == nil { - b.set = make([]uint64, wordsNeeded(0)) - } - return b.set -} - -// SetBitsetFrom fills the bitset with an array of integers without creating a new BitSet instance -func (b *BitSet) SetBitsetFrom(buf []uint64) { - b.length = uint(len(buf)) * 64 - b.set = buf -} - -// From is a constructor used to create a BitSet from an array of words -func From(buf []uint64) *BitSet { - return FromWithLength(uint(len(buf))*64, buf) -} - -// FromWithLength constructs from an array of words and length in bits. -// This function is for advanced users, most users should prefer -// the From function. -// As a user of FromWithLength, you are responsible for ensuring -// that the length is correct: your slice should have length at -// least (length+63)/64 in 64-bit words. -func FromWithLength(length uint, set []uint64) *BitSet { - if len(set) < wordsNeeded(length) { - panic("BitSet.FromWithLength: slice is too short") - } - return &BitSet{length, set} -} - -// Bytes returns the bitset as array of 64-bit words, giving direct access to the internal representation. -// It is not a copy, so changes to the returned slice will affect the bitset. -// It is meant for advanced users. -// -// Deprecated: Bytes is deprecated. Use [BitSet.Words] instead. -func (b *BitSet) Bytes() []uint64 { - return b.set -} - -// Words returns the bitset as array of 64-bit words, giving direct access to the internal representation. -// It is not a copy, so changes to the returned slice will affect the bitset. -// It is meant for advanced users. -func (b *BitSet) Words() []uint64 { - return b.set -} - -// wordsNeeded calculates the number of words needed for i bits -func wordsNeeded(i uint) int { - if i > (Cap() - wordMask) { - return int(Cap() >> log2WordSize) - } - return int((i + wordMask) >> log2WordSize) -} - -// wordsNeededUnbound calculates the number of words needed for i bits, possibly exceeding the capacity. -// This function is useful if you know that the capacity cannot be exceeded (e.g., you have an existing BitSet). -func wordsNeededUnbound(i uint) int { - return (int(i) + wordMask) >> log2WordSize -} - -// wordsIndex calculates the index of words in a `uint64` -func wordsIndex(i uint) uint { - return i & wordMask -} - -// New creates a new BitSet with a hint that length bits will be required. -// The memory usage is at least length/8 bytes. -// In case of allocation failure, the function will return a BitSet with zero -// capacity. -func New(length uint) (bset *BitSet) { - defer func() { - if r := recover(); r != nil { - bset = &BitSet{ - 0, - make([]uint64, 0), - } - } - }() - - bset = &BitSet{ - length, - make([]uint64, wordsNeeded(length)), - } - - return bset -} - -// MustNew creates a new BitSet with the given length bits. -// It panics if length exceeds the possible capacity or by a lack of memory. -func MustNew(length uint) (bset *BitSet) { - if length >= Cap() { - panic("You are exceeding the capacity") - } - - return &BitSet{ - length, - make([]uint64, wordsNeeded(length)), // may panic on lack of memory - } -} - -// Cap returns the total possible capacity, or number of bits -// that can be stored in the BitSet theoretically. Under 32-bit system, -// it is 4294967295 and under 64-bit system, it is 18446744073709551615. -// Note that this is further limited by the maximum allocation size in Go, -// and your available memory, as any Go data structure. -func Cap() uint { - return ^uint(0) -} - -// Len returns the number of bits in the BitSet. -// Note that it differ from Count function. -func (b *BitSet) Len() uint { - return b.length -} - -// extendSet adds additional words to incorporate new bits if needed -func (b *BitSet) extendSet(i uint) { - if i >= Cap() { - panic("You are exceeding the capacity") - } - nsize := wordsNeeded(i + 1) - if b.set == nil { - b.set = make([]uint64, nsize) - } else if cap(b.set) >= nsize { - b.set = b.set[:nsize] // fast resize - } else if len(b.set) < nsize { - newset := make([]uint64, nsize, 2*nsize) // increase capacity 2x - copy(newset, b.set) - b.set = newset - } - b.length = i + 1 -} - -// Test whether bit i is set. -func (b *BitSet) Test(i uint) bool { - if i >= b.length { - return false - } - return b.set[i>>log2WordSize]&(1<searchBase -%typesearchSuffix +%type searchSuffix %type searchPrefix %% @@ -53,11 +50,7 @@ searchPart { searchPart: searchPrefix searchBase searchSuffix { query := $2 - if $3 != nil { - if query, ok := query.(BoostableQuery); ok { - query.SetBoost(*$3) - } - } + query.SetBoost($3) switch($1) { case queryShould: yylex.(*lexerWrapper).query.AddShould(query) @@ -88,7 +81,7 @@ searchBase: tSTRING { str := $1 logDebugGrammar("STRING - %s", str) - var q FieldableQuery + var q Query if strings.HasPrefix(str, "/") && strings.HasSuffix(str, "/") { q = NewRegexpQuery(str[1:len(str)-1]) } else if strings.ContainsAny(str, "*?"){ @@ -128,15 +121,7 @@ tSTRING tCOLON tSTRING tTILDE { tNUMBER { str := $1 logDebugGrammar("STRING - %s", str) - q1 := NewMatchQuery(str) - val, err := strconv.ParseFloat($1, 64) - if err != nil { - yylex.(*lexerWrapper).lex.Error(fmt.Sprintf("error parsing number: %v", err)) - } - inclusive := true - q2 := NewNumericRangeInclusiveQuery(&val, &val, &inclusive, &inclusive) - q := NewDisjunctionQuery([]Query{q1,q2}) - q.queryStringMode = true + q := NewMatchQuery(str) $$ = q } | @@ -151,7 +136,7 @@ tSTRING tCOLON tSTRING { field := $1 str := $3 logDebugGrammar("FIELD - %s STRING - %s", field, str) - var q FieldableQuery + var q Query if strings.HasPrefix(str, "/") && strings.HasSuffix(str, "/") { q = NewRegexpQuery(str[1:len(str)-1]) } else if strings.ContainsAny(str, "*?"){ @@ -163,21 +148,11 @@ tSTRING tCOLON tSTRING { $$ = q } | -tSTRING tCOLON posOrNegNumber { +tSTRING tCOLON tNUMBER { field := $1 str := $3 logDebugGrammar("FIELD - %s STRING - %s", field, str) - q1 := NewMatchQuery(str) - q1.SetField(field) - val, err := strconv.ParseFloat($3, 64) - if err != nil { - yylex.(*lexerWrapper).lex.Error(fmt.Sprintf("error parsing number: %v", err)) - } - inclusive := true - q2 := NewNumericRangeInclusiveQuery(&val, &val, &inclusive, &inclusive) - q2.SetField(field) - q := NewDisjunctionQuery([]Query{q1,q2}) - q.queryStringMode = true + q := NewMatchQuery(str).SetField(field) $$ = q } | @@ -185,60 +160,43 @@ tSTRING tCOLON tPHRASE { field := $1 phrase := $3 logDebugGrammar("FIELD - %s PHRASE - %s", field, phrase) - q := NewMatchPhraseQuery(phrase) - q.SetField(field) + q := NewMatchPhraseQuery(phrase).SetField(field) $$ = q } | -tSTRING tCOLON tGREATER posOrNegNumber { +tSTRING tCOLON tGREATER tNUMBER { field := $1 - min, err := strconv.ParseFloat($4, 64) - if err != nil { - yylex.(*lexerWrapper).lex.Error(fmt.Sprintf("error parsing number: %v", err)) - } + min, _ := strconv.ParseFloat($4, 64) minInclusive := false logDebugGrammar("FIELD - GREATER THAN %f", min) - q := NewNumericRangeInclusiveQuery(&min, nil, &minInclusive, nil) - q.SetField(field) + q := NewNumericRangeInclusiveQuery(&min, nil, &minInclusive, nil).SetField(field) $$ = q } | -tSTRING tCOLON tGREATER tEQUAL posOrNegNumber { +tSTRING tCOLON tGREATER tEQUAL tNUMBER { field := $1 - min, err := strconv.ParseFloat($5, 64) - if err != nil { - yylex.(*lexerWrapper).lex.Error(fmt.Sprintf("error parsing number: %v", err)) - } + min, _ := strconv.ParseFloat($5, 64) minInclusive := true logDebugGrammar("FIELD - GREATER THAN OR EQUAL %f", min) - q := NewNumericRangeInclusiveQuery(&min, nil, &minInclusive, nil) - q.SetField(field) + q := NewNumericRangeInclusiveQuery(&min, nil, &minInclusive, nil).SetField(field) $$ = q } | -tSTRING tCOLON tLESS posOrNegNumber { +tSTRING tCOLON tLESS tNUMBER { field := $1 - max, err := strconv.ParseFloat($4, 64) - if err != nil { - yylex.(*lexerWrapper).lex.Error(fmt.Sprintf("error parsing number: %v", err)) - } + max, _ := strconv.ParseFloat($4, 64) maxInclusive := false logDebugGrammar("FIELD - LESS THAN %f", max) - q := NewNumericRangeInclusiveQuery(nil, &max, nil, &maxInclusive) - q.SetField(field) + q := NewNumericRangeInclusiveQuery(nil, &max, nil, &maxInclusive).SetField(field) $$ = q } | -tSTRING tCOLON tLESS tEQUAL posOrNegNumber { +tSTRING tCOLON tLESS tEQUAL tNUMBER { field := $1 - max, err := strconv.ParseFloat($5, 64) - if err != nil { - yylex.(*lexerWrapper).lex.Error(fmt.Sprintf("error parsing number: %v", err)) - } + max, _ := strconv.ParseFloat($5, 64) maxInclusive := true logDebugGrammar("FIELD - LESS THAN OR EQUAL %f", max) - q := NewNumericRangeInclusiveQuery(nil, &max, nil, &maxInclusive) - q.SetField(field) + q := NewNumericRangeInclusiveQuery(nil, &max, nil, &maxInclusive).SetField(field) $$ = q } | @@ -248,12 +206,7 @@ tSTRING tCOLON tGREATER tPHRASE { phrase := $4 logDebugGrammar("FIELD - GREATER THAN DATE %s", phrase) - minTime, err := queryTimeFromString(phrase) - if err != nil { - yylex.(*lexerWrapper).lex.Error(fmt.Sprintf("invalid time: %v", err)) - } - q := NewDateRangeInclusiveQuery(minTime, time.Time{}, &minInclusive, nil) - q.SetField(field) + q := NewDateRangeInclusiveQuery(&phrase, nil, &minInclusive, nil).SetField(field) $$ = q } | @@ -263,12 +216,7 @@ tSTRING tCOLON tGREATER tEQUAL tPHRASE { phrase := $5 logDebugGrammar("FIELD - GREATER THAN OR EQUAL DATE %s", phrase) - minTime, err := queryTimeFromString(phrase) - if err != nil { - yylex.(*lexerWrapper).lex.Error(fmt.Sprintf("invalid time: %v", err)) - } - q := NewDateRangeInclusiveQuery(minTime, time.Time{}, &minInclusive, nil) - q.SetField(field) + q := NewDateRangeInclusiveQuery(&phrase, nil, &minInclusive, nil).SetField(field) $$ = q } | @@ -278,12 +226,7 @@ tSTRING tCOLON tLESS tPHRASE { phrase := $4 logDebugGrammar("FIELD - LESS THAN DATE %s", phrase) - maxTime, err := queryTimeFromString(phrase) - if err != nil { - yylex.(*lexerWrapper).lex.Error(fmt.Sprintf("invalid time: %v", err)) - } - q := NewDateRangeInclusiveQuery(time.Time{}, maxTime, nil, &maxInclusive) - q.SetField(field) + q := NewDateRangeInclusiveQuery(nil, &phrase, nil, &maxInclusive).SetField(field) $$ = q } | @@ -293,36 +236,20 @@ tSTRING tCOLON tLESS tEQUAL tPHRASE { phrase := $5 logDebugGrammar("FIELD - LESS THAN OR EQUAL DATE %s", phrase) - maxTime, err := queryTimeFromString(phrase) - if err != nil { - yylex.(*lexerWrapper).lex.Error(fmt.Sprintf("invalid time: %v", err)) - } - q := NewDateRangeInclusiveQuery(time.Time{}, maxTime, nil, &maxInclusive) - q.SetField(field) + q := NewDateRangeInclusiveQuery(nil, &phrase, nil, &maxInclusive).SetField(field) $$ = q }; searchSuffix: /* empty */ { - $$ = nil + $$ = 1.0 } | tBOOST { - $$ = nil boost, err := strconv.ParseFloat($1, 64) if err != nil { yylex.(*lexerWrapper).lex.Error(fmt.Sprintf("invalid boost value: %v", err)) - } else { - $$ = &boost } + $$ = boost logDebugGrammar("BOOST %f", boost) }; - -posOrNegNumber: -tNUMBER { - $$ = $1 -} -| -tMINUS tNUMBER { - $$ = "-" + $2 -}; diff --git a/vendor/github.com/blevesearch/bleve/search/query/query_string.y.go b/vendor/github.com/blevesearch/bleve/query_string.y.go similarity index 74% rename from vendor/github.com/blevesearch/bleve/search/query/query_string.y.go rename to vendor/github.com/blevesearch/bleve/query_string.y.go index ac2d322..df75cd0 100644 --- a/vendor/github.com/blevesearch/bleve/search/query/query_string.y.go +++ b/vendor/github.com/blevesearch/bleve/query_string.y.go @@ -1,4 +1,4 @@ -package query +package bleve import __yyfmt__ "fmt" @@ -7,7 +7,6 @@ import ( "fmt" "strconv" "strings" - "time" ) func logDebugGrammar(format string, v ...interface{}) { @@ -16,14 +15,13 @@ func logDebugGrammar(format string, v ...interface{}) { } } -//line query_string.y:17 +//line query_string.y:16 type yySymType struct { yys int s string n int f float64 q Query - pf *float64 } const tSTRING = 57346 @@ -70,58 +68,57 @@ var yyExca = [...]int{ -2, 5, } -const yyNprod = 28 +const yyNprod = 26 const yyPrivate = 57344 var yyTokenNames []string var yyStates []string -const yyLast = 42 +const yyLast = 31 var yyAct = [...]int{ - 17, 16, 18, 23, 22, 30, 3, 21, 19, 20, - 29, 26, 22, 22, 1, 21, 21, 15, 28, 25, - 24, 27, 34, 14, 22, 13, 31, 21, 32, 33, - 22, 9, 11, 21, 5, 6, 2, 10, 4, 12, - 7, 8, + 16, 18, 21, 13, 27, 24, 17, 19, 20, 25, + 22, 15, 26, 23, 9, 11, 31, 14, 29, 3, + 10, 30, 2, 28, 5, 6, 7, 1, 4, 12, + 8, } var yyPact = [...]int{ - 28, -1000, -1000, 28, 27, -1000, -1000, -1000, 16, 9, - -1000, -1000, -1000, -1000, -1000, -3, -11, -1000, -1000, 6, - 5, -1000, -5, -1000, -1000, 23, -1000, -1000, 17, -1000, - -1000, -1000, -1000, -1000, -1000, + 18, -1000, -1000, 18, 10, -1000, -1000, -1000, -6, 3, + -1000, -1000, -1000, -1000, -1000, -4, -12, -1000, -1000, 0, + -1, -1000, -1000, 13, -1000, -1000, 11, -1000, -1000, -1000, + -1000, -1000, } var yyPgo = [...]int{ - 0, 0, 41, 39, 38, 14, 36, 6, + 0, 30, 29, 28, 27, 22, 19, } var yyR1 = [...]int{ - 0, 5, 6, 6, 7, 4, 4, 4, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 3, 3, 1, 1, + 0, 4, 5, 5, 6, 3, 3, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 2, } var yyR2 = [...]int{ 0, 1, 2, 1, 3, 0, 1, 1, 1, 2, 4, 1, 1, 3, 3, 3, 4, 5, 4, 5, - 4, 5, 4, 5, 0, 1, 1, 2, + 4, 5, 4, 5, 0, 1, } var yyChk = [...]int{ - -1000, -5, -6, -7, -4, 6, 7, -6, -2, 4, - 10, 5, -3, 9, 14, 8, 4, -1, 5, 11, - 12, 10, 7, 14, -1, 13, 5, -1, 13, 5, - 10, -1, 5, -1, 5, + -1000, -4, -5, -6, -3, 6, 7, -5, -1, 4, + 10, 5, -2, 9, 14, 8, 4, 10, 5, 11, + 12, 14, 10, 13, 5, 10, 13, 5, 10, 5, + 10, 5, } var yyDef = [...]int{ 5, -2, 1, -2, 0, 6, 7, 2, 24, 8, 11, 12, 4, 25, 9, 0, 13, 14, 15, 0, - 0, 26, 0, 10, 16, 0, 20, 18, 0, 22, - 27, 17, 21, 19, 23, + 0, 10, 16, 0, 20, 18, 0, 22, 17, 21, + 19, 23, } var yyTok1 = [...]int{ @@ -475,32 +472,28 @@ yydefault: case 1: yyDollar = yyS[yypt-1 : yypt+1] - //line query_string.y:40 + //line query_string.y:37 { logDebugGrammar("INPUT") } case 2: yyDollar = yyS[yypt-2 : yypt+1] - //line query_string.y:45 + //line query_string.y:42 { logDebugGrammar("SEARCH PARTS") } case 3: yyDollar = yyS[yypt-1 : yypt+1] - //line query_string.y:49 + //line query_string.y:46 { logDebugGrammar("SEARCH PART") } case 4: yyDollar = yyS[yypt-3 : yypt+1] - //line query_string.y:54 + //line query_string.y:51 { query := yyDollar[2].q - if yyDollar[3].pf != nil { - if query, ok := query.(BoostableQuery); ok { - query.SetBoost(*yyDollar[3].pf) - } - } + query.SetBoost(yyDollar[3].f) switch yyDollar[1].n { case queryShould: yylex.(*lexerWrapper).query.AddShould(query) @@ -512,31 +505,31 @@ yydefault: } case 5: yyDollar = yyS[yypt-0 : yypt+1] - //line query_string.y:73 + //line query_string.y:66 { yyVAL.n = queryShould } case 6: yyDollar = yyS[yypt-1 : yypt+1] - //line query_string.y:77 + //line query_string.y:70 { logDebugGrammar("PLUS") yyVAL.n = queryMust } case 7: yyDollar = yyS[yypt-1 : yypt+1] - //line query_string.y:82 + //line query_string.y:75 { logDebugGrammar("MINUS") yyVAL.n = queryMustNot } case 8: yyDollar = yyS[yypt-1 : yypt+1] - //line query_string.y:88 + //line query_string.y:81 { str := yyDollar[1].s logDebugGrammar("STRING - %s", str) - var q FieldableQuery + var q Query if strings.HasPrefix(str, "/") && strings.HasSuffix(str, "/") { q = NewRegexpQuery(str[1 : len(str)-1]) } else if strings.ContainsAny(str, "*?") { @@ -548,7 +541,7 @@ yydefault: } case 9: yyDollar = yyS[yypt-2 : yypt+1] - //line query_string.y:102 + //line query_string.y:95 { str := yyDollar[1].s fuzziness, err := strconv.ParseFloat(yyDollar[2].s, 64) @@ -562,7 +555,7 @@ yydefault: } case 10: yyDollar = yyS[yypt-4 : yypt+1] - //line query_string.y:114 + //line query_string.y:107 { field := yyDollar[1].s str := yyDollar[3].s @@ -578,24 +571,16 @@ yydefault: } case 11: yyDollar = yyS[yypt-1 : yypt+1] - //line query_string.y:128 + //line query_string.y:121 { str := yyDollar[1].s logDebugGrammar("STRING - %s", str) - q1 := NewMatchQuery(str) - val, err := strconv.ParseFloat(yyDollar[1].s, 64) - if err != nil { - yylex.(*lexerWrapper).lex.Error(fmt.Sprintf("error parsing number: %v", err)) - } - inclusive := true - q2 := NewNumericRangeInclusiveQuery(&val, &val, &inclusive, &inclusive) - q := NewDisjunctionQuery([]Query{q1, q2}) - q.queryStringMode = true + q := NewMatchQuery(str) yyVAL.q = q } case 12: yyDollar = yyS[yypt-1 : yypt+1] - //line query_string.y:143 + //line query_string.y:128 { phrase := yyDollar[1].s logDebugGrammar("PHRASE - %s", phrase) @@ -604,12 +589,12 @@ yydefault: } case 13: yyDollar = yyS[yypt-3 : yypt+1] - //line query_string.y:150 + //line query_string.y:135 { field := yyDollar[1].s str := yyDollar[3].s logDebugGrammar("FIELD - %s STRING - %s", field, str) - var q FieldableQuery + var q Query if strings.HasPrefix(str, "/") && strings.HasSuffix(str, "/") { q = NewRegexpQuery(str[1 : len(str)-1]) } else if strings.ContainsAny(str, "*?") { @@ -622,194 +607,133 @@ yydefault: } case 14: yyDollar = yyS[yypt-3 : yypt+1] - //line query_string.y:166 + //line query_string.y:151 { field := yyDollar[1].s str := yyDollar[3].s logDebugGrammar("FIELD - %s STRING - %s", field, str) - q1 := NewMatchQuery(str) - q1.SetField(field) - val, err := strconv.ParseFloat(yyDollar[3].s, 64) - if err != nil { - yylex.(*lexerWrapper).lex.Error(fmt.Sprintf("error parsing number: %v", err)) - } - inclusive := true - q2 := NewNumericRangeInclusiveQuery(&val, &val, &inclusive, &inclusive) - q2.SetField(field) - q := NewDisjunctionQuery([]Query{q1, q2}) - q.queryStringMode = true + q := NewMatchQuery(str).SetField(field) yyVAL.q = q } case 15: yyDollar = yyS[yypt-3 : yypt+1] - //line query_string.y:184 + //line query_string.y:159 { field := yyDollar[1].s phrase := yyDollar[3].s logDebugGrammar("FIELD - %s PHRASE - %s", field, phrase) - q := NewMatchPhraseQuery(phrase) - q.SetField(field) + q := NewMatchPhraseQuery(phrase).SetField(field) yyVAL.q = q } case 16: yyDollar = yyS[yypt-4 : yypt+1] - //line query_string.y:193 + //line query_string.y:167 { field := yyDollar[1].s - min, err := strconv.ParseFloat(yyDollar[4].s, 64) - if err != nil { - yylex.(*lexerWrapper).lex.Error(fmt.Sprintf("error parsing number: %v", err)) - } + min, _ := strconv.ParseFloat(yyDollar[4].s, 64) minInclusive := false logDebugGrammar("FIELD - GREATER THAN %f", min) - q := NewNumericRangeInclusiveQuery(&min, nil, &minInclusive, nil) - q.SetField(field) + q := NewNumericRangeInclusiveQuery(&min, nil, &minInclusive, nil).SetField(field) yyVAL.q = q } case 17: yyDollar = yyS[yypt-5 : yypt+1] - //line query_string.y:206 + //line query_string.y:176 { field := yyDollar[1].s - min, err := strconv.ParseFloat(yyDollar[5].s, 64) - if err != nil { - yylex.(*lexerWrapper).lex.Error(fmt.Sprintf("error parsing number: %v", err)) - } + min, _ := strconv.ParseFloat(yyDollar[5].s, 64) minInclusive := true logDebugGrammar("FIELD - GREATER THAN OR EQUAL %f", min) - q := NewNumericRangeInclusiveQuery(&min, nil, &minInclusive, nil) - q.SetField(field) + q := NewNumericRangeInclusiveQuery(&min, nil, &minInclusive, nil).SetField(field) yyVAL.q = q } case 18: yyDollar = yyS[yypt-4 : yypt+1] - //line query_string.y:219 + //line query_string.y:185 { field := yyDollar[1].s - max, err := strconv.ParseFloat(yyDollar[4].s, 64) - if err != nil { - yylex.(*lexerWrapper).lex.Error(fmt.Sprintf("error parsing number: %v", err)) - } + max, _ := strconv.ParseFloat(yyDollar[4].s, 64) maxInclusive := false logDebugGrammar("FIELD - LESS THAN %f", max) - q := NewNumericRangeInclusiveQuery(nil, &max, nil, &maxInclusive) - q.SetField(field) + q := NewNumericRangeInclusiveQuery(nil, &max, nil, &maxInclusive).SetField(field) yyVAL.q = q } case 19: yyDollar = yyS[yypt-5 : yypt+1] - //line query_string.y:232 + //line query_string.y:194 { field := yyDollar[1].s - max, err := strconv.ParseFloat(yyDollar[5].s, 64) - if err != nil { - yylex.(*lexerWrapper).lex.Error(fmt.Sprintf("error parsing number: %v", err)) - } + max, _ := strconv.ParseFloat(yyDollar[5].s, 64) maxInclusive := true logDebugGrammar("FIELD - LESS THAN OR EQUAL %f", max) - q := NewNumericRangeInclusiveQuery(nil, &max, nil, &maxInclusive) - q.SetField(field) + q := NewNumericRangeInclusiveQuery(nil, &max, nil, &maxInclusive).SetField(field) yyVAL.q = q } case 20: yyDollar = yyS[yypt-4 : yypt+1] - //line query_string.y:245 + //line query_string.y:203 { field := yyDollar[1].s minInclusive := false phrase := yyDollar[4].s logDebugGrammar("FIELD - GREATER THAN DATE %s", phrase) - minTime, err := queryTimeFromString(phrase) - if err != nil { - yylex.(*lexerWrapper).lex.Error(fmt.Sprintf("invalid time: %v", err)) - } - q := NewDateRangeInclusiveQuery(minTime, time.Time{}, &minInclusive, nil) - q.SetField(field) + q := NewDateRangeInclusiveQuery(&phrase, nil, &minInclusive, nil).SetField(field) yyVAL.q = q } case 21: yyDollar = yyS[yypt-5 : yypt+1] - //line query_string.y:260 + //line query_string.y:213 { field := yyDollar[1].s minInclusive := true phrase := yyDollar[5].s logDebugGrammar("FIELD - GREATER THAN OR EQUAL DATE %s", phrase) - minTime, err := queryTimeFromString(phrase) - if err != nil { - yylex.(*lexerWrapper).lex.Error(fmt.Sprintf("invalid time: %v", err)) - } - q := NewDateRangeInclusiveQuery(minTime, time.Time{}, &minInclusive, nil) - q.SetField(field) + q := NewDateRangeInclusiveQuery(&phrase, nil, &minInclusive, nil).SetField(field) yyVAL.q = q } case 22: yyDollar = yyS[yypt-4 : yypt+1] - //line query_string.y:275 + //line query_string.y:223 { field := yyDollar[1].s maxInclusive := false phrase := yyDollar[4].s logDebugGrammar("FIELD - LESS THAN DATE %s", phrase) - maxTime, err := queryTimeFromString(phrase) - if err != nil { - yylex.(*lexerWrapper).lex.Error(fmt.Sprintf("invalid time: %v", err)) - } - q := NewDateRangeInclusiveQuery(time.Time{}, maxTime, nil, &maxInclusive) - q.SetField(field) + q := NewDateRangeInclusiveQuery(nil, &phrase, nil, &maxInclusive).SetField(field) yyVAL.q = q } case 23: yyDollar = yyS[yypt-5 : yypt+1] - //line query_string.y:290 + //line query_string.y:233 { field := yyDollar[1].s maxInclusive := true phrase := yyDollar[5].s logDebugGrammar("FIELD - LESS THAN OR EQUAL DATE %s", phrase) - maxTime, err := queryTimeFromString(phrase) - if err != nil { - yylex.(*lexerWrapper).lex.Error(fmt.Sprintf("invalid time: %v", err)) - } - q := NewDateRangeInclusiveQuery(time.Time{}, maxTime, nil, &maxInclusive) - q.SetField(field) + q := NewDateRangeInclusiveQuery(nil, &phrase, nil, &maxInclusive).SetField(field) yyVAL.q = q } case 24: yyDollar = yyS[yypt-0 : yypt+1] - //line query_string.y:306 + //line query_string.y:244 { - yyVAL.pf = nil + yyVAL.f = 1.0 } case 25: yyDollar = yyS[yypt-1 : yypt+1] - //line query_string.y:310 + //line query_string.y:248 { - yyVAL.pf = nil boost, err := strconv.ParseFloat(yyDollar[1].s, 64) if err != nil { yylex.(*lexerWrapper).lex.Error(fmt.Sprintf("invalid boost value: %v", err)) - } else { - yyVAL.pf = &boost } + yyVAL.f = boost logDebugGrammar("BOOST %f", boost) } - case 26: - yyDollar = yyS[yypt-1 : yypt+1] - //line query_string.y:322 - { - yyVAL.s = yyDollar[1].s - } - case 27: - yyDollar = yyS[yypt-2 : yypt+1] - //line query_string.y:326 - { - yyVAL.s = "-" + yyDollar[2].s - } } goto yystack /* stack new state and value */ } diff --git a/vendor/github.com/blevesearch/bleve/search/query/query_string_lex.go b/vendor/github.com/blevesearch/bleve/query_string_lex.go similarity index 91% rename from vendor/github.com/blevesearch/bleve/search/query/query_string_lex.go rename to vendor/github.com/blevesearch/bleve/query_string_lex.go index 3a9cf23..8bd4a01 100644 --- a/vendor/github.com/blevesearch/bleve/search/query/query_string_lex.go +++ b/vendor/github.com/blevesearch/bleve/query_string_lex.go @@ -1,18 +1,13 @@ // Copyright (c) 2016 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. -package query +package bleve import ( "bufio" @@ -128,7 +123,7 @@ func startState(l *queryStringLex, next rune, eof bool) (lexState, bool) { return inStrState, true } - // doesn't look like anything, just eat it and stay here + // doesnt look like anything, just eat it and stay here l.reset() return startState, true } @@ -273,7 +268,6 @@ func inNumOrStrState(l *queryStringLex, next rune, eof bool) (lexState, bool) { // see where to go if !l.seenDot && next == '.' { // stay in this state - l.seenDot = true l.buf += string(next) return inNumOrStrState, true } else if unicode.IsDigit(next) { diff --git a/vendor/github.com/blevesearch/bleve/search/query/query_string_parser.go b/vendor/github.com/blevesearch/bleve/query_string_parser.go similarity index 57% rename from vendor/github.com/blevesearch/bleve/search/query/query_string_parser.go rename to vendor/github.com/blevesearch/bleve/query_string_parser.go index 3fb7731..f9875df 100644 --- a/vendor/github.com/blevesearch/bleve/search/query/query_string_parser.go +++ b/vendor/github.com/blevesearch/bleve/query_string_parser.go @@ -1,21 +1,13 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. -// as of Go 1.8 this requires the goyacc external tool -// available from golang.org/x/tools/cmd/goyacc - -//go:generate goyacc -o query_string.y.go query_string.y +//go:generate go tool yacc -o query_string.y.go query_string.y //go:generate sed -i.tmp -e 1d query_string.y.go //go:generate rm query_string.y.go.tmp @@ -23,7 +15,7 @@ // using -i.tmp works on both, at the expense of having to remove // the unsightly .tmp files -package query +package bleve import ( "fmt" @@ -34,9 +26,6 @@ var debugParser bool var debugLexer bool func parseQuerySyntax(query string) (rq Query, err error) { - if query == "" { - return NewMatchNoneQuery(), nil - } lex := newLexerWrapper(newQueryStringLex(strings.NewReader(query))) doParse(lex) @@ -66,13 +55,13 @@ const ( type lexerWrapper struct { lex yyLexer errs []string - query *BooleanQuery + query *booleanQuery } func newLexerWrapper(lex yyLexer) *lexerWrapper { return &lexerWrapper{ lex: lex, - query: NewBooleanQueryForQueryString(nil, nil, nil), + query: NewBooleanQuery(nil, nil, nil), } } diff --git a/vendor/github.com/blevesearch/bleve/query_term.go b/vendor/github.com/blevesearch/bleve/query_term.go new file mode 100644 index 0000000..df92b45 --- /dev/null +++ b/vendor/github.com/blevesearch/bleve/query_term.go @@ -0,0 +1,61 @@ +// Copyright (c) 2014 Couchbase, Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. + +package bleve + +import ( + "github.com/blevesearch/bleve/index" + "github.com/blevesearch/bleve/search" + "github.com/blevesearch/bleve/search/searchers" +) + +type termQuery struct { + Term string `json:"term"` + FieldVal string `json:"field,omitempty"` + BoostVal float64 `json:"boost,omitempty"` +} + +// NewTermQuery creates a new Query for finding an +// exact term match in the index. +func NewTermQuery(term string) *termQuery { + return &termQuery{ + Term: term, + BoostVal: 1.0, + } +} + +func (q *termQuery) Boost() float64 { + return q.BoostVal +} + +func (q *termQuery) SetBoost(b float64) Query { + q.BoostVal = b + return q +} + +func (q *termQuery) Field() string { + return q.FieldVal +} + +func (q *termQuery) SetField(f string) Query { + q.FieldVal = f + return q +} + +func (q *termQuery) Searcher(i index.IndexReader, m *IndexMapping, explain bool) (search.Searcher, error) { + field := q.FieldVal + if q.FieldVal == "" { + field = m.DefaultField + } + return searchers.NewTermSearcher(i, q.Term, field, q.BoostVal, explain) +} + +func (q *termQuery) Validate() error { + return nil +} diff --git a/vendor/github.com/blevesearch/bleve/query_wildcard.go b/vendor/github.com/blevesearch/bleve/query_wildcard.go new file mode 100644 index 0000000..32fd343 --- /dev/null +++ b/vendor/github.com/blevesearch/bleve/query_wildcard.go @@ -0,0 +1,102 @@ +// Copyright (c) 2014 Couchbase, Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. + +package bleve + +import ( + "regexp" + "strings" + + "github.com/blevesearch/bleve/index" + "github.com/blevesearch/bleve/search" + "github.com/blevesearch/bleve/search/searchers" +) + +var wildcardRegexpReplacer = strings.NewReplacer( + // characters in the wildcard that must + // be escaped in the regexp + "+", `\+`, + "(", `\(`, + ")", `\)`, + "^", `\^`, + "$", `\$`, + ".", `\.`, + "{", `\{`, + "}", `\}`, + "[", `\[`, + "]", `\]`, + `|`, `\|`, + `\`, `\\`, + // wildcard characters + "*", ".*", + "?", ".") + +type wildcardQuery struct { + Wildcard string `json:"wildcard"` + FieldVal string `json:"field,omitempty"` + BoostVal float64 `json:"boost,omitempty"` + compiled *regexp.Regexp +} + +// NewWildcardQuery creates a new Query which finds +// documents containing terms that match the +// specified wildcard. In the wildcard pattern '*' +// will match any sequence of 0 or more characters, +// and '?' will match any single character. +func NewWildcardQuery(wildcard string) *wildcardQuery { + return &wildcardQuery{ + Wildcard: wildcard, + BoostVal: 1.0, + } +} + +func (q *wildcardQuery) Boost() float64 { + return q.BoostVal +} + +func (q *wildcardQuery) SetBoost(b float64) Query { + q.BoostVal = b + return q +} + +func (q *wildcardQuery) Field() string { + return q.FieldVal +} + +func (q *wildcardQuery) SetField(f string) Query { + q.FieldVal = f + return q +} + +func (q *wildcardQuery) Searcher(i index.IndexReader, m *IndexMapping, explain bool) (search.Searcher, error) { + field := q.FieldVal + if q.FieldVal == "" { + field = m.DefaultField + } + if q.compiled == nil { + var err error + q.compiled, err = q.convertToRegexp() + if err != nil { + return nil, err + } + } + + return searchers.NewRegexpSearcher(i, q.compiled, field, q.BoostVal, explain) +} + +func (q *wildcardQuery) Validate() error { + var err error + q.compiled, err = q.convertToRegexp() + return err +} + +func (q *wildcardQuery) convertToRegexp() (*regexp.Regexp, error) { + regexpString := "^" + wildcardRegexpReplacer.Replace(q.Wildcard) + "$" + return regexp.Compile(regexpString) +} diff --git a/vendor/github.com/blevesearch/bleve/mapping/reflect.go b/vendor/github.com/blevesearch/bleve/reflect.go similarity index 60% rename from vendor/github.com/blevesearch/bleve/mapping/reflect.go rename to vendor/github.com/blevesearch/bleve/reflect.go index 6500a70..21fe397 100644 --- a/vendor/github.com/blevesearch/bleve/mapping/reflect.go +++ b/vendor/github.com/blevesearch/bleve/reflect.go @@ -1,18 +1,13 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. -package mapping +package bleve import ( "reflect" @@ -35,9 +30,6 @@ func lookupPropertyPath(data interface{}, path string) interface{} { func lookupPropertyPathPart(data interface{}, part string) interface{} { val := reflect.ValueOf(data) - if !val.IsValid() { - return nil - } typ := val.Type() switch typ.Kind() { case reflect.Map: @@ -54,11 +46,6 @@ func lookupPropertyPathPart(data interface{}, part string) interface{} { if field.IsValid() && field.CanInterface() { return field.Interface() } - case reflect.Ptr: - ptrElem := val.Elem() - if ptrElem.IsValid() && ptrElem.CanInterface() { - return lookupPropertyPathPart(ptrElem.Interface(), part) - } } return nil } @@ -83,8 +70,8 @@ func mustString(data interface{}) (string, bool) { return "", false } -// parseTagName extracts the field name from a struct tag -func parseTagName(tag string) string { +// parseJSONTagName extracts the JSON field name from a struct tag +func parseJSONTagName(tag string) string { if idx := strings.Index(tag, ","); idx != -1 { return tag[:idx] } diff --git a/vendor/github.com/blevesearch/bleve/registry/analyzer.go b/vendor/github.com/blevesearch/bleve/registry/analyzer.go index 340e349..d2de785 100644 --- a/vendor/github.com/blevesearch/bleve/registry/analyzer.go +++ b/vendor/github.com/blevesearch/bleve/registry/analyzer.go @@ -1,16 +1,11 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. package registry @@ -66,8 +61,9 @@ func (c *AnalyzerCache) DefineAnalyzer(name string, typ string, config map[strin if err != nil { if err == ErrAlreadyDefined { return nil, fmt.Errorf("analyzer named '%s' already defined", name) + } else { + return nil, err } - return nil, err } return item.(*analysis.Analyzer), nil } @@ -75,8 +71,8 @@ func (c *AnalyzerCache) DefineAnalyzer(name string, typ string, config map[strin func AnalyzerTypesAndInstances() ([]string, []string) { emptyConfig := map[string]interface{}{} emptyCache := NewCache() - var types []string - var instances []string + types := make([]string, 0) + instances := make([]string, 0) for name, cons := range analyzers { _, err := cons(emptyConfig, emptyCache) if err == nil { diff --git a/vendor/github.com/blevesearch/bleve/registry/cache.go b/vendor/github.com/blevesearch/bleve/registry/cache.go index b0ce852..284a5a2 100644 --- a/vendor/github.com/blevesearch/bleve/registry/cache.go +++ b/vendor/github.com/blevesearch/bleve/registry/cache.go @@ -1,16 +1,11 @@ // Copyright (c) 2016 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. package registry diff --git a/vendor/github.com/blevesearch/bleve/registry/char_filter.go b/vendor/github.com/blevesearch/bleve/registry/char_filter.go index 4696713..c05fa06 100644 --- a/vendor/github.com/blevesearch/bleve/registry/char_filter.go +++ b/vendor/github.com/blevesearch/bleve/registry/char_filter.go @@ -1,16 +1,11 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. package registry @@ -66,8 +61,9 @@ func (c *CharFilterCache) DefineCharFilter(name string, typ string, config map[s if err != nil { if err == ErrAlreadyDefined { return nil, fmt.Errorf("char filter named '%s' already defined", name) + } else { + return nil, err } - return nil, err } return item.(analysis.CharFilter), nil } @@ -75,8 +71,8 @@ func (c *CharFilterCache) DefineCharFilter(name string, typ string, config map[s func CharFilterTypesAndInstances() ([]string, []string) { emptyConfig := map[string]interface{}{} emptyCache := NewCache() - var types []string - var instances []string + types := make([]string, 0) + instances := make([]string, 0) for name, cons := range charFilters { _, err := cons(emptyConfig, emptyCache) if err == nil { diff --git a/vendor/github.com/blevesearch/bleve/registry/datetime_parser.go b/vendor/github.com/blevesearch/bleve/registry/datetime_parser.go index 2cd46e5..031a174 100644 --- a/vendor/github.com/blevesearch/bleve/registry/datetime_parser.go +++ b/vendor/github.com/blevesearch/bleve/registry/datetime_parser.go @@ -1,16 +1,11 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. package registry @@ -66,8 +61,9 @@ func (c *DateTimeParserCache) DefineDateTimeParser(name string, typ string, conf if err != nil { if err == ErrAlreadyDefined { return nil, fmt.Errorf("date time parser named '%s' already defined", name) + } else { + return nil, err } - return nil, err } return item.(analysis.DateTimeParser), nil } @@ -75,8 +71,8 @@ func (c *DateTimeParserCache) DefineDateTimeParser(name string, typ string, conf func DateTimeParserTypesAndInstances() ([]string, []string) { emptyConfig := map[string]interface{}{} emptyCache := NewCache() - var types []string - var instances []string + types := make([]string, 0) + instances := make([]string, 0) for name, cons := range dateTimeParsers { _, err := cons(emptyConfig, emptyCache) if err == nil { diff --git a/vendor/github.com/blevesearch/bleve/registry/fragment_formatter.go b/vendor/github.com/blevesearch/bleve/registry/fragment_formatter.go index d0121d9..5d08aae 100644 --- a/vendor/github.com/blevesearch/bleve/registry/fragment_formatter.go +++ b/vendor/github.com/blevesearch/bleve/registry/fragment_formatter.go @@ -1,16 +1,11 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. package registry @@ -66,8 +61,9 @@ func (c *FragmentFormatterCache) DefineFragmentFormatter(name string, typ string if err != nil { if err == ErrAlreadyDefined { return nil, fmt.Errorf("fragment formatter named '%s' already defined", name) + } else { + return nil, err } - return nil, err } return item.(highlight.FragmentFormatter), nil } @@ -75,8 +71,8 @@ func (c *FragmentFormatterCache) DefineFragmentFormatter(name string, typ string func FragmentFormatterTypesAndInstances() ([]string, []string) { emptyConfig := map[string]interface{}{} emptyCache := NewCache() - var types []string - var instances []string + types := make([]string, 0) + instances := make([]string, 0) for name, cons := range fragmentFormatters { _, err := cons(emptyConfig, emptyCache) if err == nil { diff --git a/vendor/github.com/blevesearch/bleve/registry/fragmenter.go b/vendor/github.com/blevesearch/bleve/registry/fragmenter.go index 18ab2ac..c1cb6ae 100644 --- a/vendor/github.com/blevesearch/bleve/registry/fragmenter.go +++ b/vendor/github.com/blevesearch/bleve/registry/fragmenter.go @@ -1,16 +1,11 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. package registry @@ -66,8 +61,9 @@ func (c *FragmenterCache) DefineFragmenter(name string, typ string, config map[s if err != nil { if err == ErrAlreadyDefined { return nil, fmt.Errorf("fragmenter named '%s' already defined", name) + } else { + return nil, err } - return nil, err } return item.(highlight.Fragmenter), nil } @@ -75,8 +71,8 @@ func (c *FragmenterCache) DefineFragmenter(name string, typ string, config map[s func FragmenterTypesAndInstances() ([]string, []string) { emptyConfig := map[string]interface{}{} emptyCache := NewCache() - var types []string - var instances []string + types := make([]string, 0) + instances := make([]string, 0) for name, cons := range fragmenters { _, err := cons(emptyConfig, emptyCache) if err == nil { diff --git a/vendor/github.com/blevesearch/bleve/registry/highlighter.go b/vendor/github.com/blevesearch/bleve/registry/highlighter.go index b84219c..20e9e71 100644 --- a/vendor/github.com/blevesearch/bleve/registry/highlighter.go +++ b/vendor/github.com/blevesearch/bleve/registry/highlighter.go @@ -1,16 +1,11 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. package registry @@ -66,8 +61,9 @@ func (c *HighlighterCache) DefineHighlighter(name string, typ string, config map if err != nil { if err == ErrAlreadyDefined { return nil, fmt.Errorf("highlighter named '%s' already defined", name) + } else { + return nil, err } - return nil, err } return item.(highlight.Highlighter), nil } @@ -75,8 +71,8 @@ func (c *HighlighterCache) DefineHighlighter(name string, typ string, config map func HighlighterTypesAndInstances() ([]string, []string) { emptyConfig := map[string]interface{}{} emptyCache := NewCache() - var types []string - var instances []string + types := make([]string, 0) + instances := make([]string, 0) for name, cons := range highlighters { _, err := cons(emptyConfig, emptyCache) if err == nil { diff --git a/vendor/github.com/blevesearch/bleve/registry/index_type.go b/vendor/github.com/blevesearch/bleve/registry/index_type.go index 4da07c8..15e782e 100644 --- a/vendor/github.com/blevesearch/bleve/registry/index_type.go +++ b/vendor/github.com/blevesearch/bleve/registry/index_type.go @@ -1,16 +1,11 @@ // Copyright (c) 2015 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. package registry @@ -21,23 +16,23 @@ import ( ) func RegisterIndexType(name string, constructor IndexTypeConstructor) { - _, exists := indexTypes[name] + _, exists := index_types[name] if exists { panic(fmt.Errorf("attempted to register duplicate index encoding named '%s'", name)) } - indexTypes[name] = constructor + index_types[name] = constructor } type IndexTypeConstructor func(storeName string, storeConfig map[string]interface{}, analysisQueue *index.AnalysisQueue) (index.Index, error) type IndexTypeRegistry map[string]IndexTypeConstructor func IndexTypeConstructorByName(name string) IndexTypeConstructor { - return indexTypes[name] + return index_types[name] } func IndexTypesAndInstances() ([]string, []string) { - var types []string - var instances []string + types := make([]string, 0) + instances := make([]string, 0) for name := range stores { types = append(types, name) } diff --git a/vendor/github.com/blevesearch/bleve/registry/registry.go b/vendor/github.com/blevesearch/bleve/registry/registry.go index a0ea69c..1e5b061 100644 --- a/vendor/github.com/blevesearch/bleve/registry/registry.go +++ b/vendor/github.com/blevesearch/bleve/registry/registry.go @@ -1,16 +1,11 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. package registry @@ -22,7 +17,7 @@ import ( ) var stores = make(KVStoreRegistry, 0) -var indexTypes = make(IndexTypeRegistry, 0) +var index_types = make(IndexTypeRegistry, 0) // highlight var fragmentFormatters = make(FragmentFormatterRegistry, 0) diff --git a/vendor/github.com/blevesearch/bleve/registry/store.go b/vendor/github.com/blevesearch/bleve/registry/store.go index 8318776..14daaa3 100644 --- a/vendor/github.com/blevesearch/bleve/registry/store.go +++ b/vendor/github.com/blevesearch/bleve/registry/store.go @@ -1,16 +1,11 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. package registry @@ -28,12 +23,6 @@ func RegisterKVStore(name string, constructor KVStoreConstructor) { stores[name] = constructor } -// KVStoreConstructor is used to build a KVStore of a specific type when -// specificied by the index configuration. In addition to meeting the -// store.KVStore interface, KVStores must also support this constructor. -// Note that currently the values of config must -// be able to be marshaled and unmarshaled using the encoding/json library (used -// when reading/writing the index metadata file). type KVStoreConstructor func(mo store.MergeOperator, config map[string]interface{}) (store.KVStore, error) type KVStoreRegistry map[string]KVStoreConstructor @@ -42,8 +31,8 @@ func KVStoreConstructorByName(name string) KVStoreConstructor { } func KVStoreTypesAndInstances() ([]string, []string) { - var types []string - var instances []string + types := make([]string, 0) + instances := make([]string, 0) for name := range stores { types = append(types, name) } diff --git a/vendor/github.com/blevesearch/bleve/registry/token_filter.go b/vendor/github.com/blevesearch/bleve/registry/token_filter.go index e202e15..e6d869b 100644 --- a/vendor/github.com/blevesearch/bleve/registry/token_filter.go +++ b/vendor/github.com/blevesearch/bleve/registry/token_filter.go @@ -1,16 +1,11 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. package registry @@ -66,8 +61,9 @@ func (c *TokenFilterCache) DefineTokenFilter(name string, typ string, config map if err != nil { if err == ErrAlreadyDefined { return nil, fmt.Errorf("token filter named '%s' already defined", name) + } else { + return nil, err } - return nil, err } return item.(analysis.TokenFilter), nil } @@ -75,8 +71,8 @@ func (c *TokenFilterCache) DefineTokenFilter(name string, typ string, config map func TokenFilterTypesAndInstances() ([]string, []string) { emptyConfig := map[string]interface{}{} emptyCache := NewCache() - var types []string - var instances []string + types := make([]string, 0) + instances := make([]string, 0) for name, cons := range tokenFilters { _, err := cons(emptyConfig, emptyCache) if err == nil { diff --git a/vendor/github.com/blevesearch/bleve/registry/token_maps.go b/vendor/github.com/blevesearch/bleve/registry/token_maps.go index 66ca08f..25c41ee 100644 --- a/vendor/github.com/blevesearch/bleve/registry/token_maps.go +++ b/vendor/github.com/blevesearch/bleve/registry/token_maps.go @@ -1,16 +1,11 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. package registry @@ -66,8 +61,9 @@ func (c *TokenMapCache) DefineTokenMap(name string, typ string, config map[strin if err != nil { if err == ErrAlreadyDefined { return nil, fmt.Errorf("token map named '%s' already defined", name) + } else { + return nil, err } - return nil, err } return item.(analysis.TokenMap), nil } @@ -75,8 +71,8 @@ func (c *TokenMapCache) DefineTokenMap(name string, typ string, config map[strin func TokenMapTypesAndInstances() ([]string, []string) { emptyConfig := map[string]interface{}{} emptyCache := NewCache() - var types []string - var instances []string + types := make([]string, 0) + instances := make([]string, 0) for name, cons := range tokenMaps { _, err := cons(emptyConfig, emptyCache) if err == nil { diff --git a/vendor/github.com/blevesearch/bleve/registry/tokenizer.go b/vendor/github.com/blevesearch/bleve/registry/tokenizer.go index cb9af64..85c75bf 100644 --- a/vendor/github.com/blevesearch/bleve/registry/tokenizer.go +++ b/vendor/github.com/blevesearch/bleve/registry/tokenizer.go @@ -1,16 +1,11 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. package registry @@ -66,8 +61,9 @@ func (c *TokenizerCache) DefineTokenizer(name string, typ string, config map[str if err != nil { if err == ErrAlreadyDefined { return nil, fmt.Errorf("tokenizer named '%s' already defined", name) + } else { + return nil, err } - return nil, err } return item.(analysis.Tokenizer), nil } @@ -75,8 +71,8 @@ func (c *TokenizerCache) DefineTokenizer(name string, typ string, config map[str func TokenizerTypesAndInstances() ([]string, []string) { emptyConfig := map[string]interface{}{} emptyCache := NewCache() - var types []string - var instances []string + types := make([]string, 0) + instances := make([]string, 0) for name, cons := range tokenizers { _, err := cons(emptyConfig, emptyCache) if err == nil { diff --git a/vendor/github.com/blevesearch/bleve/search.go b/vendor/github.com/blevesearch/bleve/search.go index f674507..dc6bc26 100644 --- a/vendor/github.com/blevesearch/bleve/search.go +++ b/vendor/github.com/blevesearch/bleve/search.go @@ -1,50 +1,23 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. package bleve import ( "encoding/json" "fmt" - "reflect" - "sort" "time" "github.com/blevesearch/bleve/analysis" - "github.com/blevesearch/bleve/analysis/datetime/optional" - "github.com/blevesearch/bleve/document" - "github.com/blevesearch/bleve/registry" "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/collector" - "github.com/blevesearch/bleve/search/query" - "github.com/blevesearch/bleve/size" ) -var reflectStaticSizeSearchResult int -var reflectStaticSizeSearchStatus int - -func init() { - var sr SearchResult - reflectStaticSizeSearchResult = int(reflect.TypeOf(sr).Size()) - var ss SearchStatus - reflectStaticSizeSearchStatus = int(reflect.TypeOf(ss).Size()) -} - -var cache = registry.NewCache() - -const defaultDateTimeParser = optional.Name - type numericRange struct { Name string `json:"name,omitempty"` Min *float64 `json:"min,omitempty"` @@ -59,22 +32,19 @@ type dateTimeRange struct { endString *string } -func (dr *dateTimeRange) ParseDates(dateTimeParser analysis.DateTimeParser) (start, end time.Time) { - start = dr.Start +func (dr *dateTimeRange) ParseDates(dateTimeParser analysis.DateTimeParser) { if dr.Start.IsZero() && dr.startString != nil { - s, err := dateTimeParser.ParseDateTime(*dr.startString) + start, err := dateTimeParser.ParseDateTime(*dr.startString) if err == nil { - start = s + dr.Start = start } } - end = dr.End if dr.End.IsZero() && dr.endString != nil { - e, err := dateTimeParser.ParseDateTime(*dr.endString) + end, err := dateTimeParser.ParseDateTime(*dr.endString) if err == nil { - end = e + dr.End = end } } - return start, end } func (dr *dateTimeRange) UnmarshalJSON(input []byte) error { @@ -100,21 +70,6 @@ func (dr *dateTimeRange) UnmarshalJSON(input []byte) error { return nil } -func (dr *dateTimeRange) MarshalJSON() ([]byte, error) { - rv := map[string]interface{}{ - "name": dr.Name, - "start": dr.Start, - "end": dr.End, - } - if dr.Start.IsZero() && dr.startString != nil { - rv["start"] = dr.startString - } - if dr.End.IsZero() && dr.endString != nil { - rv["end"] = dr.endString - } - return json.Marshal(rv) -} - // A FacetRequest describes a facet or aggregation // of the result document set you would like to be // built. @@ -126,41 +81,26 @@ type FacetRequest struct { } func (fr *FacetRequest) Validate() error { - nrCount := len(fr.NumericRanges) - drCount := len(fr.DateTimeRanges) - if nrCount > 0 && drCount > 0 { + if len(fr.NumericRanges) > 0 && len(fr.DateTimeRanges) > 0 { return fmt.Errorf("facet can only conain numeric ranges or date ranges, not both") } - if nrCount > 0 { - nrNames := map[string]interface{}{} - for _, nr := range fr.NumericRanges { - if _, ok := nrNames[nr.Name]; ok { - return fmt.Errorf("numeric ranges contains duplicate name '%s'", nr.Name) - } - nrNames[nr.Name] = struct{}{} - if nr.Min == nil && nr.Max == nil { - return fmt.Errorf("numeric range query must specify either min, max or both for range name '%s'", nr.Name) - } - } - - } else { - dateTimeParser, err := cache.DateTimeParserNamed(defaultDateTimeParser) - if err != nil { - return err - } - drNames := map[string]interface{}{} - for _, dr := range fr.DateTimeRanges { - if _, ok := drNames[dr.Name]; ok { - return fmt.Errorf("date ranges contains duplicate name '%s'", dr.Name) - } - drNames[dr.Name] = struct{}{} - start, end := dr.ParseDates(dateTimeParser) - if start.IsZero() && end.IsZero() { - return fmt.Errorf("date range query must specify either start, end or both for range name '%s'", dr.Name) - } + nrNames := map[string]interface{}{} + for _, nr := range fr.NumericRanges { + if _, ok := nrNames[nr.Name]; ok { + return fmt.Errorf("numeric ranges contains duplicate name '%s'", nr.Name) } + nrNames[nr.Name] = struct{}{} } + + drNames := map[string]interface{}{} + for _, dr := range fr.DateTimeRanges { + if _, ok := drNames[dr.Name]; ok { + return fmt.Errorf("date ranges contains duplicate name '%s'", dr.Name) + } + drNames[dr.Name] = struct{}{} + } + return nil } @@ -185,16 +125,6 @@ func (fr *FacetRequest) AddDateTimeRange(name string, start, end time.Time) { fr.DateTimeRanges = append(fr.DateTimeRanges, &dateTimeRange{Name: name, Start: start, End: end}) } -// AddDateTimeRangeString adds a bucket to a field -// containing date values. -func (fr *FacetRequest) AddDateTimeRangeString(name string, start, end *string) { - if fr.DateTimeRanges == nil { - fr.DateTimeRanges = make([]*dateTimeRange, 0, 1) - } - fr.DateTimeRanges = append(fr.DateTimeRanges, - &dateTimeRange{Name: name, startString: start, endString: end}) -} - // AddNumericRange adds a bucket to a field // containing numeric values. Documents with a // numeric value falling into this range are @@ -262,59 +192,26 @@ func (h *HighlightRequest) AddField(field string) { // Explain triggers inclusion of additional search // result score explanations. // Sort describes the desired order for the results to be returned. -// Score controls the kind of scoring performed -// SearchAfter supports deep paging by providing a minimum sort key -// SearchBefore supports deep paging by providing a maximum sort key -// sortFunc specifies the sort implementation to use for sorting results. // // A special field named "*" can be used to return all fields. type SearchRequest struct { - Query query.Query `json:"query"` - Size int `json:"size"` - From int `json:"from"` - Highlight *HighlightRequest `json:"highlight"` - Fields []string `json:"fields"` - Facets FacetsRequest `json:"facets"` - Explain bool `json:"explain"` - Sort search.SortOrder `json:"sort"` - IncludeLocations bool `json:"includeLocations"` - Score string `json:"score,omitempty"` - SearchAfter []string `json:"search_after"` - SearchBefore []string `json:"search_before"` - - sortFunc func(sort.Interface) + Query Query `json:"query"` + Size int `json:"size"` + From int `json:"from"` + Highlight *HighlightRequest `json:"highlight"` + Fields []string `json:"fields"` + Facets FacetsRequest `json:"facets"` + Explain bool `json:"explain"` + Sort search.SortOrder `json:"sort"` } -func (r *SearchRequest) Validate() error { - if srq, ok := r.Query.(query.ValidatableQuery); ok { - err := srq.Validate() - if err != nil { - return err - } +func (sr *SearchRequest) Validate() error { + err := sr.Query.Validate() + if err != nil { + return err } - if r.SearchAfter != nil && r.SearchBefore != nil { - return fmt.Errorf("cannot use search after and search before together") - } - - if r.SearchAfter != nil { - if r.From != 0 { - return fmt.Errorf("cannot use search after with from !=0") - } - if len(r.SearchAfter) != len(r.Sort) { - return fmt.Errorf("search after must have same size as sort order") - } - } - if r.SearchBefore != nil { - if r.From != 0 { - return fmt.Errorf("cannot use search before with from !=0") - } - if len(r.SearchBefore) != len(r.Sort) { - return fmt.Errorf("search before must have same size as sort order") - } - } - - return r.Facets.Validate() + return sr.Facets.Validate() } // AddFacet adds a FacetRequest to this SearchRequest @@ -340,34 +237,18 @@ func (r *SearchRequest) SortByCustom(order search.SortOrder) { r.Sort = order } -// SetSearchAfter sets the request to skip over hits with a sort -// value less than the provided sort after key -func (r *SearchRequest) SetSearchAfter(after []string) { - r.SearchAfter = after -} - -// SetSearchBefore sets the request to skip over hits with a sort -// value greater than the provided sort before key -func (r *SearchRequest) SetSearchBefore(before []string) { - r.SearchBefore = before -} - // UnmarshalJSON deserializes a JSON representation of // a SearchRequest func (r *SearchRequest) UnmarshalJSON(input []byte) error { var temp struct { - Q json.RawMessage `json:"query"` - Size *int `json:"size"` - From int `json:"from"` - Highlight *HighlightRequest `json:"highlight"` - Fields []string `json:"fields"` - Facets FacetsRequest `json:"facets"` - Explain bool `json:"explain"` - Sort []json.RawMessage `json:"sort"` - IncludeLocations bool `json:"includeLocations"` - Score string `json:"score"` - SearchAfter []string `json:"search_after"` - SearchBefore []string `json:"search_before"` + Q json.RawMessage `json:"query"` + Size *int `json:"size"` + From int `json:"from"` + Highlight *HighlightRequest `json:"highlight"` + Fields []string `json:"fields"` + Facets FacetsRequest `json:"facets"` + Explain bool `json:"explain"` + Sort []json.RawMessage `json:"sort"` } err := json.Unmarshal(input, &temp) @@ -393,11 +274,7 @@ func (r *SearchRequest) UnmarshalJSON(input []byte) error { r.Highlight = temp.Highlight r.Fields = temp.Fields r.Facets = temp.Facets - r.IncludeLocations = temp.IncludeLocations - r.Score = temp.Score - r.SearchAfter = temp.SearchAfter - r.SearchBefore = temp.SearchBefore - r.Query, err = query.ParseQuery(temp.Q) + r.Query, err = ParseQuery(temp.Q) if err != nil { return err } @@ -416,7 +293,7 @@ func (r *SearchRequest) UnmarshalJSON(input []byte) error { // NewSearchRequest creates a new SearchRequest // for the Query, using default values for all // other search parameters. -func NewSearchRequest(q query.Query) *SearchRequest { +func NewSearchRequest(q Query) *SearchRequest { return NewSearchRequestOptions(q, 10, 0, false) } @@ -424,7 +301,7 @@ func NewSearchRequest(q query.Query) *SearchRequest { // for the Query, with the requested size, from // and explanation search parameters. // By default results are ordered by score, descending. -func NewSearchRequestOptions(q query.Query, size, from int, explain bool) *SearchRequest { +func NewSearchRequestOptions(q Query, size, from int, explain bool) *SearchRequest { return &SearchRequest{ Query: q, Size: size, @@ -495,24 +372,6 @@ type SearchResult struct { Facets search.FacetResults `json:"facets"` } -func (sr *SearchResult) Size() int { - sizeInBytes := reflectStaticSizeSearchResult + size.SizeOfPtr + - reflectStaticSizeSearchStatus - - for _, entry := range sr.Hits { - if entry != nil { - sizeInBytes += entry.Size() - } - } - - for k, v := range sr.Facets { - sizeInBytes += size.SizeOfString + len(k) + - v.Size() - } - - return sizeInBytes -} - func (sr *SearchResult) String() string { rv := "" if sr.Total > 0 { @@ -562,70 +421,5 @@ func (sr *SearchResult) Merge(other *SearchResult) { if other.MaxScore > sr.MaxScore { sr.MaxScore = other.MaxScore } - if sr.Facets == nil && len(other.Facets) != 0 { - sr.Facets = other.Facets - return - } - sr.Facets.Merge(other.Facets) } - -// MemoryNeededForSearchResult is an exported helper function to determine the RAM -// needed to accommodate the results for a given search request. -func MemoryNeededForSearchResult(req *SearchRequest) uint64 { - if req == nil { - return 0 - } - - numDocMatches := req.Size + req.From - if req.Size+req.From > collector.PreAllocSizeSkipCap { - numDocMatches = collector.PreAllocSizeSkipCap - } - - estimate := 0 - - // overhead from the SearchResult structure - var sr SearchResult - estimate += sr.Size() - - var dm search.DocumentMatch - sizeOfDocumentMatch := dm.Size() - - // overhead from results - estimate += numDocMatches * sizeOfDocumentMatch - - // overhead from facet results - if req.Facets != nil { - var fr search.FacetResult - estimate += len(req.Facets) * fr.Size() - } - - // highlighting, store - var d document.Document - if len(req.Fields) > 0 || req.Highlight != nil { - for i := 0; i < (req.Size + req.From); i++ { - estimate += (req.Size + req.From) * d.Size() - } - } - - return uint64(estimate) -} - -// SetSortFunc sets the sort implementation to use when sorting hits. -// -// SearchRequests can specify a custom sort implementation to meet -// their needs. For instance, by specifying a parallel sort -// that uses all available cores. -func (r *SearchRequest) SetSortFunc(s func(sort.Interface)) { - r.sortFunc = s -} - -// SortFunc returns the sort implementation to use when sorting hits. -// Defaults to sort.Sort. -func (r *SearchRequest) SortFunc() func(data sort.Interface) { - if r.sortFunc != nil { - return r.sortFunc - } - - return sort.Sort -} diff --git a/vendor/github.com/blevesearch/bleve/search/collector.go b/vendor/github.com/blevesearch/bleve/search/collector.go index df3ff9c..a6d9148 100644 --- a/vendor/github.com/blevesearch/bleve/search/collector.go +++ b/vendor/github.com/blevesearch/bleve/search/collector.go @@ -1,24 +1,20 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. package search import ( - "context" "time" "github.com/blevesearch/bleve/index" + + "golang.org/x/net/context" ) type Collector interface { @@ -30,23 +26,3 @@ type Collector interface { SetFacetsBuilder(facetsBuilder *FacetsBuilder) FacetResults() FacetResults } - -// DocumentMatchHandler is the type of document match callback -// bleve will invoke during the search. -// Eventually, bleve will indicate the completion of an ongoing search, -// by passing a nil value for the document match callback. -// The application should take a copy of the hit/documentMatch -// if it wish to own it or need prolonged access to it. -type DocumentMatchHandler func(hit *DocumentMatch) error - -type MakeDocumentMatchHandlerKeyType string - -var MakeDocumentMatchHandlerKey = MakeDocumentMatchHandlerKeyType( - "MakeDocumentMatchHandlerKey") - -// MakeDocumentMatchHandler is an optional DocumentMatchHandler -// builder function which the applications can pass to bleve. -// These builder methods gives a DocumentMatchHandler function -// to bleve, which it will invoke on every document matches. -type MakeDocumentMatchHandler func(ctx *SearchContext) ( - callback DocumentMatchHandler, loadID bool, err error) diff --git a/vendor/github.com/blevesearch/bleve/search/collector/slice.go b/vendor/github.com/blevesearch/bleve/search/collector/slice.go deleted file mode 100644 index 85fe73c..0000000 --- a/vendor/github.com/blevesearch/bleve/search/collector/slice.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package collector - -import "github.com/blevesearch/bleve/search" - -type collectStoreSlice struct { - slice search.DocumentMatchCollection - compare collectorCompare -} - -func newStoreSlice(capacity int, compare collectorCompare) *collectStoreSlice { - rv := &collectStoreSlice{ - slice: make(search.DocumentMatchCollection, 0, capacity), - compare: compare, - } - return rv -} - -func (c *collectStoreSlice) AddNotExceedingSize(doc *search.DocumentMatch, - size int) *search.DocumentMatch { - c.add(doc) - if c.len() > size { - return c.removeLast() - } - return nil -} - -func (c *collectStoreSlice) add(doc *search.DocumentMatch) { - // find where to insert, starting at end (lowest) - i := len(c.slice) - for ; i > 0; i-- { - cmp := c.compare(doc, c.slice[i-1]) - if cmp >= 0 { - break - } - } - // insert at i - c.slice = append(c.slice, nil) - copy(c.slice[i+1:], c.slice[i:]) - c.slice[i] = doc -} - -func (c *collectStoreSlice) removeLast() *search.DocumentMatch { - var rv *search.DocumentMatch - rv, c.slice = c.slice[len(c.slice)-1], c.slice[:len(c.slice)-1] - return rv -} - -func (c *collectStoreSlice) Final(skip int, fixup collectorFixup) (search.DocumentMatchCollection, error) { - for i := skip; i < len(c.slice); i++ { - err := fixup(c.slice[i]) - if err != nil { - return nil, err - } - } - if skip <= len(c.slice) { - return c.slice[skip:], nil - } - return search.DocumentMatchCollection{}, nil -} - -func (c *collectStoreSlice) len() int { - return len(c.slice) -} diff --git a/vendor/github.com/blevesearch/bleve/search/collector/topn.go b/vendor/github.com/blevesearch/bleve/search/collector/topn.go deleted file mode 100644 index 8d4afb6..0000000 --- a/vendor/github.com/blevesearch/bleve/search/collector/topn.go +++ /dev/null @@ -1,412 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package collector - -import ( - "context" - "reflect" - "strconv" - "time" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/size" -) - -var reflectStaticSizeTopNCollector int - -func init() { - var coll TopNCollector - reflectStaticSizeTopNCollector = int(reflect.TypeOf(coll).Size()) -} - -type collectorStore interface { - // Add the document, and if the new store size exceeds the provided size - // the last element is removed and returned. If the size has not been - // exceeded, nil is returned. - AddNotExceedingSize(doc *search.DocumentMatch, size int) *search.DocumentMatch - - Final(skip int, fixup collectorFixup) (search.DocumentMatchCollection, error) -} - -// PreAllocSizeSkipCap will cap preallocation to this amount when -// size+skip exceeds this value -var PreAllocSizeSkipCap = 1000 - -type collectorCompare func(i, j *search.DocumentMatch) int - -type collectorFixup func(d *search.DocumentMatch) error - -// TopNCollector collects the top N hits, optionally skipping some results -type TopNCollector struct { - size int - skip int - total uint64 - maxScore float64 - took time.Duration - sort search.SortOrder - results search.DocumentMatchCollection - facetsBuilder *search.FacetsBuilder - - store collectorStore - - needDocIds bool - neededFields []string - cachedScoring []bool - cachedDesc []bool - - lowestMatchOutsideResults *search.DocumentMatch - updateFieldVisitor index.DocumentFieldTermVisitor - dvReader index.DocValueReader - searchAfter *search.DocumentMatch -} - -// CheckDoneEvery controls how frequently we check the context deadline -const CheckDoneEvery = uint64(1024) - -// NewTopNCollector builds a collector to find the top 'size' hits -// skipping over the first 'skip' hits -// ordering hits by the provided sort order -func NewTopNCollector(size int, skip int, sort search.SortOrder) *TopNCollector { - return newTopNCollector(size, skip, sort) -} - -// NewTopNCollector builds a collector to find the top 'size' hits -// skipping over the first 'skip' hits -// ordering hits by the provided sort order -func NewTopNCollectorAfter(size int, sort search.SortOrder, after []string) *TopNCollector { - rv := newTopNCollector(size, 0, sort) - rv.searchAfter = &search.DocumentMatch{ - Sort: after, - } - - for pos, ss := range sort { - if ss.RequiresDocID() { - rv.searchAfter.ID = after[pos] - } - if ss.RequiresScoring() { - if score, err := strconv.ParseFloat(after[pos], 64); err == nil { - rv.searchAfter.Score = score - } - } - } - - return rv -} - -func newTopNCollector(size int, skip int, sort search.SortOrder) *TopNCollector { - hc := &TopNCollector{size: size, skip: skip, sort: sort} - - // pre-allocate space on the store to avoid reslicing - // unless the size + skip is too large, then cap it - // everything should still work, just reslices as necessary - backingSize := size + skip + 1 - if size+skip > PreAllocSizeSkipCap { - backingSize = PreAllocSizeSkipCap + 1 - } - - if size+skip > 10 { - hc.store = newStoreHeap(backingSize, func(i, j *search.DocumentMatch) int { - return hc.sort.Compare(hc.cachedScoring, hc.cachedDesc, i, j) - }) - } else { - hc.store = newStoreSlice(backingSize, func(i, j *search.DocumentMatch) int { - return hc.sort.Compare(hc.cachedScoring, hc.cachedDesc, i, j) - }) - } - - // these lookups traverse an interface, so do once up-front - if sort.RequiresDocID() { - hc.needDocIds = true - } - hc.neededFields = sort.RequiredFields() - hc.cachedScoring = sort.CacheIsScore() - hc.cachedDesc = sort.CacheDescending() - - return hc -} - -func (hc *TopNCollector) Size() int { - sizeInBytes := reflectStaticSizeTopNCollector + size.SizeOfPtr - - if hc.facetsBuilder != nil { - sizeInBytes += hc.facetsBuilder.Size() - } - - for _, entry := range hc.neededFields { - sizeInBytes += len(entry) + size.SizeOfString - } - - sizeInBytes += len(hc.cachedScoring) + len(hc.cachedDesc) - - return sizeInBytes -} - -// Collect goes to the index to find the matching documents -func (hc *TopNCollector) Collect(ctx context.Context, searcher search.Searcher, reader index.IndexReader) error { - startTime := time.Now() - var err error - var next *search.DocumentMatch - - // pre-allocate enough space in the DocumentMatchPool - // unless the size + skip is too large, then cap it - // everything should still work, just allocates DocumentMatches on demand - backingSize := hc.size + hc.skip + 1 - if hc.size+hc.skip > PreAllocSizeSkipCap { - backingSize = PreAllocSizeSkipCap + 1 - } - searchContext := &search.SearchContext{ - DocumentMatchPool: search.NewDocumentMatchPool(backingSize+searcher.DocumentMatchPoolSize(), len(hc.sort)), - Collector: hc, - IndexReader: reader, - } - - hc.dvReader, err = reader.DocValueReader(hc.neededFields) - if err != nil { - return err - } - - hc.updateFieldVisitor = func(field string, term []byte) { - if hc.facetsBuilder != nil { - hc.facetsBuilder.UpdateVisitor(field, term) - } - hc.sort.UpdateVisitor(field, term) - } - - dmHandlerMaker := MakeTopNDocumentMatchHandler - if cv := ctx.Value(search.MakeDocumentMatchHandlerKey); cv != nil { - dmHandlerMaker = cv.(search.MakeDocumentMatchHandler) - } - // use the application given builder for making the custom document match - // handler and perform callbacks/invocations on the newly made handler. - dmHandler, loadID, err := dmHandlerMaker(searchContext) - if err != nil { - return err - } - - hc.needDocIds = hc.needDocIds || loadID - - select { - case <-ctx.Done(): - return ctx.Err() - default: - next, err = searcher.Next(searchContext) - } - for err == nil && next != nil { - if hc.total%CheckDoneEvery == 0 { - select { - case <-ctx.Done(): - return ctx.Err() - default: - } - } - - err = hc.prepareDocumentMatch(searchContext, reader, next) - if err != nil { - break - } - - err = dmHandler(next) - if err != nil { - break - } - - next, err = searcher.Next(searchContext) - } - - // help finalize/flush the results in case - // of custom document match handlers. - err = dmHandler(nil) - if err != nil { - return err - } - - // compute search duration - hc.took = time.Since(startTime) - if err != nil { - return err - } - // finalize actual results - err = hc.finalizeResults(reader) - if err != nil { - return err - } - return nil -} - -var sortByScoreOpt = []string{"_score"} - -func (hc *TopNCollector) prepareDocumentMatch(ctx *search.SearchContext, - reader index.IndexReader, d *search.DocumentMatch) (err error) { - - // visit field terms for features that require it (sort, facets) - if len(hc.neededFields) > 0 { - err = hc.visitFieldTerms(reader, d) - if err != nil { - return err - } - } - - // increment total hits - hc.total++ - d.HitNumber = hc.total - - // update max score - if d.Score > hc.maxScore { - hc.maxScore = d.Score - } - - // see if we need to load ID (at this early stage, for example to sort on it) - if hc.needDocIds { - d.ID, err = reader.ExternalID(d.IndexInternalID) - if err != nil { - return err - } - } - - // compute this hits sort value - if len(hc.sort) == 1 && hc.cachedScoring[0] { - d.Sort = sortByScoreOpt - } else { - hc.sort.Value(d) - } - - return nil -} - -func MakeTopNDocumentMatchHandler( - ctx *search.SearchContext) (search.DocumentMatchHandler, bool, error) { - var hc *TopNCollector - var ok bool - if hc, ok = ctx.Collector.(*TopNCollector); ok { - return func(d *search.DocumentMatch) error { - if d == nil { - return nil - } - - // support search after based pagination, - // if this hit is <= the search after sort key - // we should skip it - if hc.searchAfter != nil { - // exact sort order matches use hit number to break tie - // but we want to allow for exact match, so we pretend - hc.searchAfter.HitNumber = d.HitNumber - if hc.sort.Compare(hc.cachedScoring, hc.cachedDesc, d, hc.searchAfter) <= 0 { - return nil - } - } - - // optimization, we track lowest sorting hit already removed from heap - // with this one comparison, we can avoid all heap operations if - // this hit would have been added and then immediately removed - if hc.lowestMatchOutsideResults != nil { - cmp := hc.sort.Compare(hc.cachedScoring, hc.cachedDesc, d, - hc.lowestMatchOutsideResults) - if cmp >= 0 { - // this hit can't possibly be in the result set, so avoid heap ops - ctx.DocumentMatchPool.Put(d) - return nil - } - } - - removed := hc.store.AddNotExceedingSize(d, hc.size+hc.skip) - if removed != nil { - if hc.lowestMatchOutsideResults == nil { - hc.lowestMatchOutsideResults = removed - } else { - cmp := hc.sort.Compare(hc.cachedScoring, hc.cachedDesc, - removed, hc.lowestMatchOutsideResults) - if cmp < 0 { - tmp := hc.lowestMatchOutsideResults - hc.lowestMatchOutsideResults = removed - ctx.DocumentMatchPool.Put(tmp) - } - } - } - return nil - }, false, nil - } - return nil, false, nil -} - -// visitFieldTerms is responsible for visiting the field terms of the -// search hit, and passing visited terms to the sort and facet builder -func (hc *TopNCollector) visitFieldTerms(reader index.IndexReader, d *search.DocumentMatch) error { - if hc.facetsBuilder != nil { - hc.facetsBuilder.StartDoc() - } - - err := hc.dvReader.VisitDocValues(d.IndexInternalID, hc.updateFieldVisitor) - if hc.facetsBuilder != nil { - hc.facetsBuilder.EndDoc() - } - - return err -} - -// SetFacetsBuilder registers a facet builder for this collector -func (hc *TopNCollector) SetFacetsBuilder(facetsBuilder *search.FacetsBuilder) { - hc.facetsBuilder = facetsBuilder - hc.neededFields = append(hc.neededFields, hc.facetsBuilder.RequiredFields()...) -} - -// finalizeResults starts with the heap containing the final top size+skip -// it now throws away the results to be skipped -// and does final doc id lookup (if necessary) -func (hc *TopNCollector) finalizeResults(r index.IndexReader) error { - var err error - hc.results, err = hc.store.Final(hc.skip, func(doc *search.DocumentMatch) error { - if doc.ID == "" { - // look up the id since we need it for lookup - var err error - doc.ID, err = r.ExternalID(doc.IndexInternalID) - if err != nil { - return err - } - } - doc.Complete(nil) - return nil - }) - - return err -} - -// Results returns the collected hits -func (hc *TopNCollector) Results() search.DocumentMatchCollection { - return hc.results -} - -// Total returns the total number of hits -func (hc *TopNCollector) Total() uint64 { - return hc.total -} - -// MaxScore returns the maximum score seen across all the hits -func (hc *TopNCollector) MaxScore() float64 { - return hc.maxScore -} - -// Took returns the time spent collecting hits -func (hc *TopNCollector) Took() time.Duration { - return hc.took -} - -// FacetResults returns the computed facets results -func (hc *TopNCollector) FacetResults() search.FacetResults { - if hc.facetsBuilder != nil { - return hc.facetsBuilder.Results() - } - return nil -} diff --git a/vendor/github.com/blevesearch/bleve/search/collector/heap.go b/vendor/github.com/blevesearch/bleve/search/collectors/heap.go similarity index 50% rename from vendor/github.com/blevesearch/bleve/search/collector/heap.go rename to vendor/github.com/blevesearch/bleve/search/collectors/heap.go index 05502d5..3f62867 100644 --- a/vendor/github.com/blevesearch/bleve/search/collector/heap.go +++ b/vendor/github.com/blevesearch/bleve/search/collectors/heap.go @@ -1,18 +1,13 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. -package collector +package collectors import ( "container/heap" @@ -25,29 +20,20 @@ type collectStoreHeap struct { compare collectorCompare } -func newStoreHeap(capacity int, compare collectorCompare) *collectStoreHeap { +func newStoreHeap(cap int, compare collectorCompare) *collectStoreHeap { rv := &collectStoreHeap{ - heap: make(search.DocumentMatchCollection, 0, capacity), + heap: make(search.DocumentMatchCollection, 0, cap), compare: compare, } heap.Init(rv) return rv } -func (c *collectStoreHeap) AddNotExceedingSize(doc *search.DocumentMatch, - size int) *search.DocumentMatch { - c.add(doc) - if c.Len() > size { - return c.removeLast() - } - return nil -} - -func (c *collectStoreHeap) add(doc *search.DocumentMatch) { +func (c *collectStoreHeap) Add(doc *search.DocumentMatch) { heap.Push(c, doc) } -func (c *collectStoreHeap) removeLast() *search.DocumentMatch { +func (c *collectStoreHeap) RemoveLast() *search.DocumentMatch { return heap.Pop(c).(*search.DocumentMatch) } @@ -58,12 +44,17 @@ func (c *collectStoreHeap) Final(skip int, fixup collectorFixup) (search.Documen return make(search.DocumentMatchCollection, 0), nil } rv := make(search.DocumentMatchCollection, size) - for i := size - 1; i >= 0; i-- { - doc := heap.Pop(c).(*search.DocumentMatch) - rv[i] = doc - err := fixup(doc) - if err != nil { - return nil, err + for count > 0 { + count-- + + if count >= skip { + size-- + doc := heap.Pop(c).(*search.DocumentMatch) + rv[size] = doc + err := fixup(doc) + if err != nil { + return nil, err + } } } return rv, nil diff --git a/vendor/github.com/blevesearch/bleve/search/collector/list.go b/vendor/github.com/blevesearch/bleve/search/collectors/list.go similarity index 53% rename from vendor/github.com/blevesearch/bleve/search/collector/list.go rename to vendor/github.com/blevesearch/bleve/search/collectors/list.go index f01d205..d3f4941 100644 --- a/vendor/github.com/blevesearch/bleve/search/collector/list.go +++ b/vendor/github.com/blevesearch/bleve/search/collectors/list.go @@ -1,18 +1,13 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. -package collector +package collectors import ( "container/list" @@ -25,7 +20,7 @@ type collectStoreList struct { compare collectorCompare } -func newStoreList(capacity int, compare collectorCompare) *collectStoreList { +func newStoreList(cap int, compare collectorCompare) *collectStoreList { rv := &collectStoreList{ results: list.New(), compare: compare, @@ -34,15 +29,7 @@ func newStoreList(capacity int, compare collectorCompare) *collectStoreList { return rv } -func (c *collectStoreList) AddNotExceedingSize(doc *search.DocumentMatch, size int) *search.DocumentMatch { - c.add(doc) - if c.len() > size { - return c.removeLast() - } - return nil -} - -func (c *collectStoreList) add(doc *search.DocumentMatch) { +func (c *collectStoreList) Add(doc *search.DocumentMatch) { for e := c.results.Front(); e != nil; e = e.Next() { curr := e.Value.(*search.DocumentMatch) if c.compare(doc, curr) >= 0 { @@ -54,7 +41,7 @@ func (c *collectStoreList) add(doc *search.DocumentMatch) { c.results.PushBack(doc) } -func (c *collectStoreList) removeLast() *search.DocumentMatch { +func (c *collectStoreList) RemoveLast() *search.DocumentMatch { return c.results.Remove(c.results.Front()).(*search.DocumentMatch) } @@ -81,6 +68,6 @@ func (c *collectStoreList) Final(skip int, fixup collectorFixup) (search.Documen return search.DocumentMatchCollection{}, nil } -func (c *collectStoreList) len() int { +func (c *collectStoreList) Len() int { return c.results.Len() } diff --git a/vendor/github.com/blevesearch/bleve/search/collectors/slice.go b/vendor/github.com/blevesearch/bleve/search/collectors/slice.go new file mode 100644 index 0000000..26b29c7 --- /dev/null +++ b/vendor/github.com/blevesearch/bleve/search/collectors/slice.go @@ -0,0 +1,63 @@ +// Copyright (c) 2014 Couchbase, Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. + +package collectors + +import "github.com/blevesearch/bleve/search" + +type collectStoreSlice struct { + slice search.DocumentMatchCollection + compare collectorCompare +} + +func newStoreSlice(cap int, compare collectorCompare) *collectStoreSlice { + rv := &collectStoreSlice{ + slice: make(search.DocumentMatchCollection, 0, cap), + compare: compare, + } + return rv +} + +func (c *collectStoreSlice) Add(doc *search.DocumentMatch) { + // find where to insert, starting at end (lowest) + i := len(c.slice) + for ; i > 0; i-- { + cmp := c.compare(doc, c.slice[i-1]) + if cmp >= 0 { + break + } + } + // insert at i + c.slice = append(c.slice, nil) + copy(c.slice[i+1:], c.slice[i:]) + c.slice[i] = doc +} + +func (c *collectStoreSlice) RemoveLast() *search.DocumentMatch { + var rv *search.DocumentMatch + rv, c.slice = c.slice[len(c.slice)-1], c.slice[:len(c.slice)-1] + return rv +} + +func (c *collectStoreSlice) Final(skip int, fixup collectorFixup) (search.DocumentMatchCollection, error) { + for i := skip; i < len(c.slice); i++ { + err := fixup(c.slice[i]) + if err != nil { + return nil, err + } + } + if skip <= len(c.slice) { + return c.slice[skip:], nil + } + return search.DocumentMatchCollection{}, nil +} + +func (c *collectStoreSlice) Len() int { + return len(c.slice) +} diff --git a/vendor/github.com/blevesearch/bleve/search/collectors/topn.go b/vendor/github.com/blevesearch/bleve/search/collectors/topn.go new file mode 100644 index 0000000..4c5a566 --- /dev/null +++ b/vendor/github.com/blevesearch/bleve/search/collectors/topn.go @@ -0,0 +1,264 @@ +// Copyright (c) 2014 Couchbase, Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. + +package collectors + +import ( + "time" + + "github.com/blevesearch/bleve/index" + "github.com/blevesearch/bleve/search" + "golang.org/x/net/context" +) + +// PreAllocSizeSkipCap will cap preallocation to this amount when +// size+skip exceeds this value +var PreAllocSizeSkipCap = 1000 + +type collectorCompare func(i, j *search.DocumentMatch) int + +type collectorFixup func(d *search.DocumentMatch) error + +// TopNCollector collects the top N hits, optionally skipping some results +type TopNCollector struct { + size int + skip int + total uint64 + maxScore float64 + took time.Duration + sort search.SortOrder + results search.DocumentMatchCollection + facetsBuilder *search.FacetsBuilder + + store *collectStoreSlice + + needDocIds bool + neededFields []string + cachedScoring []bool + cachedDesc []bool + + lowestMatchOutsideResults *search.DocumentMatch +} + +// CheckDoneEvery controls how frequently we check the context deadline +const CheckDoneEvery = uint64(1024) + +// NewTopNCollector builds a collector to find the top 'size' hits +// skipping over the first 'skip' hits +// ordering hits by the provided sort order +func NewTopNCollector(size int, skip int, sort search.SortOrder) *TopNCollector { + hc := &TopNCollector{size: size, skip: skip, sort: sort} + + // pre-allocate space on the store to avoid reslicing + // unless the size + skip is too large, then cap it + // everything should still work, just reslices as necessary + backingSize := size + skip + 1 + if size+skip > PreAllocSizeSkipCap { + backingSize = PreAllocSizeSkipCap + 1 + } + + hc.store = newStoreSlice(backingSize, func(i, j *search.DocumentMatch) int { + return hc.sort.Compare(hc.cachedScoring, hc.cachedDesc, i, j) + }) + + // these lookups traverse an interface, so do once up-front + if sort.RequiresDocID() { + hc.needDocIds = true + } + hc.neededFields = sort.RequiredFields() + hc.cachedScoring = sort.CacheIsScore() + hc.cachedDesc = sort.CacheDescending() + + return hc +} + +// Collect goes to the index to find the matching documents +func (hc *TopNCollector) Collect(ctx context.Context, searcher search.Searcher, reader index.IndexReader) error { + startTime := time.Now() + var err error + var next *search.DocumentMatch + + // pre-allocate enough space in the DocumentMatchPool + // unless the size + skip is too large, then cap it + // everything should still work, just allocates DocumentMatches on demand + backingSize := hc.size + hc.skip + 1 + if hc.size+hc.skip > PreAllocSizeSkipCap { + backingSize = PreAllocSizeSkipCap + 1 + } + searchContext := &search.SearchContext{ + DocumentMatchPool: search.NewDocumentMatchPool(backingSize+searcher.DocumentMatchPoolSize(), len(hc.sort)), + } + + select { + case <-ctx.Done(): + return ctx.Err() + default: + next, err = searcher.Next(searchContext) + } + for err == nil && next != nil { + if hc.total%CheckDoneEvery == 0 { + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + } + if hc.facetsBuilder != nil { + err = hc.facetsBuilder.Update(next) + if err != nil { + break + } + } + + err = hc.collectSingle(searchContext, reader, next) + if err != nil { + break + } + + next, err = searcher.Next(searchContext) + } + // compute search duration + hc.took = time.Since(startTime) + if err != nil { + return err + } + // finalize actual results + err = hc.finalizeResults(reader) + if err != nil { + return err + } + return nil +} + +var sortByScoreOpt = []string{"_score"} + +func (hc *TopNCollector) collectSingle(ctx *search.SearchContext, reader index.IndexReader, d *search.DocumentMatch) error { + // increment total hits + hc.total++ + d.HitNumber = hc.total + + // update max score + if d.Score > hc.maxScore { + hc.maxScore = d.Score + } + + var err error + // see if we need to load ID (at this early stage, for example to sort on it) + if hc.needDocIds { + d.ID, err = reader.ExternalID(d.IndexInternalID) + if err != nil { + return err + } + } + + // see if we need to load the stored fields + if len(hc.neededFields) > 0 { + // find out which fields haven't been loaded yet + fieldsToLoad := d.CachedFieldTerms.FieldsNotYetCached(hc.neededFields) + // look them up + fieldTerms, err := reader.DocumentFieldTerms(d.IndexInternalID, fieldsToLoad) + if err != nil { + return err + } + // cache these as well + if d.CachedFieldTerms == nil { + d.CachedFieldTerms = make(map[string][]string) + } + d.CachedFieldTerms.Merge(fieldTerms) + } + + // compute this hits sort value + if len(hc.sort) == 1 && hc.cachedScoring[0] { + d.Sort = sortByScoreOpt + } else { + hc.sort.Value(d) + } + + // optimization, we track lowest sorting hit already removed from heap + // with this one comparision, we can avoid all heap operations if + // this hit would have been added and then immediately removed + if hc.lowestMatchOutsideResults != nil { + cmp := hc.sort.Compare(hc.cachedScoring, hc.cachedDesc, d, hc.lowestMatchOutsideResults) + if cmp >= 0 { + // this hit can't possibly be in the result set, so avoid heap ops + ctx.DocumentMatchPool.Put(d) + return nil + } + } + + hc.store.Add(d) + if hc.store.Len() > hc.size+hc.skip { + removed := hc.store.RemoveLast() + if hc.lowestMatchOutsideResults == nil { + hc.lowestMatchOutsideResults = removed + } else { + cmp := hc.sort.Compare(hc.cachedScoring, hc.cachedDesc, removed, hc.lowestMatchOutsideResults) + if cmp < 0 { + tmp := hc.lowestMatchOutsideResults + hc.lowestMatchOutsideResults = removed + ctx.DocumentMatchPool.Put(tmp) + } + } + } + + return nil +} + +// SetFacetsBuilder registers a facet builder for this collector +func (hc *TopNCollector) SetFacetsBuilder(facetsBuilder *search.FacetsBuilder) { + hc.facetsBuilder = facetsBuilder +} + +// finalizeResults starts with the heap containing the final top size+skip +// it now throws away the results to be skipped +// and does final doc id lookup (if necessary) +func (hc *TopNCollector) finalizeResults(r index.IndexReader) error { + var err error + hc.results, err = hc.store.Final(hc.skip, func(doc *search.DocumentMatch) error { + if doc.ID == "" { + // look up the id since we need it for lookup + var err error + doc.ID, err = r.ExternalID(doc.IndexInternalID) + if err != nil { + return err + } + } + return nil + }) + + return err +} + +// Results returns the collected hits +func (hc *TopNCollector) Results() search.DocumentMatchCollection { + return hc.results +} + +// Total returns the total number of hits +func (hc *TopNCollector) Total() uint64 { + return hc.total +} + +// MaxScore returns the maximum score seen across all the hits +func (hc *TopNCollector) MaxScore() float64 { + return hc.maxScore +} + +// Took returns the time spent collecting hits +func (hc *TopNCollector) Took() time.Duration { + return hc.took +} + +// FacetResults returns the computed facets results +func (hc *TopNCollector) FacetResults() search.FacetResults { + if hc.facetsBuilder != nil { + return hc.facetsBuilder.Results() + } + return search.FacetResults{} +} diff --git a/vendor/github.com/blevesearch/bleve/search/explanation.go b/vendor/github.com/blevesearch/bleve/search/explanation.go index 3b81737..fe2d587 100644 --- a/vendor/github.com/blevesearch/bleve/search/explanation.go +++ b/vendor/github.com/blevesearch/bleve/search/explanation.go @@ -1,34 +1,19 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. package search import ( "encoding/json" "fmt" - "reflect" - - "github.com/blevesearch/bleve/size" ) -var reflectStaticSizeExplanation int - -func init() { - var e Explanation - reflectStaticSizeExplanation = int(reflect.TypeOf(e).Size()) -} - type Explanation struct { Value float64 `json:"value"` Message string `json:"message"` @@ -42,14 +27,3 @@ func (expl *Explanation) String() string { } return string(js) } - -func (expl *Explanation) Size() int { - sizeInBytes := reflectStaticSizeExplanation + size.SizeOfPtr + - len(expl.Message) - - for _, entry := range expl.Children { - sizeInBytes += entry.Size() - } - - return sizeInBytes -} diff --git a/vendor/github.com/blevesearch/bleve/search/facet/facet_builder_datetime.go b/vendor/github.com/blevesearch/bleve/search/facet/facet_builder_datetime.go deleted file mode 100644 index c45442e..0000000 --- a/vendor/github.com/blevesearch/bleve/search/facet/facet_builder_datetime.go +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package facet - -import ( - "reflect" - "sort" - "time" - - "github.com/blevesearch/bleve/numeric" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/size" -) - -var reflectStaticSizeDateTimeFacetBuilder int -var reflectStaticSizedateTimeRange int - -func init() { - var dtfb DateTimeFacetBuilder - reflectStaticSizeDateTimeFacetBuilder = int(reflect.TypeOf(dtfb).Size()) - var dtr dateTimeRange - reflectStaticSizedateTimeRange = int(reflect.TypeOf(dtr).Size()) -} - -type dateTimeRange struct { - start time.Time - end time.Time -} - -type DateTimeFacetBuilder struct { - size int - field string - termsCount map[string]int - total int - missing int - ranges map[string]*dateTimeRange - sawValue bool -} - -func NewDateTimeFacetBuilder(field string, size int) *DateTimeFacetBuilder { - return &DateTimeFacetBuilder{ - size: size, - field: field, - termsCount: make(map[string]int), - ranges: make(map[string]*dateTimeRange, 0), - } -} - -func (fb *DateTimeFacetBuilder) Size() int { - sizeInBytes := reflectStaticSizeDateTimeFacetBuilder + size.SizeOfPtr + - len(fb.field) - - for k, _ := range fb.termsCount { - sizeInBytes += size.SizeOfString + len(k) + - size.SizeOfInt - } - - for k, _ := range fb.ranges { - sizeInBytes += size.SizeOfString + len(k) + - size.SizeOfPtr + reflectStaticSizedateTimeRange - } - - return sizeInBytes -} - -func (fb *DateTimeFacetBuilder) AddRange(name string, start, end time.Time) { - r := dateTimeRange{ - start: start, - end: end, - } - fb.ranges[name] = &r -} - -func (fb *DateTimeFacetBuilder) Field() string { - return fb.field -} - -func (fb *DateTimeFacetBuilder) UpdateVisitor(field string, term []byte) { - if field == fb.field { - fb.sawValue = true - // only consider the values which are shifted 0 - prefixCoded := numeric.PrefixCoded(term) - shift, err := prefixCoded.Shift() - if err == nil && shift == 0 { - i64, err := prefixCoded.Int64() - if err == nil { - t := time.Unix(0, i64) - - // look at each of the ranges for a match - for rangeName, r := range fb.ranges { - if (r.start.IsZero() || t.After(r.start) || t.Equal(r.start)) && (r.end.IsZero() || t.Before(r.end)) { - fb.termsCount[rangeName] = fb.termsCount[rangeName] + 1 - fb.total++ - } - } - } - } - } -} - -func (fb *DateTimeFacetBuilder) StartDoc() { - fb.sawValue = false -} - -func (fb *DateTimeFacetBuilder) EndDoc() { - if !fb.sawValue { - fb.missing++ - } -} - -func (fb *DateTimeFacetBuilder) Result() *search.FacetResult { - rv := search.FacetResult{ - Field: fb.field, - Total: fb.total, - Missing: fb.missing, - } - - rv.DateRanges = make([]*search.DateRangeFacet, 0, len(fb.termsCount)) - - for term, count := range fb.termsCount { - dateRange := fb.ranges[term] - tf := &search.DateRangeFacet{ - Name: term, - Count: count, - } - if !dateRange.start.IsZero() { - start := dateRange.start.Format(time.RFC3339Nano) - tf.Start = &start - } - if !dateRange.end.IsZero() { - end := dateRange.end.Format(time.RFC3339Nano) - tf.End = &end - } - rv.DateRanges = append(rv.DateRanges, tf) - } - - sort.Sort(rv.DateRanges) - - // we now have the list of the top N facets - if fb.size < len(rv.DateRanges) { - rv.DateRanges = rv.DateRanges[:fb.size] - } - - notOther := 0 - for _, nr := range rv.DateRanges { - notOther += nr.Count - } - rv.Other = fb.total - notOther - - return &rv -} diff --git a/vendor/github.com/blevesearch/bleve/search/facet/facet_builder_numeric.go b/vendor/github.com/blevesearch/bleve/search/facet/facet_builder_numeric.go deleted file mode 100644 index c1692b5..0000000 --- a/vendor/github.com/blevesearch/bleve/search/facet/facet_builder_numeric.go +++ /dev/null @@ -1,157 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package facet - -import ( - "reflect" - "sort" - - "github.com/blevesearch/bleve/numeric" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/size" -) - -var reflectStaticSizeNumericFacetBuilder int -var reflectStaticSizenumericRange int - -func init() { - var nfb NumericFacetBuilder - reflectStaticSizeNumericFacetBuilder = int(reflect.TypeOf(nfb).Size()) - var nr numericRange - reflectStaticSizenumericRange = int(reflect.TypeOf(nr).Size()) -} - -type numericRange struct { - min *float64 - max *float64 -} - -type NumericFacetBuilder struct { - size int - field string - termsCount map[string]int - total int - missing int - ranges map[string]*numericRange - sawValue bool -} - -func NewNumericFacetBuilder(field string, size int) *NumericFacetBuilder { - return &NumericFacetBuilder{ - size: size, - field: field, - termsCount: make(map[string]int), - ranges: make(map[string]*numericRange, 0), - } -} - -func (fb *NumericFacetBuilder) Size() int { - sizeInBytes := reflectStaticSizeNumericFacetBuilder + size.SizeOfPtr + - len(fb.field) - - for k, _ := range fb.termsCount { - sizeInBytes += size.SizeOfString + len(k) + - size.SizeOfInt - } - - for k, _ := range fb.ranges { - sizeInBytes += size.SizeOfString + len(k) + - size.SizeOfPtr + reflectStaticSizenumericRange - } - - return sizeInBytes -} - -func (fb *NumericFacetBuilder) AddRange(name string, min, max *float64) { - r := numericRange{ - min: min, - max: max, - } - fb.ranges[name] = &r -} - -func (fb *NumericFacetBuilder) Field() string { - return fb.field -} - -func (fb *NumericFacetBuilder) UpdateVisitor(field string, term []byte) { - if field == fb.field { - fb.sawValue = true - // only consider the values which are shifted 0 - prefixCoded := numeric.PrefixCoded(term) - shift, err := prefixCoded.Shift() - if err == nil && shift == 0 { - i64, err := prefixCoded.Int64() - if err == nil { - f64 := numeric.Int64ToFloat64(i64) - - // look at each of the ranges for a match - for rangeName, r := range fb.ranges { - if (r.min == nil || f64 >= *r.min) && (r.max == nil || f64 < *r.max) { - fb.termsCount[rangeName] = fb.termsCount[rangeName] + 1 - fb.total++ - } - } - } - } - } -} - -func (fb *NumericFacetBuilder) StartDoc() { - fb.sawValue = false -} - -func (fb *NumericFacetBuilder) EndDoc() { - if !fb.sawValue { - fb.missing++ - } -} - -func (fb *NumericFacetBuilder) Result() *search.FacetResult { - rv := search.FacetResult{ - Field: fb.field, - Total: fb.total, - Missing: fb.missing, - } - - rv.NumericRanges = make([]*search.NumericRangeFacet, 0, len(fb.termsCount)) - - for term, count := range fb.termsCount { - numericRange := fb.ranges[term] - tf := &search.NumericRangeFacet{ - Name: term, - Count: count, - Min: numericRange.min, - Max: numericRange.max, - } - - rv.NumericRanges = append(rv.NumericRanges, tf) - } - - sort.Sort(rv.NumericRanges) - - // we now have the list of the top N facets - if fb.size < len(rv.NumericRanges) { - rv.NumericRanges = rv.NumericRanges[:fb.size] - } - - notOther := 0 - for _, nr := range rv.NumericRanges { - notOther += nr.Count - } - rv.Other = fb.total - notOther - - return &rv -} diff --git a/vendor/github.com/blevesearch/bleve/search/facet/facet_builder_terms.go b/vendor/github.com/blevesearch/bleve/search/facet/facet_builder_terms.go deleted file mode 100644 index 5b5901e..0000000 --- a/vendor/github.com/blevesearch/bleve/search/facet/facet_builder_terms.go +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package facet - -import ( - "reflect" - "sort" - - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/size" -) - -var reflectStaticSizeTermsFacetBuilder int - -func init() { - var tfb TermsFacetBuilder - reflectStaticSizeTermsFacetBuilder = int(reflect.TypeOf(tfb).Size()) -} - -type TermsFacetBuilder struct { - size int - field string - termsCount map[string]int - total int - missing int - sawValue bool -} - -func NewTermsFacetBuilder(field string, size int) *TermsFacetBuilder { - return &TermsFacetBuilder{ - size: size, - field: field, - termsCount: make(map[string]int), - } -} - -func (fb *TermsFacetBuilder) Size() int { - sizeInBytes := reflectStaticSizeTermsFacetBuilder + size.SizeOfPtr + - len(fb.field) - - for k, _ := range fb.termsCount { - sizeInBytes += size.SizeOfString + len(k) + - size.SizeOfInt - } - - return sizeInBytes -} - -func (fb *TermsFacetBuilder) Field() string { - return fb.field -} - -func (fb *TermsFacetBuilder) UpdateVisitor(field string, term []byte) { - if field == fb.field { - fb.sawValue = true - fb.termsCount[string(term)] = fb.termsCount[string(term)] + 1 - fb.total++ - } -} - -func (fb *TermsFacetBuilder) StartDoc() { - fb.sawValue = false -} - -func (fb *TermsFacetBuilder) EndDoc() { - if !fb.sawValue { - fb.missing++ - } -} - -func (fb *TermsFacetBuilder) Result() *search.FacetResult { - rv := search.FacetResult{ - Field: fb.field, - Total: fb.total, - Missing: fb.missing, - } - - rv.Terms = make([]*search.TermFacet, 0, len(fb.termsCount)) - - for term, count := range fb.termsCount { - tf := &search.TermFacet{ - Term: term, - Count: count, - } - - rv.Terms = append(rv.Terms, tf) - } - - sort.Sort(rv.Terms) - - // we now have the list of the top N facets - trimTopN := fb.size - if trimTopN > len(rv.Terms) { - trimTopN = len(rv.Terms) - } - rv.Terms = rv.Terms[:trimTopN] - - notOther := 0 - for _, tf := range rv.Terms { - notOther += tf.Count - } - rv.Other = fb.total - notOther - - return &rv -} diff --git a/vendor/github.com/blevesearch/bleve/search/facet/benchmark_data.txt b/vendor/github.com/blevesearch/bleve/search/facets/benchmark_data.txt similarity index 100% rename from vendor/github.com/blevesearch/bleve/search/facet/benchmark_data.txt rename to vendor/github.com/blevesearch/bleve/search/facets/benchmark_data.txt diff --git a/vendor/github.com/blevesearch/bleve/search/facets/facet_builder_datetime.go b/vendor/github.com/blevesearch/bleve/search/facets/facet_builder_datetime.go new file mode 100644 index 0000000..7e94d52 --- /dev/null +++ b/vendor/github.com/blevesearch/bleve/search/facets/facet_builder_datetime.go @@ -0,0 +1,130 @@ +// Copyright (c) 2014 Couchbase, Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. + +package facets + +import ( + "sort" + "time" + + "github.com/blevesearch/bleve/index" + "github.com/blevesearch/bleve/numeric_util" + "github.com/blevesearch/bleve/search" +) + +type dateTimeRange struct { + start time.Time + end time.Time +} + +type DateTimeFacetBuilder struct { + size int + field string + termsCount map[string]int + total int + missing int + ranges map[string]*dateTimeRange +} + +func NewDateTimeFacetBuilder(field string, size int) *DateTimeFacetBuilder { + return &DateTimeFacetBuilder{ + size: size, + field: field, + termsCount: make(map[string]int), + ranges: make(map[string]*dateTimeRange, 0), + } +} + +func (fb *DateTimeFacetBuilder) AddRange(name string, start, end time.Time) { + r := dateTimeRange{ + start: start, + end: end, + } + fb.ranges[name] = &r +} + +func (fb *DateTimeFacetBuilder) Field() string { + return fb.field +} + +func (fb *DateTimeFacetBuilder) Update(ft index.FieldTerms) { + terms, ok := ft[fb.field] + if ok { + for _, term := range terms { + // only consider the values which are shifted 0 + prefixCoded := numeric_util.PrefixCoded(term) + shift, err := prefixCoded.Shift() + if err == nil && shift == 0 { + i64, err := prefixCoded.Int64() + if err == nil { + t := time.Unix(0, i64) + + // look at each of the ranges for a match + for rangeName, r := range fb.ranges { + + if (r.start.IsZero() || t.After(r.start) || t.Equal(r.start)) && (r.end.IsZero() || t.Before(r.end)) { + + existingCount, existed := fb.termsCount[rangeName] + if existed { + fb.termsCount[rangeName] = existingCount + 1 + } else { + fb.termsCount[rangeName] = 1 + } + fb.total++ + } + } + } + } + } + } else { + fb.missing++ + } +} + +func (fb *DateTimeFacetBuilder) Result() *search.FacetResult { + rv := search.FacetResult{ + Field: fb.field, + Total: fb.total, + Missing: fb.missing, + } + + rv.DateRanges = make([]*search.DateRangeFacet, 0, len(fb.termsCount)) + + for term, count := range fb.termsCount { + dateRange := fb.ranges[term] + tf := &search.DateRangeFacet{ + Name: term, + Count: count, + } + if !dateRange.start.IsZero() { + start := dateRange.start.Format(time.RFC3339Nano) + tf.Start = &start + } + if !dateRange.end.IsZero() { + end := dateRange.end.Format(time.RFC3339Nano) + tf.End = &end + } + rv.DateRanges = append(rv.DateRanges, tf) + } + + sort.Sort(rv.DateRanges) + + // we now have the list of the top N facets + if fb.size < len(rv.DateRanges) { + rv.DateRanges = rv.DateRanges[:fb.size] + } + + notOther := 0 + for _, nr := range rv.DateRanges { + notOther += nr.Count + } + rv.Other = fb.total - notOther + + return &rv +} diff --git a/vendor/github.com/blevesearch/bleve/search/facets/facet_builder_numeric.go b/vendor/github.com/blevesearch/bleve/search/facets/facet_builder_numeric.go new file mode 100644 index 0000000..a1ac311 --- /dev/null +++ b/vendor/github.com/blevesearch/bleve/search/facets/facet_builder_numeric.go @@ -0,0 +1,124 @@ +// Copyright (c) 2014 Couchbase, Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. + +package facets + +import ( + "sort" + + "github.com/blevesearch/bleve/index" + "github.com/blevesearch/bleve/numeric_util" + "github.com/blevesearch/bleve/search" +) + +type numericRange struct { + min *float64 + max *float64 +} + +type NumericFacetBuilder struct { + size int + field string + termsCount map[string]int + total int + missing int + ranges map[string]*numericRange +} + +func NewNumericFacetBuilder(field string, size int) *NumericFacetBuilder { + return &NumericFacetBuilder{ + size: size, + field: field, + termsCount: make(map[string]int), + ranges: make(map[string]*numericRange, 0), + } +} + +func (fb *NumericFacetBuilder) AddRange(name string, min, max *float64) { + r := numericRange{ + min: min, + max: max, + } + fb.ranges[name] = &r +} + +func (fb *NumericFacetBuilder) Field() string { + return fb.field +} + +func (fb *NumericFacetBuilder) Update(ft index.FieldTerms) { + terms, ok := ft[fb.field] + if ok { + for _, term := range terms { + // only consider the values which are shifted 0 + prefixCoded := numeric_util.PrefixCoded(term) + shift, err := prefixCoded.Shift() + if err == nil && shift == 0 { + i64, err := prefixCoded.Int64() + if err == nil { + f64 := numeric_util.Int64ToFloat64(i64) + + // look at each of the ranges for a match + for rangeName, r := range fb.ranges { + + if (r.min == nil || f64 >= *r.min) && (r.max == nil || f64 < *r.max) { + + existingCount, existed := fb.termsCount[rangeName] + if existed { + fb.termsCount[rangeName] = existingCount + 1 + } else { + fb.termsCount[rangeName] = 1 + } + fb.total++ + } + } + } + } + } + } else { + fb.missing++ + } +} + +func (fb *NumericFacetBuilder) Result() *search.FacetResult { + rv := search.FacetResult{ + Field: fb.field, + Total: fb.total, + Missing: fb.missing, + } + + rv.NumericRanges = make([]*search.NumericRangeFacet, 0, len(fb.termsCount)) + + for term, count := range fb.termsCount { + numericRange := fb.ranges[term] + tf := &search.NumericRangeFacet{ + Name: term, + Count: count, + Min: numericRange.min, + Max: numericRange.max, + } + + rv.NumericRanges = append(rv.NumericRanges, tf) + } + + sort.Sort(rv.NumericRanges) + + // we now have the list of the top N facets + if fb.size < len(rv.NumericRanges) { + rv.NumericRanges = rv.NumericRanges[:fb.size] + } + + notOther := 0 + for _, nr := range rv.NumericRanges { + notOther += nr.Count + } + rv.Other = fb.total - notOther + + return &rv +} diff --git a/vendor/github.com/blevesearch/bleve/search/facets/facet_builder_terms.go b/vendor/github.com/blevesearch/bleve/search/facets/facet_builder_terms.go new file mode 100644 index 0000000..4488139 --- /dev/null +++ b/vendor/github.com/blevesearch/bleve/search/facets/facet_builder_terms.go @@ -0,0 +1,90 @@ +// Copyright (c) 2014 Couchbase, Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. + +package facets + +import ( + "sort" + + "github.com/blevesearch/bleve/index" + "github.com/blevesearch/bleve/search" +) + +type TermsFacetBuilder struct { + size int + field string + termsCount map[string]int + total int + missing int +} + +func NewTermsFacetBuilder(field string, size int) *TermsFacetBuilder { + return &TermsFacetBuilder{ + size: size, + field: field, + termsCount: make(map[string]int), + } +} + +func (fb *TermsFacetBuilder) Field() string { + return fb.field +} + +func (fb *TermsFacetBuilder) Update(ft index.FieldTerms) { + terms, ok := ft[fb.field] + if ok { + for _, term := range terms { + existingCount, existed := fb.termsCount[term] + if existed { + fb.termsCount[term] = existingCount + 1 + } else { + fb.termsCount[term] = 1 + } + fb.total++ + } + } else { + fb.missing++ + } +} + +func (fb *TermsFacetBuilder) Result() *search.FacetResult { + rv := search.FacetResult{ + Field: fb.field, + Total: fb.total, + Missing: fb.missing, + } + + rv.Terms = make([]*search.TermFacet, 0, len(fb.termsCount)) + + for term, count := range fb.termsCount { + tf := &search.TermFacet{ + Term: term, + Count: count, + } + + rv.Terms = append(rv.Terms, tf) + } + + sort.Sort(rv.Terms) + + // we now have the list of the top N facets + trimTopN := fb.size + if trimTopN > len(rv.Terms) { + trimTopN = len(rv.Terms) + } + rv.Terms = rv.Terms[:trimTopN] + + notOther := 0 + for _, tf := range rv.Terms { + notOther += tf.Count + } + rv.Other = fb.total - notOther + + return &rv +} diff --git a/vendor/github.com/blevesearch/bleve/search/facets_builder.go b/vendor/github.com/blevesearch/bleve/search/facets_builder.go index 7fc0bed..66f96a6 100644 --- a/vendor/github.com/blevesearch/bleve/search/facets_builder.go +++ b/vendor/github.com/blevesearch/bleve/search/facets_builder.go @@ -1,110 +1,66 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. package search import ( - "reflect" "sort" "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/size" ) -var reflectStaticSizeFacetsBuilder int -var reflectStaticSizeFacetResult int -var reflectStaticSizeTermFacet int -var reflectStaticSizeNumericRangeFacet int -var reflectStaticSizeDateRangeFacet int - -func init() { - var fb FacetsBuilder - reflectStaticSizeFacetsBuilder = int(reflect.TypeOf(fb).Size()) - var fr FacetResult - reflectStaticSizeFacetResult = int(reflect.TypeOf(fr).Size()) - var tf TermFacet - reflectStaticSizeTermFacet = int(reflect.TypeOf(tf).Size()) - var nrf NumericRangeFacet - reflectStaticSizeNumericRangeFacet = int(reflect.TypeOf(nrf).Size()) - var drf DateRangeFacet - reflectStaticSizeDateRangeFacet = int(reflect.TypeOf(drf).Size()) -} - type FacetBuilder interface { - StartDoc() - UpdateVisitor(field string, term []byte) - EndDoc() - + Update(index.FieldTerms) Result() *FacetResult Field() string - - Size() int } type FacetsBuilder struct { indexReader index.IndexReader - facetNames []string - facets []FacetBuilder - fields []string + facets map[string]FacetBuilder } func NewFacetsBuilder(indexReader index.IndexReader) *FacetsBuilder { return &FacetsBuilder{ indexReader: indexReader, + facets: make(map[string]FacetBuilder, 0), } } -func (fb *FacetsBuilder) Size() int { - sizeInBytes := reflectStaticSizeFacetsBuilder + size.SizeOfPtr - - for k, v := range fb.facets { - sizeInBytes += size.SizeOfString + v.Size() + len(fb.facetNames[k]) - } - - for _, entry := range fb.fields { - sizeInBytes += size.SizeOfString + len(entry) - } - - return sizeInBytes -} - func (fb *FacetsBuilder) Add(name string, facetBuilder FacetBuilder) { - fb.facetNames = append(fb.facetNames, name) - fb.facets = append(fb.facets, facetBuilder) - fb.fields = append(fb.fields, facetBuilder.Field()) + fb.facets[name] = facetBuilder } -func (fb *FacetsBuilder) RequiredFields() []string { - return fb.fields -} - -func (fb *FacetsBuilder) StartDoc() { +func (fb *FacetsBuilder) Update(docMatch *DocumentMatch) error { + var fields []string for _, facetBuilder := range fb.facets { - facetBuilder.StartDoc() + fields = append(fields, facetBuilder.Field()) } -} -func (fb *FacetsBuilder) EndDoc() { - for _, facetBuilder := range fb.facets { - facetBuilder.EndDoc() + if len(fields) > 0 { + // find out which fields haven't been loaded yet + fieldsToLoad := docMatch.CachedFieldTerms.FieldsNotYetCached(fields) + // look them up + fieldTerms, err := fb.indexReader.DocumentFieldTerms(docMatch.IndexInternalID, fieldsToLoad) + if err != nil { + return err + } + // cache these as well + if docMatch.CachedFieldTerms == nil { + docMatch.CachedFieldTerms = make(map[string][]string) + } + docMatch.CachedFieldTerms.Merge(fieldTerms) } -} - -func (fb *FacetsBuilder) UpdateVisitor(field string, term []byte) { for _, facetBuilder := range fb.facets { - facetBuilder.UpdateVisitor(field, term) + facetBuilder.Update(docMatch.CachedFieldTerms) } + return nil } type TermFacet struct { @@ -142,34 +98,11 @@ type NumericRangeFacet struct { Count int `json:"count"` } -func (nrf *NumericRangeFacet) Same(other *NumericRangeFacet) bool { - if nrf.Min == nil && other.Min != nil { - return false - } - if nrf.Min != nil && other.Min == nil { - return false - } - if nrf.Min != nil && other.Min != nil && *nrf.Min != *other.Min { - return false - } - if nrf.Max == nil && other.Max != nil { - return false - } - if nrf.Max != nil && other.Max == nil { - return false - } - if nrf.Max != nil && other.Max != nil && *nrf.Max != *other.Max { - return false - } - - return true -} - type NumericRangeFacets []*NumericRangeFacet func (nrf NumericRangeFacets) Add(numericRangeFacet *NumericRangeFacet) NumericRangeFacets { for _, existingNr := range nrf { - if numericRangeFacet.Same(existingNr) { + if numericRangeFacet.Min == existingNr.Min && numericRangeFacet.Max == existingNr.Max { existingNr.Count += numericRangeFacet.Count return nrf } @@ -251,14 +184,6 @@ type FacetResult struct { DateRanges DateRangeFacets `json:"date_ranges,omitempty"` } -func (fr *FacetResult) Size() int { - return reflectStaticSizeFacetResult + size.SizeOfPtr + - len(fr.Field) + - len(fr.Terms)*(reflectStaticSizeTermFacet+size.SizeOfPtr) + - len(fr.NumericRanges)*(reflectStaticSizeNumericRangeFacet+size.SizeOfPtr) + - len(fr.DateRanges)*(reflectStaticSizeDateRangeFacet+size.SizeOfPtr) -} - func (fr *FacetResult) Merge(other *FacetResult) { fr.Total += other.Total fr.Missing += other.Missing @@ -333,9 +258,9 @@ func (fr FacetResults) Fixup(name string, size int) { func (fb *FacetsBuilder) Results() FacetResults { fr := make(FacetResults) - for i, facetBuilder := range fb.facets { + for facetName, facetBuilder := range fb.facets { facetResult := facetBuilder.Result() - fr[fb.facetNames[i]] = facetResult + fr[facetName] = facetResult } return fr } diff --git a/vendor/github.com/blevesearch/bleve/search/highlight/format/html/html.go b/vendor/github.com/blevesearch/bleve/search/highlight/fragment_formatters/html/fragment_formatter_html.go similarity index 66% rename from vendor/github.com/blevesearch/bleve/search/highlight/format/html/html.go rename to vendor/github.com/blevesearch/bleve/search/highlight/fragment_formatters/html/fragment_formatter_html.go index 259a037..d2bfe64 100644 --- a/vendor/github.com/blevesearch/bleve/search/highlight/format/html/html.go +++ b/vendor/github.com/blevesearch/bleve/search/highlight/fragment_formatters/html/fragment_formatter_html.go @@ -1,22 +1,15 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. package html import ( - "html" - "github.com/blevesearch/bleve/registry" "github.com/blevesearch/bleve/search/highlight" ) @@ -46,7 +39,7 @@ func (a *FragmentFormatter) Format(f *highlight.Fragment, orderedTermLocations h continue } // make sure the array positions match - if !termLocation.ArrayPositions.Equals(f.ArrayPositions) { + if !highlight.SameArrayPositions(f.ArrayPositions, termLocation.ArrayPositions) { continue } if termLocation.Start < curr { @@ -56,18 +49,18 @@ func (a *FragmentFormatter) Format(f *highlight.Fragment, orderedTermLocations h break } // add the stuff before this location - rv += html.EscapeString(string(f.Orig[curr:termLocation.Start])) - // start the tag + rv += string(f.Orig[curr:termLocation.Start]) + // add the color rv += a.before // add the term itself rv += string(f.Orig[termLocation.Start:termLocation.End]) - // end the tag + // reset the color rv += a.after // update current curr = termLocation.End } // add any remaining text after the last token - rv += html.EscapeString(string(f.Orig[curr:f.End])) + rv += string(f.Orig[curr:f.End]) return rv } diff --git a/vendor/github.com/blevesearch/bleve/search/highlight/fragmenter/simple/simple.go b/vendor/github.com/blevesearch/bleve/search/highlight/fragmenters/simple/fragmenter_simple.go similarity index 79% rename from vendor/github.com/blevesearch/bleve/search/highlight/fragmenter/simple/simple.go rename to vendor/github.com/blevesearch/bleve/search/highlight/fragmenters/simple/fragmenter_simple.go index 9c63f7f..8818660 100644 --- a/vendor/github.com/blevesearch/bleve/search/highlight/fragmenter/simple/simple.go +++ b/vendor/github.com/blevesearch/bleve/search/highlight/fragmenters/simple/fragmenter_simple.go @@ -1,16 +1,11 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. package simple @@ -36,7 +31,8 @@ func NewFragmenter(fragmentSize int) *Fragmenter { } func (s *Fragmenter) Fragment(orig []byte, ot highlight.TermLocations) []*highlight.Fragment { - var rv []*highlight.Fragment + rv := make([]*highlight.Fragment, 0) + maxbegin := 0 OUTER: for currTermIndex, termLocation := range ot { @@ -51,25 +47,20 @@ OUTER: continue OUTER // bail } end += size - used++ + used += 1 } // if we still have more characters available to us // push back towards beginning // without cross maxbegin for start > 0 && used < s.fragmentSize { - if start > len(orig) { - // bail if out of bounds, possibly due to token replacement - // e.g with a regexp replacement - continue OUTER - } r, size := utf8.DecodeLastRune(orig[0:start]) if r == utf8.RuneError { continue OUTER // bail } if start-size >= maxbegin { start -= size - used++ + used += 1 } else { break } diff --git a/vendor/github.com/blevesearch/bleve/search/highlight/highlighter.go b/vendor/github.com/blevesearch/bleve/search/highlight/highlighter.go index 8077985..7a6c69d 100644 --- a/vendor/github.com/blevesearch/bleve/search/highlight/highlighter.go +++ b/vendor/github.com/blevesearch/bleve/search/highlight/highlighter.go @@ -1,16 +1,11 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. package highlight diff --git a/vendor/github.com/blevesearch/bleve/search/highlight/highlighter/html/html.go b/vendor/github.com/blevesearch/bleve/search/highlight/highlighter/html/html.go deleted file mode 100644 index 928589c..0000000 --- a/vendor/github.com/blevesearch/bleve/search/highlight/highlighter/html/html.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) 2015 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package html - -import ( - "fmt" - - "github.com/blevesearch/bleve/registry" - "github.com/blevesearch/bleve/search/highlight" - htmlFormatter "github.com/blevesearch/bleve/search/highlight/format/html" - simpleFragmenter "github.com/blevesearch/bleve/search/highlight/fragmenter/simple" - simpleHighlighter "github.com/blevesearch/bleve/search/highlight/highlighter/simple" -) - -const Name = "html" - -func Constructor(config map[string]interface{}, cache *registry.Cache) (highlight.Highlighter, error) { - - fragmenter, err := cache.FragmenterNamed(simpleFragmenter.Name) - if err != nil { - return nil, fmt.Errorf("error building fragmenter: %v", err) - } - - formatter, err := cache.FragmentFormatterNamed(htmlFormatter.Name) - if err != nil { - return nil, fmt.Errorf("error building fragment formatter: %v", err) - } - - return simpleHighlighter.NewHighlighter( - fragmenter, - formatter, - simpleHighlighter.DefaultSeparator), - nil -} - -func init() { - registry.RegisterHighlighter(Name, Constructor) -} diff --git a/vendor/github.com/blevesearch/bleve/search/highlight/highlighters/html/html.go b/vendor/github.com/blevesearch/bleve/search/highlight/highlighters/html/html.go new file mode 100644 index 0000000..3b82ae3 --- /dev/null +++ b/vendor/github.com/blevesearch/bleve/search/highlight/highlighters/html/html.go @@ -0,0 +1,45 @@ +// Copyright (c) 2015 Couchbase, Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. + +package html + +import ( + "fmt" + + "github.com/blevesearch/bleve/registry" + "github.com/blevesearch/bleve/search/highlight" + html_formatter "github.com/blevesearch/bleve/search/highlight/fragment_formatters/html" + simple_fragmenter "github.com/blevesearch/bleve/search/highlight/fragmenters/simple" + simple_highlighter "github.com/blevesearch/bleve/search/highlight/highlighters/simple" +) + +const Name = "html" + +func Constructor(config map[string]interface{}, cache *registry.Cache) (highlight.Highlighter, error) { + + fragmenter, err := cache.FragmenterNamed(simple_fragmenter.Name) + if err != nil { + return nil, fmt.Errorf("error building fragmenter: %v", err) + } + + formatter, err := cache.FragmentFormatterNamed(html_formatter.Name) + if err != nil { + return nil, fmt.Errorf("error building fragment formatter: %v", err) + } + + return simple_highlighter.NewHighlighter( + fragmenter, + formatter, + simple_highlighter.DefaultSeparator), + nil +} + +func init() { + registry.RegisterHighlighter(Name, Constructor) +} diff --git a/vendor/github.com/blevesearch/bleve/search/highlight/highlighter/simple/fragment_scorer_simple.go b/vendor/github.com/blevesearch/bleve/search/highlight/highlighters/simple/fragment_scorer_simple.go similarity index 53% rename from vendor/github.com/blevesearch/bleve/search/highlight/highlighter/simple/fragment_scorer_simple.go rename to vendor/github.com/blevesearch/bleve/search/highlight/highlighters/simple/fragment_scorer_simple.go index 3ec4c3d..a550a84 100644 --- a/vendor/github.com/blevesearch/bleve/search/highlight/highlighter/simple/fragment_scorer_simple.go +++ b/vendor/github.com/blevesearch/bleve/search/highlight/highlighters/simple/fragment_scorer_simple.go @@ -1,16 +1,11 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. package simple @@ -37,7 +32,7 @@ func (s *FragmentScorer) Score(f *highlight.Fragment) { OUTER: for _, locations := range s.tlm { for _, location := range locations { - if location.ArrayPositions.Equals(f.ArrayPositions) && int(location.Start) >= f.Start && int(location.End) <= f.End { + if highlight.SameArrayPositions(f.ArrayPositions, location.ArrayPositions) && int(location.Start) >= f.Start && int(location.End) <= f.End { score += 1.0 // once we find a term in the fragment // don't care about additional matches diff --git a/vendor/github.com/blevesearch/bleve/search/highlight/highlighter/simple/highlighter_simple.go b/vendor/github.com/blevesearch/bleve/search/highlight/highlighters/simple/highlighter_simple.go similarity index 88% rename from vendor/github.com/blevesearch/bleve/search/highlight/highlighter/simple/highlighter_simple.go rename to vendor/github.com/blevesearch/bleve/search/highlight/highlighters/simple/highlighter_simple.go index 4849516..b8e0756 100644 --- a/vendor/github.com/blevesearch/bleve/search/highlight/highlighter/simple/highlighter_simple.go +++ b/vendor/github.com/blevesearch/bleve/search/highlight/highlighters/simple/highlighter_simple.go @@ -1,16 +1,11 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. package simple @@ -87,7 +82,7 @@ func (s *Highlighter) BestFragmentsInField(dm *search.DocumentMatch, doc *docume if ok { termLocationsSameArrayPosition := make(highlight.TermLocations, 0) for _, otl := range orderedTermLocations { - if otl.ArrayPositions.Equals(f.ArrayPositions()) { + if highlight.SameArrayPositions(f.ArrayPositions(), otl.ArrayPositions) { termLocationsSameArrayPosition = append(termLocationsSameArrayPosition, otl) } } @@ -104,7 +99,7 @@ func (s *Highlighter) BestFragmentsInField(dm *search.DocumentMatch, doc *docume } // now find the N best non-overlapping fragments - var bestFragments []*highlight.Fragment + bestFragments := make([]*highlight.Fragment, 0) if len(fq) > 0 { candidate := heap.Pop(&fq) OUTER: diff --git a/vendor/github.com/blevesearch/bleve/search/highlight/term_locations.go b/vendor/github.com/blevesearch/bleve/search/highlight/term_locations.go index 6d2cb13..2fdd67d 100644 --- a/vendor/github.com/blevesearch/bleve/search/highlight/term_locations.go +++ b/vendor/github.com/blevesearch/bleve/search/highlight/term_locations.go @@ -1,16 +1,11 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. package highlight @@ -23,7 +18,7 @@ import ( type TermLocation struct { Term string - ArrayPositions search.ArrayPositions + ArrayPositions []float64 Pos int Start int End int @@ -103,3 +98,15 @@ func OrderTermLocations(tlm search.TermLocationMap) TermLocations { sort.Sort(rv) return rv } + +func SameArrayPositions(fieldArrayPositions []uint64, termLocationArrayPositions []float64) bool { + if len(fieldArrayPositions) != len(termLocationArrayPositions) { + return false + } + for i := 0; i < len(fieldArrayPositions); i++ { + if fieldArrayPositions[i] != uint64(termLocationArrayPositions[i]) { + return false + } + } + return true +} diff --git a/vendor/github.com/blevesearch/bleve/search/levenshtein.go b/vendor/github.com/blevesearch/bleve/search/levenshtein.go index 687608d..5201ab2 100644 --- a/vendor/github.com/blevesearch/bleve/search/levenshtein.go +++ b/vendor/github.com/blevesearch/bleve/search/levenshtein.go @@ -1,26 +1,12 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - package search import ( "math" ) -func LevenshteinDistance(a, b string) int { - la := len(a) - lb := len(b) +func LevenshteinDistance(a, b *string) int { + la := len(*a) + lb := len(*b) d := make([]int, la+1) var lastdiag, olddiag, temp int @@ -36,7 +22,7 @@ func LevenshteinDistance(a, b string) int { if (d[j-1] + 1) < min { min = d[j-1] + 1 } - if a[j-1] == b[i-1] { + if (*a)[j-1] == (*b)[i-1] { temp = 0 } else { temp = 1 @@ -51,30 +37,21 @@ func LevenshteinDistance(a, b string) int { return d[la] } -// LevenshteinDistanceMax same as LevenshteinDistance but +// levenshteinDistanceMax same as levenshteinDistance but // attempts to bail early once we know the distance // will be greater than max // in which case the first return val will be the max // and the second will be true, indicating max was exceeded -func LevenshteinDistanceMax(a, b string, max int) (int, bool) { - v, wasMax, _ := LevenshteinDistanceMaxReuseSlice(a, b, max, nil) - return v, wasMax -} - -func LevenshteinDistanceMaxReuseSlice(a, b string, max int, d []int) (int, bool, []int) { - la := len(a) - lb := len(b) +func LevenshteinDistanceMax(a, b *string, max int) (int, bool) { + la := len(*a) + lb := len(*b) ld := int(math.Abs(float64(la - lb))) if ld > max { - return max, true, d + return max, true } - if cap(d) < la+1 { - d = make([]int, la+1) - } - d = d[:la+1] - + d := make([]int, la+1) var lastdiag, olddiag, temp int for i := 1; i <= la; i++ { @@ -90,7 +67,7 @@ func LevenshteinDistanceMaxReuseSlice(a, b string, max int, d []int) (int, bool, if (d[j-1] + 1) < min { min = d[j-1] + 1 } - if a[j-1] == b[i-1] { + if (*a)[j-1] == (*b)[i-1] { temp = 0 } else { temp = 1 @@ -107,8 +84,8 @@ func LevenshteinDistanceMaxReuseSlice(a, b string, max int, d []int) (int, bool, } // after each row if rowmin isn't less than max stop if rowmin > max { - return max, true, d + return max, true } } - return d[la], false, d + return d[la], false } diff --git a/vendor/github.com/blevesearch/bleve/search/pool.go b/vendor/github.com/blevesearch/bleve/search/pool.go index ba8be8f..5600f48 100644 --- a/vendor/github.com/blevesearch/bleve/search/pool.go +++ b/vendor/github.com/blevesearch/bleve/search/pool.go @@ -1,30 +1,14 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. package search -import ( - "reflect" -) - -var reflectStaticSizeDocumentMatchPool int - -func init() { - var dmp DocumentMatchPool - reflectStaticSizeDocumentMatchPool = int(reflect.TypeOf(dmp).Size()) -} - // DocumentMatchPoolTooSmall is a callback function that can be executed // when the DocumentMatchPool does not have sufficient capacity // By default we just perform just-in-time allocation, but you could log @@ -45,20 +29,16 @@ func defaultDocumentMatchPoolTooSmall(p *DocumentMatchPool) *DocumentMatch { } // NewDocumentMatchPool will build a DocumentMatchPool with memory -// pre-allocated to accommodate the requested number of DocumentMatch +// pre-allocated to accomodate the requested number of DocumentMatch // instances func NewDocumentMatchPool(size, sortsize int) *DocumentMatchPool { - avail := make(DocumentMatchCollection, size) + avail := make(DocumentMatchCollection, 0, size) // pre-allocate the expected number of instances startBlock := make([]DocumentMatch, size) - startSorts := make([]string, size*sortsize) // make these initial instances available - i, j := 0, 0 - for i < size { - avail[i] = &startBlock[i] - avail[i].Sort = startSorts[j:j] - i += 1 - j += sortsize + for i := range startBlock { + startBlock[i].Sort = make([]string, 0, sortsize) + avail = append(avail, &startBlock[i]) } return &DocumentMatchPool{ avail: avail, diff --git a/vendor/github.com/blevesearch/bleve/search/query/bool_field.go b/vendor/github.com/blevesearch/bleve/search/query/bool_field.go deleted file mode 100644 index b7b5a3d..0000000 --- a/vendor/github.com/blevesearch/bleve/search/query/bool_field.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package query - -import ( - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/mapping" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/searcher" -) - -type BoolFieldQuery struct { - Bool bool `json:"bool"` - FieldVal string `json:"field,omitempty"` - BoostVal *Boost `json:"boost,omitempty"` -} - -// NewBoolFieldQuery creates a new Query for boolean fields -func NewBoolFieldQuery(val bool) *BoolFieldQuery { - return &BoolFieldQuery{ - Bool: val, - } -} - -func (q *BoolFieldQuery) SetBoost(b float64) { - boost := Boost(b) - q.BoostVal = &boost -} - -func (q *BoolFieldQuery) Boost() float64 { - return q.BoostVal.Value() -} - -func (q *BoolFieldQuery) SetField(f string) { - q.FieldVal = f -} - -func (q *BoolFieldQuery) Field() string { - return q.FieldVal -} - -func (q *BoolFieldQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, options search.SearcherOptions) (search.Searcher, error) { - field := q.FieldVal - if q.FieldVal == "" { - field = m.DefaultSearchField() - } - term := "F" - if q.Bool { - term = "T" - } - return searcher.NewTermSearcher(i, term, field, q.BoostVal.Value(), options) -} diff --git a/vendor/github.com/blevesearch/bleve/search/query/boolean.go b/vendor/github.com/blevesearch/bleve/search/query/boolean.go deleted file mode 100644 index 3cfa1d9..0000000 --- a/vendor/github.com/blevesearch/bleve/search/query/boolean.go +++ /dev/null @@ -1,248 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package query - -import ( - "encoding/json" - "fmt" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/mapping" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/searcher" -) - -type BooleanQuery struct { - Must Query `json:"must,omitempty"` - Should Query `json:"should,omitempty"` - MustNot Query `json:"must_not,omitempty"` - BoostVal *Boost `json:"boost,omitempty"` - queryStringMode bool -} - -// NewBooleanQuery creates a compound Query composed -// of several other Query objects. -// Result documents must satisfy ALL of the -// must Queries. -// Result documents must satisfy NONE of the must not -// Queries. -// Result documents that ALSO satisfy any of the should -// Queries will score higher. -func NewBooleanQuery(must []Query, should []Query, mustNot []Query) *BooleanQuery { - - rv := BooleanQuery{} - if len(must) > 0 { - rv.Must = NewConjunctionQuery(must) - } - if len(should) > 0 { - rv.Should = NewDisjunctionQuery(should) - } - if len(mustNot) > 0 { - rv.MustNot = NewDisjunctionQuery(mustNot) - } - - return &rv -} - -func NewBooleanQueryForQueryString(must []Query, should []Query, mustNot []Query) *BooleanQuery { - rv := NewBooleanQuery(nil, nil, nil) - rv.queryStringMode = true - rv.AddMust(must...) - rv.AddShould(should...) - rv.AddMustNot(mustNot...) - return rv -} - -// SetMinShould requires that at least minShould of the -// should Queries must be satisfied. -func (q *BooleanQuery) SetMinShould(minShould float64) { - q.Should.(*DisjunctionQuery).SetMin(minShould) -} - -func (q *BooleanQuery) AddMust(m ...Query) { - if q.Must == nil { - tmp := NewConjunctionQuery([]Query{}) - tmp.queryStringMode = q.queryStringMode - q.Must = tmp - } - for _, mq := range m { - q.Must.(*ConjunctionQuery).AddQuery(mq) - } -} - -func (q *BooleanQuery) AddShould(m ...Query) { - if q.Should == nil { - tmp := NewDisjunctionQuery([]Query{}) - tmp.queryStringMode = q.queryStringMode - q.Should = tmp - } - for _, mq := range m { - q.Should.(*DisjunctionQuery).AddQuery(mq) - } -} - -func (q *BooleanQuery) AddMustNot(m ...Query) { - if q.MustNot == nil { - tmp := NewDisjunctionQuery([]Query{}) - tmp.queryStringMode = q.queryStringMode - q.MustNot = tmp - } - for _, mq := range m { - q.MustNot.(*DisjunctionQuery).AddQuery(mq) - } -} - -func (q *BooleanQuery) SetBoost(b float64) { - boost := Boost(b) - q.BoostVal = &boost -} - -func (q *BooleanQuery) Boost() float64 { - return q.BoostVal.Value() -} - -func (q *BooleanQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, options search.SearcherOptions) (search.Searcher, error) { - var err error - var mustNotSearcher search.Searcher - if q.MustNot != nil { - mustNotSearcher, err = q.MustNot.Searcher(i, m, options) - if err != nil { - return nil, err - } - // if must not is MatchNone, reset it to nil - if _, ok := mustNotSearcher.(*searcher.MatchNoneSearcher); ok { - mustNotSearcher = nil - } - } - - var mustSearcher search.Searcher - if q.Must != nil { - mustSearcher, err = q.Must.Searcher(i, m, options) - if err != nil { - return nil, err - } - // if must searcher is MatchNone, reset it to nil - if _, ok := mustSearcher.(*searcher.MatchNoneSearcher); ok { - mustSearcher = nil - } - } - - var shouldSearcher search.Searcher - if q.Should != nil { - shouldSearcher, err = q.Should.Searcher(i, m, options) - if err != nil { - return nil, err - } - // if should searcher is MatchNone, reset it to nil - if _, ok := shouldSearcher.(*searcher.MatchNoneSearcher); ok { - shouldSearcher = nil - } - } - - // if all 3 are nil, return MatchNone - if mustSearcher == nil && shouldSearcher == nil && mustNotSearcher == nil { - return searcher.NewMatchNoneSearcher(i) - } - - // if only mustNotSearcher, start with MatchAll - if mustSearcher == nil && shouldSearcher == nil && mustNotSearcher != nil { - mustSearcher, err = searcher.NewMatchAllSearcher(i, 1.0, options) - if err != nil { - return nil, err - } - } - - // optimization, if only should searcher, just return it instead - if mustSearcher == nil && shouldSearcher != nil && mustNotSearcher == nil { - return shouldSearcher, nil - } - - return searcher.NewBooleanSearcher(i, mustSearcher, shouldSearcher, mustNotSearcher, options) -} - -func (q *BooleanQuery) Validate() error { - if qm, ok := q.Must.(ValidatableQuery); ok { - err := qm.Validate() - if err != nil { - return err - } - } - if qs, ok := q.Should.(ValidatableQuery); ok { - err := qs.Validate() - if err != nil { - return err - } - } - if qmn, ok := q.MustNot.(ValidatableQuery); ok { - err := qmn.Validate() - if err != nil { - return err - } - } - if q.Must == nil && q.Should == nil && q.MustNot == nil { - return fmt.Errorf("boolean query must contain at least one must or should or not must clause") - } - return nil -} - -func (q *BooleanQuery) UnmarshalJSON(data []byte) error { - tmp := struct { - Must json.RawMessage `json:"must,omitempty"` - Should json.RawMessage `json:"should,omitempty"` - MustNot json.RawMessage `json:"must_not,omitempty"` - Boost *Boost `json:"boost,omitempty"` - }{} - err := json.Unmarshal(data, &tmp) - if err != nil { - return err - } - - if tmp.Must != nil { - q.Must, err = ParseQuery(tmp.Must) - if err != nil { - return err - } - _, isConjunctionQuery := q.Must.(*ConjunctionQuery) - if !isConjunctionQuery { - return fmt.Errorf("must clause must be conjunction") - } - } - - if tmp.Should != nil { - q.Should, err = ParseQuery(tmp.Should) - if err != nil { - return err - } - _, isDisjunctionQuery := q.Should.(*DisjunctionQuery) - if !isDisjunctionQuery { - return fmt.Errorf("should clause must be disjunction") - } - } - - if tmp.MustNot != nil { - q.MustNot, err = ParseQuery(tmp.MustNot) - if err != nil { - return err - } - _, isDisjunctionQuery := q.MustNot.(*DisjunctionQuery) - if !isDisjunctionQuery { - return fmt.Errorf("must not clause must be disjunction") - } - } - - q.BoostVal = tmp.Boost - - return nil -} diff --git a/vendor/github.com/blevesearch/bleve/search/query/boost.go b/vendor/github.com/blevesearch/bleve/search/query/boost.go deleted file mode 100644 index 1365994..0000000 --- a/vendor/github.com/blevesearch/bleve/search/query/boost.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package query - -import "fmt" - -type Boost float64 - -func (b *Boost) Value() float64 { - if b == nil { - return 1.0 - } - return float64(*b) -} - -func (b *Boost) GoString() string { - if b == nil { - return "boost unspecified" - } - return fmt.Sprintf("%f", *b) -} diff --git a/vendor/github.com/blevesearch/bleve/search/query/conjunction.go b/vendor/github.com/blevesearch/bleve/search/query/conjunction.go deleted file mode 100644 index 1a7ed1b..0000000 --- a/vendor/github.com/blevesearch/bleve/search/query/conjunction.go +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package query - -import ( - "encoding/json" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/mapping" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/searcher" -) - -type ConjunctionQuery struct { - Conjuncts []Query `json:"conjuncts"` - BoostVal *Boost `json:"boost,omitempty"` - queryStringMode bool -} - -// NewConjunctionQuery creates a new compound Query. -// Result documents must satisfy all of the queries. -func NewConjunctionQuery(conjuncts []Query) *ConjunctionQuery { - return &ConjunctionQuery{ - Conjuncts: conjuncts, - } -} - -func (q *ConjunctionQuery) SetBoost(b float64) { - boost := Boost(b) - q.BoostVal = &boost -} - -func (q *ConjunctionQuery) Boost() float64 { - return q.BoostVal.Value() -} - -func (q *ConjunctionQuery) AddQuery(aq ...Query) { - for _, aaq := range aq { - q.Conjuncts = append(q.Conjuncts, aaq) - } -} - -func (q *ConjunctionQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, options search.SearcherOptions) (search.Searcher, error) { - ss := make([]search.Searcher, 0, len(q.Conjuncts)) - for _, conjunct := range q.Conjuncts { - sr, err := conjunct.Searcher(i, m, options) - if err != nil { - for _, searcher := range ss { - if searcher != nil { - _ = searcher.Close() - } - } - return nil, err - } - if _, ok := sr.(*searcher.MatchNoneSearcher); ok && q.queryStringMode { - // in query string mode, skip match none - continue - } - ss = append(ss, sr) - } - - if len(ss) < 1 { - return searcher.NewMatchNoneSearcher(i) - } - - return searcher.NewConjunctionSearcher(i, ss, options) -} - -func (q *ConjunctionQuery) Validate() error { - for _, q := range q.Conjuncts { - if q, ok := q.(ValidatableQuery); ok { - err := q.Validate() - if err != nil { - return err - } - } - } - return nil -} - -func (q *ConjunctionQuery) UnmarshalJSON(data []byte) error { - tmp := struct { - Conjuncts []json.RawMessage `json:"conjuncts"` - Boost *Boost `json:"boost,omitempty"` - }{} - err := json.Unmarshal(data, &tmp) - if err != nil { - return err - } - q.Conjuncts = make([]Query, len(tmp.Conjuncts)) - for i, term := range tmp.Conjuncts { - query, err := ParseQuery(term) - if err != nil { - return err - } - q.Conjuncts[i] = query - } - q.BoostVal = tmp.Boost - return nil -} diff --git a/vendor/github.com/blevesearch/bleve/search/query/date_range.go b/vendor/github.com/blevesearch/bleve/search/query/date_range.go deleted file mode 100644 index 3ac0322..0000000 --- a/vendor/github.com/blevesearch/bleve/search/query/date_range.go +++ /dev/null @@ -1,191 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package query - -import ( - "encoding/json" - "fmt" - "math" - "time" - - "github.com/blevesearch/bleve/analysis/datetime/optional" - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/mapping" - "github.com/blevesearch/bleve/numeric" - "github.com/blevesearch/bleve/registry" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/searcher" -) - -// QueryDateTimeParser controls the default query date time parser -var QueryDateTimeParser = optional.Name - -// QueryDateTimeFormat controls the format when Marshaling to JSON -var QueryDateTimeFormat = time.RFC3339 - -var cache = registry.NewCache() - -type BleveQueryTime struct { - time.Time -} - -var MinRFC3339CompatibleTime time.Time -var MaxRFC3339CompatibleTime time.Time - -func init() { - MinRFC3339CompatibleTime, _ = time.Parse(time.RFC3339, "1677-12-01T00:00:00Z") - MaxRFC3339CompatibleTime, _ = time.Parse(time.RFC3339, "2262-04-11T11:59:59Z") -} - -func queryTimeFromString(t string) (time.Time, error) { - dateTimeParser, err := cache.DateTimeParserNamed(QueryDateTimeParser) - if err != nil { - return time.Time{}, err - } - rv, err := dateTimeParser.ParseDateTime(t) - if err != nil { - return time.Time{}, err - } - return rv, nil -} - -func (t *BleveQueryTime) MarshalJSON() ([]byte, error) { - tt := time.Time(t.Time) - return []byte("\"" + tt.Format(QueryDateTimeFormat) + "\""), nil -} - -func (t *BleveQueryTime) UnmarshalJSON(data []byte) error { - var timeString string - err := json.Unmarshal(data, &timeString) - if err != nil { - return err - } - dateTimeParser, err := cache.DateTimeParserNamed(QueryDateTimeParser) - if err != nil { - return err - } - t.Time, err = dateTimeParser.ParseDateTime(timeString) - if err != nil { - return err - } - return nil -} - -type DateRangeQuery struct { - Start BleveQueryTime `json:"start,omitempty"` - End BleveQueryTime `json:"end,omitempty"` - InclusiveStart *bool `json:"inclusive_start,omitempty"` - InclusiveEnd *bool `json:"inclusive_end,omitempty"` - FieldVal string `json:"field,omitempty"` - BoostVal *Boost `json:"boost,omitempty"` -} - -// NewDateRangeQuery creates a new Query for ranges -// of date values. -// Date strings are parsed using the DateTimeParser configured in the -// top-level config.QueryDateTimeParser -// Either, but not both endpoints can be nil. -func NewDateRangeQuery(start, end time.Time) *DateRangeQuery { - return NewDateRangeInclusiveQuery(start, end, nil, nil) -} - -// NewDateRangeInclusiveQuery creates a new Query for ranges -// of date values. -// Date strings are parsed using the DateTimeParser configured in the -// top-level config.QueryDateTimeParser -// Either, but not both endpoints can be nil. -// startInclusive and endInclusive control inclusion of the endpoints. -func NewDateRangeInclusiveQuery(start, end time.Time, startInclusive, endInclusive *bool) *DateRangeQuery { - return &DateRangeQuery{ - Start: BleveQueryTime{start}, - End: BleveQueryTime{end}, - InclusiveStart: startInclusive, - InclusiveEnd: endInclusive, - } -} - -func (q *DateRangeQuery) SetBoost(b float64) { - boost := Boost(b) - q.BoostVal = &boost -} - -func (q *DateRangeQuery) Boost() float64 { - return q.BoostVal.Value() -} - -func (q *DateRangeQuery) SetField(f string) { - q.FieldVal = f -} - -func (q *DateRangeQuery) Field() string { - return q.FieldVal -} - -func (q *DateRangeQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, options search.SearcherOptions) (search.Searcher, error) { - min, max, err := q.parseEndpoints() - if err != nil { - return nil, err - } - - field := q.FieldVal - if q.FieldVal == "" { - field = m.DefaultSearchField() - } - - return searcher.NewNumericRangeSearcher(i, min, max, q.InclusiveStart, q.InclusiveEnd, field, q.BoostVal.Value(), options) -} - -func (q *DateRangeQuery) parseEndpoints() (*float64, *float64, error) { - min := math.Inf(-1) - max := math.Inf(1) - if !q.Start.IsZero() { - if !isDatetimeCompatible(q.Start) { - // overflow - return nil, nil, fmt.Errorf("invalid/unsupported date range, start: %v", q.Start) - } - startInt64 := q.Start.UnixNano() - min = numeric.Int64ToFloat64(startInt64) - } - if !q.End.IsZero() { - if !isDatetimeCompatible(q.End) { - // overflow - return nil, nil, fmt.Errorf("invalid/unsupported date range, end: %v", q.End) - } - endInt64 := q.End.UnixNano() - max = numeric.Int64ToFloat64(endInt64) - } - - return &min, &max, nil -} - -func (q *DateRangeQuery) Validate() error { - if q.Start.IsZero() && q.End.IsZero() { - return fmt.Errorf("must specify start or end") - } - _, _, err := q.parseEndpoints() - if err != nil { - return err - } - return nil -} - -func isDatetimeCompatible(t BleveQueryTime) bool { - if QueryDateTimeFormat == time.RFC3339 && - (t.Before(MinRFC3339CompatibleTime) || t.After(MaxRFC3339CompatibleTime)) { - return false - } - - return true -} diff --git a/vendor/github.com/blevesearch/bleve/search/query/disjunction.go b/vendor/github.com/blevesearch/bleve/search/query/disjunction.go deleted file mode 100644 index a1fc143..0000000 --- a/vendor/github.com/blevesearch/bleve/search/query/disjunction.go +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package query - -import ( - "encoding/json" - "fmt" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/mapping" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/searcher" -) - -type DisjunctionQuery struct { - Disjuncts []Query `json:"disjuncts"` - BoostVal *Boost `json:"boost,omitempty"` - Min float64 `json:"min"` - queryStringMode bool -} - -// NewDisjunctionQuery creates a new compound Query. -// Result documents satisfy at least one Query. -func NewDisjunctionQuery(disjuncts []Query) *DisjunctionQuery { - return &DisjunctionQuery{ - Disjuncts: disjuncts, - } -} - -func (q *DisjunctionQuery) SetBoost(b float64) { - boost := Boost(b) - q.BoostVal = &boost -} - -func (q *DisjunctionQuery) Boost() float64 { - return q.BoostVal.Value() -} - -func (q *DisjunctionQuery) AddQuery(aq ...Query) { - for _, aaq := range aq { - q.Disjuncts = append(q.Disjuncts, aaq) - } -} - -func (q *DisjunctionQuery) SetMin(m float64) { - q.Min = m -} - -func (q *DisjunctionQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, - options search.SearcherOptions) (search.Searcher, error) { - ss := make([]search.Searcher, 0, len(q.Disjuncts)) - for _, disjunct := range q.Disjuncts { - sr, err := disjunct.Searcher(i, m, options) - if err != nil { - for _, searcher := range ss { - if searcher != nil { - _ = searcher.Close() - } - } - return nil, err - } - if _, ok := sr.(*searcher.MatchNoneSearcher); ok && q.queryStringMode { - // in query string mode, skip match none - continue - } - ss = append(ss, sr) - } - - if len(ss) < 1 { - return searcher.NewMatchNoneSearcher(i) - } - - return searcher.NewDisjunctionSearcher(i, ss, q.Min, options) -} - -func (q *DisjunctionQuery) Validate() error { - if int(q.Min) > len(q.Disjuncts) { - return fmt.Errorf("disjunction query has fewer than the minimum number of clauses to satisfy") - } - for _, q := range q.Disjuncts { - if q, ok := q.(ValidatableQuery); ok { - err := q.Validate() - if err != nil { - return err - } - } - } - return nil -} - -func (q *DisjunctionQuery) UnmarshalJSON(data []byte) error { - tmp := struct { - Disjuncts []json.RawMessage `json:"disjuncts"` - Boost *Boost `json:"boost,omitempty"` - Min float64 `json:"min"` - }{} - err := json.Unmarshal(data, &tmp) - if err != nil { - return err - } - q.Disjuncts = make([]Query, len(tmp.Disjuncts)) - for i, term := range tmp.Disjuncts { - query, err := ParseQuery(term) - if err != nil { - return err - } - q.Disjuncts[i] = query - } - q.BoostVal = tmp.Boost - q.Min = tmp.Min - return nil -} diff --git a/vendor/github.com/blevesearch/bleve/search/query/docid.go b/vendor/github.com/blevesearch/bleve/search/query/docid.go deleted file mode 100644 index 3b865f9..0000000 --- a/vendor/github.com/blevesearch/bleve/search/query/docid.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) 2015 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package query - -import ( - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/mapping" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/searcher" -) - -type DocIDQuery struct { - IDs []string `json:"ids"` - BoostVal *Boost `json:"boost,omitempty"` -} - -// NewDocIDQuery creates a new Query object returning indexed documents among -// the specified set. Combine it with ConjunctionQuery to restrict the scope of -// other queries output. -func NewDocIDQuery(ids []string) *DocIDQuery { - return &DocIDQuery{ - IDs: ids, - } -} - -func (q *DocIDQuery) SetBoost(b float64) { - boost := Boost(b) - q.BoostVal = &boost -} - -func (q *DocIDQuery) Boost() float64 { - return q.BoostVal.Value() -} - -func (q *DocIDQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, options search.SearcherOptions) (search.Searcher, error) { - return searcher.NewDocIDSearcher(i, q.IDs, q.BoostVal.Value(), options) -} diff --git a/vendor/github.com/blevesearch/bleve/search/query/fuzzy.go b/vendor/github.com/blevesearch/bleve/search/query/fuzzy.go deleted file mode 100644 index f18982d..0000000 --- a/vendor/github.com/blevesearch/bleve/search/query/fuzzy.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package query - -import ( - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/mapping" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/searcher" -) - -type FuzzyQuery struct { - Term string `json:"term"` - Prefix int `json:"prefix_length"` - Fuzziness int `json:"fuzziness"` - FieldVal string `json:"field,omitempty"` - BoostVal *Boost `json:"boost,omitempty"` -} - -// NewFuzzyQuery creates a new Query which finds -// documents containing terms within a specific -// fuzziness of the specified term. -// The default fuzziness is 1. -// -// The current implementation uses Levenshtein edit -// distance as the fuzziness metric. -func NewFuzzyQuery(term string) *FuzzyQuery { - return &FuzzyQuery{ - Term: term, - Fuzziness: 1, - } -} - -func (q *FuzzyQuery) SetBoost(b float64) { - boost := Boost(b) - q.BoostVal = &boost -} - -func (q *FuzzyQuery) Boost() float64 { - return q.BoostVal.Value() -} - -func (q *FuzzyQuery) SetField(f string) { - q.FieldVal = f -} - -func (q *FuzzyQuery) Field() string { - return q.FieldVal -} - -func (q *FuzzyQuery) SetFuzziness(f int) { - q.Fuzziness = f -} - -func (q *FuzzyQuery) SetPrefix(p int) { - q.Prefix = p -} - -func (q *FuzzyQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, options search.SearcherOptions) (search.Searcher, error) { - field := q.FieldVal - if q.FieldVal == "" { - field = m.DefaultSearchField() - } - return searcher.NewFuzzySearcher(i, q.Term, q.Prefix, q.Fuzziness, field, q.BoostVal.Value(), options) -} diff --git a/vendor/github.com/blevesearch/bleve/search/query/geo_boundingbox.go b/vendor/github.com/blevesearch/bleve/search/query/geo_boundingbox.go deleted file mode 100644 index de6be4a..0000000 --- a/vendor/github.com/blevesearch/bleve/search/query/geo_boundingbox.go +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package query - -import ( - "encoding/json" - "fmt" - - "github.com/blevesearch/bleve/geo" - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/mapping" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/searcher" -) - -type GeoBoundingBoxQuery struct { - TopLeft []float64 `json:"top_left,omitempty"` - BottomRight []float64 `json:"bottom_right,omitempty"` - FieldVal string `json:"field,omitempty"` - BoostVal *Boost `json:"boost,omitempty"` -} - -func NewGeoBoundingBoxQuery(topLeftLon, topLeftLat, bottomRightLon, bottomRightLat float64) *GeoBoundingBoxQuery { - return &GeoBoundingBoxQuery{ - TopLeft: []float64{topLeftLon, topLeftLat}, - BottomRight: []float64{bottomRightLon, bottomRightLat}, - } -} - -func (q *GeoBoundingBoxQuery) SetBoost(b float64) { - boost := Boost(b) - q.BoostVal = &boost -} - -func (q *GeoBoundingBoxQuery) Boost() float64 { - return q.BoostVal.Value() -} - -func (q *GeoBoundingBoxQuery) SetField(f string) { - q.FieldVal = f -} - -func (q *GeoBoundingBoxQuery) Field() string { - return q.FieldVal -} - -func (q *GeoBoundingBoxQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, options search.SearcherOptions) (search.Searcher, error) { - field := q.FieldVal - if q.FieldVal == "" { - field = m.DefaultSearchField() - } - - if q.BottomRight[0] < q.TopLeft[0] { - // cross date line, rewrite as two parts - - leftSearcher, err := searcher.NewGeoBoundingBoxSearcher(i, -180, q.BottomRight[1], q.BottomRight[0], q.TopLeft[1], field, q.BoostVal.Value(), options, true) - if err != nil { - return nil, err - } - rightSearcher, err := searcher.NewGeoBoundingBoxSearcher(i, q.TopLeft[0], q.BottomRight[1], 180, q.TopLeft[1], field, q.BoostVal.Value(), options, true) - if err != nil { - _ = leftSearcher.Close() - return nil, err - } - - return searcher.NewDisjunctionSearcher(i, []search.Searcher{leftSearcher, rightSearcher}, 0, options) - } - - return searcher.NewGeoBoundingBoxSearcher(i, q.TopLeft[0], q.BottomRight[1], q.BottomRight[0], q.TopLeft[1], field, q.BoostVal.Value(), options, true) -} - -func (q *GeoBoundingBoxQuery) Validate() error { - return nil -} - -func (q *GeoBoundingBoxQuery) UnmarshalJSON(data []byte) error { - tmp := struct { - TopLeft interface{} `json:"top_left,omitempty"` - BottomRight interface{} `json:"bottom_right,omitempty"` - FieldVal string `json:"field,omitempty"` - BoostVal *Boost `json:"boost,omitempty"` - }{} - err := json.Unmarshal(data, &tmp) - if err != nil { - return err - } - // now use our generic point parsing code from the geo package - lon, lat, found := geo.ExtractGeoPoint(tmp.TopLeft) - if !found { - return fmt.Errorf("geo location top_left not in a valid format") - } - q.TopLeft = []float64{lon, lat} - lon, lat, found = geo.ExtractGeoPoint(tmp.BottomRight) - if !found { - return fmt.Errorf("geo location bottom_right not in a valid format") - } - q.BottomRight = []float64{lon, lat} - q.FieldVal = tmp.FieldVal - q.BoostVal = tmp.BoostVal - return nil -} diff --git a/vendor/github.com/blevesearch/bleve/search/query/geo_boundingpolygon.go b/vendor/github.com/blevesearch/bleve/search/query/geo_boundingpolygon.go deleted file mode 100644 index 41c7f7f..0000000 --- a/vendor/github.com/blevesearch/bleve/search/query/geo_boundingpolygon.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (c) 2019 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package query - -import ( - "encoding/json" - "fmt" - - "github.com/blevesearch/bleve/geo" - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/mapping" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/searcher" -) - -type GeoBoundingPolygonQuery struct { - Points []geo.Point `json:"polygon_points"` - FieldVal string `json:"field,omitempty"` - BoostVal *Boost `json:"boost,omitempty"` -} - -func NewGeoBoundingPolygonQuery(points []geo.Point) *GeoBoundingPolygonQuery { - return &GeoBoundingPolygonQuery{ - Points: points} -} - -func (q *GeoBoundingPolygonQuery) SetBoost(b float64) { - boost := Boost(b) - q.BoostVal = &boost -} - -func (q *GeoBoundingPolygonQuery) Boost() float64 { - return q.BoostVal.Value() -} - -func (q *GeoBoundingPolygonQuery) SetField(f string) { - q.FieldVal = f -} - -func (q *GeoBoundingPolygonQuery) Field() string { - return q.FieldVal -} - -func (q *GeoBoundingPolygonQuery) Searcher(i index.IndexReader, - m mapping.IndexMapping, options search.SearcherOptions) (search.Searcher, error) { - field := q.FieldVal - if q.FieldVal == "" { - field = m.DefaultSearchField() - } - - return searcher.NewGeoBoundedPolygonSearcher(i, q.Points, field, q.BoostVal.Value(), options) -} - -func (q *GeoBoundingPolygonQuery) Validate() error { - return nil -} - -func (q *GeoBoundingPolygonQuery) UnmarshalJSON(data []byte) error { - tmp := struct { - Points []interface{} `json:"polygon_points"` - FieldVal string `json:"field,omitempty"` - BoostVal *Boost `json:"boost,omitempty"` - }{} - err := json.Unmarshal(data, &tmp) - if err != nil { - return err - } - - q.Points = make([]geo.Point, 0, len(tmp.Points)) - for _, i := range tmp.Points { - // now use our generic point parsing code from the geo package - lon, lat, found := geo.ExtractGeoPoint(i) - if !found { - return fmt.Errorf("geo polygon point: %v is not in a valid format", i) - } - q.Points = append(q.Points, geo.Point{Lon: lon, Lat: lat}) - } - - q.FieldVal = tmp.FieldVal - q.BoostVal = tmp.BoostVal - return nil -} diff --git a/vendor/github.com/blevesearch/bleve/search/query/geo_distance.go b/vendor/github.com/blevesearch/bleve/search/query/geo_distance.go deleted file mode 100644 index ef3aa88..0000000 --- a/vendor/github.com/blevesearch/bleve/search/query/geo_distance.go +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package query - -import ( - "encoding/json" - "fmt" - - "github.com/blevesearch/bleve/geo" - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/mapping" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/searcher" -) - -type GeoDistanceQuery struct { - Location []float64 `json:"location,omitempty"` - Distance string `json:"distance,omitempty"` - FieldVal string `json:"field,omitempty"` - BoostVal *Boost `json:"boost,omitempty"` -} - -func NewGeoDistanceQuery(lon, lat float64, distance string) *GeoDistanceQuery { - return &GeoDistanceQuery{ - Location: []float64{lon, lat}, - Distance: distance, - } -} - -func (q *GeoDistanceQuery) SetBoost(b float64) { - boost := Boost(b) - q.BoostVal = &boost -} - -func (q *GeoDistanceQuery) Boost() float64 { - return q.BoostVal.Value() -} - -func (q *GeoDistanceQuery) SetField(f string) { - q.FieldVal = f -} - -func (q *GeoDistanceQuery) Field() string { - return q.FieldVal -} - -func (q *GeoDistanceQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, - options search.SearcherOptions) (search.Searcher, error) { - field := q.FieldVal - if q.FieldVal == "" { - field = m.DefaultSearchField() - } - - dist, err := geo.ParseDistance(q.Distance) - if err != nil { - return nil, err - } - - return searcher.NewGeoPointDistanceSearcher(i, q.Location[0], q.Location[1], - dist, field, q.BoostVal.Value(), options) -} - -func (q *GeoDistanceQuery) Validate() error { - return nil -} - -func (q *GeoDistanceQuery) UnmarshalJSON(data []byte) error { - tmp := struct { - Location interface{} `json:"location,omitempty"` - Distance string `json:"distance,omitempty"` - FieldVal string `json:"field,omitempty"` - BoostVal *Boost `json:"boost,omitempty"` - }{} - err := json.Unmarshal(data, &tmp) - if err != nil { - return err - } - // now use our generic point parsing code from the geo package - lon, lat, found := geo.ExtractGeoPoint(tmp.Location) - if !found { - return fmt.Errorf("geo location not in a valid format") - } - q.Location = []float64{lon, lat} - q.Distance = tmp.Distance - q.FieldVal = tmp.FieldVal - q.BoostVal = tmp.BoostVal - return nil -} diff --git a/vendor/github.com/blevesearch/bleve/search/query/match.go b/vendor/github.com/blevesearch/bleve/search/query/match.go deleted file mode 100644 index 36c9ee4..0000000 --- a/vendor/github.com/blevesearch/bleve/search/query/match.go +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package query - -import ( - "encoding/json" - "fmt" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/mapping" - "github.com/blevesearch/bleve/search" -) - -type MatchQuery struct { - Match string `json:"match"` - FieldVal string `json:"field,omitempty"` - Analyzer string `json:"analyzer,omitempty"` - BoostVal *Boost `json:"boost,omitempty"` - Prefix int `json:"prefix_length"` - Fuzziness int `json:"fuzziness"` - Operator MatchQueryOperator `json:"operator,omitempty"` -} - -type MatchQueryOperator int - -const ( - // Document must satisfy AT LEAST ONE of term searches. - MatchQueryOperatorOr = 0 - // Document must satisfy ALL of term searches. - MatchQueryOperatorAnd = 1 -) - -func (o MatchQueryOperator) MarshalJSON() ([]byte, error) { - switch o { - case MatchQueryOperatorOr: - return json.Marshal("or") - case MatchQueryOperatorAnd: - return json.Marshal("and") - default: - return nil, fmt.Errorf("cannot marshal match operator %d to JSON", o) - } -} - -func (o *MatchQueryOperator) UnmarshalJSON(data []byte) error { - var operatorString string - err := json.Unmarshal(data, &operatorString) - if err != nil { - return err - } - - switch operatorString { - case "or": - *o = MatchQueryOperatorOr - return nil - case "and": - *o = MatchQueryOperatorAnd - return nil - default: - return fmt.Errorf("cannot unmarshal match operator '%v' from JSON", o) - } -} - -// NewMatchQuery creates a Query for matching text. -// An Analyzer is chosen based on the field. -// Input text is analyzed using this analyzer. -// Token terms resulting from this analysis are -// used to perform term searches. Result documents -// must satisfy at least one of these term searches. -func NewMatchQuery(match string) *MatchQuery { - return &MatchQuery{ - Match: match, - Operator: MatchQueryOperatorOr, - } -} - -func (q *MatchQuery) SetBoost(b float64) { - boost := Boost(b) - q.BoostVal = &boost -} - -func (q *MatchQuery) Boost() float64 { - return q.BoostVal.Value() -} - -func (q *MatchQuery) SetField(f string) { - q.FieldVal = f -} - -func (q *MatchQuery) Field() string { - return q.FieldVal -} - -func (q *MatchQuery) SetFuzziness(f int) { - q.Fuzziness = f -} - -func (q *MatchQuery) SetPrefix(p int) { - q.Prefix = p -} - -func (q *MatchQuery) SetOperator(operator MatchQueryOperator) { - q.Operator = operator -} - -func (q *MatchQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, options search.SearcherOptions) (search.Searcher, error) { - - field := q.FieldVal - if q.FieldVal == "" { - field = m.DefaultSearchField() - } - - analyzerName := "" - if q.Analyzer != "" { - analyzerName = q.Analyzer - } else { - analyzerName = m.AnalyzerNameForPath(field) - } - analyzer := m.AnalyzerNamed(analyzerName) - - if analyzer == nil { - return nil, fmt.Errorf("no analyzer named '%s' registered", q.Analyzer) - } - - tokens := analyzer.Analyze([]byte(q.Match)) - if len(tokens) > 0 { - - tqs := make([]Query, len(tokens)) - if q.Fuzziness != 0 { - for i, token := range tokens { - query := NewFuzzyQuery(string(token.Term)) - query.SetFuzziness(q.Fuzziness) - query.SetPrefix(q.Prefix) - query.SetField(field) - query.SetBoost(q.BoostVal.Value()) - tqs[i] = query - } - } else { - for i, token := range tokens { - tq := NewTermQuery(string(token.Term)) - tq.SetField(field) - tq.SetBoost(q.BoostVal.Value()) - tqs[i] = tq - } - } - - switch q.Operator { - case MatchQueryOperatorOr: - shouldQuery := NewDisjunctionQuery(tqs) - shouldQuery.SetMin(1) - shouldQuery.SetBoost(q.BoostVal.Value()) - return shouldQuery.Searcher(i, m, options) - - case MatchQueryOperatorAnd: - mustQuery := NewConjunctionQuery(tqs) - mustQuery.SetBoost(q.BoostVal.Value()) - return mustQuery.Searcher(i, m, options) - - default: - return nil, fmt.Errorf("unhandled operator %d", q.Operator) - } - } - noneQuery := NewMatchNoneQuery() - return noneQuery.Searcher(i, m, options) -} diff --git a/vendor/github.com/blevesearch/bleve/search/query/match_all.go b/vendor/github.com/blevesearch/bleve/search/query/match_all.go deleted file mode 100644 index 7fbe1f9..0000000 --- a/vendor/github.com/blevesearch/bleve/search/query/match_all.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package query - -import ( - "encoding/json" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/mapping" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/searcher" -) - -type MatchAllQuery struct { - BoostVal *Boost `json:"boost,omitempty"` -} - -// NewMatchAllQuery creates a Query which will -// match all documents in the index. -func NewMatchAllQuery() *MatchAllQuery { - return &MatchAllQuery{} -} - -func (q *MatchAllQuery) SetBoost(b float64) { - boost := Boost(b) - q.BoostVal = &boost -} - -func (q *MatchAllQuery) Boost() float64 { - return q.BoostVal.Value() -} - -func (q *MatchAllQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, options search.SearcherOptions) (search.Searcher, error) { - return searcher.NewMatchAllSearcher(i, q.BoostVal.Value(), options) -} - -func (q *MatchAllQuery) MarshalJSON() ([]byte, error) { - tmp := map[string]interface{}{ - "boost": q.BoostVal, - "match_all": map[string]interface{}{}, - } - return json.Marshal(tmp) -} diff --git a/vendor/github.com/blevesearch/bleve/search/query/match_none.go b/vendor/github.com/blevesearch/bleve/search/query/match_none.go deleted file mode 100644 index dc2ea78..0000000 --- a/vendor/github.com/blevesearch/bleve/search/query/match_none.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package query - -import ( - "encoding/json" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/mapping" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/searcher" -) - -type MatchNoneQuery struct { - BoostVal *Boost `json:"boost,omitempty"` -} - -// NewMatchNoneQuery creates a Query which will not -// match any documents in the index. -func NewMatchNoneQuery() *MatchNoneQuery { - return &MatchNoneQuery{} -} - -func (q *MatchNoneQuery) SetBoost(b float64) { - boost := Boost(b) - q.BoostVal = &boost -} - -func (q *MatchNoneQuery) Boost() float64 { - return q.BoostVal.Value() -} - -func (q *MatchNoneQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, options search.SearcherOptions) (search.Searcher, error) { - return searcher.NewMatchNoneSearcher(i) -} - -func (q *MatchNoneQuery) MarshalJSON() ([]byte, error) { - tmp := map[string]interface{}{ - "boost": q.BoostVal, - "match_none": map[string]interface{}{}, - } - return json.Marshal(tmp) -} diff --git a/vendor/github.com/blevesearch/bleve/search/query/match_phrase.go b/vendor/github.com/blevesearch/bleve/search/query/match_phrase.go deleted file mode 100644 index 51be355..0000000 --- a/vendor/github.com/blevesearch/bleve/search/query/match_phrase.go +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package query - -import ( - "fmt" - - "github.com/blevesearch/bleve/analysis" - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/mapping" - "github.com/blevesearch/bleve/search" -) - -type MatchPhraseQuery struct { - MatchPhrase string `json:"match_phrase"` - FieldVal string `json:"field,omitempty"` - Analyzer string `json:"analyzer,omitempty"` - BoostVal *Boost `json:"boost,omitempty"` -} - -// NewMatchPhraseQuery creates a new Query object -// for matching phrases in the index. -// An Analyzer is chosen based on the field. -// Input text is analyzed using this analyzer. -// Token terms resulting from this analysis are -// used to build a search phrase. Result documents -// must match this phrase. Queried field must have been indexed with -// IncludeTermVectors set to true. -func NewMatchPhraseQuery(matchPhrase string) *MatchPhraseQuery { - return &MatchPhraseQuery{ - MatchPhrase: matchPhrase, - } -} - -func (q *MatchPhraseQuery) SetBoost(b float64) { - boost := Boost(b) - q.BoostVal = &boost -} - -func (q *MatchPhraseQuery) Boost() float64 { - return q.BoostVal.Value() -} - -func (q *MatchPhraseQuery) SetField(f string) { - q.FieldVal = f -} - -func (q *MatchPhraseQuery) Field() string { - return q.FieldVal -} - -func (q *MatchPhraseQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, options search.SearcherOptions) (search.Searcher, error) { - field := q.FieldVal - if q.FieldVal == "" { - field = m.DefaultSearchField() - } - - analyzerName := "" - if q.Analyzer != "" { - analyzerName = q.Analyzer - } else { - analyzerName = m.AnalyzerNameForPath(field) - } - analyzer := m.AnalyzerNamed(analyzerName) - if analyzer == nil { - return nil, fmt.Errorf("no analyzer named '%s' registered", q.Analyzer) - } - - tokens := analyzer.Analyze([]byte(q.MatchPhrase)) - if len(tokens) > 0 { - phrase := tokenStreamToPhrase(tokens) - phraseQuery := NewMultiPhraseQuery(phrase, field) - phraseQuery.SetBoost(q.BoostVal.Value()) - return phraseQuery.Searcher(i, m, options) - } - noneQuery := NewMatchNoneQuery() - return noneQuery.Searcher(i, m, options) -} - -func tokenStreamToPhrase(tokens analysis.TokenStream) [][]string { - firstPosition := int(^uint(0) >> 1) - lastPosition := 0 - for _, token := range tokens { - if token.Position < firstPosition { - firstPosition = token.Position - } - if token.Position > lastPosition { - lastPosition = token.Position - } - } - phraseLen := lastPosition - firstPosition + 1 - if phraseLen > 0 { - rv := make([][]string, phraseLen) - for _, token := range tokens { - pos := token.Position - firstPosition - rv[pos] = append(rv[pos], string(token.Term)) - } - return rv - } - return nil -} diff --git a/vendor/github.com/blevesearch/bleve/search/query/multi_phrase.go b/vendor/github.com/blevesearch/bleve/search/query/multi_phrase.go deleted file mode 100644 index 8a7c9b6..0000000 --- a/vendor/github.com/blevesearch/bleve/search/query/multi_phrase.go +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package query - -import ( - "encoding/json" - "fmt" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/mapping" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/searcher" -) - -type MultiPhraseQuery struct { - Terms [][]string `json:"terms"` - Field string `json:"field,omitempty"` - BoostVal *Boost `json:"boost,omitempty"` -} - -// NewMultiPhraseQuery creates a new Query for finding -// term phrases in the index. -// It is like PhraseQuery, but each position in the -// phrase may be satisfied by a list of terms -// as opposed to just one. -// At least one of the terms must exist in the correct -// order, at the correct index offsets, in the -// specified field. Queried field must have been indexed with -// IncludeTermVectors set to true. -func NewMultiPhraseQuery(terms [][]string, field string) *MultiPhraseQuery { - return &MultiPhraseQuery{ - Terms: terms, - Field: field, - } -} - -func (q *MultiPhraseQuery) SetBoost(b float64) { - boost := Boost(b) - q.BoostVal = &boost -} - -func (q *MultiPhraseQuery) Boost() float64 { - return q.BoostVal.Value() -} - -func (q *MultiPhraseQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, options search.SearcherOptions) (search.Searcher, error) { - return searcher.NewMultiPhraseSearcher(i, q.Terms, q.Field, options) -} - -func (q *MultiPhraseQuery) Validate() error { - if len(q.Terms) < 1 { - return fmt.Errorf("phrase query must contain at least one term") - } - return nil -} - -func (q *MultiPhraseQuery) UnmarshalJSON(data []byte) error { - type _mphraseQuery MultiPhraseQuery - tmp := _mphraseQuery{} - err := json.Unmarshal(data, &tmp) - if err != nil { - return err - } - q.Terms = tmp.Terms - q.Field = tmp.Field - q.BoostVal = tmp.BoostVal - return nil -} diff --git a/vendor/github.com/blevesearch/bleve/search/query/numeric_range.go b/vendor/github.com/blevesearch/bleve/search/query/numeric_range.go deleted file mode 100644 index ea3f068..0000000 --- a/vendor/github.com/blevesearch/bleve/search/query/numeric_range.go +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package query - -import ( - "fmt" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/mapping" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/searcher" -) - -type NumericRangeQuery struct { - Min *float64 `json:"min,omitempty"` - Max *float64 `json:"max,omitempty"` - InclusiveMin *bool `json:"inclusive_min,omitempty"` - InclusiveMax *bool `json:"inclusive_max,omitempty"` - FieldVal string `json:"field,omitempty"` - BoostVal *Boost `json:"boost,omitempty"` -} - -// NewNumericRangeQuery creates a new Query for ranges -// of numeric values. -// Either, but not both endpoints can be nil. -// The minimum value is inclusive. -// The maximum value is exclusive. -func NewNumericRangeQuery(min, max *float64) *NumericRangeQuery { - return NewNumericRangeInclusiveQuery(min, max, nil, nil) -} - -// NewNumericRangeInclusiveQuery creates a new Query for ranges -// of numeric values. -// Either, but not both endpoints can be nil. -// Control endpoint inclusion with inclusiveMin, inclusiveMax. -func NewNumericRangeInclusiveQuery(min, max *float64, minInclusive, maxInclusive *bool) *NumericRangeQuery { - return &NumericRangeQuery{ - Min: min, - Max: max, - InclusiveMin: minInclusive, - InclusiveMax: maxInclusive, - } -} - -func (q *NumericRangeQuery) SetBoost(b float64) { - boost := Boost(b) - q.BoostVal = &boost -} - -func (q *NumericRangeQuery) Boost() float64 { - return q.BoostVal.Value() -} - -func (q *NumericRangeQuery) SetField(f string) { - q.FieldVal = f -} - -func (q *NumericRangeQuery) Field() string { - return q.FieldVal -} - -func (q *NumericRangeQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, options search.SearcherOptions) (search.Searcher, error) { - field := q.FieldVal - if q.FieldVal == "" { - field = m.DefaultSearchField() - } - return searcher.NewNumericRangeSearcher(i, q.Min, q.Max, q.InclusiveMin, q.InclusiveMax, field, q.BoostVal.Value(), options) -} - -func (q *NumericRangeQuery) Validate() error { - if q.Min == nil && q.Min == q.Max { - return fmt.Errorf("numeric range query must specify min or max") - } - return nil -} diff --git a/vendor/github.com/blevesearch/bleve/search/query/phrase.go b/vendor/github.com/blevesearch/bleve/search/query/phrase.go deleted file mode 100644 index dff1a02..0000000 --- a/vendor/github.com/blevesearch/bleve/search/query/phrase.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package query - -import ( - "encoding/json" - "fmt" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/mapping" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/searcher" -) - -type PhraseQuery struct { - Terms []string `json:"terms"` - Field string `json:"field,omitempty"` - BoostVal *Boost `json:"boost,omitempty"` -} - -// NewPhraseQuery creates a new Query for finding -// exact term phrases in the index. -// The provided terms must exist in the correct -// order, at the correct index offsets, in the -// specified field. Queried field must have been indexed with -// IncludeTermVectors set to true. -func NewPhraseQuery(terms []string, field string) *PhraseQuery { - return &PhraseQuery{ - Terms: terms, - Field: field, - } -} - -func (q *PhraseQuery) SetBoost(b float64) { - boost := Boost(b) - q.BoostVal = &boost -} - -func (q *PhraseQuery) Boost() float64 { - return q.BoostVal.Value() -} - -func (q *PhraseQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, options search.SearcherOptions) (search.Searcher, error) { - return searcher.NewPhraseSearcher(i, q.Terms, q.Field, options) -} - -func (q *PhraseQuery) Validate() error { - if len(q.Terms) < 1 { - return fmt.Errorf("phrase query must contain at least one term") - } - return nil -} - -func (q *PhraseQuery) UnmarshalJSON(data []byte) error { - type _phraseQuery PhraseQuery - tmp := _phraseQuery{} - err := json.Unmarshal(data, &tmp) - if err != nil { - return err - } - q.Terms = tmp.Terms - q.Field = tmp.Field - q.BoostVal = tmp.BoostVal - return nil -} diff --git a/vendor/github.com/blevesearch/bleve/search/query/prefix.go b/vendor/github.com/blevesearch/bleve/search/query/prefix.go deleted file mode 100644 index 4f5be2b..0000000 --- a/vendor/github.com/blevesearch/bleve/search/query/prefix.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package query - -import ( - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/mapping" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/searcher" -) - -type PrefixQuery struct { - Prefix string `json:"prefix"` - FieldVal string `json:"field,omitempty"` - BoostVal *Boost `json:"boost,omitempty"` -} - -// NewPrefixQuery creates a new Query which finds -// documents containing terms that start with the -// specified prefix. -func NewPrefixQuery(prefix string) *PrefixQuery { - return &PrefixQuery{ - Prefix: prefix, - } -} - -func (q *PrefixQuery) SetBoost(b float64) { - boost := Boost(b) - q.BoostVal = &boost -} - -func (q *PrefixQuery) Boost() float64 { - return q.BoostVal.Value() -} - -func (q *PrefixQuery) SetField(f string) { - q.FieldVal = f -} - -func (q *PrefixQuery) Field() string { - return q.FieldVal -} - -func (q *PrefixQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, options search.SearcherOptions) (search.Searcher, error) { - field := q.FieldVal - if q.FieldVal == "" { - field = m.DefaultSearchField() - } - return searcher.NewTermPrefixSearcher(i, q.Prefix, field, q.BoostVal.Value(), options) -} diff --git a/vendor/github.com/blevesearch/bleve/search/query/query.go b/vendor/github.com/blevesearch/bleve/search/query/query.go deleted file mode 100644 index 18aca22..0000000 --- a/vendor/github.com/blevesearch/bleve/search/query/query.go +++ /dev/null @@ -1,361 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package query - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "log" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/mapping" - "github.com/blevesearch/bleve/search" -) - -var logger = log.New(ioutil.Discard, "bleve mapping ", log.LstdFlags) - -// SetLog sets the logger used for logging -// by default log messages are sent to ioutil.Discard -func SetLog(l *log.Logger) { - logger = l -} - -// A Query represents a description of the type -// and parameters for a query into the index. -type Query interface { - Searcher(i index.IndexReader, m mapping.IndexMapping, - options search.SearcherOptions) (search.Searcher, error) -} - -// A BoostableQuery represents a Query which can be boosted -// relative to other queries. -type BoostableQuery interface { - Query - SetBoost(b float64) - Boost() float64 -} - -// A FieldableQuery represents a Query which can be restricted -// to a single field. -type FieldableQuery interface { - Query - SetField(f string) - Field() string -} - -// A ValidatableQuery represents a Query which can be validated -// prior to execution. -type ValidatableQuery interface { - Query - Validate() error -} - -// ParseQuery deserializes a JSON representation of -// a Query object. -func ParseQuery(input []byte) (Query, error) { - var tmp map[string]interface{} - err := json.Unmarshal(input, &tmp) - if err != nil { - return nil, err - } - _, isMatchQuery := tmp["match"] - _, hasFuzziness := tmp["fuzziness"] - if hasFuzziness && !isMatchQuery { - var rv FuzzyQuery - err := json.Unmarshal(input, &rv) - if err != nil { - return nil, err - } - return &rv, nil - } - _, isTermQuery := tmp["term"] - if isTermQuery { - var rv TermQuery - err := json.Unmarshal(input, &rv) - if err != nil { - return nil, err - } - return &rv, nil - } - if isMatchQuery { - var rv MatchQuery - err := json.Unmarshal(input, &rv) - if err != nil { - return nil, err - } - return &rv, nil - } - _, isMatchPhraseQuery := tmp["match_phrase"] - if isMatchPhraseQuery { - var rv MatchPhraseQuery - err := json.Unmarshal(input, &rv) - if err != nil { - return nil, err - } - return &rv, nil - } - _, hasMust := tmp["must"] - _, hasShould := tmp["should"] - _, hasMustNot := tmp["must_not"] - if hasMust || hasShould || hasMustNot { - var rv BooleanQuery - err := json.Unmarshal(input, &rv) - if err != nil { - return nil, err - } - return &rv, nil - } - _, hasTerms := tmp["terms"] - if hasTerms { - var rv PhraseQuery - err := json.Unmarshal(input, &rv) - if err != nil { - // now try multi-phrase - var rv2 MultiPhraseQuery - err = json.Unmarshal(input, &rv2) - if err != nil { - return nil, err - } - return &rv2, nil - } - return &rv, nil - } - _, hasConjuncts := tmp["conjuncts"] - if hasConjuncts { - var rv ConjunctionQuery - err := json.Unmarshal(input, &rv) - if err != nil { - return nil, err - } - return &rv, nil - } - _, hasDisjuncts := tmp["disjuncts"] - if hasDisjuncts { - var rv DisjunctionQuery - err := json.Unmarshal(input, &rv) - if err != nil { - return nil, err - } - return &rv, nil - } - - _, hasSyntaxQuery := tmp["query"] - if hasSyntaxQuery { - var rv QueryStringQuery - err := json.Unmarshal(input, &rv) - if err != nil { - return nil, err - } - return &rv, nil - } - _, hasMin := tmp["min"].(float64) - _, hasMax := tmp["max"].(float64) - if hasMin || hasMax { - var rv NumericRangeQuery - err := json.Unmarshal(input, &rv) - if err != nil { - return nil, err - } - return &rv, nil - } - _, hasMinStr := tmp["min"].(string) - _, hasMaxStr := tmp["max"].(string) - if hasMinStr || hasMaxStr { - var rv TermRangeQuery - err := json.Unmarshal(input, &rv) - if err != nil { - return nil, err - } - return &rv, nil - } - _, hasStart := tmp["start"] - _, hasEnd := tmp["end"] - if hasStart || hasEnd { - var rv DateRangeQuery - err := json.Unmarshal(input, &rv) - if err != nil { - return nil, err - } - return &rv, nil - } - _, hasPrefix := tmp["prefix"] - if hasPrefix { - var rv PrefixQuery - err := json.Unmarshal(input, &rv) - if err != nil { - return nil, err - } - return &rv, nil - } - _, hasRegexp := tmp["regexp"] - if hasRegexp { - var rv RegexpQuery - err := json.Unmarshal(input, &rv) - if err != nil { - return nil, err - } - return &rv, nil - } - _, hasWildcard := tmp["wildcard"] - if hasWildcard { - var rv WildcardQuery - err := json.Unmarshal(input, &rv) - if err != nil { - return nil, err - } - return &rv, nil - } - _, hasMatchAll := tmp["match_all"] - if hasMatchAll { - var rv MatchAllQuery - err := json.Unmarshal(input, &rv) - if err != nil { - return nil, err - } - return &rv, nil - } - _, hasMatchNone := tmp["match_none"] - if hasMatchNone { - var rv MatchNoneQuery - err := json.Unmarshal(input, &rv) - if err != nil { - return nil, err - } - return &rv, nil - } - _, hasDocIds := tmp["ids"] - if hasDocIds { - var rv DocIDQuery - err := json.Unmarshal(input, &rv) - if err != nil { - return nil, err - } - return &rv, nil - } - _, hasBool := tmp["bool"] - if hasBool { - var rv BoolFieldQuery - err := json.Unmarshal(input, &rv) - if err != nil { - return nil, err - } - return &rv, nil - } - _, hasTopLeft := tmp["top_left"] - _, hasBottomRight := tmp["bottom_right"] - if hasTopLeft && hasBottomRight { - var rv GeoBoundingBoxQuery - err := json.Unmarshal(input, &rv) - if err != nil { - return nil, err - } - return &rv, nil - } - _, hasDistance := tmp["distance"] - if hasDistance { - var rv GeoDistanceQuery - err := json.Unmarshal(input, &rv) - if err != nil { - return nil, err - } - return &rv, nil - } - _, hasPoints := tmp["polygon_points"] - if hasPoints { - var rv GeoBoundingPolygonQuery - err := json.Unmarshal(input, &rv) - if err != nil { - return nil, err - } - return &rv, nil - } - return nil, fmt.Errorf("unknown query type") -} - -// expandQuery traverses the input query tree and returns a new tree where -// query string queries have been expanded into base queries. Returned tree may -// reference queries from the input tree or new queries. -func expandQuery(m mapping.IndexMapping, query Query) (Query, error) { - var expand func(query Query) (Query, error) - var expandSlice func(queries []Query) ([]Query, error) - - expandSlice = func(queries []Query) ([]Query, error) { - expanded := []Query{} - for _, q := range queries { - exp, err := expand(q) - if err != nil { - return nil, err - } - expanded = append(expanded, exp) - } - return expanded, nil - } - - expand = func(query Query) (Query, error) { - switch q := query.(type) { - case *QueryStringQuery: - parsed, err := parseQuerySyntax(q.Query) - if err != nil { - return nil, fmt.Errorf("could not parse '%s': %s", q.Query, err) - } - return expand(parsed) - case *ConjunctionQuery: - children, err := expandSlice(q.Conjuncts) - if err != nil { - return nil, err - } - q.Conjuncts = children - return q, nil - case *DisjunctionQuery: - children, err := expandSlice(q.Disjuncts) - if err != nil { - return nil, err - } - q.Disjuncts = children - return q, nil - case *BooleanQuery: - var err error - q.Must, err = expand(q.Must) - if err != nil { - return nil, err - } - q.Should, err = expand(q.Should) - if err != nil { - return nil, err - } - q.MustNot, err = expand(q.MustNot) - if err != nil { - return nil, err - } - return q, nil - default: - return query, nil - } - } - return expand(query) -} - -// DumpQuery returns a string representation of the query tree, where query -// string queries have been expanded into base queries. The output format is -// meant for debugging purpose and may change in the future. -func DumpQuery(m mapping.IndexMapping, query Query) (string, error) { - q, err := expandQuery(m, query) - if err != nil { - return "", err - } - data, err := json.MarshalIndent(q, "", " ") - return string(data), err -} diff --git a/vendor/github.com/blevesearch/bleve/search/query/query_string.go b/vendor/github.com/blevesearch/bleve/search/query/query_string.go deleted file mode 100644 index ecafe6b..0000000 --- a/vendor/github.com/blevesearch/bleve/search/query/query_string.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package query - -import ( - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/mapping" - "github.com/blevesearch/bleve/search" -) - -type QueryStringQuery struct { - Query string `json:"query"` - BoostVal *Boost `json:"boost,omitempty"` -} - -// NewQueryStringQuery creates a new Query used for -// finding documents that satisfy a query string. The -// query string is a small query language for humans. -func NewQueryStringQuery(query string) *QueryStringQuery { - return &QueryStringQuery{ - Query: query, - } -} - -func (q *QueryStringQuery) SetBoost(b float64) { - boost := Boost(b) - q.BoostVal = &boost -} - -func (q *QueryStringQuery) Boost() float64 { - return q.BoostVal.Value() -} - -func (q *QueryStringQuery) Parse() (Query, error) { - return parseQuerySyntax(q.Query) -} - -func (q *QueryStringQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, options search.SearcherOptions) (search.Searcher, error) { - newQuery, err := parseQuerySyntax(q.Query) - if err != nil { - return nil, err - } - return newQuery.Searcher(i, m, options) -} - -func (q *QueryStringQuery) Validate() error { - newQuery, err := parseQuerySyntax(q.Query) - if err != nil { - return err - } - if newQuery, ok := newQuery.(ValidatableQuery); ok { - return newQuery.Validate() - } - return nil -} diff --git a/vendor/github.com/blevesearch/bleve/search/query/regexp.go b/vendor/github.com/blevesearch/bleve/search/query/regexp.go deleted file mode 100644 index 0c87a6f..0000000 --- a/vendor/github.com/blevesearch/bleve/search/query/regexp.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package query - -import ( - "strings" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/mapping" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/searcher" -) - -type RegexpQuery struct { - Regexp string `json:"regexp"` - FieldVal string `json:"field,omitempty"` - BoostVal *Boost `json:"boost,omitempty"` -} - -// NewRegexpQuery creates a new Query which finds -// documents containing terms that match the -// specified regular expression. The regexp pattern -// SHOULD NOT include ^ or $ modifiers, the search -// will only match entire terms even without them. -func NewRegexpQuery(regexp string) *RegexpQuery { - return &RegexpQuery{ - Regexp: regexp, - } -} - -func (q *RegexpQuery) SetBoost(b float64) { - boost := Boost(b) - q.BoostVal = &boost -} - -func (q *RegexpQuery) Boost() float64 { - return q.BoostVal.Value() -} - -func (q *RegexpQuery) SetField(f string) { - q.FieldVal = f -} - -func (q *RegexpQuery) Field() string { - return q.FieldVal -} - -func (q *RegexpQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, options search.SearcherOptions) (search.Searcher, error) { - field := q.FieldVal - if q.FieldVal == "" { - field = m.DefaultSearchField() - } - - // require that pattern NOT be anchored to start and end of term. - // do not attempt to remove trailing $, its presence is not - // known to interfere with LiteralPrefix() the way ^ does - // and removing $ introduces possible ambiguities with escaped \$, \\$, etc - actualRegexp := q.Regexp - if strings.HasPrefix(actualRegexp, "^") { - actualRegexp = actualRegexp[1:] // remove leading ^ - } - - return searcher.NewRegexpStringSearcher(i, actualRegexp, field, - q.BoostVal.Value(), options) -} - -func (q *RegexpQuery) Validate() error { - return nil // real validation delayed until searcher constructor -} diff --git a/vendor/github.com/blevesearch/bleve/search/query/term.go b/vendor/github.com/blevesearch/bleve/search/query/term.go deleted file mode 100644 index 2eeb5a3..0000000 --- a/vendor/github.com/blevesearch/bleve/search/query/term.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package query - -import ( - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/mapping" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/searcher" -) - -type TermQuery struct { - Term string `json:"term"` - FieldVal string `json:"field,omitempty"` - BoostVal *Boost `json:"boost,omitempty"` -} - -// NewTermQuery creates a new Query for finding an -// exact term match in the index. -func NewTermQuery(term string) *TermQuery { - return &TermQuery{ - Term: term, - } -} - -func (q *TermQuery) SetBoost(b float64) { - boost := Boost(b) - q.BoostVal = &boost -} - -func (q *TermQuery) Boost() float64 { - return q.BoostVal.Value() -} - -func (q *TermQuery) SetField(f string) { - q.FieldVal = f -} - -func (q *TermQuery) Field() string { - return q.FieldVal -} - -func (q *TermQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, options search.SearcherOptions) (search.Searcher, error) { - field := q.FieldVal - if q.FieldVal == "" { - field = m.DefaultSearchField() - } - return searcher.NewTermSearcher(i, q.Term, field, q.BoostVal.Value(), options) -} diff --git a/vendor/github.com/blevesearch/bleve/search/query/term_range.go b/vendor/github.com/blevesearch/bleve/search/query/term_range.go deleted file mode 100644 index 8f8ca84..0000000 --- a/vendor/github.com/blevesearch/bleve/search/query/term_range.go +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package query - -import ( - "fmt" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/mapping" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/searcher" -) - -type TermRangeQuery struct { - Min string `json:"min,omitempty"` - Max string `json:"max,omitempty"` - InclusiveMin *bool `json:"inclusive_min,omitempty"` - InclusiveMax *bool `json:"inclusive_max,omitempty"` - FieldVal string `json:"field,omitempty"` - BoostVal *Boost `json:"boost,omitempty"` -} - -// NewTermRangeQuery creates a new Query for ranges -// of text term values. -// Either, but not both endpoints can be nil. -// The minimum value is inclusive. -// The maximum value is exclusive. -func NewTermRangeQuery(min, max string) *TermRangeQuery { - return NewTermRangeInclusiveQuery(min, max, nil, nil) -} - -// NewTermRangeInclusiveQuery creates a new Query for ranges -// of numeric values. -// Either, but not both endpoints can be nil. -// Control endpoint inclusion with inclusiveMin, inclusiveMax. -func NewTermRangeInclusiveQuery(min, max string, minInclusive, maxInclusive *bool) *TermRangeQuery { - return &TermRangeQuery{ - Min: min, - Max: max, - InclusiveMin: minInclusive, - InclusiveMax: maxInclusive, - } -} - -func (q *TermRangeQuery) SetBoost(b float64) { - boost := Boost(b) - q.BoostVal = &boost -} - -func (q *TermRangeQuery) Boost() float64 { - return q.BoostVal.Value() -} - -func (q *TermRangeQuery) SetField(f string) { - q.FieldVal = f -} - -func (q *TermRangeQuery) Field() string { - return q.FieldVal -} - -func (q *TermRangeQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, options search.SearcherOptions) (search.Searcher, error) { - field := q.FieldVal - if q.FieldVal == "" { - field = m.DefaultSearchField() - } - var minTerm []byte - if q.Min != "" { - minTerm = []byte(q.Min) - } - var maxTerm []byte - if q.Max != "" { - maxTerm = []byte(q.Max) - } - return searcher.NewTermRangeSearcher(i, minTerm, maxTerm, q.InclusiveMin, q.InclusiveMax, field, q.BoostVal.Value(), options) -} - -func (q *TermRangeQuery) Validate() error { - if q.Min == "" && q.Min == q.Max { - return fmt.Errorf("term range query must specify min or max") - } - return nil -} diff --git a/vendor/github.com/blevesearch/bleve/search/query/wildcard.go b/vendor/github.com/blevesearch/bleve/search/query/wildcard.go deleted file mode 100644 index 747dfe7..0000000 --- a/vendor/github.com/blevesearch/bleve/search/query/wildcard.go +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package query - -import ( - "strings" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/mapping" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/searcher" -) - -var wildcardRegexpReplacer = strings.NewReplacer( - // characters in the wildcard that must - // be escaped in the regexp - "+", `\+`, - "(", `\(`, - ")", `\)`, - "^", `\^`, - "$", `\$`, - ".", `\.`, - "{", `\{`, - "}", `\}`, - "[", `\[`, - "]", `\]`, - `|`, `\|`, - `\`, `\\`, - // wildcard characters - "*", ".*", - "?", ".") - -type WildcardQuery struct { - Wildcard string `json:"wildcard"` - FieldVal string `json:"field,omitempty"` - BoostVal *Boost `json:"boost,omitempty"` -} - -// NewWildcardQuery creates a new Query which finds -// documents containing terms that match the -// specified wildcard. In the wildcard pattern '*' -// will match any sequence of 0 or more characters, -// and '?' will match any single character. -func NewWildcardQuery(wildcard string) *WildcardQuery { - return &WildcardQuery{ - Wildcard: wildcard, - } -} - -func (q *WildcardQuery) SetBoost(b float64) { - boost := Boost(b) - q.BoostVal = &boost -} - -func (q *WildcardQuery) Boost() float64 { - return q.BoostVal.Value() -} - -func (q *WildcardQuery) SetField(f string) { - q.FieldVal = f -} - -func (q *WildcardQuery) Field() string { - return q.FieldVal -} - -func (q *WildcardQuery) Searcher(i index.IndexReader, m mapping.IndexMapping, options search.SearcherOptions) (search.Searcher, error) { - field := q.FieldVal - if q.FieldVal == "" { - field = m.DefaultSearchField() - } - - regexpString := wildcardRegexpReplacer.Replace(q.Wildcard) - - return searcher.NewRegexpStringSearcher(i, regexpString, field, - q.BoostVal.Value(), options) -} - -func (q *WildcardQuery) Validate() error { - return nil // real validation delayed until searcher constructor -} diff --git a/vendor/github.com/blevesearch/bleve/search/scorer/scorer_conjunction.go b/vendor/github.com/blevesearch/bleve/search/scorer/scorer_conjunction.go deleted file mode 100644 index 48cdf3a..0000000 --- a/vendor/github.com/blevesearch/bleve/search/scorer/scorer_conjunction.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package scorer - -import ( - "reflect" - - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/size" -) - -var reflectStaticSizeConjunctionQueryScorer int - -func init() { - var cqs ConjunctionQueryScorer - reflectStaticSizeConjunctionQueryScorer = int(reflect.TypeOf(cqs).Size()) -} - -type ConjunctionQueryScorer struct { - options search.SearcherOptions -} - -func (s *ConjunctionQueryScorer) Size() int { - return reflectStaticSizeConjunctionQueryScorer + size.SizeOfPtr -} - -func NewConjunctionQueryScorer(options search.SearcherOptions) *ConjunctionQueryScorer { - return &ConjunctionQueryScorer{ - options: options, - } -} - -func (s *ConjunctionQueryScorer) Score(ctx *search.SearchContext, constituents []*search.DocumentMatch) *search.DocumentMatch { - var sum float64 - var childrenExplanations []*search.Explanation - if s.options.Explain { - childrenExplanations = make([]*search.Explanation, len(constituents)) - } - - for i, docMatch := range constituents { - sum += docMatch.Score - if s.options.Explain { - childrenExplanations[i] = docMatch.Expl - } - } - newScore := sum - var newExpl *search.Explanation - if s.options.Explain { - newExpl = &search.Explanation{Value: sum, Message: "sum of:", Children: childrenExplanations} - } - - // reuse constituents[0] as the return value - rv := constituents[0] - rv.Score = newScore - rv.Expl = newExpl - rv.FieldTermLocations = search.MergeFieldTermLocations( - rv.FieldTermLocations, constituents[1:]) - - return rv -} diff --git a/vendor/github.com/blevesearch/bleve/search/scorer/scorer_disjunction.go b/vendor/github.com/blevesearch/bleve/search/scorer/scorer_disjunction.go deleted file mode 100644 index 7a955e1..0000000 --- a/vendor/github.com/blevesearch/bleve/search/scorer/scorer_disjunction.go +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package scorer - -import ( - "fmt" - "reflect" - - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/size" -) - -var reflectStaticSizeDisjunctionQueryScorer int - -func init() { - var dqs DisjunctionQueryScorer - reflectStaticSizeDisjunctionQueryScorer = int(reflect.TypeOf(dqs).Size()) -} - -type DisjunctionQueryScorer struct { - options search.SearcherOptions -} - -func (s *DisjunctionQueryScorer) Size() int { - return reflectStaticSizeDisjunctionQueryScorer + size.SizeOfPtr -} - -func NewDisjunctionQueryScorer(options search.SearcherOptions) *DisjunctionQueryScorer { - return &DisjunctionQueryScorer{ - options: options, - } -} - -func (s *DisjunctionQueryScorer) Score(ctx *search.SearchContext, constituents []*search.DocumentMatch, countMatch, countTotal int) *search.DocumentMatch { - var sum float64 - var childrenExplanations []*search.Explanation - if s.options.Explain { - childrenExplanations = make([]*search.Explanation, len(constituents)) - } - - for i, docMatch := range constituents { - sum += docMatch.Score - if s.options.Explain { - childrenExplanations[i] = docMatch.Expl - } - } - - var rawExpl *search.Explanation - if s.options.Explain { - rawExpl = &search.Explanation{Value: sum, Message: "sum of:", Children: childrenExplanations} - } - - coord := float64(countMatch) / float64(countTotal) - newScore := sum * coord - var newExpl *search.Explanation - if s.options.Explain { - ce := make([]*search.Explanation, 2) - ce[0] = rawExpl - ce[1] = &search.Explanation{Value: coord, Message: fmt.Sprintf("coord(%d/%d)", countMatch, countTotal)} - newExpl = &search.Explanation{Value: newScore, Message: "product of:", Children: ce} - } - - // reuse constituents[0] as the return value - rv := constituents[0] - rv.Score = newScore - rv.Expl = newExpl - rv.FieldTermLocations = search.MergeFieldTermLocations( - rv.FieldTermLocations, constituents[1:]) - - return rv -} diff --git a/vendor/github.com/blevesearch/bleve/search/scorer/scorer_term.go b/vendor/github.com/blevesearch/bleve/search/scorer/scorer_term.go deleted file mode 100644 index 718de2e..0000000 --- a/vendor/github.com/blevesearch/bleve/search/scorer/scorer_term.go +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package scorer - -import ( - "fmt" - "math" - "reflect" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/size" -) - -var reflectStaticSizeTermQueryScorer int - -func init() { - var tqs TermQueryScorer - reflectStaticSizeTermQueryScorer = int(reflect.TypeOf(tqs).Size()) -} - -type TermQueryScorer struct { - queryTerm string - queryField string - queryBoost float64 - docTerm uint64 - docTotal uint64 - idf float64 - options search.SearcherOptions - idfExplanation *search.Explanation - includeScore bool - queryNorm float64 - queryWeight float64 - queryWeightExplanation *search.Explanation -} - -func (s *TermQueryScorer) Size() int { - sizeInBytes := reflectStaticSizeTermQueryScorer + size.SizeOfPtr + - len(s.queryTerm) + len(s.queryField) - - if s.idfExplanation != nil { - sizeInBytes += s.idfExplanation.Size() - } - - if s.queryWeightExplanation != nil { - sizeInBytes += s.queryWeightExplanation.Size() - } - - return sizeInBytes -} - -func NewTermQueryScorer(queryTerm []byte, queryField string, queryBoost float64, docTotal, docTerm uint64, options search.SearcherOptions) *TermQueryScorer { - rv := TermQueryScorer{ - queryTerm: string(queryTerm), - queryField: queryField, - queryBoost: queryBoost, - docTerm: docTerm, - docTotal: docTotal, - idf: 1.0 + math.Log(float64(docTotal)/float64(docTerm+1.0)), - options: options, - queryWeight: 1.0, - includeScore: options.Score != "none", - } - - if options.Explain { - rv.idfExplanation = &search.Explanation{ - Value: rv.idf, - Message: fmt.Sprintf("idf(docFreq=%d, maxDocs=%d)", docTerm, docTotal), - } - } - - return &rv -} - -func (s *TermQueryScorer) Weight() float64 { - sum := s.queryBoost * s.idf - return sum * sum -} - -func (s *TermQueryScorer) SetQueryNorm(qnorm float64) { - s.queryNorm = qnorm - - // update the query weight - s.queryWeight = s.queryBoost * s.idf * s.queryNorm - - if s.options.Explain { - childrenExplanations := make([]*search.Explanation, 3) - childrenExplanations[0] = &search.Explanation{ - Value: s.queryBoost, - Message: "boost", - } - childrenExplanations[1] = s.idfExplanation - childrenExplanations[2] = &search.Explanation{ - Value: s.queryNorm, - Message: "queryNorm", - } - s.queryWeightExplanation = &search.Explanation{ - Value: s.queryWeight, - Message: fmt.Sprintf("queryWeight(%s:%s^%f), product of:", s.queryField, s.queryTerm, s.queryBoost), - Children: childrenExplanations, - } - } -} - -func (s *TermQueryScorer) Score(ctx *search.SearchContext, termMatch *index.TermFieldDoc) *search.DocumentMatch { - rv := ctx.DocumentMatchPool.Get() - // perform any score computations only when needed - if s.includeScore || s.options.Explain { - var scoreExplanation *search.Explanation - var tf float64 - if termMatch.Freq < MaxSqrtCache { - tf = SqrtCache[int(termMatch.Freq)] - } else { - tf = math.Sqrt(float64(termMatch.Freq)) - } - score := tf * termMatch.Norm * s.idf - - if s.options.Explain { - childrenExplanations := make([]*search.Explanation, 3) - childrenExplanations[0] = &search.Explanation{ - Value: tf, - Message: fmt.Sprintf("tf(termFreq(%s:%s)=%d", s.queryField, s.queryTerm, termMatch.Freq), - } - childrenExplanations[1] = &search.Explanation{ - Value: termMatch.Norm, - Message: fmt.Sprintf("fieldNorm(field=%s, doc=%s)", s.queryField, termMatch.ID), - } - childrenExplanations[2] = s.idfExplanation - scoreExplanation = &search.Explanation{ - Value: score, - Message: fmt.Sprintf("fieldWeight(%s:%s in %s), product of:", s.queryField, s.queryTerm, termMatch.ID), - Children: childrenExplanations, - } - } - - // if the query weight isn't 1, multiply - if s.queryWeight != 1.0 { - score = score * s.queryWeight - if s.options.Explain { - childExplanations := make([]*search.Explanation, 2) - childExplanations[0] = s.queryWeightExplanation - childExplanations[1] = scoreExplanation - scoreExplanation = &search.Explanation{ - Value: score, - Message: fmt.Sprintf("weight(%s:%s^%f in %s), product of:", s.queryField, s.queryTerm, s.queryBoost, termMatch.ID), - Children: childExplanations, - } - } - } - - if s.includeScore { - rv.Score = score - } - - if s.options.Explain { - rv.Expl = scoreExplanation - } - } - - rv.IndexInternalID = append(rv.IndexInternalID, termMatch.ID...) - - if len(termMatch.Vectors) > 0 { - if cap(rv.FieldTermLocations) < len(termMatch.Vectors) { - rv.FieldTermLocations = make([]search.FieldTermLocation, 0, len(termMatch.Vectors)) - } - - for _, v := range termMatch.Vectors { - var ap search.ArrayPositions - if len(v.ArrayPositions) > 0 { - n := len(rv.FieldTermLocations) - if n < cap(rv.FieldTermLocations) { // reuse ap slice if available - ap = rv.FieldTermLocations[:n+1][n].Location.ArrayPositions[:0] - } - ap = append(ap, v.ArrayPositions...) - } - rv.FieldTermLocations = - append(rv.FieldTermLocations, search.FieldTermLocation{ - Field: v.Field, - Term: s.queryTerm, - Location: search.Location{ - Pos: v.Pos, - Start: v.Start, - End: v.End, - ArrayPositions: ap, - }, - }) - } - } - - return rv -} diff --git a/vendor/github.com/blevesearch/bleve/search/scorer/sqrt_cache.go b/vendor/github.com/blevesearch/bleve/search/scorer/sqrt_cache.go deleted file mode 100644 index e26d33d..0000000 --- a/vendor/github.com/blevesearch/bleve/search/scorer/sqrt_cache.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package scorer - -import ( - "math" -) - -var SqrtCache []float64 - -const MaxSqrtCache = 64 - -func init() { - SqrtCache = make([]float64, MaxSqrtCache) - for i := 0; i < MaxSqrtCache; i++ { - SqrtCache[i] = math.Sqrt(float64(i)) - } -} diff --git a/vendor/github.com/blevesearch/bleve/search/scorers/scorer_conjunction.go b/vendor/github.com/blevesearch/bleve/search/scorers/scorer_conjunction.go new file mode 100644 index 0000000..c941c69 --- /dev/null +++ b/vendor/github.com/blevesearch/bleve/search/scorers/scorer_conjunction.go @@ -0,0 +1,60 @@ +// Copyright (c) 2014 Couchbase, Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. + +package scorers + +import ( + "github.com/blevesearch/bleve/search" +) + +type ConjunctionQueryScorer struct { + explain bool +} + +func NewConjunctionQueryScorer(explain bool) *ConjunctionQueryScorer { + return &ConjunctionQueryScorer{ + explain: explain, + } +} + +func (s *ConjunctionQueryScorer) Score(ctx *search.SearchContext, constituents []*search.DocumentMatch) *search.DocumentMatch { + var sum float64 + var childrenExplanations []*search.Explanation + if s.explain { + childrenExplanations = make([]*search.Explanation, len(constituents)) + } + + locations := []search.FieldTermLocationMap{} + for i, docMatch := range constituents { + sum += docMatch.Score + if s.explain { + childrenExplanations[i] = docMatch.Expl + } + if docMatch.Locations != nil { + locations = append(locations, docMatch.Locations) + } + } + newScore := sum + var newExpl *search.Explanation + if s.explain { + newExpl = &search.Explanation{Value: sum, Message: "sum of:", Children: childrenExplanations} + } + + // reuse constituents[0] as the return value + rv := constituents[0] + rv.Score = newScore + rv.Expl = newExpl + if len(locations) == 1 { + rv.Locations = locations[0] + } else if len(locations) > 1 { + rv.Locations = search.MergeLocations(locations) + } + + return rv +} diff --git a/vendor/github.com/blevesearch/bleve/search/scorer/scorer_constant.go b/vendor/github.com/blevesearch/bleve/search/scorers/scorer_constant.go similarity index 60% rename from vendor/github.com/blevesearch/bleve/search/scorer/scorer_constant.go rename to vendor/github.com/blevesearch/bleve/search/scorers/scorer_constant.go index dc10fda..adbaf47 100644 --- a/vendor/github.com/blevesearch/bleve/search/scorer/scorer_constant.go +++ b/vendor/github.com/blevesearch/bleve/search/scorers/scorer_constant.go @@ -1,57 +1,33 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. -package scorer +package scorers import ( "fmt" - "reflect" "github.com/blevesearch/bleve/index" "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/size" ) -var reflectStaticSizeConstantScorer int - -func init() { - var cs ConstantScorer - reflectStaticSizeConstantScorer = int(reflect.TypeOf(cs).Size()) -} - type ConstantScorer struct { constant float64 boost float64 - options search.SearcherOptions + explain bool queryNorm float64 queryWeight float64 queryWeightExplanation *search.Explanation } -func (s *ConstantScorer) Size() int { - sizeInBytes := reflectStaticSizeConstantScorer + size.SizeOfPtr - - if s.queryWeightExplanation != nil { - sizeInBytes += s.queryWeightExplanation.Size() - } - - return sizeInBytes -} - -func NewConstantScorer(constant float64, boost float64, options search.SearcherOptions) *ConstantScorer { +func NewConstantScorer(constant float64, boost float64, explain bool) *ConstantScorer { rv := ConstantScorer{ - options: options, + explain: explain, queryWeight: 1.0, constant: constant, boost: boost, @@ -71,7 +47,7 @@ func (s *ConstantScorer) SetQueryNorm(qnorm float64) { // update the query weight s.queryWeight = s.boost * s.queryNorm - if s.options.Explain { + if s.explain { childrenExplanations := make([]*search.Explanation, 2) childrenExplanations[0] = &search.Explanation{ Value: s.boost, @@ -94,7 +70,7 @@ func (s *ConstantScorer) Score(ctx *search.SearchContext, id index.IndexInternal score := s.constant - if s.options.Explain { + if s.explain { scoreExplanation = &search.Explanation{ Value: score, Message: fmt.Sprintf("ConstantScore()"), @@ -104,7 +80,7 @@ func (s *ConstantScorer) Score(ctx *search.SearchContext, id index.IndexInternal // if the query weight isn't 1, multiply if s.queryWeight != 1.0 { score = score * s.queryWeight - if s.options.Explain { + if s.explain { childExplanations := make([]*search.Explanation, 2) childExplanations[0] = s.queryWeightExplanation childExplanations[1] = scoreExplanation @@ -119,7 +95,7 @@ func (s *ConstantScorer) Score(ctx *search.SearchContext, id index.IndexInternal rv := ctx.DocumentMatchPool.Get() rv.IndexInternalID = id rv.Score = score - if s.options.Explain { + if s.explain { rv.Expl = scoreExplanation } diff --git a/vendor/github.com/blevesearch/bleve/search/scorers/scorer_disjunction.go b/vendor/github.com/blevesearch/bleve/search/scorers/scorer_disjunction.go new file mode 100644 index 0000000..2aca054 --- /dev/null +++ b/vendor/github.com/blevesearch/bleve/search/scorers/scorer_disjunction.go @@ -0,0 +1,72 @@ +// Copyright (c) 2014 Couchbase, Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. + +package scorers + +import ( + "fmt" + + "github.com/blevesearch/bleve/search" +) + +type DisjunctionQueryScorer struct { + explain bool +} + +func NewDisjunctionQueryScorer(explain bool) *DisjunctionQueryScorer { + return &DisjunctionQueryScorer{ + explain: explain, + } +} + +func (s *DisjunctionQueryScorer) Score(ctx *search.SearchContext, constituents []*search.DocumentMatch, countMatch, countTotal int) *search.DocumentMatch { + var sum float64 + var childrenExplanations []*search.Explanation + if s.explain { + childrenExplanations = make([]*search.Explanation, len(constituents)) + } + + var locations []search.FieldTermLocationMap + for i, docMatch := range constituents { + sum += docMatch.Score + if s.explain { + childrenExplanations[i] = docMatch.Expl + } + if docMatch.Locations != nil { + locations = append(locations, docMatch.Locations) + } + } + + var rawExpl *search.Explanation + if s.explain { + rawExpl = &search.Explanation{Value: sum, Message: "sum of:", Children: childrenExplanations} + } + + coord := float64(countMatch) / float64(countTotal) + newScore := sum * coord + var newExpl *search.Explanation + if s.explain { + ce := make([]*search.Explanation, 2) + ce[0] = rawExpl + ce[1] = &search.Explanation{Value: coord, Message: fmt.Sprintf("coord(%d/%d)", countMatch, countTotal)} + newExpl = &search.Explanation{Value: newScore, Message: "product of:", Children: ce} + } + + // reuse constituents[0] as the return value + rv := constituents[0] + rv.Score = newScore + rv.Expl = newExpl + if len(locations) == 1 { + rv.Locations = locations[0] + } else if len(locations) > 1 { + rv.Locations = search.MergeLocations(locations) + } + + return rv +} diff --git a/vendor/github.com/blevesearch/bleve/search/scorers/scorer_term.go b/vendor/github.com/blevesearch/bleve/search/scorers/scorer_term.go new file mode 100644 index 0000000..4304d06 --- /dev/null +++ b/vendor/github.com/blevesearch/bleve/search/scorers/scorer_term.go @@ -0,0 +1,175 @@ +// Copyright (c) 2014 Couchbase, Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. + +package scorers + +import ( + "fmt" + "math" + + "github.com/blevesearch/bleve/index" + "github.com/blevesearch/bleve/search" +) + +type TermQueryScorer struct { + queryTerm string + queryField string + queryBoost float64 + docTerm uint64 + docTotal uint64 + idf float64 + explain bool + idfExplanation *search.Explanation + queryNorm float64 + queryWeight float64 + queryWeightExplanation *search.Explanation +} + +func NewTermQueryScorer(queryTerm string, queryField string, queryBoost float64, docTotal, docTerm uint64, explain bool) *TermQueryScorer { + rv := TermQueryScorer{ + queryTerm: queryTerm, + queryField: queryField, + queryBoost: queryBoost, + docTerm: docTerm, + docTotal: docTotal, + idf: 1.0 + math.Log(float64(docTotal)/float64(docTerm+1.0)), + explain: explain, + queryWeight: 1.0, + } + + if explain { + rv.idfExplanation = &search.Explanation{ + Value: rv.idf, + Message: fmt.Sprintf("idf(docFreq=%d, maxDocs=%d)", docTerm, docTotal), + } + } + + return &rv +} + +func (s *TermQueryScorer) Weight() float64 { + sum := s.queryBoost * s.idf + return sum * sum +} + +func (s *TermQueryScorer) SetQueryNorm(qnorm float64) { + s.queryNorm = qnorm + + // update the query weight + s.queryWeight = s.queryBoost * s.idf * s.queryNorm + + if s.explain { + childrenExplanations := make([]*search.Explanation, 3) + childrenExplanations[0] = &search.Explanation{ + Value: s.queryBoost, + Message: "boost", + } + childrenExplanations[1] = s.idfExplanation + childrenExplanations[2] = &search.Explanation{ + Value: s.queryNorm, + Message: "queryNorm", + } + s.queryWeightExplanation = &search.Explanation{ + Value: s.queryWeight, + Message: fmt.Sprintf("queryWeight(%s:%s^%f), product of:", s.queryField, string(s.queryTerm), s.queryBoost), + Children: childrenExplanations, + } + } +} + +func (s *TermQueryScorer) Score(ctx *search.SearchContext, termMatch *index.TermFieldDoc) *search.DocumentMatch { + var scoreExplanation *search.Explanation + + // need to compute score + var tf float64 + if termMatch.Freq < MaxSqrtCache { + tf = SqrtCache[int(termMatch.Freq)] + } else { + tf = math.Sqrt(float64(termMatch.Freq)) + } + score := tf * termMatch.Norm * s.idf + + if s.explain { + childrenExplanations := make([]*search.Explanation, 3) + childrenExplanations[0] = &search.Explanation{ + Value: tf, + Message: fmt.Sprintf("tf(termFreq(%s:%s)=%d", s.queryField, string(s.queryTerm), termMatch.Freq), + } + childrenExplanations[1] = &search.Explanation{ + Value: termMatch.Norm, + Message: fmt.Sprintf("fieldNorm(field=%s, doc=%s)", s.queryField, termMatch.ID), + } + childrenExplanations[2] = s.idfExplanation + scoreExplanation = &search.Explanation{ + Value: score, + Message: fmt.Sprintf("fieldWeight(%s:%s in %s), product of:", s.queryField, string(s.queryTerm), termMatch.ID), + Children: childrenExplanations, + } + } + + // if the query weight isn't 1, multiply + if s.queryWeight != 1.0 { + score = score * s.queryWeight + if s.explain { + childExplanations := make([]*search.Explanation, 2) + childExplanations[0] = s.queryWeightExplanation + childExplanations[1] = scoreExplanation + scoreExplanation = &search.Explanation{ + Value: score, + Message: fmt.Sprintf("weight(%s:%s^%f in %s), product of:", s.queryField, string(s.queryTerm), s.queryBoost, termMatch.ID), + Children: childExplanations, + } + } + } + + rv := ctx.DocumentMatchPool.Get() + rv.IndexInternalID = append(rv.IndexInternalID, termMatch.ID...) + rv.Score = score + if s.explain { + rv.Expl = scoreExplanation + } + + if termMatch.Vectors != nil && len(termMatch.Vectors) > 0 { + + rv.Locations = make(search.FieldTermLocationMap) + for _, v := range termMatch.Vectors { + tlm := rv.Locations[v.Field] + if tlm == nil { + tlm = make(search.TermLocationMap) + } + + loc := search.Location{ + Pos: float64(v.Pos), + Start: float64(v.Start), + End: float64(v.End), + } + + if len(v.ArrayPositions) > 0 { + loc.ArrayPositions = make([]float64, len(v.ArrayPositions)) + for i, ap := range v.ArrayPositions { + loc.ArrayPositions[i] = float64(ap) + } + } + + locations := tlm[s.queryTerm] + if locations == nil { + locations = make(search.Locations, 1) + locations[0] = &loc + } else { + locations = append(locations, &loc) + } + tlm[s.queryTerm] = locations + + rv.Locations[v.Field] = tlm + } + + } + + return rv +} diff --git a/vendor/github.com/blevesearch/bleve/search/scorers/sqrt_cache.go b/vendor/github.com/blevesearch/bleve/search/scorers/sqrt_cache.go new file mode 100644 index 0000000..d444c25 --- /dev/null +++ b/vendor/github.com/blevesearch/bleve/search/scorers/sqrt_cache.go @@ -0,0 +1,25 @@ +// Copyright (c) 2014 Couchbase, Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. + +package scorers + +import ( + "math" +) + +var SqrtCache []float64 + +const MaxSqrtCache = 64 + +func init() { + SqrtCache = make([]float64, MaxSqrtCache) + for i := 0; i < MaxSqrtCache; i++ { + SqrtCache[i] = math.Sqrt(float64(i)) + } +} diff --git a/vendor/github.com/blevesearch/bleve/search/search.go b/vendor/github.com/blevesearch/bleve/search/search.go index 8ed23de..5e43b74 100644 --- a/vendor/github.com/blevesearch/bleve/search/search.go +++ b/vendor/github.com/blevesearch/bleve/search/search.go @@ -1,146 +1,60 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. package search import ( "fmt" - "reflect" - "sort" + "github.com/blevesearch/bleve/document" "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/size" ) -var reflectStaticSizeDocumentMatch int -var reflectStaticSizeSearchContext int -var reflectStaticSizeLocation int - -func init() { - var dm DocumentMatch - reflectStaticSizeDocumentMatch = int(reflect.TypeOf(dm).Size()) - var sc SearchContext - reflectStaticSizeSearchContext = int(reflect.TypeOf(sc).Size()) - var l Location - reflectStaticSizeLocation = int(reflect.TypeOf(l).Size()) +type Location struct { + Pos float64 `json:"pos"` + Start float64 `json:"start"` + End float64 `json:"end"` + ArrayPositions []float64 `json:"array_positions"` } -type ArrayPositions []uint64 - -func (ap ArrayPositions) Equals(other ArrayPositions) bool { - if len(ap) != len(other) { +// SameArrayElement returns true if two locations are point to +// the same array element +func (l *Location) SameArrayElement(other *Location) bool { + if len(l.ArrayPositions) != len(other.ArrayPositions) { return false } - for i := range ap { - if ap[i] != other[i] { + for i, elem := range l.ArrayPositions { + if other.ArrayPositions[i] != elem { return false } } return true } -func (ap ArrayPositions) Compare(other ArrayPositions) int { - for i, p := range ap { - if i >= len(other) { - return 1 - } - if p < other[i] { - return -1 - } - if p > other[i] { - return 1 - } - } - if len(ap) < len(other) { - return -1 - } - return 0 -} - -type Location struct { - // Pos is the position of the term within the field, starting at 1 - Pos uint64 `json:"pos"` - - // Start and End are the byte offsets of the term in the field - Start uint64 `json:"start"` - End uint64 `json:"end"` - - // ArrayPositions contains the positions of the term within any elements. - ArrayPositions ArrayPositions `json:"array_positions"` -} - -func (l *Location) Size() int { - return reflectStaticSizeLocation + size.SizeOfPtr + - len(l.ArrayPositions)*size.SizeOfUint64 -} - type Locations []*Location -func (p Locations) Len() int { return len(p) } -func (p Locations) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - -func (p Locations) Less(i, j int) bool { - c := p[i].ArrayPositions.Compare(p[j].ArrayPositions) - if c < 0 { - return true - } - if c > 0 { - return false - } - return p[i].Pos < p[j].Pos -} - -func (p Locations) Dedupe() Locations { // destructive! - if len(p) <= 1 { - return p - } - - sort.Sort(p) - - slow := 0 - - for _, pfast := range p { - pslow := p[slow] - if pslow.Pos == pfast.Pos && - pslow.Start == pfast.Start && - pslow.End == pfast.End && - pslow.ArrayPositions.Equals(pfast.ArrayPositions) { - continue // duplicate, so only move fast ahead - } - - slow++ - - p[slow] = pfast - } - - return p[:slow+1] -} - type TermLocationMap map[string]Locations func (t TermLocationMap) AddLocation(term string, location *Location) { - t[term] = append(t[term], location) + existingLocations, exists := t[term] + if exists { + existingLocations = append(existingLocations, location) + t[term] = existingLocations + } else { + locations := make(Locations, 1) + locations[0] = location + t[term] = locations + } } type FieldTermLocationMap map[string]TermLocationMap -type FieldTermLocation struct { - Field string - Term string - Location Location -} - type FieldFragmentMap map[string][]string type DocumentMatch struct { @@ -158,14 +72,15 @@ type DocumentMatch struct { // fields as float64s and date fields as time.RFC3339 formatted strings. Fields map[string]interface{} `json:"fields,omitempty"` + // as we learn field terms, we can cache important ones for later use + // for example, sorting and building facets need these values + CachedFieldTerms index.FieldTerms `json:"-"` + + // if we load the document for this hit, remember it so we dont load again + Document *document.Document `json:"-"` + // used to maintain natural index order HitNumber uint64 `json:"-"` - - // used to temporarily hold field term location information during - // search processing in an efficient, recycle-friendly manner, to - // be later incorporated into the Locations map when search - // results are completed - FieldTermLocations []FieldTermLocation `json:"-"` } func (dm *DocumentMatch) AddFieldValue(name string, value interface{}) { @@ -195,137 +110,15 @@ func (dm *DocumentMatch) Reset() *DocumentMatch { indexInternalID := dm.IndexInternalID // remember the []interface{} used for sort sort := dm.Sort - // remember the FieldTermLocations backing array - ftls := dm.FieldTermLocations - for i := range ftls { // recycle the ArrayPositions of each location - ftls[i].Location.ArrayPositions = ftls[i].Location.ArrayPositions[:0] - } // idiom to copy over from empty DocumentMatch (0 allocations) *dm = DocumentMatch{} // reuse the []byte already allocated (and reset len to 0) dm.IndexInternalID = indexInternalID[:0] // reuse the []interface{} already allocated (and reset len to 0) dm.Sort = sort[:0] - // reuse the FieldTermLocations already allocated (and reset len to 0) - dm.FieldTermLocations = ftls[:0] return dm } -func (dm *DocumentMatch) Size() int { - sizeInBytes := reflectStaticSizeDocumentMatch + size.SizeOfPtr + - len(dm.Index) + - len(dm.ID) + - len(dm.IndexInternalID) - - if dm.Expl != nil { - sizeInBytes += dm.Expl.Size() - } - - for k, v := range dm.Locations { - sizeInBytes += size.SizeOfString + len(k) - for k1, v1 := range v { - sizeInBytes += size.SizeOfString + len(k1) + - size.SizeOfSlice - for _, entry := range v1 { - sizeInBytes += entry.Size() - } - } - } - - for k, v := range dm.Fragments { - sizeInBytes += size.SizeOfString + len(k) + - size.SizeOfSlice - - for _, entry := range v { - sizeInBytes += size.SizeOfString + len(entry) - } - } - - for _, entry := range dm.Sort { - sizeInBytes += size.SizeOfString + len(entry) - } - - for k, _ := range dm.Fields { - sizeInBytes += size.SizeOfString + len(k) + - size.SizeOfPtr - } - - return sizeInBytes -} - -// Complete performs final preparation & transformation of the -// DocumentMatch at the end of search processing, also allowing the -// caller to provide an optional preallocated locations slice -func (dm *DocumentMatch) Complete(prealloc []Location) []Location { - // transform the FieldTermLocations slice into the Locations map - nlocs := len(dm.FieldTermLocations) - if nlocs > 0 { - if cap(prealloc) < nlocs { - prealloc = make([]Location, nlocs) - } - prealloc = prealloc[:nlocs] - - var lastField string - var tlm TermLocationMap - var needsDedupe bool - - for i, ftl := range dm.FieldTermLocations { - if lastField != ftl.Field { - lastField = ftl.Field - - if dm.Locations == nil { - dm.Locations = make(FieldTermLocationMap) - } - - tlm = dm.Locations[ftl.Field] - if tlm == nil { - tlm = make(TermLocationMap) - dm.Locations[ftl.Field] = tlm - } - } - - loc := &prealloc[i] - *loc = ftl.Location - - if len(loc.ArrayPositions) > 0 { // copy - loc.ArrayPositions = append(ArrayPositions(nil), loc.ArrayPositions...) - } - - locs := tlm[ftl.Term] - - // if the loc is before or at the last location, then there - // might be duplicates that need to be deduplicated - if !needsDedupe && len(locs) > 0 { - last := locs[len(locs)-1] - cmp := loc.ArrayPositions.Compare(last.ArrayPositions) - if cmp < 0 || (cmp == 0 && loc.Pos <= last.Pos) { - needsDedupe = true - } - } - - tlm[ftl.Term] = append(locs, loc) - - dm.FieldTermLocations[i] = FieldTermLocation{ // recycle - Location: Location{ - ArrayPositions: ftl.Location.ArrayPositions[:0], - }, - } - } - - if needsDedupe { - for _, tlm := range dm.Locations { - for term, locs := range tlm { - tlm[term] = locs.Dedupe() - } - } - } - } - - dm.FieldTermLocations = dm.FieldTermLocations[:0] // recycle - - return prealloc -} - func (dm *DocumentMatch) String() string { return fmt.Sprintf("[%s-%f]", string(dm.IndexInternalID), dm.Score) } @@ -344,35 +137,11 @@ type Searcher interface { SetQueryNorm(float64) Count() uint64 Min() int - Size() int DocumentMatchPoolSize() int } -type SearcherOptions struct { - Explain bool - IncludeTermVectors bool - Score string -} - // SearchContext represents the context around a single search type SearchContext struct { DocumentMatchPool *DocumentMatchPool - Collector Collector - IndexReader index.IndexReader -} - -func (sc *SearchContext) Size() int { - sizeInBytes := reflectStaticSizeSearchContext + size.SizeOfPtr + - reflectStaticSizeDocumentMatchPool + size.SizeOfPtr - - if sc.DocumentMatchPool != nil { - for _, entry := range sc.DocumentMatchPool.avail { - if entry != nil { - sizeInBytes += entry.Size() - } - } - } - - return sizeInBytes } diff --git a/vendor/github.com/blevesearch/bleve/search/searcher/ordered_searchers_list.go b/vendor/github.com/blevesearch/bleve/search/searcher/ordered_searchers_list.go deleted file mode 100644 index 536c593..0000000 --- a/vendor/github.com/blevesearch/bleve/search/searcher/ordered_searchers_list.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package searcher - -import ( - "github.com/blevesearch/bleve/search" -) - -type OrderedSearcherList []search.Searcher - -// sort.Interface - -func (otrl OrderedSearcherList) Len() int { - return len(otrl) -} - -func (otrl OrderedSearcherList) Less(i, j int) bool { - return otrl[i].Count() < otrl[j].Count() -} - -func (otrl OrderedSearcherList) Swap(i, j int) { - otrl[i], otrl[j] = otrl[j], otrl[i] -} diff --git a/vendor/github.com/blevesearch/bleve/search/searcher/search_disjunction.go b/vendor/github.com/blevesearch/bleve/search/searcher/search_disjunction.go deleted file mode 100644 index f47da27..0000000 --- a/vendor/github.com/blevesearch/bleve/search/searcher/search_disjunction.go +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright (c) 2018 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package searcher - -import ( - "fmt" - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/search" -) - -// DisjunctionMaxClauseCount is a compile time setting that applications can -// adjust to non-zero value to cause the DisjunctionSearcher to return an -// error instead of exeucting searches when the size exceeds this value. -var DisjunctionMaxClauseCount = 0 - -// DisjunctionHeapTakeover is a compile time setting that applications can -// adjust to control when the DisjunctionSearcher will switch from a simple -// slice implementation to a heap implementation. -var DisjunctionHeapTakeover = 10 - -func NewDisjunctionSearcher(indexReader index.IndexReader, - qsearchers []search.Searcher, min float64, options search.SearcherOptions) ( - search.Searcher, error) { - return newDisjunctionSearcher(indexReader, qsearchers, min, options, true) -} - -func optionsDisjunctionOptimizable(options search.SearcherOptions) bool { - rv := options.Score == "none" && !options.IncludeTermVectors - return rv -} - -func newDisjunctionSearcher(indexReader index.IndexReader, - qsearchers []search.Searcher, min float64, options search.SearcherOptions, - limit bool) (search.Searcher, error) { - // attempt the "unadorned" disjunction optimization only when we - // do not need extra information like freq-norm's or term vectors - // and the requested min is simple - if len(qsearchers) > 1 && min <= 1 && - optionsDisjunctionOptimizable(options) { - rv, err := optimizeCompositeSearcher("disjunction:unadorned", - indexReader, qsearchers, options) - if err != nil || rv != nil { - return rv, err - } - } - - if len(qsearchers) > DisjunctionHeapTakeover { - return newDisjunctionHeapSearcher(indexReader, qsearchers, min, options, - limit) - } - return newDisjunctionSliceSearcher(indexReader, qsearchers, min, options, - limit) -} - -func optimizeCompositeSearcher(optimizationKind string, - indexReader index.IndexReader, qsearchers []search.Searcher, - options search.SearcherOptions) (search.Searcher, error) { - var octx index.OptimizableContext - - for _, searcher := range qsearchers { - o, ok := searcher.(index.Optimizable) - if !ok { - return nil, nil - } - - var err error - octx, err = o.Optimize(optimizationKind, octx) - if err != nil { - return nil, err - } - - if octx == nil { - return nil, nil - } - } - - optimized, err := octx.Finish() - if err != nil || optimized == nil { - return nil, err - } - - tfr, ok := optimized.(index.TermFieldReader) - if !ok { - return nil, nil - } - - return newTermSearcherFromReader(indexReader, tfr, - []byte(optimizationKind), "*", 1.0, options) -} - -func tooManyClauses(count int) bool { - if DisjunctionMaxClauseCount != 0 && count > DisjunctionMaxClauseCount { - return true - } - return false -} - -func tooManyClausesErr(field string, count int) error { - return fmt.Errorf("TooManyClauses over field: `%s` [%d > maxClauseCount,"+ - " which is set to %d]", field, count, DisjunctionMaxClauseCount) -} diff --git a/vendor/github.com/blevesearch/bleve/search/searcher/search_disjunction_heap.go b/vendor/github.com/blevesearch/bleve/search/searcher/search_disjunction_heap.go deleted file mode 100644 index 7f0a5a0..0000000 --- a/vendor/github.com/blevesearch/bleve/search/searcher/search_disjunction_heap.go +++ /dev/null @@ -1,343 +0,0 @@ -// Copyright (c) 2018 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package searcher - -import ( - "bytes" - "container/heap" - "math" - "reflect" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/scorer" - "github.com/blevesearch/bleve/size" -) - -var reflectStaticSizeDisjunctionHeapSearcher int -var reflectStaticSizeSearcherCurr int - -func init() { - var dhs DisjunctionHeapSearcher - reflectStaticSizeDisjunctionHeapSearcher = int(reflect.TypeOf(dhs).Size()) - - var sc SearcherCurr - reflectStaticSizeSearcherCurr = int(reflect.TypeOf(sc).Size()) -} - -type SearcherCurr struct { - searcher search.Searcher - curr *search.DocumentMatch -} - -type DisjunctionHeapSearcher struct { - indexReader index.IndexReader - - numSearchers int - scorer *scorer.DisjunctionQueryScorer - min int - queryNorm float64 - initialized bool - searchers []search.Searcher - heap []*SearcherCurr - - matching []*search.DocumentMatch - matchingCurrs []*SearcherCurr -} - -func newDisjunctionHeapSearcher(indexReader index.IndexReader, - searchers []search.Searcher, min float64, options search.SearcherOptions, - limit bool) ( - *DisjunctionHeapSearcher, error) { - if limit && tooManyClauses(len(searchers)) { - return nil, tooManyClausesErr("", len(searchers)) - } - - // build our searcher - rv := DisjunctionHeapSearcher{ - indexReader: indexReader, - searchers: searchers, - numSearchers: len(searchers), - scorer: scorer.NewDisjunctionQueryScorer(options), - min: int(min), - matching: make([]*search.DocumentMatch, len(searchers)), - matchingCurrs: make([]*SearcherCurr, len(searchers)), - heap: make([]*SearcherCurr, 0, len(searchers)), - } - rv.computeQueryNorm() - return &rv, nil -} - -func (s *DisjunctionHeapSearcher) Size() int { - sizeInBytes := reflectStaticSizeDisjunctionHeapSearcher + size.SizeOfPtr + - s.scorer.Size() - - for _, entry := range s.searchers { - sizeInBytes += entry.Size() - } - - for _, entry := range s.matching { - if entry != nil { - sizeInBytes += entry.Size() - } - } - - // for matchingCurrs and heap, just use static size * len - // since searchers and document matches already counted above - sizeInBytes += len(s.matchingCurrs) * reflectStaticSizeSearcherCurr - sizeInBytes += len(s.heap) * reflectStaticSizeSearcherCurr - - return sizeInBytes -} - -func (s *DisjunctionHeapSearcher) computeQueryNorm() { - // first calculate sum of squared weights - sumOfSquaredWeights := 0.0 - for _, searcher := range s.searchers { - sumOfSquaredWeights += searcher.Weight() - } - // now compute query norm from this - s.queryNorm = 1.0 / math.Sqrt(sumOfSquaredWeights) - // finally tell all the downstream searchers the norm - for _, searcher := range s.searchers { - searcher.SetQueryNorm(s.queryNorm) - } -} - -func (s *DisjunctionHeapSearcher) initSearchers(ctx *search.SearchContext) error { - // alloc a single block of SearcherCurrs - block := make([]SearcherCurr, len(s.searchers)) - - // get all searchers pointing at their first match - for i, searcher := range s.searchers { - curr, err := searcher.Next(ctx) - if err != nil { - return err - } - if curr != nil { - block[i].searcher = searcher - block[i].curr = curr - heap.Push(s, &block[i]) - } - } - - err := s.updateMatches() - if err != nil { - return err - } - s.initialized = true - return nil -} - -func (s *DisjunctionHeapSearcher) updateMatches() error { - matching := s.matching[:0] - matchingCurrs := s.matchingCurrs[:0] - - if len(s.heap) > 0 { - - // top of the heap is our next hit - next := heap.Pop(s).(*SearcherCurr) - matching = append(matching, next.curr) - matchingCurrs = append(matchingCurrs, next) - - // now as long as top of heap matches, keep popping - for len(s.heap) > 0 && bytes.Compare(next.curr.IndexInternalID, s.heap[0].curr.IndexInternalID) == 0 { - next = heap.Pop(s).(*SearcherCurr) - matching = append(matching, next.curr) - matchingCurrs = append(matchingCurrs, next) - } - } - - s.matching = matching - s.matchingCurrs = matchingCurrs - - return nil -} - -func (s *DisjunctionHeapSearcher) Weight() float64 { - var rv float64 - for _, searcher := range s.searchers { - rv += searcher.Weight() - } - return rv -} - -func (s *DisjunctionHeapSearcher) SetQueryNorm(qnorm float64) { - for _, searcher := range s.searchers { - searcher.SetQueryNorm(qnorm) - } -} - -func (s *DisjunctionHeapSearcher) Next(ctx *search.SearchContext) ( - *search.DocumentMatch, error) { - if !s.initialized { - err := s.initSearchers(ctx) - if err != nil { - return nil, err - } - } - - var rv *search.DocumentMatch - found := false - for !found && len(s.matching) > 0 { - if len(s.matching) >= s.min { - found = true - // score this match - rv = s.scorer.Score(ctx, s.matching, len(s.matching), s.numSearchers) - } - - // invoke next on all the matching searchers - for _, matchingCurr := range s.matchingCurrs { - if matchingCurr.curr != rv { - ctx.DocumentMatchPool.Put(matchingCurr.curr) - } - curr, err := matchingCurr.searcher.Next(ctx) - if err != nil { - return nil, err - } - if curr != nil { - matchingCurr.curr = curr - heap.Push(s, matchingCurr) - } - } - - err := s.updateMatches() - if err != nil { - return nil, err - } - } - - return rv, nil -} - -func (s *DisjunctionHeapSearcher) Advance(ctx *search.SearchContext, - ID index.IndexInternalID) (*search.DocumentMatch, error) { - if !s.initialized { - err := s.initSearchers(ctx) - if err != nil { - return nil, err - } - } - - // if there is anything in matching, toss it back onto the heap - for _, matchingCurr := range s.matchingCurrs { - heap.Push(s, matchingCurr) - } - s.matching = s.matching[:0] - s.matchingCurrs = s.matchingCurrs[:0] - - // find all searchers that actually need to be advanced - // advance them, using s.matchingCurrs as temp storage - for len(s.heap) > 0 && bytes.Compare(s.heap[0].curr.IndexInternalID, ID) < 0 { - searcherCurr := heap.Pop(s).(*SearcherCurr) - ctx.DocumentMatchPool.Put(searcherCurr.curr) - curr, err := searcherCurr.searcher.Advance(ctx, ID) - if err != nil { - return nil, err - } - if curr != nil { - searcherCurr.curr = curr - s.matchingCurrs = append(s.matchingCurrs, searcherCurr) - } - } - // now all of the searchers that we advanced have to be pushed back - for _, matchingCurr := range s.matchingCurrs { - heap.Push(s, matchingCurr) - } - // reset our temp space - s.matchingCurrs = s.matchingCurrs[:0] - - err := s.updateMatches() - if err != nil { - return nil, err - } - - return s.Next(ctx) -} - -func (s *DisjunctionHeapSearcher) Count() uint64 { - // for now return a worst case - var sum uint64 - for _, searcher := range s.searchers { - sum += searcher.Count() - } - return sum -} - -func (s *DisjunctionHeapSearcher) Close() (rv error) { - for _, searcher := range s.searchers { - err := searcher.Close() - if err != nil && rv == nil { - rv = err - } - } - return rv -} - -func (s *DisjunctionHeapSearcher) Min() int { - return s.min -} - -func (s *DisjunctionHeapSearcher) DocumentMatchPoolSize() int { - rv := len(s.searchers) - for _, s := range s.searchers { - rv += s.DocumentMatchPoolSize() - } - return rv -} - -// a disjunction searcher implements the index.Optimizable interface -// but only activates on an edge case where the disjunction is a -// wrapper around a single Optimizable child searcher -func (s *DisjunctionHeapSearcher) Optimize(kind string, octx index.OptimizableContext) ( - index.OptimizableContext, error) { - if len(s.searchers) == 1 { - o, ok := s.searchers[0].(index.Optimizable) - if ok { - return o.Optimize(kind, octx) - } - } - - return nil, nil -} - -// heap impl - -func (s *DisjunctionHeapSearcher) Len() int { return len(s.heap) } - -func (s *DisjunctionHeapSearcher) Less(i, j int) bool { - if s.heap[i].curr == nil { - return true - } else if s.heap[j].curr == nil { - return false - } - return bytes.Compare(s.heap[i].curr.IndexInternalID, s.heap[j].curr.IndexInternalID) < 0 -} - -func (s *DisjunctionHeapSearcher) Swap(i, j int) { - s.heap[i], s.heap[j] = s.heap[j], s.heap[i] -} - -func (s *DisjunctionHeapSearcher) Push(x interface{}) { - s.heap = append(s.heap, x.(*SearcherCurr)) -} - -func (s *DisjunctionHeapSearcher) Pop() interface{} { - old := s.heap - n := len(old) - x := old[n-1] - s.heap = old[0 : n-1] - return x -} diff --git a/vendor/github.com/blevesearch/bleve/search/searcher/search_disjunction_slice.go b/vendor/github.com/blevesearch/bleve/search/searcher/search_disjunction_slice.go deleted file mode 100644 index dc566ad..0000000 --- a/vendor/github.com/blevesearch/bleve/search/searcher/search_disjunction_slice.go +++ /dev/null @@ -1,298 +0,0 @@ -// Copyright (c) 2018 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package searcher - -import ( - "math" - "reflect" - "sort" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/scorer" - "github.com/blevesearch/bleve/size" -) - -var reflectStaticSizeDisjunctionSliceSearcher int - -func init() { - var ds DisjunctionSliceSearcher - reflectStaticSizeDisjunctionSliceSearcher = int(reflect.TypeOf(ds).Size()) -} - -type DisjunctionSliceSearcher struct { - indexReader index.IndexReader - searchers OrderedSearcherList - numSearchers int - queryNorm float64 - currs []*search.DocumentMatch - scorer *scorer.DisjunctionQueryScorer - min int - matching []*search.DocumentMatch - matchingIdxs []int - initialized bool -} - -func newDisjunctionSliceSearcher(indexReader index.IndexReader, - qsearchers []search.Searcher, min float64, options search.SearcherOptions, - limit bool) ( - *DisjunctionSliceSearcher, error) { - if limit && tooManyClauses(len(qsearchers)) { - return nil, tooManyClausesErr("", len(qsearchers)) - } - // build the downstream searchers - searchers := make(OrderedSearcherList, len(qsearchers)) - for i, searcher := range qsearchers { - searchers[i] = searcher - } - // sort the searchers - sort.Sort(sort.Reverse(searchers)) - // build our searcher - rv := DisjunctionSliceSearcher{ - indexReader: indexReader, - searchers: searchers, - numSearchers: len(searchers), - currs: make([]*search.DocumentMatch, len(searchers)), - scorer: scorer.NewDisjunctionQueryScorer(options), - min: int(min), - matching: make([]*search.DocumentMatch, len(searchers)), - matchingIdxs: make([]int, len(searchers)), - } - rv.computeQueryNorm() - return &rv, nil -} - -func (s *DisjunctionSliceSearcher) Size() int { - sizeInBytes := reflectStaticSizeDisjunctionSliceSearcher + size.SizeOfPtr + - s.scorer.Size() - - for _, entry := range s.searchers { - sizeInBytes += entry.Size() - } - - for _, entry := range s.currs { - if entry != nil { - sizeInBytes += entry.Size() - } - } - - for _, entry := range s.matching { - if entry != nil { - sizeInBytes += entry.Size() - } - } - - sizeInBytes += len(s.matchingIdxs) * size.SizeOfInt - - return sizeInBytes -} - -func (s *DisjunctionSliceSearcher) computeQueryNorm() { - // first calculate sum of squared weights - sumOfSquaredWeights := 0.0 - for _, searcher := range s.searchers { - sumOfSquaredWeights += searcher.Weight() - } - // now compute query norm from this - s.queryNorm = 1.0 / math.Sqrt(sumOfSquaredWeights) - // finally tell all the downstream searchers the norm - for _, searcher := range s.searchers { - searcher.SetQueryNorm(s.queryNorm) - } -} - -func (s *DisjunctionSliceSearcher) initSearchers(ctx *search.SearchContext) error { - var err error - // get all searchers pointing at their first match - for i, searcher := range s.searchers { - if s.currs[i] != nil { - ctx.DocumentMatchPool.Put(s.currs[i]) - } - s.currs[i], err = searcher.Next(ctx) - if err != nil { - return err - } - } - - err = s.updateMatches() - if err != nil { - return err - } - - s.initialized = true - return nil -} - -func (s *DisjunctionSliceSearcher) updateMatches() error { - matching := s.matching[:0] - matchingIdxs := s.matchingIdxs[:0] - - for i := 0; i < len(s.currs); i++ { - curr := s.currs[i] - if curr == nil { - continue - } - - if len(matching) > 0 { - cmp := curr.IndexInternalID.Compare(matching[0].IndexInternalID) - if cmp > 0 { - continue - } - - if cmp < 0 { - matching = matching[:0] - matchingIdxs = matchingIdxs[:0] - } - } - - matching = append(matching, curr) - matchingIdxs = append(matchingIdxs, i) - } - - s.matching = matching - s.matchingIdxs = matchingIdxs - - return nil -} - -func (s *DisjunctionSliceSearcher) Weight() float64 { - var rv float64 - for _, searcher := range s.searchers { - rv += searcher.Weight() - } - return rv -} - -func (s *DisjunctionSliceSearcher) SetQueryNorm(qnorm float64) { - for _, searcher := range s.searchers { - searcher.SetQueryNorm(qnorm) - } -} - -func (s *DisjunctionSliceSearcher) Next(ctx *search.SearchContext) ( - *search.DocumentMatch, error) { - if !s.initialized { - err := s.initSearchers(ctx) - if err != nil { - return nil, err - } - } - var err error - var rv *search.DocumentMatch - - found := false - for !found && len(s.matching) > 0 { - if len(s.matching) >= s.min { - found = true - // score this match - rv = s.scorer.Score(ctx, s.matching, len(s.matching), s.numSearchers) - } - - // invoke next on all the matching searchers - for _, i := range s.matchingIdxs { - searcher := s.searchers[i] - if s.currs[i] != rv { - ctx.DocumentMatchPool.Put(s.currs[i]) - } - s.currs[i], err = searcher.Next(ctx) - if err != nil { - return nil, err - } - } - - err = s.updateMatches() - if err != nil { - return nil, err - } - } - return rv, nil -} - -func (s *DisjunctionSliceSearcher) Advance(ctx *search.SearchContext, - ID index.IndexInternalID) (*search.DocumentMatch, error) { - if !s.initialized { - err := s.initSearchers(ctx) - if err != nil { - return nil, err - } - } - // get all searchers pointing at their first match - var err error - for i, searcher := range s.searchers { - if s.currs[i] != nil { - if s.currs[i].IndexInternalID.Compare(ID) >= 0 { - continue - } - ctx.DocumentMatchPool.Put(s.currs[i]) - } - s.currs[i], err = searcher.Advance(ctx, ID) - if err != nil { - return nil, err - } - } - - err = s.updateMatches() - if err != nil { - return nil, err - } - - return s.Next(ctx) -} - -func (s *DisjunctionSliceSearcher) Count() uint64 { - // for now return a worst case - var sum uint64 - for _, searcher := range s.searchers { - sum += searcher.Count() - } - return sum -} - -func (s *DisjunctionSliceSearcher) Close() (rv error) { - for _, searcher := range s.searchers { - err := searcher.Close() - if err != nil && rv == nil { - rv = err - } - } - return rv -} - -func (s *DisjunctionSliceSearcher) Min() int { - return s.min -} - -func (s *DisjunctionSliceSearcher) DocumentMatchPoolSize() int { - rv := len(s.currs) - for _, s := range s.searchers { - rv += s.DocumentMatchPoolSize() - } - return rv -} - -// a disjunction searcher implements the index.Optimizable interface -// but only activates on an edge case where the disjunction is a -// wrapper around a single Optimizable child searcher -func (s *DisjunctionSliceSearcher) Optimize(kind string, octx index.OptimizableContext) ( - index.OptimizableContext, error) { - if len(s.searchers) == 1 { - o, ok := s.searchers[0].(index.Optimizable) - if ok { - return o.Optimize(kind, octx) - } - } - - return nil, nil -} diff --git a/vendor/github.com/blevesearch/bleve/search/searcher/search_filter.go b/vendor/github.com/blevesearch/bleve/search/searcher/search_filter.go deleted file mode 100644 index 7c95fb4..0000000 --- a/vendor/github.com/blevesearch/bleve/search/searcher/search_filter.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package searcher - -import ( - "reflect" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/size" -) - -var reflectStaticSizeFilteringSearcher int - -func init() { - var fs FilteringSearcher - reflectStaticSizeFilteringSearcher = int(reflect.TypeOf(fs).Size()) -} - -// FilterFunc defines a function which can filter documents -// returning true means keep the document -// returning false means do not keep the document -type FilterFunc func(d *search.DocumentMatch) bool - -// FilteringSearcher wraps any other searcher, but checks any Next/Advance -// call against the supplied FilterFunc -type FilteringSearcher struct { - child search.Searcher - accept FilterFunc -} - -func NewFilteringSearcher(s search.Searcher, filter FilterFunc) *FilteringSearcher { - return &FilteringSearcher{ - child: s, - accept: filter, - } -} - -func (f *FilteringSearcher) Size() int { - return reflectStaticSizeFilteringSearcher + size.SizeOfPtr + - f.child.Size() -} - -func (f *FilteringSearcher) Next(ctx *search.SearchContext) (*search.DocumentMatch, error) { - next, err := f.child.Next(ctx) - for next != nil && err == nil { - if f.accept(next) { - return next, nil - } - next, err = f.child.Next(ctx) - } - return nil, err -} - -func (f *FilteringSearcher) Advance(ctx *search.SearchContext, ID index.IndexInternalID) (*search.DocumentMatch, error) { - adv, err := f.child.Advance(ctx, ID) - if err != nil { - return nil, err - } - if adv == nil { - return nil, nil - } - if f.accept(adv) { - return adv, nil - } - return f.Next(ctx) -} - -func (f *FilteringSearcher) Close() error { - return f.child.Close() -} - -func (f *FilteringSearcher) Weight() float64 { - return f.child.Weight() -} - -func (f *FilteringSearcher) SetQueryNorm(n float64) { - f.child.SetQueryNorm(n) -} - -func (f *FilteringSearcher) Count() uint64 { - return f.child.Count() -} - -func (f *FilteringSearcher) Min() int { - return f.child.Min() -} - -func (f *FilteringSearcher) DocumentMatchPoolSize() int { - return f.child.DocumentMatchPoolSize() -} diff --git a/vendor/github.com/blevesearch/bleve/search/searcher/search_fuzzy.go b/vendor/github.com/blevesearch/bleve/search/searcher/search_fuzzy.go deleted file mode 100644 index aca8a7d..0000000 --- a/vendor/github.com/blevesearch/bleve/search/searcher/search_fuzzy.go +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package searcher - -import ( - "fmt" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/search" -) - -var MaxFuzziness = 2 - -func NewFuzzySearcher(indexReader index.IndexReader, term string, - prefix, fuzziness int, field string, boost float64, - options search.SearcherOptions) (search.Searcher, error) { - - if fuzziness > MaxFuzziness { - return nil, fmt.Errorf("fuzziness exceeds max (%d)", MaxFuzziness) - } - - if fuzziness < 0 { - return nil, fmt.Errorf("invalid fuzziness, negative") - } - - // Note: we don't byte slice the term for a prefix because of runes. - prefixTerm := "" - for i, r := range term { - if i < prefix { - prefixTerm += string(r) - } else { - break - } - } - candidateTerms, err := findFuzzyCandidateTerms(indexReader, term, fuzziness, - field, prefixTerm) - if err != nil { - return nil, err - } - - return NewMultiTermSearcher(indexReader, candidateTerms, field, - boost, options, true) -} - -func findFuzzyCandidateTerms(indexReader index.IndexReader, term string, - fuzziness int, field, prefixTerm string) (rv []string, err error) { - rv = make([]string, 0) - - // in case of advanced reader implementations directly call - // the levenshtein automaton based iterator to collect the - // candidate terms - if ir, ok := indexReader.(index.IndexReaderFuzzy); ok { - fieldDict, err := ir.FieldDictFuzzy(field, term, fuzziness, prefixTerm) - if err != nil { - return nil, err - } - defer func() { - if cerr := fieldDict.Close(); cerr != nil && err == nil { - err = cerr - } - }() - tfd, err := fieldDict.Next() - for err == nil && tfd != nil { - rv = append(rv, tfd.Term) - if tooManyClauses(len(rv)) { - return nil, tooManyClausesErr(field, len(rv)) - } - tfd, err = fieldDict.Next() - } - return rv, err - } - - var fieldDict index.FieldDict - if len(prefixTerm) > 0 { - fieldDict, err = indexReader.FieldDictPrefix(field, []byte(prefixTerm)) - } else { - fieldDict, err = indexReader.FieldDict(field) - } - if err != nil { - return nil, err - } - defer func() { - if cerr := fieldDict.Close(); cerr != nil && err == nil { - err = cerr - } - }() - - // enumerate terms and check levenshtein distance - var reuse []int - tfd, err := fieldDict.Next() - for err == nil && tfd != nil { - var ld int - var exceeded bool - ld, exceeded, reuse = search.LevenshteinDistanceMaxReuseSlice(term, tfd.Term, fuzziness, reuse) - if !exceeded && ld <= fuzziness { - rv = append(rv, tfd.Term) - if tooManyClauses(len(rv)) { - return nil, tooManyClausesErr(field, len(rv)) - } - } - tfd, err = fieldDict.Next() - } - - return rv, err -} diff --git a/vendor/github.com/blevesearch/bleve/search/searcher/search_geoboundingbox.go b/vendor/github.com/blevesearch/bleve/search/searcher/search_geoboundingbox.go deleted file mode 100644 index 76157f0..0000000 --- a/vendor/github.com/blevesearch/bleve/search/searcher/search_geoboundingbox.go +++ /dev/null @@ -1,272 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package searcher - -import ( - "github.com/blevesearch/bleve/document" - "github.com/blevesearch/bleve/geo" - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/numeric" - "github.com/blevesearch/bleve/search" -) - -type filterFunc func(key []byte) bool - -var GeoBitsShift1 = geo.GeoBits << 1 -var GeoBitsShift1Minus1 = GeoBitsShift1 - 1 - -func NewGeoBoundingBoxSearcher(indexReader index.IndexReader, minLon, minLat, - maxLon, maxLat float64, field string, boost float64, - options search.SearcherOptions, checkBoundaries bool) ( - search.Searcher, error) { - - // track list of opened searchers, for cleanup on early exit - var openedSearchers []search.Searcher - cleanupOpenedSearchers := func() { - for _, s := range openedSearchers { - _ = s.Close() - } - } - - // do math to produce list of terms needed for this search - onBoundaryTerms, notOnBoundaryTerms, err := ComputeGeoRange(0, GeoBitsShift1Minus1, - minLon, minLat, maxLon, maxLat, checkBoundaries, indexReader, field) - if err != nil { - return nil, err - } - - var onBoundarySearcher search.Searcher - dvReader, err := indexReader.DocValueReader([]string{field}) - if err != nil { - return nil, err - } - - if len(onBoundaryTerms) > 0 { - rawOnBoundarySearcher, err := NewMultiTermSearcherBytes(indexReader, - onBoundaryTerms, field, boost, options, false) - if err != nil { - return nil, err - } - // add filter to check points near the boundary - onBoundarySearcher = NewFilteringSearcher(rawOnBoundarySearcher, - buildRectFilter(dvReader, field, minLon, minLat, maxLon, maxLat)) - openedSearchers = append(openedSearchers, onBoundarySearcher) - } - - var notOnBoundarySearcher search.Searcher - if len(notOnBoundaryTerms) > 0 { - var err error - notOnBoundarySearcher, err = NewMultiTermSearcherBytes(indexReader, - notOnBoundaryTerms, field, boost, options, false) - if err != nil { - cleanupOpenedSearchers() - return nil, err - } - openedSearchers = append(openedSearchers, notOnBoundarySearcher) - } - - if onBoundarySearcher != nil && notOnBoundarySearcher != nil { - rv, err := NewDisjunctionSearcher(indexReader, - []search.Searcher{ - onBoundarySearcher, - notOnBoundarySearcher, - }, - 0, options) - if err != nil { - cleanupOpenedSearchers() - return nil, err - } - return rv, nil - } else if onBoundarySearcher != nil { - return onBoundarySearcher, nil - } else if notOnBoundarySearcher != nil { - return notOnBoundarySearcher, nil - } - - return NewMatchNoneSearcher(indexReader) -} - -var geoMaxShift = document.GeoPrecisionStep * 4 -var geoDetailLevel = ((geo.GeoBits << 1) - geoMaxShift) / 2 -type closeFunc func() error - -func ComputeGeoRange(term uint64, shift uint, - sminLon, sminLat, smaxLon, smaxLat float64, checkBoundaries bool, - indexReader index.IndexReader, field string) ( - onBoundary [][]byte, notOnBoundary [][]byte, err error) { - - isIndexed, closeF, err := buildIsIndexedFunc(indexReader, field) - if closeF != nil { - defer func() { - cerr := closeF() - if cerr != nil { - err = cerr - } - }() - } - - grc := &geoRangeCompute{ - preallocBytesLen: 32, - preallocBytes: make([]byte, 32), - sminLon: sminLon, - sminLat: sminLat, - smaxLon: smaxLon, - smaxLat: smaxLat, - checkBoundaries: checkBoundaries, - isIndexed: isIndexed, - } - - grc.computeGeoRange(term, shift) - - return grc.onBoundary, grc.notOnBoundary, nil -} - -func buildIsIndexedFunc(indexReader index.IndexReader, field string) (isIndexed filterFunc, closeF closeFunc, err error) { - if irr, ok := indexReader.(index.IndexReaderContains); ok { - fieldDict, err := irr.FieldDictContains(field) - if err != nil { - return nil, nil, err - } - - isIndexed = func(term []byte) bool { - found, err := fieldDict.Contains(term) - return err == nil && found - } - - closeF = func() error { - if fd, ok := fieldDict.(index.FieldDict); ok { - err := fd.Close() - if err != nil { - return err - } - } - return nil - } - } else if indexReader != nil { - isIndexed = func(term []byte) bool { - reader, err := indexReader.TermFieldReader(term, field, false, false, false) - if err != nil || reader == nil { - return false - } - if reader.Count() == 0 { - _ = reader.Close() - return false - } - _ = reader.Close() - return true - } - - } else { - isIndexed = func([]byte) bool { - return true - } - } - return isIndexed, closeF, err -} - -func buildRectFilter(dvReader index.DocValueReader, field string, - minLon, minLat, maxLon, maxLat float64) FilterFunc { - return func(d *search.DocumentMatch) bool { - // check geo matches against all numeric type terms indexed - var lons, lats []float64 - var found bool - err := dvReader.VisitDocValues(d.IndexInternalID, func(field string, term []byte) { - // only consider the values which are shifted 0 - prefixCoded := numeric.PrefixCoded(term) - shift, err := prefixCoded.Shift() - if err == nil && shift == 0 { - var i64 int64 - i64, err = prefixCoded.Int64() - if err == nil { - lons = append(lons, geo.MortonUnhashLon(uint64(i64))) - lats = append(lats, geo.MortonUnhashLat(uint64(i64))) - found = true - } - } - }) - if err == nil && found { - for i := range lons { - if geo.BoundingBoxContains(lons[i], lats[i], - minLon, minLat, maxLon, maxLat) { - return true - } - } - } - return false - } -} - -type geoRangeCompute struct { - preallocBytesLen int - preallocBytes []byte - sminLon, sminLat, smaxLon, smaxLat float64 - checkBoundaries bool - onBoundary, notOnBoundary [][]byte - isIndexed func(term []byte) bool -} - -func (grc *geoRangeCompute) makePrefixCoded(in int64, shift uint) (rv numeric.PrefixCoded) { - if len(grc.preallocBytes) <= 0 { - grc.preallocBytesLen = grc.preallocBytesLen * 2 - grc.preallocBytes = make([]byte, grc.preallocBytesLen) - } - - rv, grc.preallocBytes, _ = - numeric.NewPrefixCodedInt64Prealloc(in, shift, grc.preallocBytes) - - return rv -} - -func (grc *geoRangeCompute) computeGeoRange(term uint64, shift uint) { - split := term | uint64(0x1)< > 1 - - within := res%document.GeoPrecisionStep == 0 && - geo.RectWithin(minLon, minLat, maxLon, maxLat, - grc.sminLon, grc.sminLat, grc.smaxLon, grc.smaxLat) - if within || (level == geoDetailLevel && - geo.RectIntersects(minLon, minLat, maxLon, maxLat, - grc.sminLon, grc.sminLat, grc.smaxLon, grc.smaxLat)) { - codedTerm := grc.makePrefixCoded(int64(start), res) - if grc.isIndexed(codedTerm) { - if !within && grc.checkBoundaries { - grc.onBoundary = append(grc.onBoundary, codedTerm) - } else { - grc.notOnBoundary = append(grc.notOnBoundary, codedTerm) - } - } - } else if level < geoDetailLevel && - geo.RectIntersects(minLon, minLat, maxLon, maxLat, - grc.sminLon, grc.sminLat, grc.smaxLon, grc.smaxLat) { - grc.computeGeoRange(start, res-1) - } -} \ No newline at end of file diff --git a/vendor/github.com/blevesearch/bleve/search/searcher/search_geopointdistance.go b/vendor/github.com/blevesearch/bleve/search/searcher/search_geopointdistance.go deleted file mode 100644 index b6f2932..0000000 --- a/vendor/github.com/blevesearch/bleve/search/searcher/search_geopointdistance.go +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package searcher - -import ( - "github.com/blevesearch/bleve/geo" - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/numeric" - "github.com/blevesearch/bleve/search" -) - -func NewGeoPointDistanceSearcher(indexReader index.IndexReader, centerLon, - centerLat, dist float64, field string, boost float64, - options search.SearcherOptions) (search.Searcher, error) { - // compute bounding box containing the circle - topLeftLon, topLeftLat, bottomRightLon, bottomRightLat, err := - geo.RectFromPointDistance(centerLon, centerLat, dist) - if err != nil { - return nil, err - } - - // build a searcher for the box - boxSearcher, err := boxSearcher(indexReader, - topLeftLon, topLeftLat, bottomRightLon, bottomRightLat, - field, boost, options, false) - if err != nil { - return nil, err - } - - dvReader, err := indexReader.DocValueReader([]string{field}) - if err != nil { - return nil, err - } - - // wrap it in a filtering searcher which checks the actual distance - return NewFilteringSearcher(boxSearcher, - buildDistFilter(dvReader, field, centerLon, centerLat, dist)), nil -} - -// boxSearcher builds a searcher for the described bounding box -// if the desired box crosses the dateline, it is automatically split into -// two boxes joined through a disjunction searcher -func boxSearcher(indexReader index.IndexReader, - topLeftLon, topLeftLat, bottomRightLon, bottomRightLat float64, - field string, boost float64, options search.SearcherOptions, checkBoundaries bool) ( - search.Searcher, error) { - if bottomRightLon < topLeftLon { - // cross date line, rewrite as two parts - - leftSearcher, err := NewGeoBoundingBoxSearcher(indexReader, - -180, bottomRightLat, bottomRightLon, topLeftLat, - field, boost, options, checkBoundaries) - if err != nil { - return nil, err - } - rightSearcher, err := NewGeoBoundingBoxSearcher(indexReader, - topLeftLon, bottomRightLat, 180, topLeftLat, field, boost, options, - checkBoundaries) - if err != nil { - _ = leftSearcher.Close() - return nil, err - } - - boxSearcher, err := NewDisjunctionSearcher(indexReader, - []search.Searcher{leftSearcher, rightSearcher}, 0, options) - if err != nil { - _ = leftSearcher.Close() - _ = rightSearcher.Close() - return nil, err - } - return boxSearcher, nil - } - - // build geoboundingbox searcher for that bounding box - boxSearcher, err := NewGeoBoundingBoxSearcher(indexReader, - topLeftLon, bottomRightLat, bottomRightLon, topLeftLat, field, boost, - options, checkBoundaries) - if err != nil { - return nil, err - } - return boxSearcher, nil -} - -func buildDistFilter(dvReader index.DocValueReader, field string, - centerLon, centerLat, maxDist float64) FilterFunc { - return func(d *search.DocumentMatch) bool { - // check geo matches against all numeric type terms indexed - var lons, lats []float64 - var found bool - - err := dvReader.VisitDocValues(d.IndexInternalID, func(field string, term []byte) { - // only consider the values which are shifted 0 - prefixCoded := numeric.PrefixCoded(term) - shift, err := prefixCoded.Shift() - if err == nil && shift == 0 { - i64, err := prefixCoded.Int64() - if err == nil { - lons = append(lons, geo.MortonUnhashLon(uint64(i64))) - lats = append(lats, geo.MortonUnhashLat(uint64(i64))) - found = true - } - } - }) - if err == nil && found { - for i := range lons { - dist := geo.Haversin(lons[i], lats[i], centerLon, centerLat) - if dist <= maxDist/1000 { - return true - } - } - } - return false - } -} diff --git a/vendor/github.com/blevesearch/bleve/search/searcher/search_geopolygon.go b/vendor/github.com/blevesearch/bleve/search/searcher/search_geopolygon.go deleted file mode 100644 index 5f16aa8..0000000 --- a/vendor/github.com/blevesearch/bleve/search/searcher/search_geopolygon.go +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright (c) 2019 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package searcher - -import ( - "fmt" - "github.com/blevesearch/bleve/geo" - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/numeric" - "github.com/blevesearch/bleve/search" - "math" -) - -func NewGeoBoundedPolygonSearcher(indexReader index.IndexReader, - polygon []geo.Point, field string, boost float64, - options search.SearcherOptions) (search.Searcher, error) { - - if len(polygon) < 3 { - return nil, fmt.Errorf("Too few points specified for the polygon boundary") - } - - // compute the bounding box enclosing the polygon - topLeftLon, topLeftLat, bottomRightLon, bottomRightLat, err := - geo.BoundingRectangleForPolygon(polygon) - if err != nil { - return nil, err - } - - // build a searcher for the bounding box on the polygon - boxSearcher, err := boxSearcher(indexReader, - topLeftLon, topLeftLat, bottomRightLon, bottomRightLat, - field, boost, options, true) - if err != nil { - return nil, err - } - - dvReader, err := indexReader.DocValueReader([]string{field}) - if err != nil { - return nil, err - } - - // wrap it in a filtering searcher that checks for the polygon inclusivity - return NewFilteringSearcher(boxSearcher, - buildPolygonFilter(dvReader, field, polygon)), nil -} - -const float64EqualityThreshold = 1e-6 - -func almostEqual(a, b float64) bool { - return math.Abs(a-b) <= float64EqualityThreshold -} - -// buildPolygonFilter returns true if the point lies inside the -// polygon. It is based on the ray-casting technique as referred -// here: https://wrf.ecse.rpi.edu/nikola/pubdetails/pnpoly.html -func buildPolygonFilter(dvReader index.DocValueReader, field string, - polygon []geo.Point) FilterFunc { - return func(d *search.DocumentMatch) bool { - // check geo matches against all numeric type terms indexed - var lons, lats []float64 - var found bool - - err := dvReader.VisitDocValues(d.IndexInternalID, func(field string, term []byte) { - // only consider the values which are shifted 0 - prefixCoded := numeric.PrefixCoded(term) - shift, err := prefixCoded.Shift() - if err == nil && shift == 0 { - i64, err := prefixCoded.Int64() - if err == nil { - lons = append(lons, geo.MortonUnhashLon(uint64(i64))) - lats = append(lats, geo.MortonUnhashLat(uint64(i64))) - found = true - } - } - }) - - // Note: this approach works for points which are strictly inside - // the polygon. ie it might fail for certain points on the polygon boundaries. - if err == nil && found { - nVertices := len(polygon) - if len(polygon) < 3 { - return false - } - rayIntersectsSegment := func(point, a, b geo.Point) bool { - return (a.Lat > point.Lat) != (b.Lat > point.Lat) && - point.Lon < (b.Lon-a.Lon)*(point.Lat-a.Lat)/(b.Lat-a.Lat)+a.Lon - } - - for i := range lons { - pt := geo.Point{Lon: lons[i], Lat: lats[i]} - inside := rayIntersectsSegment(pt, polygon[len(polygon)-1], polygon[0]) - // check for a direct vertex match - if almostEqual(polygon[0].Lat, lats[i]) && - almostEqual(polygon[0].Lon, lons[i]) { - return true - } - - for j := 1; j < nVertices; j++ { - if almostEqual(polygon[j].Lat, lats[i]) && - almostEqual(polygon[j].Lon, lons[i]) { - return true - } - if rayIntersectsSegment(pt, polygon[j-1], polygon[j]) { - inside = !inside - } - } - if inside { - return true - } - } - } - return false - } -} diff --git a/vendor/github.com/blevesearch/bleve/search/searcher/search_multi_term.go b/vendor/github.com/blevesearch/bleve/search/searcher/search_multi_term.go deleted file mode 100644 index 70a2fa3..0000000 --- a/vendor/github.com/blevesearch/bleve/search/searcher/search_multi_term.go +++ /dev/null @@ -1,215 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package searcher - -import ( - "fmt" - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/search" -) - -func NewMultiTermSearcher(indexReader index.IndexReader, terms []string, - field string, boost float64, options search.SearcherOptions, limit bool) ( - search.Searcher, error) { - - if tooManyClauses(len(terms)) { - if optionsDisjunctionOptimizable(options) { - return optimizeMultiTermSearcher(indexReader, terms, field, boost, options) - } - if limit { - return nil, tooManyClausesErr(field, len(terms)) - } - } - - qsearchers, err := makeBatchSearchers(indexReader, terms, field, boost, options) - if err != nil { - return nil, err - } - - // build disjunction searcher of these ranges - return newMultiTermSearcherInternal(indexReader, qsearchers, field, boost, - options, limit) -} - -func NewMultiTermSearcherBytes(indexReader index.IndexReader, terms [][]byte, - field string, boost float64, options search.SearcherOptions, limit bool) ( - search.Searcher, error) { - - if tooManyClauses(len(terms)) { - if optionsDisjunctionOptimizable(options) { - return optimizeMultiTermSearcherBytes(indexReader, terms, field, boost, options) - } - - if limit { - return nil, tooManyClausesErr(field, len(terms)) - } - } - - qsearchers, err := makeBatchSearchersBytes(indexReader, terms, field, boost, options) - if err != nil { - return nil, err - } - - // build disjunction searcher of these ranges - return newMultiTermSearcherInternal(indexReader, qsearchers, field, boost, - options, limit) -} - -func newMultiTermSearcherInternal(indexReader index.IndexReader, - searchers []search.Searcher, field string, boost float64, - options search.SearcherOptions, limit bool) ( - search.Searcher, error) { - - // build disjunction searcher of these ranges - searcher, err := newDisjunctionSearcher(indexReader, searchers, 0, options, - limit) - if err != nil { - for _, s := range searchers { - _ = s.Close() - } - return nil, err - } - - return searcher, nil -} - -func optimizeMultiTermSearcher(indexReader index.IndexReader, terms []string, - field string, boost float64, options search.SearcherOptions) ( - search.Searcher, error) { - var finalSearcher search.Searcher - for len(terms) > 0 { - var batchTerms []string - if len(terms) > DisjunctionMaxClauseCount { - batchTerms = terms[:DisjunctionMaxClauseCount] - terms = terms[DisjunctionMaxClauseCount:] - } else { - batchTerms = terms - terms = nil - } - batch, err := makeBatchSearchers(indexReader, batchTerms, field, boost, options) - if err != nil { - return nil, err - } - if finalSearcher != nil { - batch = append(batch, finalSearcher) - } - cleanup := func() { - for _, searcher := range batch { - if searcher != nil { - _ = searcher.Close() - } - } - } - finalSearcher, err = optimizeCompositeSearcher("disjunction:unadorned", - indexReader, batch, options) - // all searchers in batch should be closed, regardless of error or optimization failure - // either we're returning, or continuing and only finalSearcher is needed for next loop - cleanup() - if err != nil { - return nil, err - } - if finalSearcher == nil { - return nil, fmt.Errorf("unable to optimize") - } - } - return finalSearcher, nil -} - -func makeBatchSearchers(indexReader index.IndexReader, terms []string, field string, - boost float64, options search.SearcherOptions) ([]search.Searcher, error) { - - qsearchers := make([]search.Searcher, len(terms)) - qsearchersClose := func() { - for _, searcher := range qsearchers { - if searcher != nil { - _ = searcher.Close() - } - } - } - for i, term := range terms { - var err error - qsearchers[i], err = NewTermSearcher(indexReader, term, field, boost, options) - if err != nil { - qsearchersClose() - return nil, err - } - } - return qsearchers, nil -} - -func optimizeMultiTermSearcherBytes(indexReader index.IndexReader, terms [][]byte, - field string, boost float64, options search.SearcherOptions) ( - search.Searcher, error) { - - var finalSearcher search.Searcher - for len(terms) > 0 { - var batchTerms [][]byte - if len(terms) > DisjunctionMaxClauseCount { - batchTerms = terms[:DisjunctionMaxClauseCount] - terms = terms[DisjunctionMaxClauseCount:] - } else { - batchTerms = terms - terms = nil - } - batch, err := makeBatchSearchersBytes(indexReader, batchTerms, field, boost, options) - if err != nil { - return nil, err - } - if finalSearcher != nil { - batch = append(batch, finalSearcher) - } - cleanup := func() { - for _, searcher := range batch { - if searcher != nil { - _ = searcher.Close() - } - } - } - finalSearcher, err = optimizeCompositeSearcher("disjunction:unadorned", - indexReader, batch, options) - // all searchers in batch should be closed, regardless of error or optimization failure - // either we're returning, or continuing and only finalSearcher is needed for next loop - cleanup() - if err != nil { - return nil, err - } - if finalSearcher == nil { - return nil, fmt.Errorf("unable to optimize") - } - } - return finalSearcher, nil -} - -func makeBatchSearchersBytes(indexReader index.IndexReader, terms [][]byte, field string, - boost float64, options search.SearcherOptions) ([]search.Searcher, error) { - - qsearchers := make([]search.Searcher, len(terms)) - qsearchersClose := func() { - for _, searcher := range qsearchers { - if searcher != nil { - _ = searcher.Close() - } - } - } - for i, term := range terms { - var err error - qsearchers[i], err = NewTermSearcherBytes(indexReader, term, field, boost, options) - if err != nil { - qsearchersClose() - return nil, err - } - } - return qsearchers, nil -} diff --git a/vendor/github.com/blevesearch/bleve/search/searcher/search_numeric_range.go b/vendor/github.com/blevesearch/bleve/search/searcher/search_numeric_range.go deleted file mode 100644 index 48d6226..0000000 --- a/vendor/github.com/blevesearch/bleve/search/searcher/search_numeric_range.go +++ /dev/null @@ -1,260 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package searcher - -import ( - "bytes" - "math" - "sort" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/numeric" - "github.com/blevesearch/bleve/search" -) - -func NewNumericRangeSearcher(indexReader index.IndexReader, - min *float64, max *float64, inclusiveMin, inclusiveMax *bool, field string, - boost float64, options search.SearcherOptions) (search.Searcher, error) { - // account for unbounded edges - if min == nil { - negInf := math.Inf(-1) - min = &negInf - } - if max == nil { - Inf := math.Inf(1) - max = &Inf - } - if inclusiveMin == nil { - defaultInclusiveMin := true - inclusiveMin = &defaultInclusiveMin - } - if inclusiveMax == nil { - defaultInclusiveMax := false - inclusiveMax = &defaultInclusiveMax - } - // find all the ranges - minInt64 := numeric.Float64ToInt64(*min) - if !*inclusiveMin && minInt64 != math.MaxInt64 { - minInt64++ - } - maxInt64 := numeric.Float64ToInt64(*max) - if !*inclusiveMax && maxInt64 != math.MinInt64 { - maxInt64-- - } - - var fieldDict index.FieldDictContains - var isIndexed filterFunc - var err error - if irr, ok := indexReader.(index.IndexReaderContains); ok { - fieldDict, err = irr.FieldDictContains(field) - if err != nil { - return nil, err - } - - isIndexed = func(term []byte) bool { - found, err := fieldDict.Contains(term) - return err == nil && found - } - } - - // FIXME hard-coded precision, should match field declaration - termRanges := splitInt64Range(minInt64, maxInt64, 4) - terms := termRanges.Enumerate(isIndexed) - if fieldDict != nil { - if fd, ok := fieldDict.(index.FieldDict); ok { - if err = fd.Close(); err != nil { - return nil, err - } - } - } - - if len(terms) < 1 { - // cannot return MatchNoneSearcher because of interaction with - // commit f391b991c20f02681bacd197afc6d8aed444e132 - return NewMultiTermSearcherBytes(indexReader, terms, field, boost, options, - true) - } - - // for upside_down - if isIndexed == nil { - terms, err = filterCandidateTerms(indexReader, terms, field) - if err != nil { - return nil, err - } - } - - if tooManyClauses(len(terms)) { - return nil, tooManyClausesErr(field, len(terms)) - } - - return NewMultiTermSearcherBytes(indexReader, terms, field, boost, options, - true) -} - -func filterCandidateTerms(indexReader index.IndexReader, - terms [][]byte, field string) (rv [][]byte, err error) { - - if ir, ok := indexReader.(index.IndexReaderOnly); ok { - fieldDict, err := ir.FieldDictOnly(field, terms, false) - if err != nil { - return nil, err - } - // enumerate the terms (no need to check them again) - tfd, err := fieldDict.Next() - for err == nil && tfd != nil { - rv = append(rv, []byte(tfd.Term)) - tfd, err = fieldDict.Next() - } - if cerr := fieldDict.Close(); cerr != nil && err == nil { - err = cerr - } - - return rv, err - } - - fieldDict, err := indexReader.FieldDictRange(field, terms[0], terms[len(terms)-1]) - if err != nil { - return nil, err - } - - // enumerate the terms and check against list of terms - tfd, err := fieldDict.Next() - for err == nil && tfd != nil { - termBytes := []byte(tfd.Term) - i := sort.Search(len(terms), func(i int) bool { return bytes.Compare(terms[i], termBytes) >= 0 }) - if i < len(terms) && bytes.Compare(terms[i], termBytes) == 0 { - rv = append(rv, terms[i]) - } - terms = terms[i:] - tfd, err = fieldDict.Next() - } - - if cerr := fieldDict.Close(); cerr != nil && err == nil { - err = cerr - } - - return rv, err -} - -type termRange struct { - startTerm []byte - endTerm []byte -} - -func (t *termRange) Enumerate(filter filterFunc) [][]byte { - var rv [][]byte - next := t.startTerm - for bytes.Compare(next, t.endTerm) <= 0 { - if filter != nil { - if filter(next) { - rv = append(rv, next) - } - } else { - rv = append(rv, next) - } - next = incrementBytes(next) - } - return rv -} - -func incrementBytes(in []byte) []byte { - rv := make([]byte, len(in)) - copy(rv, in) - for i := len(rv) - 1; i >= 0; i-- { - rv[i] = rv[i] + 1 - if rv[i] != 0 { - // didn't overflow, so stop - break - } - } - return rv -} - -type termRanges []*termRange - -func (tr termRanges) Enumerate(filter filterFunc) [][]byte { - var rv [][]byte - for _, tri := range tr { - trie := tri.Enumerate(filter) - rv = append(rv, trie...) - } - return rv -} - -func splitInt64Range(minBound, maxBound int64, precisionStep uint) termRanges { - rv := make(termRanges, 0) - if minBound > maxBound { - return rv - } - - for shift := uint(0); ; shift += precisionStep { - - diff := int64(1) << (shift + precisionStep) - mask := ((int64(1) << precisionStep) - int64(1)) << shift - hasLower := (minBound & mask) != int64(0) - hasUpper := (maxBound & mask) != mask - - var nextMinBound int64 - if hasLower { - nextMinBound = (minBound + diff) &^ mask - } else { - nextMinBound = minBound &^ mask - } - var nextMaxBound int64 - if hasUpper { - nextMaxBound = (maxBound - diff) &^ mask - } else { - nextMaxBound = maxBound &^ mask - } - - lowerWrapped := nextMinBound < minBound - upperWrapped := nextMaxBound > maxBound - - if shift+precisionStep >= 64 || nextMinBound > nextMaxBound || - lowerWrapped || upperWrapped { - // We are in the lowest precision or the next precision is not available. - rv = append(rv, newRange(minBound, maxBound, shift)) - // exit the split recursion loop - break - } - - if hasLower { - rv = append(rv, newRange(minBound, minBound|mask, shift)) - } - if hasUpper { - rv = append(rv, newRange(maxBound&^mask, maxBound, shift)) - } - - // recurse to next precision - minBound = nextMinBound - maxBound = nextMaxBound - } - - return rv -} - -func newRange(minBound, maxBound int64, shift uint) *termRange { - maxBound |= (int64(1) << shift) - int64(1) - minBytes := numeric.MustNewPrefixCodedInt64(minBound, shift) - maxBytes := numeric.MustNewPrefixCodedInt64(maxBound, shift) - return newRangeBytes(minBytes, maxBytes) -} - -func newRangeBytes(minBytes, maxBytes []byte) *termRange { - return &termRange{ - startTerm: minBytes, - endTerm: maxBytes, - } -} diff --git a/vendor/github.com/blevesearch/bleve/search/searcher/search_phrase.go b/vendor/github.com/blevesearch/bleve/search/searcher/search_phrase.go deleted file mode 100644 index 51b7e5b..0000000 --- a/vendor/github.com/blevesearch/bleve/search/searcher/search_phrase.go +++ /dev/null @@ -1,437 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package searcher - -import ( - "fmt" - "math" - "reflect" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/size" -) - -var reflectStaticSizePhraseSearcher int - -func init() { - var ps PhraseSearcher - reflectStaticSizePhraseSearcher = int(reflect.TypeOf(ps).Size()) -} - -type PhraseSearcher struct { - mustSearcher search.Searcher - queryNorm float64 - currMust *search.DocumentMatch - terms [][]string - path phrasePath - paths []phrasePath - locations []search.Location - initialized bool -} - -func (s *PhraseSearcher) Size() int { - sizeInBytes := reflectStaticSizePhraseSearcher + size.SizeOfPtr - - if s.mustSearcher != nil { - sizeInBytes += s.mustSearcher.Size() - } - - if s.currMust != nil { - sizeInBytes += s.currMust.Size() - } - - for _, entry := range s.terms { - sizeInBytes += size.SizeOfSlice - for _, entry1 := range entry { - sizeInBytes += size.SizeOfString + len(entry1) - } - } - - return sizeInBytes -} - -func NewPhraseSearcher(indexReader index.IndexReader, terms []string, field string, options search.SearcherOptions) (*PhraseSearcher, error) { - // turn flat terms []string into [][]string - mterms := make([][]string, len(terms)) - for i, term := range terms { - mterms[i] = []string{term} - } - return NewMultiPhraseSearcher(indexReader, mterms, field, options) -} - -func NewMultiPhraseSearcher(indexReader index.IndexReader, terms [][]string, field string, options search.SearcherOptions) (*PhraseSearcher, error) { - options.IncludeTermVectors = true - var termPositionSearchers []search.Searcher - for _, termPos := range terms { - if len(termPos) == 1 && termPos[0] != "" { - // single term - ts, err := NewTermSearcher(indexReader, termPos[0], field, 1.0, options) - if err != nil { - // close any searchers already opened - for _, ts := range termPositionSearchers { - _ = ts.Close() - } - return nil, fmt.Errorf("phrase searcher error building term searcher: %v", err) - } - termPositionSearchers = append(termPositionSearchers, ts) - } else if len(termPos) > 1 { - // multiple terms - var termSearchers []search.Searcher - for _, term := range termPos { - if term == "" { - continue - } - ts, err := NewTermSearcher(indexReader, term, field, 1.0, options) - if err != nil { - // close any searchers already opened - for _, ts := range termPositionSearchers { - _ = ts.Close() - } - return nil, fmt.Errorf("phrase searcher error building term searcher: %v", err) - } - termSearchers = append(termSearchers, ts) - } - disjunction, err := NewDisjunctionSearcher(indexReader, termSearchers, 1, options) - if err != nil { - // close any searchers already opened - for _, ts := range termPositionSearchers { - _ = ts.Close() - } - return nil, fmt.Errorf("phrase searcher error building term position disjunction searcher: %v", err) - } - termPositionSearchers = append(termPositionSearchers, disjunction) - } - } - - mustSearcher, err := NewConjunctionSearcher(indexReader, termPositionSearchers, options) - if err != nil { - // close any searchers already opened - for _, ts := range termPositionSearchers { - _ = ts.Close() - } - return nil, fmt.Errorf("phrase searcher error building conjunction searcher: %v", err) - } - - // build our searcher - rv := PhraseSearcher{ - mustSearcher: mustSearcher, - terms: terms, - } - rv.computeQueryNorm() - return &rv, nil -} - -func (s *PhraseSearcher) computeQueryNorm() { - // first calculate sum of squared weights - sumOfSquaredWeights := 0.0 - if s.mustSearcher != nil { - sumOfSquaredWeights += s.mustSearcher.Weight() - } - - // now compute query norm from this - s.queryNorm = 1.0 / math.Sqrt(sumOfSquaredWeights) - // finally tell all the downstream searchers the norm - if s.mustSearcher != nil { - s.mustSearcher.SetQueryNorm(s.queryNorm) - } -} - -func (s *PhraseSearcher) initSearchers(ctx *search.SearchContext) error { - err := s.advanceNextMust(ctx) - if err != nil { - return err - } - - s.initialized = true - return nil -} - -func (s *PhraseSearcher) advanceNextMust(ctx *search.SearchContext) error { - var err error - - if s.mustSearcher != nil { - if s.currMust != nil { - ctx.DocumentMatchPool.Put(s.currMust) - } - s.currMust, err = s.mustSearcher.Next(ctx) - if err != nil { - return err - } - } - - return nil -} - -func (s *PhraseSearcher) Weight() float64 { - return s.mustSearcher.Weight() -} - -func (s *PhraseSearcher) SetQueryNorm(qnorm float64) { - s.mustSearcher.SetQueryNorm(qnorm) -} - -func (s *PhraseSearcher) Next(ctx *search.SearchContext) (*search.DocumentMatch, error) { - if !s.initialized { - err := s.initSearchers(ctx) - if err != nil { - return nil, err - } - } - - for s.currMust != nil { - // check this match against phrase constraints - rv := s.checkCurrMustMatch(ctx) - - // prepare for next iteration (either loop or subsequent call to Next()) - err := s.advanceNextMust(ctx) - if err != nil { - return nil, err - } - - // if match satisfied phrase constraints return it as a hit - if rv != nil { - return rv, nil - } - } - - return nil, nil -} - -// checkCurrMustMatch is solely concerned with determining if the DocumentMatch -// pointed to by s.currMust (which satisifies the pre-condition searcher) -// also satisfies the phase constraints. if so, it returns a DocumentMatch -// for this document, otherwise nil -func (s *PhraseSearcher) checkCurrMustMatch(ctx *search.SearchContext) *search.DocumentMatch { - s.locations = s.currMust.Complete(s.locations) - - locations := s.currMust.Locations - s.currMust.Locations = nil - - ftls := s.currMust.FieldTermLocations - - // typically we would expect there to only actually be results in - // one field, but we allow for this to not be the case - // but, we note that phrase constraints can only be satisfied within - // a single field, so we can check them each independently - for field, tlm := range locations { - ftls = s.checkCurrMustMatchField(ctx, field, tlm, ftls) - } - - if len(ftls) > 0 { - // return match - rv := s.currMust - s.currMust = nil - rv.FieldTermLocations = ftls - return rv - } - - return nil -} - -// checkCurrMustMatchField is solely concerned with determining if one -// particular field within the currMust DocumentMatch Locations -// satisfies the phase constraints (possibly more than once). if so, -// the matching field term locations are appended to the provided -// slice -func (s *PhraseSearcher) checkCurrMustMatchField(ctx *search.SearchContext, - field string, tlm search.TermLocationMap, - ftls []search.FieldTermLocation) []search.FieldTermLocation { - if s.path == nil { - s.path = make(phrasePath, 0, len(s.terms)) - } - s.paths = findPhrasePaths(0, nil, s.terms, tlm, s.path[:0], 0, s.paths[:0]) - for _, p := range s.paths { - for _, pp := range p { - ftls = append(ftls, search.FieldTermLocation{ - Field: field, - Term: pp.term, - Location: search.Location{ - Pos: pp.loc.Pos, - Start: pp.loc.Start, - End: pp.loc.End, - ArrayPositions: pp.loc.ArrayPositions, - }, - }) - } - } - return ftls -} - -type phrasePart struct { - term string - loc *search.Location -} - -func (p *phrasePart) String() string { - return fmt.Sprintf("[%s %v]", p.term, p.loc) -} - -type phrasePath []phrasePart - -func (p phrasePath) MergeInto(in search.TermLocationMap) { - for _, pp := range p { - in[pp.term] = append(in[pp.term], pp.loc) - } -} - -func (p phrasePath) String() string { - rv := "[" - for i, pp := range p { - if i > 0 { - rv += ", " - } - rv += pp.String() - } - rv += "]" - return rv -} - -// findPhrasePaths is a function to identify phase matches from a set -// of known term locations. it recursive so care must be taken with -// arguments and return values. -// -// prevPos - the previous location, 0 on first invocation -// ap - array positions of the first candidate phrase part to -// which further recursive phrase parts must match, -// nil on initial invocation or when there are no array positions -// phraseTerms - slice containing the phrase terms, -// may contain empty string as placeholder (don't care) -// tlm - the Term Location Map containing all relevant term locations -// p - the current path being explored (appended to in recursive calls) -// this is the primary state being built during the traversal -// remainingSlop - amount of sloppiness that's allowed, which is the -// sum of the editDistances from each matching phrase part, -// where 0 means no sloppiness allowed (all editDistances must be 0), -// decremented during recursion -// rv - the final result being appended to by all the recursive calls -// -// returns slice of paths, or nil if invocation did not find any successul paths -func findPhrasePaths(prevPos uint64, ap search.ArrayPositions, phraseTerms [][]string, - tlm search.TermLocationMap, p phrasePath, remainingSlop int, rv []phrasePath) []phrasePath { - // no more terms - if len(phraseTerms) < 1 { - // snapshot or copy the recursively built phrasePath p and - // append it to the rv, also optimizing by checking if next - // phrasePath item in the rv (which we're about to overwrite) - // is available for reuse - var pcopy phrasePath - if len(rv) < cap(rv) { - pcopy = rv[:len(rv)+1][len(rv)][:0] - } - return append(rv, append(pcopy, p...)) - } - - car := phraseTerms[0] - cdr := phraseTerms[1:] - - // empty term is treated as match (continue) - if len(car) == 0 || (len(car) == 1 && car[0] == "") { - nextPos := prevPos + 1 - if prevPos == 0 { - // if prevPos was 0, don't set it to 1 (as thats not a real abs pos) - nextPos = 0 // don't advance nextPos if prevPos was 0 - } - return findPhrasePaths(nextPos, ap, cdr, tlm, p, remainingSlop, rv) - } - - // locations for this term - for _, carTerm := range car { - locations := tlm[carTerm] - LOCATIONS_LOOP: - for _, loc := range locations { - if prevPos != 0 && !loc.ArrayPositions.Equals(ap) { - // if the array positions are wrong, can't match, try next location - continue - } - - // compute distance from previous phrase term - dist := 0 - if prevPos != 0 { - dist = editDistance(prevPos+1, loc.Pos) - } - - // if enough slop remaining, continue recursively - if prevPos == 0 || (remainingSlop-dist) >= 0 { - // skip if we've already used this term+loc already - for _, ppart := range p { - if ppart.term == carTerm && ppart.loc == loc { - continue LOCATIONS_LOOP - } - } - - // this location works, add it to the path (but not for empty term) - px := append(p, phrasePart{term: carTerm, loc: loc}) - rv = findPhrasePaths(loc.Pos, loc.ArrayPositions, cdr, tlm, px, remainingSlop-dist, rv) - } - } - } - return rv -} - -func editDistance(p1, p2 uint64) int { - dist := int(p1 - p2) - if dist < 0 { - return -dist - } - return dist -} - -func (s *PhraseSearcher) Advance(ctx *search.SearchContext, ID index.IndexInternalID) (*search.DocumentMatch, error) { - if !s.initialized { - err := s.initSearchers(ctx) - if err != nil { - return nil, err - } - } - if s.currMust != nil { - if s.currMust.IndexInternalID.Compare(ID) >= 0 { - return s.Next(ctx) - } - ctx.DocumentMatchPool.Put(s.currMust) - } - if s.currMust == nil { - return nil, nil - } - var err error - s.currMust, err = s.mustSearcher.Advance(ctx, ID) - if err != nil { - return nil, err - } - return s.Next(ctx) -} - -func (s *PhraseSearcher) Count() uint64 { - // for now return a worst case - return s.mustSearcher.Count() -} - -func (s *PhraseSearcher) Close() error { - if s.mustSearcher != nil { - err := s.mustSearcher.Close() - if err != nil { - return err - } - } - return nil -} - -func (s *PhraseSearcher) Min() int { - return 0 -} - -func (s *PhraseSearcher) DocumentMatchPoolSize() int { - return s.mustSearcher.DocumentMatchPoolSize() + 1 -} diff --git a/vendor/github.com/blevesearch/bleve/search/searcher/search_regexp.go b/vendor/github.com/blevesearch/bleve/search/searcher/search_regexp.go deleted file mode 100644 index 11a44f1..0000000 --- a/vendor/github.com/blevesearch/bleve/search/searcher/search_regexp.go +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright (c) 2015 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package searcher - -import ( - "regexp" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/search" -) - -// NewRegexpStringSearcher is similar to NewRegexpSearcher, but -// additionally optimizes for index readers that handle regexp's. -func NewRegexpStringSearcher(indexReader index.IndexReader, pattern string, - field string, boost float64, options search.SearcherOptions) ( - search.Searcher, error) { - ir, ok := indexReader.(index.IndexReaderRegexp) - if !ok { - r, err := regexp.Compile(pattern) - if err != nil { - return nil, err - } - - return NewRegexpSearcher(indexReader, r, field, boost, options) - } - - fieldDict, err := ir.FieldDictRegexp(field, pattern) - if err != nil { - return nil, err - } - defer func() { - if cerr := fieldDict.Close(); cerr != nil && err == nil { - err = cerr - } - }() - - var candidateTerms []string - - tfd, err := fieldDict.Next() - for err == nil && tfd != nil { - candidateTerms = append(candidateTerms, tfd.Term) - tfd, err = fieldDict.Next() - } - if err != nil { - return nil, err - } - - return NewMultiTermSearcher(indexReader, candidateTerms, field, boost, - options, true) -} - -// NewRegexpSearcher creates a searcher which will match documents that -// contain terms which match the pattern regexp. The match must be EXACT -// matching the entire term. The provided regexp SHOULD NOT start with ^ -// or end with $ as this can intefere with the implementation. Separately, -// matches will be checked to ensure they match the entire term. -func NewRegexpSearcher(indexReader index.IndexReader, pattern index.Regexp, - field string, boost float64, options search.SearcherOptions) ( - search.Searcher, error) { - var candidateTerms []string - - prefixTerm, complete := pattern.LiteralPrefix() - if complete { - // there is no pattern - candidateTerms = []string{prefixTerm} - } else { - var err error - candidateTerms, err = findRegexpCandidateTerms(indexReader, pattern, field, - prefixTerm) - if err != nil { - return nil, err - } - } - - return NewMultiTermSearcher(indexReader, candidateTerms, field, boost, - options, true) -} - -func findRegexpCandidateTerms(indexReader index.IndexReader, - pattern index.Regexp, field, prefixTerm string) (rv []string, err error) { - rv = make([]string, 0) - var fieldDict index.FieldDict - if len(prefixTerm) > 0 { - fieldDict, err = indexReader.FieldDictPrefix(field, []byte(prefixTerm)) - } else { - fieldDict, err = indexReader.FieldDict(field) - } - defer func() { - if cerr := fieldDict.Close(); cerr != nil && err == nil { - err = cerr - } - }() - - // enumerate the terms and check against regexp - tfd, err := fieldDict.Next() - for err == nil && tfd != nil { - matchPos := pattern.FindStringIndex(tfd.Term) - if matchPos != nil && matchPos[0] == 0 && matchPos[1] == len(tfd.Term) { - rv = append(rv, tfd.Term) - if tooManyClauses(len(rv)) { - return rv, tooManyClausesErr(field, len(rv)) - } - } - tfd, err = fieldDict.Next() - } - - return rv, err -} diff --git a/vendor/github.com/blevesearch/bleve/search/searcher/search_term.go b/vendor/github.com/blevesearch/bleve/search/searcher/search_term.go deleted file mode 100644 index e07d253..0000000 --- a/vendor/github.com/blevesearch/bleve/search/searcher/search_term.go +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package searcher - -import ( - "reflect" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/scorer" - "github.com/blevesearch/bleve/size" -) - -var reflectStaticSizeTermSearcher int - -func init() { - var ts TermSearcher - reflectStaticSizeTermSearcher = int(reflect.TypeOf(ts).Size()) -} - -type TermSearcher struct { - indexReader index.IndexReader - reader index.TermFieldReader - scorer *scorer.TermQueryScorer - tfd index.TermFieldDoc -} - -func NewTermSearcher(indexReader index.IndexReader, term string, field string, boost float64, options search.SearcherOptions) (*TermSearcher, error) { - return NewTermSearcherBytes(indexReader, []byte(term), field, boost, options) -} - -func NewTermSearcherBytes(indexReader index.IndexReader, term []byte, field string, boost float64, options search.SearcherOptions) (*TermSearcher, error) { - needFreqNorm := options.Score != "none" - reader, err := indexReader.TermFieldReader(term, field, needFreqNorm, needFreqNorm, options.IncludeTermVectors) - if err != nil { - return nil, err - } - return newTermSearcherFromReader(indexReader, reader, term, field, boost, options) -} - -func newTermSearcherFromReader(indexReader index.IndexReader, reader index.TermFieldReader, - term []byte, field string, boost float64, options search.SearcherOptions) (*TermSearcher, error) { - count, err := indexReader.DocCount() - if err != nil { - _ = reader.Close() - return nil, err - } - scorer := scorer.NewTermQueryScorer(term, field, boost, count, reader.Count(), options) - return &TermSearcher{ - indexReader: indexReader, - reader: reader, - scorer: scorer, - }, nil -} - -func (s *TermSearcher) Size() int { - return reflectStaticSizeTermSearcher + size.SizeOfPtr + - s.reader.Size() + - s.tfd.Size() + - s.scorer.Size() -} - -func (s *TermSearcher) Count() uint64 { - return s.reader.Count() -} - -func (s *TermSearcher) Weight() float64 { - return s.scorer.Weight() -} - -func (s *TermSearcher) SetQueryNorm(qnorm float64) { - s.scorer.SetQueryNorm(qnorm) -} - -func (s *TermSearcher) Next(ctx *search.SearchContext) (*search.DocumentMatch, error) { - termMatch, err := s.reader.Next(s.tfd.Reset()) - if err != nil { - return nil, err - } - - if termMatch == nil { - return nil, nil - } - - // score match - docMatch := s.scorer.Score(ctx, termMatch) - // return doc match - return docMatch, nil - -} - -func (s *TermSearcher) Advance(ctx *search.SearchContext, ID index.IndexInternalID) (*search.DocumentMatch, error) { - termMatch, err := s.reader.Advance(ID, s.tfd.Reset()) - if err != nil { - return nil, err - } - - if termMatch == nil { - return nil, nil - } - - // score match - docMatch := s.scorer.Score(ctx, termMatch) - - // return doc match - return docMatch, nil -} - -func (s *TermSearcher) Close() error { - return s.reader.Close() -} - -func (s *TermSearcher) Min() int { - return 0 -} - -func (s *TermSearcher) DocumentMatchPoolSize() int { - return 1 -} - -func (s *TermSearcher) Optimize(kind string, octx index.OptimizableContext) ( - index.OptimizableContext, error) { - o, ok := s.reader.(index.Optimizable) - if ok { - return o.Optimize(kind, octx) - } - - return nil, nil -} diff --git a/vendor/github.com/blevesearch/bleve/search/searcher/search_term_prefix.go b/vendor/github.com/blevesearch/bleve/search/searcher/search_term_prefix.go deleted file mode 100644 index 2a8f22c..0000000 --- a/vendor/github.com/blevesearch/bleve/search/searcher/search_term_prefix.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package searcher - -import ( - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/search" -) - -func NewTermPrefixSearcher(indexReader index.IndexReader, prefix string, - field string, boost float64, options search.SearcherOptions) ( - search.Searcher, error) { - // find the terms with this prefix - fieldDict, err := indexReader.FieldDictPrefix(field, []byte(prefix)) - if err != nil { - return nil, err - } - defer func() { - if cerr := fieldDict.Close(); cerr != nil && err == nil { - err = cerr - } - }() - - var terms []string - tfd, err := fieldDict.Next() - for err == nil && tfd != nil { - terms = append(terms, tfd.Term) - if tooManyClauses(len(terms)) { - return nil, tooManyClausesErr(field, len(terms)) - } - tfd, err = fieldDict.Next() - } - if err != nil { - return nil, err - } - - return NewMultiTermSearcher(indexReader, terms, field, boost, options, true) -} diff --git a/vendor/github.com/blevesearch/bleve/search/searcher/search_term_range.go b/vendor/github.com/blevesearch/bleve/search/searcher/search_term_range.go deleted file mode 100644 index 90be1e1..0000000 --- a/vendor/github.com/blevesearch/bleve/search/searcher/search_term_range.go +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package searcher - -import ( - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/search" -) - -func NewTermRangeSearcher(indexReader index.IndexReader, - min, max []byte, inclusiveMin, inclusiveMax *bool, field string, - boost float64, options search.SearcherOptions) (search.Searcher, error) { - - if inclusiveMin == nil { - defaultInclusiveMin := true - inclusiveMin = &defaultInclusiveMin - } - if inclusiveMax == nil { - defaultInclusiveMax := false - inclusiveMax = &defaultInclusiveMax - } - - if min == nil { - min = []byte{} - } - - rangeMax := max - if rangeMax != nil { - // the term dictionary range end has an unfortunate implementation - rangeMax = append(rangeMax, 0) - } - - // find the terms with this prefix - fieldDict, err := indexReader.FieldDictRange(field, min, rangeMax) - if err != nil { - return nil, err - } - - defer func() { - if cerr := fieldDict.Close(); cerr != nil && err == nil { - err = cerr - } - }() - - var terms []string - tfd, err := fieldDict.Next() - for err == nil && tfd != nil { - terms = append(terms, tfd.Term) - tfd, err = fieldDict.Next() - } - if err != nil { - return nil, err - } - - if len(terms) < 1 { - return NewMatchNoneSearcher(indexReader) - } - - if !*inclusiveMin && min != nil && string(min) == terms[0] { - terms = terms[1:] - // check again, as we might have removed only entry - if len(terms) < 1 { - return NewMatchNoneSearcher(indexReader) - } - } - - // if our term list included the max, it would be the last item - if !*inclusiveMax && max != nil && string(max) == terms[len(terms)-1] { - terms = terms[:len(terms)-1] - } - - return NewMultiTermSearcher(indexReader, terms, field, boost, options, true) -} diff --git a/vendor/github.com/blevesearch/bleve/search/searchers/ordered_searchers_list.go b/vendor/github.com/blevesearch/bleve/search/searchers/ordered_searchers_list.go new file mode 100644 index 0000000..34e06a4 --- /dev/null +++ b/vendor/github.com/blevesearch/bleve/search/searchers/ordered_searchers_list.go @@ -0,0 +1,30 @@ +// Copyright (c) 2014 Couchbase, Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. + +package searchers + +import ( + "github.com/blevesearch/bleve/search" +) + +type OrderedSearcherList []search.Searcher + +// sort.Interface + +func (otrl OrderedSearcherList) Len() int { + return len(otrl) +} + +func (otrl OrderedSearcherList) Less(i, j int) bool { + return otrl[i].Count() < otrl[j].Count() +} + +func (otrl OrderedSearcherList) Swap(i, j int) { + otrl[i], otrl[j] = otrl[j], otrl[i] +} diff --git a/vendor/github.com/blevesearch/bleve/search/searcher/search_boolean.go b/vendor/github.com/blevesearch/bleve/search/searchers/search_boolean.go similarity index 71% rename from vendor/github.com/blevesearch/bleve/search/searcher/search_boolean.go rename to vendor/github.com/blevesearch/bleve/search/searchers/search_boolean.go index 7f0bfa4..8a94929 100644 --- a/vendor/github.com/blevesearch/bleve/search/searcher/search_boolean.go +++ b/vendor/github.com/blevesearch/bleve/search/searchers/search_boolean.go @@ -1,36 +1,22 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. -package searcher +package searchers import ( "math" - "reflect" "github.com/blevesearch/bleve/index" "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/scorer" - "github.com/blevesearch/bleve/size" + "github.com/blevesearch/bleve/search/scorers" ) -var reflectStaticSizeBooleanSearcher int - -func init() { - var bs BooleanSearcher - reflectStaticSizeBooleanSearcher = int(reflect.TypeOf(bs).Size()) -} - type BooleanSearcher struct { indexReader index.IndexReader mustSearcher search.Searcher @@ -42,52 +28,25 @@ type BooleanSearcher struct { currMustNot *search.DocumentMatch currentID index.IndexInternalID min uint64 - scorer *scorer.ConjunctionQueryScorer + scorer *scorers.ConjunctionQueryScorer matches []*search.DocumentMatch initialized bool - done bool } -func NewBooleanSearcher(indexReader index.IndexReader, mustSearcher search.Searcher, shouldSearcher search.Searcher, mustNotSearcher search.Searcher, options search.SearcherOptions) (*BooleanSearcher, error) { +func NewBooleanSearcher(indexReader index.IndexReader, mustSearcher search.Searcher, shouldSearcher search.Searcher, mustNotSearcher search.Searcher, explain bool) (*BooleanSearcher, error) { // build our searcher rv := BooleanSearcher{ indexReader: indexReader, mustSearcher: mustSearcher, shouldSearcher: shouldSearcher, mustNotSearcher: mustNotSearcher, - scorer: scorer.NewConjunctionQueryScorer(options), + scorer: scorers.NewConjunctionQueryScorer(explain), matches: make([]*search.DocumentMatch, 2), } rv.computeQueryNorm() return &rv, nil } -func (s *BooleanSearcher) Size() int { - sizeInBytes := reflectStaticSizeBooleanSearcher + size.SizeOfPtr - - if s.mustSearcher != nil { - sizeInBytes += s.mustSearcher.Size() - } - - if s.shouldSearcher != nil { - sizeInBytes += s.shouldSearcher.Size() - } - - if s.mustNotSearcher != nil { - sizeInBytes += s.mustNotSearcher.Size() - } - - sizeInBytes += s.scorer.Size() - - for _, entry := range s.matches { - if entry != nil { - sizeInBytes += entry.Size() - } - } - - return sizeInBytes -} - func (s *BooleanSearcher) computeQueryNorm() { // first calculate sum of squared weights sumOfSquaredWeights := 0.0 @@ -208,10 +167,6 @@ func (s *BooleanSearcher) SetQueryNorm(qnorm float64) { func (s *BooleanSearcher) Next(ctx *search.SearchContext) (*search.DocumentMatch, error) { - if s.done { - return nil, nil - } - if !s.initialized { err := s.initSearchers(ctx) if err != nil { @@ -324,20 +279,11 @@ func (s *BooleanSearcher) Next(ctx *search.SearchContext) (*search.DocumentMatch return nil, err } } - - if rv == nil { - s.done = true - } - return rv, nil } func (s *BooleanSearcher) Advance(ctx *search.SearchContext, ID index.IndexInternalID) (*search.DocumentMatch, error) { - if s.done { - return nil, nil - } - if !s.initialized { err := s.initSearchers(ctx) if err != nil { @@ -345,51 +291,41 @@ func (s *BooleanSearcher) Advance(ctx *search.SearchContext, ID index.IndexInter } } - // Advance the searcher only if the cursor is trailing the lookup ID - if s.currentID == nil || s.currentID.Compare(ID) < 0 { - var err error - if s.mustSearcher != nil { - if s.currMust != nil { - ctx.DocumentMatchPool.Put(s.currMust) - } - s.currMust, err = s.mustSearcher.Advance(ctx, ID) - if err != nil { - return nil, err - } + var err error + if s.mustSearcher != nil { + if s.currMust != nil { + ctx.DocumentMatchPool.Put(s.currMust) } + s.currMust, err = s.mustSearcher.Advance(ctx, ID) + if err != nil { + return nil, err + } + } + if s.shouldSearcher != nil { + if s.currShould != nil { + ctx.DocumentMatchPool.Put(s.currShould) + } + s.currShould, err = s.shouldSearcher.Advance(ctx, ID) + if err != nil { + return nil, err + } + } + if s.mustNotSearcher != nil { + if s.currMustNot != nil { + ctx.DocumentMatchPool.Put(s.currMustNot) + } + s.currMustNot, err = s.mustNotSearcher.Advance(ctx, ID) + if err != nil { + return nil, err + } + } - if s.shouldSearcher != nil { - if s.currShould != nil { - ctx.DocumentMatchPool.Put(s.currShould) - } - s.currShould, err = s.shouldSearcher.Advance(ctx, ID) - if err != nil { - return nil, err - } - } - - if s.mustNotSearcher != nil { - // Additional check for mustNotSearcher, whose cursor isn't tracked by - // currentID to prevent it from moving when the searcher's tracked - // position is already ahead of or at the requested ID. - if s.currMustNot == nil || s.currMustNot.IndexInternalID.Compare(ID) < 0 { - if s.currMustNot != nil { - ctx.DocumentMatchPool.Put(s.currMustNot) - } - s.currMustNot, err = s.mustNotSearcher.Advance(ctx, ID) - if err != nil { - return nil, err - } - } - } - - if s.mustSearcher != nil && s.currMust != nil { - s.currentID = s.currMust.IndexInternalID - } else if s.mustSearcher == nil && s.currShould != nil { - s.currentID = s.currShould.IndexInternalID - } else { - s.currentID = nil - } + if s.mustSearcher != nil && s.currMust != nil { + s.currentID = s.currMust.IndexInternalID + } else if s.mustSearcher == nil && s.currShould != nil { + s.currentID = s.currShould.IndexInternalID + } else { + s.currentID = nil } return s.Next(ctx) @@ -409,24 +345,23 @@ func (s *BooleanSearcher) Count() uint64 { } func (s *BooleanSearcher) Close() error { - var err0, err1, err2 error if s.mustSearcher != nil { - err0 = s.mustSearcher.Close() + err := s.mustSearcher.Close() + if err != nil { + return err + } } if s.shouldSearcher != nil { - err1 = s.shouldSearcher.Close() + err := s.shouldSearcher.Close() + if err != nil { + return err + } } if s.mustNotSearcher != nil { - err2 = s.mustNotSearcher.Close() - } - if err0 != nil { - return err0 - } - if err1 != nil { - return err1 - } - if err2 != nil { - return err2 + err := s.mustNotSearcher.Close() + if err != nil { + return err + } } return nil } diff --git a/vendor/github.com/blevesearch/bleve/search/searcher/search_conjunction.go b/vendor/github.com/blevesearch/bleve/search/searchers/search_conjunction.go similarity index 60% rename from vendor/github.com/blevesearch/bleve/search/searcher/search_conjunction.go rename to vendor/github.com/blevesearch/bleve/search/searchers/search_conjunction.go index ac737bc..c9fe0f8 100644 --- a/vendor/github.com/blevesearch/bleve/search/searcher/search_conjunction.go +++ b/vendor/github.com/blevesearch/bleve/search/searchers/search_conjunction.go @@ -1,130 +1,76 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. -package searcher +package searchers import ( "math" - "reflect" "sort" "github.com/blevesearch/bleve/index" "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/scorer" - "github.com/blevesearch/bleve/size" + "github.com/blevesearch/bleve/search/scorers" ) -var reflectStaticSizeConjunctionSearcher int - -func init() { - var cs ConjunctionSearcher - reflectStaticSizeConjunctionSearcher = int(reflect.TypeOf(cs).Size()) -} - type ConjunctionSearcher struct { indexReader index.IndexReader searchers OrderedSearcherList queryNorm float64 currs []*search.DocumentMatch maxIDIdx int - scorer *scorer.ConjunctionQueryScorer + scorer *scorers.ConjunctionQueryScorer initialized bool - options search.SearcherOptions + explain bool } -func NewConjunctionSearcher(indexReader index.IndexReader, - qsearchers []search.Searcher, options search.SearcherOptions) ( - search.Searcher, error) { - // build the sorted downstream searchers +func NewConjunctionSearcher(indexReader index.IndexReader, qsearchers []search.Searcher, explain bool) (*ConjunctionSearcher, error) { + // build the downstream searchers searchers := make(OrderedSearcherList, len(qsearchers)) for i, searcher := range qsearchers { searchers[i] = searcher } + // sort the searchers sort.Sort(searchers) - - // attempt the "unadorned" conjunction optimization only when we - // do not need extra information like freq-norm's or term vectors - if len(searchers) > 1 && - options.Score == "none" && !options.IncludeTermVectors { - rv, err := optimizeCompositeSearcher("conjunction:unadorned", - indexReader, searchers, options) - if err != nil || rv != nil { - return rv, err - } - } - // build our searcher rv := ConjunctionSearcher{ indexReader: indexReader, - options: options, + explain: explain, searchers: searchers, currs: make([]*search.DocumentMatch, len(searchers)), - scorer: scorer.NewConjunctionQueryScorer(options), + scorer: scorers.NewConjunctionQueryScorer(explain), } rv.computeQueryNorm() - - // attempt push-down conjunction optimization when there's >1 searchers - if len(searchers) > 1 { - rv, err := optimizeCompositeSearcher("conjunction", - indexReader, searchers, options) - if err != nil || rv != nil { - return rv, err - } - } - return &rv, nil } -func (s *ConjunctionSearcher) Size() int { - sizeInBytes := reflectStaticSizeConjunctionSearcher + size.SizeOfPtr + - s.scorer.Size() - - for _, entry := range s.searchers { - sizeInBytes += entry.Size() - } - - for _, entry := range s.currs { - if entry != nil { - sizeInBytes += entry.Size() - } - } - - return sizeInBytes -} - func (s *ConjunctionSearcher) computeQueryNorm() { // first calculate sum of squared weights sumOfSquaredWeights := 0.0 - for _, searcher := range s.searchers { - sumOfSquaredWeights += searcher.Weight() + for _, termSearcher := range s.searchers { + sumOfSquaredWeights += termSearcher.Weight() } // now compute query norm from this s.queryNorm = 1.0 / math.Sqrt(sumOfSquaredWeights) // finally tell all the downstream searchers the norm - for _, searcher := range s.searchers { - searcher.SetQueryNorm(s.queryNorm) + for _, termSearcher := range s.searchers { + termSearcher.SetQueryNorm(s.queryNorm) } } func (s *ConjunctionSearcher) initSearchers(ctx *search.SearchContext) error { var err error // get all searchers pointing at their first match - for i, searcher := range s.searchers { + for i, termSearcher := range s.searchers { if s.currs[i] != nil { ctx.DocumentMatchPool.Put(s.currs[i]) } - s.currs[i], err = searcher.Next(ctx) + s.currs[i], err = termSearcher.Next(ctx) if err != nil { return err } @@ -157,7 +103,7 @@ func (s *ConjunctionSearcher) Next(ctx *search.SearchContext) (*search.DocumentM var rv *search.DocumentMatch var err error OUTER: - for s.maxIDIdx < len(s.currs) && s.currs[s.maxIDIdx] != nil { + for s.currs[s.maxIDIdx] != nil { maxID := s.currs[s.maxIDIdx].IndexInternalID i := 0 @@ -209,11 +155,11 @@ OUTER: // we know all the searchers are pointing at the same thing // so they all need to be bumped - for i, searcher := range s.searchers { + for i, termSearcher := range s.searchers { if s.currs[i] != rv { ctx.DocumentMatchPool.Put(s.currs[i]) } - s.currs[i], err = searcher.Next(ctx) + s.currs[i], err = termSearcher.Next(ctx) if err != nil { return nil, err } @@ -233,9 +179,6 @@ func (s *ConjunctionSearcher) Advance(ctx *search.SearchContext, ID index.IndexI } } for i := range s.searchers { - if s.currs[i] != nil && s.currs[i].IndexInternalID.Compare(ID) >= 0 { - continue - } err := s.advanceChild(ctx, i, ID) if err != nil { return nil, err @@ -261,14 +204,14 @@ func (s *ConjunctionSearcher) Count() uint64 { return sum } -func (s *ConjunctionSearcher) Close() (rv error) { +func (s *ConjunctionSearcher) Close() error { for _, searcher := range s.searchers { err := searcher.Close() - if err != nil && rv == nil { - rv = err + if err != nil { + return err } } - return rv + return nil } func (s *ConjunctionSearcher) Min() int { diff --git a/vendor/github.com/blevesearch/bleve/search/searchers/search_disjunction.go b/vendor/github.com/blevesearch/bleve/search/searchers/search_disjunction.go new file mode 100644 index 0000000..daa9f33 --- /dev/null +++ b/vendor/github.com/blevesearch/bleve/search/searchers/search_disjunction.go @@ -0,0 +1,238 @@ +// Copyright (c) 2014 Couchbase, Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. + +package searchers + +import ( + "fmt" + "math" + "sort" + + "github.com/blevesearch/bleve/index" + "github.com/blevesearch/bleve/search" + "github.com/blevesearch/bleve/search/scorers" +) + +// DisjunctionMaxClauseCount is a compile time setting that applications can +// adjust to non-zero value to cause the DisjunctionSearcher to return an +// error instead of exeucting searches when the size exceeds this value. +var DisjunctionMaxClauseCount = 0 + +type DisjunctionSearcher struct { + indexReader index.IndexReader + searchers OrderedSearcherList + queryNorm float64 + currs []*search.DocumentMatch + scorer *scorers.DisjunctionQueryScorer + min int + matching []*search.DocumentMatch + matchingIdxs []int + initialized bool +} + +func tooManyClauses(count int) bool { + if DisjunctionMaxClauseCount != 0 && count > DisjunctionMaxClauseCount { + return true + } + return false +} + +func tooManyClausesErr() error { + return fmt.Errorf("TooManyClauses[maxClauseCount is set to %d]", DisjunctionMaxClauseCount) +} + +func NewDisjunctionSearcher(indexReader index.IndexReader, qsearchers []search.Searcher, min float64, explain bool) (*DisjunctionSearcher, error) { + if tooManyClauses(len(qsearchers)) { + return nil, tooManyClausesErr() + } + // build the downstream searchers + searchers := make(OrderedSearcherList, len(qsearchers)) + for i, searcher := range qsearchers { + searchers[i] = searcher + } + // sort the searchers + sort.Sort(sort.Reverse(searchers)) + // build our searcher + rv := DisjunctionSearcher{ + indexReader: indexReader, + searchers: searchers, + currs: make([]*search.DocumentMatch, len(searchers)), + scorer: scorers.NewDisjunctionQueryScorer(explain), + min: int(min), + matching: make([]*search.DocumentMatch, len(searchers)), + matchingIdxs: make([]int, len(searchers)), + } + rv.computeQueryNorm() + return &rv, nil +} + +func (s *DisjunctionSearcher) computeQueryNorm() { + // first calculate sum of squared weights + sumOfSquaredWeights := 0.0 + for _, termSearcher := range s.searchers { + sumOfSquaredWeights += termSearcher.Weight() + } + // now compute query norm from this + s.queryNorm = 1.0 / math.Sqrt(sumOfSquaredWeights) + // finally tell all the downstream searchers the norm + for _, termSearcher := range s.searchers { + termSearcher.SetQueryNorm(s.queryNorm) + } +} + +func (s *DisjunctionSearcher) initSearchers(ctx *search.SearchContext) error { + var err error + // get all searchers pointing at their first match + for i, termSearcher := range s.searchers { + if s.currs[i] != nil { + ctx.DocumentMatchPool.Put(s.currs[i]) + } + s.currs[i], err = termSearcher.Next(ctx) + if err != nil { + return err + } + } + + s.updateMatches() + s.initialized = true + return nil +} + +func (s *DisjunctionSearcher) updateMatches() { + matching := s.matching[:0] + matchingIdxs := s.matchingIdxs[:0] + + for i, curr := range s.currs { + if curr == nil { + continue + } + + if len(matching) > 0 { + cmp := curr.IndexInternalID.Compare(matching[0].IndexInternalID) + if cmp > 0 { + continue + } + + if cmp < 0 { + matching = matching[:0] + matchingIdxs = matchingIdxs[:0] + } + } + + matching = append(matching, curr) + matchingIdxs = append(matchingIdxs, i) + } + + s.matching = matching + s.matchingIdxs = matchingIdxs +} + +func (s *DisjunctionSearcher) Weight() float64 { + var rv float64 + for _, searcher := range s.searchers { + rv += searcher.Weight() + } + return rv +} + +func (s *DisjunctionSearcher) SetQueryNorm(qnorm float64) { + for _, searcher := range s.searchers { + searcher.SetQueryNorm(qnorm) + } +} + +func (s *DisjunctionSearcher) Next(ctx *search.SearchContext) (*search.DocumentMatch, error) { + if !s.initialized { + err := s.initSearchers(ctx) + if err != nil { + return nil, err + } + } + var err error + var rv *search.DocumentMatch + + found := false + for !found && len(s.matching) > 0 { + if len(s.matching) >= s.min { + found = true + // score this match + rv = s.scorer.Score(ctx, s.matching, len(s.matching), len(s.searchers)) + } + + // invoke next on all the matching searchers + for _, i := range s.matchingIdxs { + searcher := s.searchers[i] + if s.currs[i] != rv { + ctx.DocumentMatchPool.Put(s.currs[i]) + } + s.currs[i], err = searcher.Next(ctx) + if err != nil { + return nil, err + } + } + + s.updateMatches() + } + return rv, nil +} + +func (s *DisjunctionSearcher) Advance(ctx *search.SearchContext, ID index.IndexInternalID) (*search.DocumentMatch, error) { + if !s.initialized { + err := s.initSearchers(ctx) + if err != nil { + return nil, err + } + } + // get all searchers pointing at their first match + var err error + for i, termSearcher := range s.searchers { + if s.currs[i] != nil { + ctx.DocumentMatchPool.Put(s.currs[i]) + } + s.currs[i], err = termSearcher.Advance(ctx, ID) + if err != nil { + return nil, err + } + } + + s.updateMatches() + + return s.Next(ctx) +} + +func (s *DisjunctionSearcher) Count() uint64 { + // for now return a worst case + var sum uint64 + for _, searcher := range s.searchers { + sum += searcher.Count() + } + return sum +} + +func (s *DisjunctionSearcher) Close() error { + for _, searcher := range s.searchers { + err := searcher.Close() + if err != nil { + return err + } + } + return nil +} + +func (s *DisjunctionSearcher) Min() int { + return s.min +} + +func (s *DisjunctionSearcher) DocumentMatchPoolSize() int { + rv := len(s.currs) + for _, s := range s.searchers { + rv += s.DocumentMatchPoolSize() + } + return rv +} diff --git a/vendor/github.com/blevesearch/bleve/search/searcher/search_docid.go b/vendor/github.com/blevesearch/bleve/search/searchers/search_docid.go similarity index 57% rename from vendor/github.com/blevesearch/bleve/search/searcher/search_docid.go rename to vendor/github.com/blevesearch/bleve/search/searchers/search_docid.go index 3b258a5..33b9b4c 100644 --- a/vendor/github.com/blevesearch/bleve/search/searcher/search_docid.go +++ b/vendor/github.com/blevesearch/bleve/search/searchers/search_docid.go @@ -1,50 +1,35 @@ // Copyright (c) 2015 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. -package searcher +package searchers import ( - "reflect" - "github.com/blevesearch/bleve/index" "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/scorer" - "github.com/blevesearch/bleve/size" + "github.com/blevesearch/bleve/search/scorers" ) -var reflectStaticSizeDocIDSearcher int - -func init() { - var ds DocIDSearcher - reflectStaticSizeDocIDSearcher = int(reflect.TypeOf(ds).Size()) -} - // DocIDSearcher returns documents matching a predefined set of identifiers. type DocIDSearcher struct { reader index.DocIDReader - scorer *scorer.ConstantScorer + scorer *scorers.ConstantScorer count int } func NewDocIDSearcher(indexReader index.IndexReader, ids []string, boost float64, - options search.SearcherOptions) (searcher *DocIDSearcher, err error) { + explain bool) (searcher *DocIDSearcher, err error) { reader, err := indexReader.DocIDReaderOnly(ids) if err != nil { return nil, err } - scorer := scorer.NewConstantScorer(1.0, boost, options) + scorer := scorers.NewConstantScorer(1.0, boost, explain) return &DocIDSearcher{ scorer: scorer, reader: reader, @@ -52,12 +37,6 @@ func NewDocIDSearcher(indexReader index.IndexReader, ids []string, boost float64 }, nil } -func (s *DocIDSearcher) Size() int { - return reflectStaticSizeDocIDSearcher + size.SizeOfPtr + - s.reader.Size() + - s.scorer.Size() -} - func (s *DocIDSearcher) Count() uint64 { return uint64(s.count) } @@ -97,7 +76,7 @@ func (s *DocIDSearcher) Advance(ctx *search.SearchContext, ID index.IndexInterna } func (s *DocIDSearcher) Close() error { - return s.reader.Close() + return nil } func (s *DocIDSearcher) Min() int { diff --git a/vendor/github.com/blevesearch/bleve/search/searchers/search_fuzzy.go b/vendor/github.com/blevesearch/bleve/search/searchers/search_fuzzy.go new file mode 100644 index 0000000..2cd44eb --- /dev/null +++ b/vendor/github.com/blevesearch/bleve/search/searchers/search_fuzzy.go @@ -0,0 +1,129 @@ +// Copyright (c) 2014 Couchbase, Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. + +package searchers + +import ( + "github.com/blevesearch/bleve/index" + "github.com/blevesearch/bleve/search" +) + +type FuzzySearcher struct { + indexReader index.IndexReader + term string + prefix int + fuzziness int + field string + explain bool + searcher *DisjunctionSearcher +} + +func NewFuzzySearcher(indexReader index.IndexReader, term string, prefix, fuzziness int, field string, boost float64, explain bool) (*FuzzySearcher, error) { + prefixTerm := "" + for i, r := range term { + if i < prefix { + prefixTerm += string(r) + } + } + + candidateTerms, err := findFuzzyCandidateTerms(indexReader, &term, fuzziness, field, prefixTerm) + if err != nil { + return nil, err + } + + // enumerate all the terms in the range + qsearchers := make([]search.Searcher, 0, len(candidateTerms)) + + for _, cterm := range candidateTerms { + qsearcher, err := NewTermSearcher(indexReader, cterm, field, boost, explain) + if err != nil { + return nil, err + } + qsearchers = append(qsearchers, qsearcher) + } + + // build disjunction searcher of these ranges + searcher, err := NewDisjunctionSearcher(indexReader, qsearchers, 0, explain) + if err != nil { + return nil, err + } + + return &FuzzySearcher{ + indexReader: indexReader, + term: term, + prefix: prefix, + fuzziness: fuzziness, + field: field, + explain: explain, + searcher: searcher, + }, nil +} + +func findFuzzyCandidateTerms(indexReader index.IndexReader, term *string, fuzziness int, field, prefixTerm string) (rv []string, err error) { + rv = make([]string, 0) + var fieldDict index.FieldDict + if len(prefixTerm) > 0 { + fieldDict, err = indexReader.FieldDictPrefix(field, []byte(prefixTerm)) + } else { + fieldDict, err = indexReader.FieldDict(field) + } + defer func() { + if cerr := fieldDict.Close(); cerr != nil && err == nil { + err = cerr + } + }() + + // enumerate terms and check levenshtein distance + tfd, err := fieldDict.Next() + for err == nil && tfd != nil { + ld, exceeded := search.LevenshteinDistanceMax(term, &tfd.Term, fuzziness) + if !exceeded && ld <= fuzziness { + rv = append(rv, tfd.Term) + if tooManyClauses(len(rv)) { + return rv, tooManyClausesErr() + } + } + tfd, err = fieldDict.Next() + } + + return rv, err +} + +func (s *FuzzySearcher) Count() uint64 { + return s.searcher.Count() +} + +func (s *FuzzySearcher) Weight() float64 { + return s.searcher.Weight() +} + +func (s *FuzzySearcher) SetQueryNorm(qnorm float64) { + s.searcher.SetQueryNorm(qnorm) +} + +func (s *FuzzySearcher) Next(ctx *search.SearchContext) (*search.DocumentMatch, error) { + return s.searcher.Next(ctx) + +} + +func (s *FuzzySearcher) Advance(ctx *search.SearchContext, ID index.IndexInternalID) (*search.DocumentMatch, error) { + return s.searcher.Advance(ctx, ID) +} + +func (s *FuzzySearcher) Close() error { + return s.searcher.Close() +} + +func (s *FuzzySearcher) Min() int { + return 0 +} + +func (s *FuzzySearcher) DocumentMatchPoolSize() int { + return s.searcher.DocumentMatchPoolSize() +} diff --git a/vendor/github.com/blevesearch/bleve/search/searcher/search_match_all.go b/vendor/github.com/blevesearch/bleve/search/searchers/search_match_all.go similarity index 59% rename from vendor/github.com/blevesearch/bleve/search/searcher/search_match_all.go rename to vendor/github.com/blevesearch/bleve/search/searchers/search_match_all.go index bb66401..5659f88 100644 --- a/vendor/github.com/blevesearch/bleve/search/searcher/search_match_all.go +++ b/vendor/github.com/blevesearch/bleve/search/searchers/search_match_all.go @@ -1,53 +1,37 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. -package searcher +package searchers import ( - "reflect" - "github.com/blevesearch/bleve/index" "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/search/scorer" - "github.com/blevesearch/bleve/size" + "github.com/blevesearch/bleve/search/scorers" ) -var reflectStaticSizeMatchAllSearcher int - -func init() { - var mas MatchAllSearcher - reflectStaticSizeMatchAllSearcher = int(reflect.TypeOf(mas).Size()) -} - type MatchAllSearcher struct { indexReader index.IndexReader reader index.DocIDReader - scorer *scorer.ConstantScorer + scorer *scorers.ConstantScorer count uint64 } -func NewMatchAllSearcher(indexReader index.IndexReader, boost float64, options search.SearcherOptions) (*MatchAllSearcher, error) { +func NewMatchAllSearcher(indexReader index.IndexReader, boost float64, explain bool) (*MatchAllSearcher, error) { reader, err := indexReader.DocIDReaderAll() if err != nil { return nil, err } count, err := indexReader.DocCount() if err != nil { - _ = reader.Close() return nil, err } - scorer := scorer.NewConstantScorer(1.0, boost, options) + scorer := scorers.NewConstantScorer(1.0, boost, explain) return &MatchAllSearcher{ indexReader: indexReader, reader: reader, @@ -56,12 +40,6 @@ func NewMatchAllSearcher(indexReader index.IndexReader, boost float64, options s }, nil } -func (s *MatchAllSearcher) Size() int { - return reflectStaticSizeMatchAllSearcher + size.SizeOfPtr + - s.reader.Size() + - s.scorer.Size() -} - func (s *MatchAllSearcher) Count() uint64 { return s.count } diff --git a/vendor/github.com/blevesearch/bleve/search/searcher/search_match_none.go b/vendor/github.com/blevesearch/bleve/search/searchers/search_match_none.go similarity index 52% rename from vendor/github.com/blevesearch/bleve/search/searcher/search_match_none.go rename to vendor/github.com/blevesearch/bleve/search/searchers/search_match_none.go index a345e17..c3159dc 100644 --- a/vendor/github.com/blevesearch/bleve/search/searcher/search_match_none.go +++ b/vendor/github.com/blevesearch/bleve/search/searchers/search_match_none.go @@ -1,34 +1,19 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. -package searcher +package searchers import ( - "reflect" - "github.com/blevesearch/bleve/index" "github.com/blevesearch/bleve/search" - "github.com/blevesearch/bleve/size" ) -var reflectStaticSizeMatchNoneSearcher int - -func init() { - var mns MatchNoneSearcher - reflectStaticSizeMatchNoneSearcher = int(reflect.TypeOf(mns).Size()) -} - type MatchNoneSearcher struct { indexReader index.IndexReader } @@ -39,10 +24,6 @@ func NewMatchNoneSearcher(indexReader index.IndexReader) (*MatchNoneSearcher, er }, nil } -func (s *MatchNoneSearcher) Size() int { - return reflectStaticSizeMatchNoneSearcher + size.SizeOfPtr -} - func (s *MatchNoneSearcher) Count() uint64 { return uint64(0) } diff --git a/vendor/github.com/blevesearch/bleve/search/searchers/search_numeric_range.go b/vendor/github.com/blevesearch/bleve/search/searchers/search_numeric_range.go new file mode 100644 index 0000000..03cd495 --- /dev/null +++ b/vendor/github.com/blevesearch/bleve/search/searchers/search_numeric_range.go @@ -0,0 +1,221 @@ +// Copyright (c) 2014 Couchbase, Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. + +package searchers + +import ( + "bytes" + "math" + + "github.com/blevesearch/bleve/index" + "github.com/blevesearch/bleve/numeric_util" + "github.com/blevesearch/bleve/search" +) + +type NumericRangeSearcher struct { + indexReader index.IndexReader + min *float64 + max *float64 + field string + explain bool + searcher *DisjunctionSearcher +} + +func NewNumericRangeSearcher(indexReader index.IndexReader, min *float64, max *float64, inclusiveMin, inclusiveMax *bool, field string, boost float64, explain bool) (*NumericRangeSearcher, error) { + // account for unbounded edges + if min == nil { + negInf := math.Inf(-1) + min = &negInf + } + if max == nil { + Inf := math.Inf(1) + max = &Inf + } + if inclusiveMin == nil { + defaultInclusiveMin := true + inclusiveMin = &defaultInclusiveMin + } + if inclusiveMax == nil { + defaultInclusiveMax := false + inclusiveMax = &defaultInclusiveMax + } + // find all the ranges + minInt64 := numeric_util.Float64ToInt64(*min) + if !*inclusiveMin && minInt64 != math.MaxInt64 { + minInt64++ + } + maxInt64 := numeric_util.Float64ToInt64(*max) + if !*inclusiveMax && maxInt64 != math.MinInt64 { + maxInt64-- + } + // FIXME hard-coded precision, should match field declaration + termRanges := splitInt64Range(minInt64, maxInt64, 4) + terms := termRanges.Enumerate() + if tooManyClauses(len(terms)) { + return nil, tooManyClausesErr() + } + // enumerate all the terms in the range + qsearchers := make([]search.Searcher, len(terms)) + for i, term := range terms { + var err error + qsearchers[i], err = NewTermSearcher(indexReader, string(term), field, boost, explain) + if err != nil { + return nil, err + } + } + // build disjunction searcher of these ranges + searcher, err := NewDisjunctionSearcher(indexReader, qsearchers, 0, explain) + if err != nil { + return nil, err + } + return &NumericRangeSearcher{ + indexReader: indexReader, + min: min, + max: max, + field: field, + explain: explain, + searcher: searcher, + }, nil +} + +func (s *NumericRangeSearcher) Count() uint64 { + return s.searcher.Count() +} + +func (s *NumericRangeSearcher) Weight() float64 { + return s.searcher.Weight() +} + +func (s *NumericRangeSearcher) SetQueryNorm(qnorm float64) { + s.searcher.SetQueryNorm(qnorm) +} + +func (s *NumericRangeSearcher) Next(ctx *search.SearchContext) (*search.DocumentMatch, error) { + return s.searcher.Next(ctx) +} + +func (s *NumericRangeSearcher) Advance(ctx *search.SearchContext, ID index.IndexInternalID) (*search.DocumentMatch, error) { + return s.searcher.Advance(ctx, ID) +} + +func (s *NumericRangeSearcher) Close() error { + return s.searcher.Close() +} + +type termRange struct { + startTerm []byte + endTerm []byte +} + +func (t *termRange) Enumerate() [][]byte { + rv := make([][]byte, 0) + next := t.startTerm + for bytes.Compare(next, t.endTerm) <= 0 { + rv = append(rv, next) + next = incrementBytes(next) + } + return rv +} + +func incrementBytes(in []byte) []byte { + rv := make([]byte, len(in)) + copy(rv, in) + for i := len(rv) - 1; i >= 0; i-- { + rv[i] = rv[i] + 1 + if rv[i] != 0 { + // didn't overflow, so stop + break + } + } + return rv +} + +type termRanges []*termRange + +func (tr termRanges) Enumerate() [][]byte { + rv := make([][]byte, 0) + for _, tri := range tr { + trie := tri.Enumerate() + rv = append(rv, trie...) + } + return rv +} + +func splitInt64Range(minBound, maxBound int64, precisionStep uint) termRanges { + rv := make(termRanges, 0) + if minBound > maxBound { + return rv + } + + for shift := uint(0); ; shift += precisionStep { + + diff := int64(1) << (shift + precisionStep) + mask := ((int64(1) << precisionStep) - int64(1)) << shift + hasLower := (minBound & mask) != int64(0) + hasUpper := (maxBound & mask) != mask + + var nextMinBound int64 + if hasLower { + nextMinBound = (minBound + diff) &^ mask + } else { + nextMinBound = minBound &^ mask + } + var nextMaxBound int64 + if hasUpper { + nextMaxBound = (maxBound - diff) &^ mask + } else { + nextMaxBound = maxBound &^ mask + } + + lowerWrapped := nextMinBound < minBound + upperWrapped := nextMaxBound > maxBound + + if shift+precisionStep >= 64 || nextMinBound > nextMaxBound || lowerWrapped || upperWrapped { + // We are in the lowest precision or the next precision is not available. + rv = append(rv, newRange(minBound, maxBound, shift)) + // exit the split recursion loop + break + } + + if hasLower { + rv = append(rv, newRange(minBound, minBound|mask, shift)) + } + if hasUpper { + rv = append(rv, newRange(maxBound&^mask, maxBound, shift)) + } + + // recurse to next precision + minBound = nextMinBound + maxBound = nextMaxBound + } + + return rv +} + +func newRange(minBound, maxBound int64, shift uint) *termRange { + maxBound |= (int64(1) << shift) - int64(1) + minBytes := numeric_util.MustNewPrefixCodedInt64(minBound, shift) + maxBytes := numeric_util.MustNewPrefixCodedInt64(maxBound, shift) + return newRangeBytes(minBytes, maxBytes) +} + +func newRangeBytes(minBytes, maxBytes []byte) *termRange { + return &termRange{ + startTerm: minBytes, + endTerm: maxBytes, + } +} + +func (s *NumericRangeSearcher) Min() int { + return 0 +} + +func (s *NumericRangeSearcher) DocumentMatchPoolSize() int { + return s.searcher.DocumentMatchPoolSize() +} diff --git a/vendor/github.com/blevesearch/bleve/search/searchers/search_phrase.go b/vendor/github.com/blevesearch/bleve/search/searchers/search_phrase.go new file mode 100644 index 0000000..6456420 --- /dev/null +++ b/vendor/github.com/blevesearch/bleve/search/searchers/search_phrase.go @@ -0,0 +1,201 @@ +// Copyright (c) 2014 Couchbase, Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. + +package searchers + +import ( + "math" + + "github.com/blevesearch/bleve/index" + "github.com/blevesearch/bleve/search" +) + +type PhraseSearcher struct { + initialized bool + indexReader index.IndexReader + mustSearcher *ConjunctionSearcher + queryNorm float64 + currMust *search.DocumentMatch + slop int + terms []string +} + +func NewPhraseSearcher(indexReader index.IndexReader, mustSearcher *ConjunctionSearcher, terms []string) (*PhraseSearcher, error) { + // build our searcher + rv := PhraseSearcher{ + indexReader: indexReader, + mustSearcher: mustSearcher, + terms: terms, + } + rv.computeQueryNorm() + return &rv, nil +} + +func (s *PhraseSearcher) computeQueryNorm() { + // first calculate sum of squared weights + sumOfSquaredWeights := 0.0 + if s.mustSearcher != nil { + sumOfSquaredWeights += s.mustSearcher.Weight() + } + + // now compute query norm from this + s.queryNorm = 1.0 / math.Sqrt(sumOfSquaredWeights) + // finally tell all the downstream searchers the norm + if s.mustSearcher != nil { + s.mustSearcher.SetQueryNorm(s.queryNorm) + } +} + +func (s *PhraseSearcher) initSearchers(ctx *search.SearchContext) error { + var err error + // get all searchers pointing at their first match + if s.mustSearcher != nil { + s.currMust, err = s.mustSearcher.Next(ctx) + if err != nil { + return err + } + } + + s.initialized = true + return nil +} + +func (s *PhraseSearcher) advanceNextMust(ctx *search.SearchContext) error { + var err error + + if s.mustSearcher != nil { + s.currMust, err = s.mustSearcher.Next(ctx) + if err != nil { + return err + } + } + + return nil +} + +func (s *PhraseSearcher) Weight() float64 { + var rv float64 + rv += s.mustSearcher.Weight() + + return rv +} + +func (s *PhraseSearcher) SetQueryNorm(qnorm float64) { + s.mustSearcher.SetQueryNorm(qnorm) +} + +func (s *PhraseSearcher) Next(ctx *search.SearchContext) (*search.DocumentMatch, error) { + if !s.initialized { + err := s.initSearchers(ctx) + if err != nil { + return nil, err + } + } + + var rv *search.DocumentMatch + for s.currMust != nil { + rvftlm := make(search.FieldTermLocationMap, 0) + freq := 0 + firstTerm := s.terms[0] + for field, termLocMap := range s.currMust.Locations { + rvtlm := make(search.TermLocationMap, 0) + locations, ok := termLocMap[firstTerm] + if ok { + OUTER: + for _, location := range locations { + crvtlm := make(search.TermLocationMap, 0) + INNER: + for i := 0; i < len(s.terms); i++ { + nextTerm := s.terms[i] + if nextTerm != "" { + // look through all these term locations + // to try and find the correct offsets + nextLocations, ok := termLocMap[nextTerm] + if ok { + for _, nextLocation := range nextLocations { + if nextLocation.Pos == location.Pos+float64(i) && nextLocation.SameArrayElement(location) { + // found a location match for this term + crvtlm.AddLocation(nextTerm, nextLocation) + continue INNER + } + } + // if we got here we didn't find a location match for this term + continue OUTER + } else { + continue OUTER + } + } + } + // if we got here all the terms matched + freq++ + search.MergeTermLocationMaps(rvtlm, crvtlm) + rvftlm[field] = rvtlm + } + } + } + + if freq > 0 { + // return match + rv = s.currMust + rv.Locations = rvftlm + err := s.advanceNextMust(ctx) + if err != nil { + return nil, err + } + return rv, nil + } + + err := s.advanceNextMust(ctx) + if err != nil { + return nil, err + } + } + + return nil, nil +} + +func (s *PhraseSearcher) Advance(ctx *search.SearchContext, ID index.IndexInternalID) (*search.DocumentMatch, error) { + if !s.initialized { + err := s.initSearchers(ctx) + if err != nil { + return nil, err + } + } + var err error + s.currMust, err = s.mustSearcher.Advance(ctx, ID) + if err != nil { + return nil, err + } + return s.Next(ctx) +} + +func (s *PhraseSearcher) Count() uint64 { + // for now return a worst case + var sum uint64 + sum += s.mustSearcher.Count() + return sum +} + +func (s *PhraseSearcher) Close() error { + if s.mustSearcher != nil { + err := s.mustSearcher.Close() + if err != nil { + return err + } + } + return nil +} + +func (s *PhraseSearcher) Min() int { + return 0 +} + +func (s *PhraseSearcher) DocumentMatchPoolSize() int { + return s.mustSearcher.DocumentMatchPoolSize() + 1 +} diff --git a/vendor/github.com/blevesearch/bleve/search/searchers/search_regexp.go b/vendor/github.com/blevesearch/bleve/search/searchers/search_regexp.go new file mode 100644 index 0000000..3ce61d8 --- /dev/null +++ b/vendor/github.com/blevesearch/bleve/search/searchers/search_regexp.go @@ -0,0 +1,128 @@ +// Copyright (c) 2015 Couchbase, Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. + +package searchers + +import ( + "regexp" + + "github.com/blevesearch/bleve/index" + "github.com/blevesearch/bleve/search" +) + +type RegexpSearcher struct { + indexReader index.IndexReader + pattern *regexp.Regexp + field string + explain bool + searcher *DisjunctionSearcher +} + +func NewRegexpSearcher(indexReader index.IndexReader, pattern *regexp.Regexp, field string, boost float64, explain bool) (*RegexpSearcher, error) { + + prefixTerm, complete := pattern.LiteralPrefix() + var candidateTerms []string + if complete { + // there is no pattern + candidateTerms = []string{prefixTerm} + } else { + var err error + candidateTerms, err = findRegexpCandidateTerms(indexReader, pattern, field, prefixTerm) + if err != nil { + return nil, err + } + } + + // enumerate all the terms in the range + qsearchers := make([]search.Searcher, 0, len(candidateTerms)) + + for _, cterm := range candidateTerms { + qsearcher, err := NewTermSearcher(indexReader, cterm, field, boost, explain) + if err != nil { + return nil, err + } + qsearchers = append(qsearchers, qsearcher) + } + + // build disjunction searcher of these ranges + searcher, err := NewDisjunctionSearcher(indexReader, qsearchers, 0, explain) + if err != nil { + return nil, err + } + + return &RegexpSearcher{ + indexReader: indexReader, + pattern: pattern, + field: field, + explain: explain, + searcher: searcher, + }, nil +} + +func findRegexpCandidateTerms(indexReader index.IndexReader, pattern *regexp.Regexp, field, prefixTerm string) (rv []string, err error) { + rv = make([]string, 0) + var fieldDict index.FieldDict + if len(prefixTerm) > 0 { + fieldDict, err = indexReader.FieldDictPrefix(field, []byte(prefixTerm)) + } else { + fieldDict, err = indexReader.FieldDict(field) + } + defer func() { + if cerr := fieldDict.Close(); cerr != nil && err == nil { + err = cerr + } + }() + + // enumerate the terms and check against regexp + tfd, err := fieldDict.Next() + for err == nil && tfd != nil { + if pattern.MatchString(tfd.Term) { + rv = append(rv, tfd.Term) + if tooManyClauses(len(rv)) { + return rv, tooManyClausesErr() + } + } + tfd, err = fieldDict.Next() + } + + return rv, err +} + +func (s *RegexpSearcher) Count() uint64 { + return s.searcher.Count() +} + +func (s *RegexpSearcher) Weight() float64 { + return s.searcher.Weight() +} + +func (s *RegexpSearcher) SetQueryNorm(qnorm float64) { + s.searcher.SetQueryNorm(qnorm) +} + +func (s *RegexpSearcher) Next(ctx *search.SearchContext) (*search.DocumentMatch, error) { + return s.searcher.Next(ctx) + +} + +func (s *RegexpSearcher) Advance(ctx *search.SearchContext, ID index.IndexInternalID) (*search.DocumentMatch, error) { + return s.searcher.Advance(ctx, ID) +} + +func (s *RegexpSearcher) Close() error { + return s.searcher.Close() +} + +func (s *RegexpSearcher) Min() int { + return 0 +} + +func (s *RegexpSearcher) DocumentMatchPoolSize() int { + return s.searcher.DocumentMatchPoolSize() +} diff --git a/vendor/github.com/blevesearch/bleve/search/searchers/search_term.go b/vendor/github.com/blevesearch/bleve/search/searchers/search_term.go new file mode 100644 index 0000000..fcdf6cc --- /dev/null +++ b/vendor/github.com/blevesearch/bleve/search/searchers/search_term.go @@ -0,0 +1,104 @@ +// Copyright (c) 2014 Couchbase, Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. + +package searchers + +import ( + "github.com/blevesearch/bleve/index" + "github.com/blevesearch/bleve/search" + "github.com/blevesearch/bleve/search/scorers" +) + +type TermSearcher struct { + indexReader index.IndexReader + term string + field string + reader index.TermFieldReader + scorer *scorers.TermQueryScorer + tfd index.TermFieldDoc + explain bool +} + +func NewTermSearcher(indexReader index.IndexReader, term string, field string, boost float64, explain bool) (*TermSearcher, error) { + reader, err := indexReader.TermFieldReader([]byte(term), field, true, true, true) + if err != nil { + return nil, err + } + count, err := indexReader.DocCount() + if err != nil { + return nil, err + } + scorer := scorers.NewTermQueryScorer(term, field, boost, count, reader.Count(), explain) + return &TermSearcher{ + indexReader: indexReader, + term: term, + field: field, + explain: explain, + reader: reader, + scorer: scorer, + }, nil +} + +func (s *TermSearcher) Count() uint64 { + return s.reader.Count() +} + +func (s *TermSearcher) Weight() float64 { + return s.scorer.Weight() +} + +func (s *TermSearcher) SetQueryNorm(qnorm float64) { + s.scorer.SetQueryNorm(qnorm) +} + +func (s *TermSearcher) Next(ctx *search.SearchContext) (*search.DocumentMatch, error) { + termMatch, err := s.reader.Next(s.tfd.Reset()) + if err != nil { + return nil, err + } + + if termMatch == nil { + return nil, nil + } + + // score match + docMatch := s.scorer.Score(ctx, termMatch) + // return doc match + return docMatch, nil + +} + +func (s *TermSearcher) Advance(ctx *search.SearchContext, ID index.IndexInternalID) (*search.DocumentMatch, error) { + termMatch, err := s.reader.Advance(ID, s.tfd.Reset()) + if err != nil { + return nil, err + } + + if termMatch == nil { + return nil, nil + } + + // score match + docMatch := s.scorer.Score(ctx, termMatch) + + // return doc match + return docMatch, nil +} + +func (s *TermSearcher) Close() error { + return s.reader.Close() +} + +func (s *TermSearcher) Min() int { + return 0 +} + +func (s *TermSearcher) DocumentMatchPoolSize() int { + return 1 +} diff --git a/vendor/github.com/blevesearch/bleve/search/searchers/search_term_prefix.go b/vendor/github.com/blevesearch/bleve/search/searchers/search_term_prefix.go new file mode 100644 index 0000000..35caf71 --- /dev/null +++ b/vendor/github.com/blevesearch/bleve/search/searchers/search_term_prefix.go @@ -0,0 +1,92 @@ +// Copyright (c) 2014 Couchbase, Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. + +package searchers + +import ( + "github.com/blevesearch/bleve/index" + "github.com/blevesearch/bleve/search" +) + +type TermPrefixSearcher struct { + indexReader index.IndexReader + prefix string + field string + explain bool + searcher *DisjunctionSearcher +} + +func NewTermPrefixSearcher(indexReader index.IndexReader, prefix string, field string, boost float64, explain bool) (*TermPrefixSearcher, error) { + // find the terms with this prefix + fieldDict, err := indexReader.FieldDictPrefix(field, []byte(prefix)) + + // enumerate all the terms in the range + qsearchers := make([]search.Searcher, 0, 25) + tfd, err := fieldDict.Next() + for err == nil && tfd != nil { + var qsearcher *TermSearcher + qsearcher, err = NewTermSearcher(indexReader, string(tfd.Term), field, 1.0, explain) + if err != nil { + return nil, err + } + qsearchers = append(qsearchers, qsearcher) + tfd, err = fieldDict.Next() + } + + err = fieldDict.Close() + if err != nil { + return nil, err + } + + // build disjunction searcher of these ranges + searcher, err := NewDisjunctionSearcher(indexReader, qsearchers, 0, explain) + if err != nil { + return nil, err + } + + return &TermPrefixSearcher{ + indexReader: indexReader, + prefix: prefix, + field: field, + explain: explain, + searcher: searcher, + }, nil +} +func (s *TermPrefixSearcher) Count() uint64 { + return s.searcher.Count() +} + +func (s *TermPrefixSearcher) Weight() float64 { + return s.searcher.Weight() +} + +func (s *TermPrefixSearcher) SetQueryNorm(qnorm float64) { + s.searcher.SetQueryNorm(qnorm) +} + +func (s *TermPrefixSearcher) Next(ctx *search.SearchContext) (*search.DocumentMatch, error) { + return s.searcher.Next(ctx) + +} + +func (s *TermPrefixSearcher) Advance(ctx *search.SearchContext, ID index.IndexInternalID) (*search.DocumentMatch, error) { + return s.searcher.Advance(ctx, ID) +} + +func (s *TermPrefixSearcher) Close() error { + return s.searcher.Close() +} + +func (s *TermPrefixSearcher) Min() int { + return 0 +} + +func (s *TermPrefixSearcher) DocumentMatchPoolSize() int { + return s.searcher.DocumentMatchPoolSize() +} diff --git a/vendor/github.com/blevesearch/bleve/search/sort.go b/vendor/github.com/blevesearch/bleve/search/sort.go index dca422e..6428742 100644 --- a/vendor/github.com/blevesearch/bleve/search/sort.go +++ b/vendor/github.com/blevesearch/bleve/search/sort.go @@ -1,46 +1,33 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. package search import ( - "bytes" "encoding/json" "fmt" - "math" "sort" "strings" - "github.com/blevesearch/bleve/geo" - "github.com/blevesearch/bleve/numeric" + "github.com/blevesearch/bleve/numeric_util" ) var HighTerm = strings.Repeat(string([]byte{0xff}), 10) var LowTerm = string([]byte{0x00}) type SearchSort interface { - UpdateVisitor(field string, term []byte) Value(a *DocumentMatch) string Descending() bool RequiresDocID() bool RequiresScoring() bool RequiresFields() []string - - Reverse() - - Copy() SearchSort } func ParseSearchSortObj(input map[string]interface{}) (SearchSort, error) { @@ -58,31 +45,6 @@ func ParseSearchSortObj(input map[string]interface{}) (SearchSort, error) { return &SortScore{ Desc: descending, }, nil - case "geo_distance": - field, ok := input["field"].(string) - if !ok { - return nil, fmt.Errorf("search sort mode geo_distance must specify field") - } - lon, lat, foundLocation := geo.ExtractGeoPoint(input["location"]) - if !foundLocation { - return nil, fmt.Errorf("unable to parse geo_distance location") - } - rvd := &SortGeoDistance{ - Field: field, - Desc: descending, - Lon: lon, - Lat: lat, - unitMult: 1.0, - } - if distUnit, ok := input["unit"].(string); ok { - var err error - rvd.unitMult, err = geo.ParseDistanceUnit(distUnit) - if err != nil { - return nil, err - } - rvd.Unit = distUnit - } - return rvd, nil case "field": field, ok := input["field"].(string) if !ok { @@ -104,7 +66,7 @@ func ParseSearchSortObj(input map[string]interface{}) (SearchSort, error) { case "date": rv.Type = SortFieldAsDate default: - return nil, fmt.Errorf("unknown sort field type: %s", typ) + return nil, fmt.Errorf("unkown sort field type: %s", typ) } } mode, ok := input["mode"].(string) @@ -204,20 +166,6 @@ func (so SortOrder) Value(doc *DocumentMatch) { } } -func (so SortOrder) UpdateVisitor(field string, term []byte) { - for _, soi := range so { - soi.UpdateVisitor(field, term) - } -} - -func (so SortOrder) Copy() SortOrder { - rv := make(SortOrder, len(so)) - for i, soi := range so { - rv[i] = soi.Copy() - } - return rv -} - // Compare will compare two document matches using the specified sort order // if both are numbers, we avoid converting back to term func (so SortOrder) Compare(cachedScoring, cachedDesc []bool, i, j *DocumentMatch) int { @@ -233,11 +181,7 @@ func (so SortOrder) Compare(cachedScoring, cachedDesc []bool, i, j *DocumentMatc } else { iVal := i.Sort[x] jVal := j.Sort[x] - if iVal < jVal { - c = -1 - } else if iVal > jVal { - c = 1 - } + c = strings.Compare(iVal, jVal) } if c == 0 { @@ -258,21 +202,23 @@ func (so SortOrder) Compare(cachedScoring, cachedDesc []bool, i, j *DocumentMatc } func (so SortOrder) RequiresScore() bool { + rv := false for _, soi := range so { if soi.RequiresScoring() { - return true + rv = true } } - return false + return rv } func (so SortOrder) RequiresDocID() bool { + rv := false for _, soi := range so { if soi.RequiresDocID() { - return true + rv = true } } - return false + return rv } func (so SortOrder) RequiredFields() []string { @@ -284,7 +230,7 @@ func (so SortOrder) RequiredFields() []string { } func (so SortOrder) CacheIsScore() []bool { - rv := make([]bool, 0, len(so)) + var rv []bool for _, soi := range so { rv = append(rv, soi.RequiresScoring()) } @@ -292,19 +238,13 @@ func (so SortOrder) CacheIsScore() []bool { } func (so SortOrder) CacheDescending() []bool { - rv := make([]bool, 0, len(so)) + var rv []bool for _, soi := range so { rv = append(rv, soi.Descending()) } return rv } -func (so SortOrder) Reverse() { - for _, soi := range so { - soi.Reverse() - } -} - // SortFieldType lets you control some internal sort behavior // normally leaving this to the zero-value of SortFieldAuto is fine type SortFieldType int @@ -355,25 +295,13 @@ type SortField struct { Type SortFieldType Mode SortFieldMode Missing SortFieldMissing - values [][]byte - tmp [][]byte -} - -// UpdateVisitor notifies this sort field that in this document -// this field has the specified term -func (s *SortField) UpdateVisitor(field string, term []byte) { - if field == s.Field { - s.values = append(s.values, term) - } } // Value returns the sort value of the DocumentMatch -// it also resets the state of this SortField for -// processing the next document func (s *SortField) Value(i *DocumentMatch) string { - iTerms := s.filterTermsByType(s.values) + iTerms := i.CachedFieldTerms[s.Field] + iTerms = s.filterTermsByType(iTerms) iTerm := s.filterTermsByMode(iTerms) - s.values = s.values[:0] return iTerm } @@ -382,17 +310,17 @@ func (s *SortField) Descending() bool { return s.Desc } -func (s *SortField) filterTermsByMode(terms [][]byte) string { +func (s *SortField) filterTermsByMode(terms []string) string { if len(terms) == 1 || (len(terms) > 1 && s.Mode == SortFieldDefault) { - return string(terms[0]) + return terms[0] } else if len(terms) > 1 { switch s.Mode { case SortFieldMin: - sort.Sort(BytesSlice(terms)) - return string(terms[0]) + sort.Strings(terms) + return terms[0] case SortFieldMax: - sort.Sort(BytesSlice(terms)) - return string(terms[len(terms)-1]) + sort.Strings(terms) + return terms[len(terms)-1] } } @@ -414,34 +342,31 @@ func (s *SortField) filterTermsByMode(terms [][]byte) string { // return only the terms which had shift of 0 // if we are in explicit number or date mode, return only valid // prefix coded numbers with shift of 0 -func (s *SortField) filterTermsByType(terms [][]byte) [][]byte { +func (s *SortField) filterTermsByType(terms []string) []string { stype := s.Type if stype == SortFieldAuto { allTermsPrefixCoded := true - termsWithShiftZero := s.tmp[:0] + var termsWithShiftZero []string for _, term := range terms { - valid, shift := numeric.ValidPrefixCodedTermBytes(term) + valid, shift := numeric_util.ValidPrefixCodedTerm(term) if valid && shift == 0 { termsWithShiftZero = append(termsWithShiftZero, term) } else if !valid { allTermsPrefixCoded = false } } - // reset the terms only when valid zero shift terms are found. - if allTermsPrefixCoded && len(termsWithShiftZero) > 0 { + if allTermsPrefixCoded { terms = termsWithShiftZero - s.tmp = termsWithShiftZero[:0] } } else if stype == SortFieldAsNumber || stype == SortFieldAsDate { - termsWithShiftZero := s.tmp[:0] + var termsWithShiftZero []string for _, term := range terms { - valid, shift := numeric.ValidPrefixCodedTermBytes(term) + valid, shift := numeric_util.ValidPrefixCodedTerm(term) if valid && shift == 0 { - termsWithShiftZero = append(termsWithShiftZero, term) + termsWithShiftZero = append(termsWithShiftZero) } } terms = termsWithShiftZero - s.tmp = termsWithShiftZero[:0] } return terms } @@ -500,30 +425,11 @@ func (s *SortField) MarshalJSON() ([]byte, error) { return json.Marshal(sfm) } -func (s *SortField) Copy() SearchSort { - rv := *s - return &rv -} - -func (s *SortField) Reverse() { - s.Desc = !s.Desc - if s.Missing == SortFieldMissingFirst { - s.Missing = SortFieldMissingLast - } else { - s.Missing = SortFieldMissingFirst - } -} - // SortDocID will sort results by the document identifier type SortDocID struct { Desc bool } -// UpdateVisitor is a no-op for SortDocID as it's value -// is not dependent on any field terms -func (s *SortDocID) UpdateVisitor(field string, term []byte) { -} - // Value returns the sort value of the DocumentMatch func (s *SortDocID) Value(i *DocumentMatch) string { return i.ID @@ -550,25 +456,11 @@ func (s *SortDocID) MarshalJSON() ([]byte, error) { return json.Marshal("_id") } -func (s *SortDocID) Copy() SearchSort { - rv := *s - return &rv -} - -func (s *SortDocID) Reverse() { - s.Desc = !s.Desc -} - // SortScore will sort results by the document match score type SortScore struct { Desc bool } -// UpdateVisitor is a no-op for SortScore as it's value -// is not dependent on any field terms -func (s *SortScore) UpdateVisitor(field string, term []byte) { -} - // Value returns the sort value of the DocumentMatch func (s *SortScore) Value(i *DocumentMatch) string { return "_score" @@ -594,153 +486,3 @@ func (s *SortScore) MarshalJSON() ([]byte, error) { } return json.Marshal("_score") } - -func (s *SortScore) Copy() SearchSort { - rv := *s - return &rv -} - -func (s *SortScore) Reverse() { - s.Desc = !s.Desc -} - -var maxDistance = string(numeric.MustNewPrefixCodedInt64(math.MaxInt64, 0)) - -// NewSortGeoDistance creates SearchSort instance for sorting documents by -// their distance from the specified point. -func NewSortGeoDistance(field, unit string, lon, lat float64, desc bool) ( - *SortGeoDistance, error) { - rv := &SortGeoDistance{ - Field: field, - Desc: desc, - Unit: unit, - Lon: lon, - Lat: lat, - } - var err error - rv.unitMult, err = geo.ParseDistanceUnit(unit) - if err != nil { - return nil, err - } - return rv, nil -} - -// SortGeoDistance will sort results by the distance of an -// indexed geo point, from the provided location. -// Field is the name of the field -// Descending reverse the sort order (default false) -type SortGeoDistance struct { - Field string - Desc bool - Unit string - values []string - Lon float64 - Lat float64 - unitMult float64 -} - -// UpdateVisitor notifies this sort field that in this document -// this field has the specified term -func (s *SortGeoDistance) UpdateVisitor(field string, term []byte) { - if field == s.Field { - s.values = append(s.values, string(term)) - } -} - -// Value returns the sort value of the DocumentMatch -// it also resets the state of this SortField for -// processing the next document -func (s *SortGeoDistance) Value(i *DocumentMatch) string { - iTerms := s.filterTermsByType(s.values) - iTerm := s.filterTermsByMode(iTerms) - s.values = s.values[:0] - - if iTerm == "" { - return maxDistance - } - - i64, err := numeric.PrefixCoded(iTerm).Int64() - if err != nil { - return maxDistance - } - docLon := geo.MortonUnhashLon(uint64(i64)) - docLat := geo.MortonUnhashLat(uint64(i64)) - - dist := geo.Haversin(s.Lon, s.Lat, docLon, docLat) - // dist is returned in km, so convert to m - dist *= 1000 - if s.unitMult != 0 { - dist /= s.unitMult - } - distInt64 := numeric.Float64ToInt64(dist) - return string(numeric.MustNewPrefixCodedInt64(distInt64, 0)) -} - -// Descending determines the order of the sort -func (s *SortGeoDistance) Descending() bool { - return s.Desc -} - -func (s *SortGeoDistance) filterTermsByMode(terms []string) string { - if len(terms) >= 1 { - return terms[0] - } - - return "" -} - -// filterTermsByType attempts to make one pass on the terms -// return only valid prefix coded numbers with shift of 0 -func (s *SortGeoDistance) filterTermsByType(terms []string) []string { - var termsWithShiftZero []string - for _, term := range terms { - valid, shift := numeric.ValidPrefixCodedTerm(term) - if valid && shift == 0 { - termsWithShiftZero = append(termsWithShiftZero, term) - } - } - return termsWithShiftZero -} - -// RequiresDocID says this SearchSort does not require the DocID be loaded -func (s *SortGeoDistance) RequiresDocID() bool { return false } - -// RequiresScoring says this SearchStore does not require scoring -func (s *SortGeoDistance) RequiresScoring() bool { return false } - -// RequiresFields says this SearchStore requires the specified stored field -func (s *SortGeoDistance) RequiresFields() []string { return []string{s.Field} } - -func (s *SortGeoDistance) MarshalJSON() ([]byte, error) { - sfm := map[string]interface{}{ - "by": "geo_distance", - "field": s.Field, - "location": map[string]interface{}{ - "lon": s.Lon, - "lat": s.Lat, - }, - } - if s.Unit != "" { - sfm["unit"] = s.Unit - } - if s.Desc { - sfm["desc"] = true - } - - return json.Marshal(sfm) -} - -func (s *SortGeoDistance) Copy() SearchSort { - rv := *s - return &rv -} - -func (s *SortGeoDistance) Reverse() { - s.Desc = !s.Desc -} - -type BytesSlice [][]byte - -func (p BytesSlice) Len() int { return len(p) } -func (p BytesSlice) Less(i, j int) bool { return bytes.Compare(p[i], p[j]) < 0 } -func (p BytesSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } diff --git a/vendor/github.com/blevesearch/bleve/search/util.go b/vendor/github.com/blevesearch/bleve/search/util.go index 19dd5d6..6867eee 100644 --- a/vendor/github.com/blevesearch/bleve/search/util.go +++ b/vendor/github.com/blevesearch/bleve/search/util.go @@ -1,16 +1,11 @@ // Copyright (c) 2014 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. package search @@ -40,30 +35,3 @@ func MergeTermLocationMaps(rv, other TermLocationMap) TermLocationMap { } return rv } - -func MergeFieldTermLocations(dest []FieldTermLocation, matches []*DocumentMatch) []FieldTermLocation { - n := len(dest) - for _, dm := range matches { - n += len(dm.FieldTermLocations) - } - if cap(dest) < n { - dest = append(make([]FieldTermLocation, 0, n), dest...) - } - - for _, dm := range matches { - for _, ftl := range dm.FieldTermLocations { - dest = append(dest, FieldTermLocation{ - Field: ftl.Field, - Term: ftl.Term, - Location: Location{ - Pos: ftl.Location.Pos, - Start: ftl.Location.Start, - End: ftl.Location.End, - ArrayPositions: append(ArrayPositions(nil), ftl.Location.ArrayPositions...), - }, - }) - } - } - - return dest -} diff --git a/vendor/github.com/blevesearch/bleve/size/sizes.go b/vendor/github.com/blevesearch/bleve/size/sizes.go deleted file mode 100644 index 0990bf8..0000000 --- a/vendor/github.com/blevesearch/bleve/size/sizes.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (c) 2018 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package size - -import ( - "reflect" -) - -func init() { - var b bool - SizeOfBool = int(reflect.TypeOf(b).Size()) - var f32 float32 - SizeOfFloat32 = int(reflect.TypeOf(f32).Size()) - var f64 float64 - SizeOfFloat64 = int(reflect.TypeOf(f64).Size()) - var i int - SizeOfInt = int(reflect.TypeOf(i).Size()) - var m map[int]int - SizeOfMap = int(reflect.TypeOf(m).Size()) - var ptr *int - SizeOfPtr = int(reflect.TypeOf(ptr).Size()) - var slice []int - SizeOfSlice = int(reflect.TypeOf(slice).Size()) - var str string - SizeOfString = int(reflect.TypeOf(str).Size()) - var u8 uint8 - SizeOfUint8 = int(reflect.TypeOf(u8).Size()) - var u16 uint16 - SizeOfUint16 = int(reflect.TypeOf(u16).Size()) - var u32 uint32 - SizeOfUint32 = int(reflect.TypeOf(u32).Size()) - var u64 uint64 - SizeOfUint64 = int(reflect.TypeOf(u64).Size()) -} - -var SizeOfBool int -var SizeOfFloat32 int -var SizeOfFloat64 int -var SizeOfInt int -var SizeOfMap int -var SizeOfPtr int -var SizeOfSlice int -var SizeOfString int -var SizeOfUint8 int -var SizeOfUint16 int -var SizeOfUint32 int -var SizeOfUint64 int diff --git a/vendor/github.com/blevesearch/mmap-go/.gitignore b/vendor/github.com/blevesearch/mmap-go/.gitignore deleted file mode 100644 index 0c0a5e4..0000000 --- a/vendor/github.com/blevesearch/mmap-go/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -*.out -*.5 -*.6 -*.8 -*.swp -_obj -_test -testdata -/.idea -*.iml \ No newline at end of file diff --git a/vendor/github.com/blevesearch/mmap-go/.travis.yml b/vendor/github.com/blevesearch/mmap-go/.travis.yml deleted file mode 100644 index 169eb1f..0000000 --- a/vendor/github.com/blevesearch/mmap-go/.travis.yml +++ /dev/null @@ -1,16 +0,0 @@ -language: go -os: - - linux - - osx - - windows -go: - - 1.11.4 -env: - global: - - GO111MODULE=on -install: - - go mod download - - go get github.com/mattn/goveralls -script: - - go test -v -covermode=count -coverprofile=coverage.out -bench . -cpu 1,4 - - '[ "${TRAVIS_PULL_REQUEST}" = "false" ] && $HOME/gopath/bin/goveralls -coverprofile=coverage.out -service=travis-ci -repotoken $COVERALLS_TOKEN || true' diff --git a/vendor/github.com/blevesearch/mmap-go/LICENSE b/vendor/github.com/blevesearch/mmap-go/LICENSE deleted file mode 100644 index 8f05f33..0000000 --- a/vendor/github.com/blevesearch/mmap-go/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2011, Evan Shaw -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the copyright holder nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/vendor/github.com/blevesearch/mmap-go/README.md b/vendor/github.com/blevesearch/mmap-go/README.md deleted file mode 100644 index 4cc2bfe..0000000 --- a/vendor/github.com/blevesearch/mmap-go/README.md +++ /dev/null @@ -1,12 +0,0 @@ -mmap-go -======= - -mmap-go is a portable mmap package for the [Go programming language](http://golang.org). -It has been tested on Linux (386, amd64), OS X, and Windows (386). It should also -work on other Unix-like platforms, but hasn't been tested with them. I'm interested -to hear about the results. - -I haven't been able to add more features without adding significant complexity, -so mmap-go doesn't support mprotect, mincore, and maybe a few other things. -If you're running on a Unix-like platform and need some of these features, -I suggest Gustavo Niemeyer's [gommap](http://labix.org/gommap). diff --git a/vendor/github.com/blevesearch/mmap-go/mmap.go b/vendor/github.com/blevesearch/mmap-go/mmap.go deleted file mode 100644 index 29655bd..0000000 --- a/vendor/github.com/blevesearch/mmap-go/mmap.go +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright 2011 Evan Shaw. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file defines the common package interface and contains a little bit of -// factored out logic. - -// Package mmap allows mapping files into memory. It tries to provide a simple, reasonably portable interface, -// but doesn't go out of its way to abstract away every little platform detail. -// This specifically means: -// * forked processes may or may not inherit mappings -// * a file's timestamp may or may not be updated by writes through mappings -// * specifying a size larger than the file's actual size can increase the file's size -// * If the mapped file is being modified by another process while your program's running, don't expect consistent results between platforms -package mmap - -import ( - "errors" - "os" - "reflect" - "unsafe" -) - -const ( - // RDONLY maps the memory read-only. - // Attempts to write to the MMap object will result in undefined behavior. - RDONLY = 0 - // RDWR maps the memory as read-write. Writes to the MMap object will update the - // underlying file. - RDWR = 1 << iota - // COPY maps the memory as copy-on-write. Writes to the MMap object will affect - // memory, but the underlying file will remain unchanged. - COPY - // If EXEC is set, the mapped memory is marked as executable. - EXEC -) - -const ( - // If the ANON flag is set, the mapped memory will not be backed by a file. - ANON = 1 << iota -) - -// MMap represents a file mapped into memory. -type MMap []byte - -// Map maps an entire file into memory. -// If ANON is set in flags, f is ignored. -func Map(f *os.File, prot, flags int) (MMap, error) { - return MapRegion(f, -1, prot, flags, 0) -} - -// MapRegion maps part of a file into memory. -// The offset parameter must be a multiple of the system's page size. -// If length < 0, the entire file will be mapped. -// If ANON is set in flags, f is ignored. -func MapRegion(f *os.File, length int, prot, flags int, offset int64) (MMap, error) { - if offset%int64(os.Getpagesize()) != 0 { - return nil, errors.New("offset parameter must be a multiple of the system's page size") - } - - var fd uintptr - if flags&ANON == 0 { - fd = uintptr(f.Fd()) - if length < 0 { - fi, err := f.Stat() - if err != nil { - return nil, err - } - length = int(fi.Size()) - } - } else { - if length <= 0 { - return nil, errors.New("anonymous mapping requires non-zero length") - } - fd = ^uintptr(0) - } - return mmap(length, uintptr(prot), uintptr(flags), fd, offset) -} - -func (m *MMap) header() *reflect.SliceHeader { - return (*reflect.SliceHeader)(unsafe.Pointer(m)) -} - -func (m *MMap) addrLen() (uintptr, uintptr) { - header := m.header() - return header.Data, uintptr(header.Len) -} - -// Lock keeps the mapped region in physical memory, ensuring that it will not be -// swapped out. -func (m MMap) Lock() error { - return m.lock() -} - -// Unlock reverses the effect of Lock, allowing the mapped region to potentially -// be swapped out. -// If m is already unlocked, aan error will result. -func (m MMap) Unlock() error { - return m.unlock() -} - -// Flush synchronizes the mapping's contents to the file's contents on disk. -func (m MMap) Flush() error { - return m.flush() -} - -// Unmap deletes the memory mapped region, flushes any remaining changes, and sets -// m to nil. -// Trying to read or write any remaining references to m after Unmap is called will -// result in undefined behavior. -// Unmap should only be called on the slice value that was originally returned from -// a call to Map. Calling Unmap on a derived slice may cause errors. -func (m *MMap) Unmap() error { - err := m.unmap() - *m = nil - return err -} diff --git a/vendor/github.com/blevesearch/mmap-go/mmap_unix.go b/vendor/github.com/blevesearch/mmap-go/mmap_unix.go deleted file mode 100644 index 25b13e5..0000000 --- a/vendor/github.com/blevesearch/mmap-go/mmap_unix.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2011 Evan Shaw. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd linux openbsd solaris netbsd - -package mmap - -import ( - "golang.org/x/sys/unix" -) - -func mmap(len int, inprot, inflags, fd uintptr, off int64) ([]byte, error) { - flags := unix.MAP_SHARED - prot := unix.PROT_READ - switch { - case inprot© != 0: - prot |= unix.PROT_WRITE - flags = unix.MAP_PRIVATE - case inprot&RDWR != 0: - prot |= unix.PROT_WRITE - } - if inprot&EXEC != 0 { - prot |= unix.PROT_EXEC - } - if inflags&ANON != 0 { - flags |= unix.MAP_ANON - } - - b, err := unix.Mmap(int(fd), off, len, prot, flags) - if err != nil { - return nil, err - } - return b, nil -} - -func (m MMap) flush() error { - return unix.Msync([]byte(m), unix.MS_SYNC) -} - -func (m MMap) lock() error { - return unix.Mlock([]byte(m)) -} - -func (m MMap) unlock() error { - return unix.Munlock([]byte(m)) -} - -func (m MMap) unmap() error { - return unix.Munmap([]byte(m)) -} diff --git a/vendor/github.com/blevesearch/mmap-go/mmap_windows.go b/vendor/github.com/blevesearch/mmap-go/mmap_windows.go deleted file mode 100644 index 631b382..0000000 --- a/vendor/github.com/blevesearch/mmap-go/mmap_windows.go +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright 2011 Evan Shaw. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package mmap - -import ( - "errors" - "os" - "sync" - - "golang.org/x/sys/windows" -) - -// mmap on Windows is a two-step process. -// First, we call CreateFileMapping to get a handle. -// Then, we call MapviewToFile to get an actual pointer into memory. -// Because we want to emulate a POSIX-style mmap, we don't want to expose -// the handle -- only the pointer. We also want to return only a byte slice, -// not a struct, so it's convenient to manipulate. - -// We keep this map so that we can get back the original handle from the memory address. - -type addrinfo struct { - file windows.Handle - mapview windows.Handle - writable bool -} - -var handleLock sync.Mutex -var handleMap = map[uintptr]*addrinfo{} - -func mmap(len int, prot, flags, hfile uintptr, off int64) ([]byte, error) { - flProtect := uint32(windows.PAGE_READONLY) - dwDesiredAccess := uint32(windows.FILE_MAP_READ) - writable := false - switch { - case prot© != 0: - flProtect = windows.PAGE_WRITECOPY - dwDesiredAccess = windows.FILE_MAP_COPY - writable = true - case prot&RDWR != 0: - flProtect = windows.PAGE_READWRITE - dwDesiredAccess = windows.FILE_MAP_WRITE - writable = true - } - if prot&EXEC != 0 { - flProtect <<= 4 - dwDesiredAccess |= windows.FILE_MAP_EXECUTE - } - - // The maximum size is the area of the file, starting from 0, - // that we wish to allow to be mappable. It is the sum of - // the length the user requested, plus the offset where that length - // is starting from. This does not map the data into memory. - maxSizeHigh := uint32((off + int64(len)) >> 32) - maxSizeLow := uint32((off + int64(len)) & 0xFFFFFFFF) - // TODO: Do we need to set some security attributes? It might help portability. - h, errno := windows.CreateFileMapping(windows.Handle(hfile), nil, flProtect, maxSizeHigh, maxSizeLow, nil) - if h == 0 { - return nil, os.NewSyscallError("CreateFileMapping", errno) - } - - // Actually map a view of the data into memory. The view's size - // is the length the user requested. - fileOffsetHigh := uint32(off >> 32) - fileOffsetLow := uint32(off & 0xFFFFFFFF) - addr, errno := windows.MapViewOfFile(h, dwDesiredAccess, fileOffsetHigh, fileOffsetLow, uintptr(len)) - if addr == 0 { - return nil, os.NewSyscallError("MapViewOfFile", errno) - } - handleLock.Lock() - handleMap[addr] = &addrinfo{ - file: windows.Handle(hfile), - mapview: h, - writable: writable, - } - handleLock.Unlock() - - m := MMap{} - dh := m.header() - dh.Data = addr - dh.Len = len - dh.Cap = dh.Len - - return m, nil -} - -func (m MMap) flush() error { - addr, len := m.addrLen() - errno := windows.FlushViewOfFile(addr, len) - if errno != nil { - return os.NewSyscallError("FlushViewOfFile", errno) - } - - handleLock.Lock() - defer handleLock.Unlock() - handle, ok := handleMap[addr] - if !ok { - // should be impossible; we would've errored above - return errors.New("unknown base address") - } - - if handle.writable { - if err := windows.FlushFileBuffers(handle.file); err != nil { - return os.NewSyscallError("FlushFileBuffers", err) - } - } - - return nil -} - -func (m MMap) lock() error { - addr, len := m.addrLen() - errno := windows.VirtualLock(addr, len) - return os.NewSyscallError("VirtualLock", errno) -} - -func (m MMap) unlock() error { - addr, len := m.addrLen() - errno := windows.VirtualUnlock(addr, len) - return os.NewSyscallError("VirtualUnlock", errno) -} - -func (m MMap) unmap() error { - err := m.flush() - if err != nil { - return err - } - - addr := m.header().Data - // Lock the UnmapViewOfFile along with the handleMap deletion. - // As soon as we unmap the view, the OS is free to give the - // same addr to another new map. We don't want another goroutine - // to insert and remove the same addr into handleMap while - // we're trying to remove our old addr/handle pair. - handleLock.Lock() - defer handleLock.Unlock() - err = windows.UnmapViewOfFile(addr) - if err != nil { - return err - } - - handle, ok := handleMap[addr] - if !ok { - // should be impossible; we would've errored above - return errors.New("unknown base address") - } - delete(handleMap, addr) - - e := windows.CloseHandle(windows.Handle(handle.mapview)) - return os.NewSyscallError("CloseHandle", e) -} diff --git a/vendor/github.com/blevesearch/segment/.travis.yml b/vendor/github.com/blevesearch/segment/.travis.yml new file mode 100644 index 0000000..b9d58e7 --- /dev/null +++ b/vendor/github.com/blevesearch/segment/.travis.yml @@ -0,0 +1,15 @@ +language: go + +go: + - 1.7 + +script: + - go get golang.org/x/tools/cmd/cover + - go get github.com/mattn/goveralls + - go test -v -covermode=count -coverprofile=profile.out + - go vet + - goveralls -service drone.io -coverprofile=profile.out -repotoken $COVERALLS + +notifications: + email: + - marty.schoch@gmail.com diff --git a/vendor/github.com/blevesearch/segment/README.md b/vendor/github.com/blevesearch/segment/README.md index b24dfb4..0840962 100644 --- a/vendor/github.com/blevesearch/segment/README.md +++ b/vendor/github.com/blevesearch/segment/README.md @@ -1,7 +1,5 @@ # segment -[](https://github.com/blevesearch/segment/actions?query=workflow%3ATests+event%3Apush+branch%3Amaster) - A Go library for performing Unicode Text Segmentation as described in [Unicode Standard Annex #29](http://www.unicode.org/reports/tr29/) diff --git a/vendor/github.com/blevesearch/segment/maketesttables.go b/vendor/github.com/blevesearch/segment/maketesttables.go new file mode 100644 index 0000000..9d7df95 --- /dev/null +++ b/vendor/github.com/blevesearch/segment/maketesttables.go @@ -0,0 +1,219 @@ +// Copyright (c) 2015 Couchbase, Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +// either express or implied. See the License for the specific language governing permissions +// and limitations under the License. + +// +build ignore + +package main + +import ( + "bufio" + "bytes" + "flag" + "fmt" + "io" + "log" + "net/http" + "os" + "os/exec" + "strconv" + "strings" + "unicode" +) + +var url = flag.String("url", + "http://www.unicode.org/Public/"+unicode.Version+"/ucd/auxiliary/", + "URL of Unicode database directory") +var verbose = flag.Bool("verbose", + false, + "write data to stdout as it is parsed") +var localFiles = flag.Bool("local", + false, + "data files have been copied to the current directory; for debugging only") + +var outputFile = flag.String("output", + "", + "output file for generated tables; default stdout") + +var output *bufio.Writer + +func main() { + flag.Parse() + setupOutput() + + graphemeTests := make([]test, 0) + graphemeComments := make([]string, 0) + graphemeTests, graphemeComments = loadUnicodeData("GraphemeBreakTest.txt", graphemeTests, graphemeComments) + wordTests := make([]test, 0) + wordComments := make([]string, 0) + wordTests, wordComments = loadUnicodeData("WordBreakTest.txt", wordTests, wordComments) + sentenceTests := make([]test, 0) + sentenceComments := make([]string, 0) + sentenceTests, sentenceComments = loadUnicodeData("SentenceBreakTest.txt", sentenceTests, sentenceComments) + + fmt.Fprintf(output, fileHeader, *url) + generateTestTables("Grapheme", graphemeTests, graphemeComments) + generateTestTables("Word", wordTests, wordComments) + generateTestTables("Sentence", sentenceTests, sentenceComments) + + flushOutput() +} + +// WordBreakProperty.txt has the form: +// 05F0..05F2 ; Hebrew_Letter # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD +// FB1D ; Hebrew_Letter # Lo HEBREW LETTER YOD WITH HIRIQ +func openReader(file string) (input io.ReadCloser) { + if *localFiles { + f, err := os.Open(file) + if err != nil { + log.Fatal(err) + } + input = f + } else { + path := *url + file + resp, err := http.Get(path) + if err != nil { + log.Fatal(err) + } + if resp.StatusCode != 200 { + log.Fatal("bad GET status for "+file, resp.Status) + } + input = resp.Body + } + return +} + +func loadUnicodeData(filename string, tests []test, comments []string) ([]test, []string) { + f := openReader(filename) + defer f.Close() + bufioReader := bufio.NewReader(f) + line, err := bufioReader.ReadString('\n') + for err == nil { + tests, comments = parseLine(line, tests, comments) + line, err = bufioReader.ReadString('\n') + } + // if the err was EOF still need to process last value + if err == io.EOF { + tests, comments = parseLine(line, tests, comments) + } + return tests, comments +} + +const comment = "#" +const brk = "÷" +const nbrk = "×" + +type test [][]byte + +func parseLine(line string, tests []test, comments []string) ([]test, []string) { + if strings.HasPrefix(line, comment) { + return tests, comments + } + line = strings.TrimSpace(line) + if len(line) == 0 { + return tests, comments + } + commentStart := strings.Index(line, comment) + comment := strings.TrimSpace(line[commentStart+1:]) + if commentStart > 0 { + line = line[0:commentStart] + } + pieces := strings.Split(line, brk) + t := make(test, 0) + for _, piece := range pieces { + piece = strings.TrimSpace(piece) + if len(piece) > 0 { + codePoints := strings.Split(piece, nbrk) + word := "" + for _, codePoint := range codePoints { + codePoint = strings.TrimSpace(codePoint) + r, err := strconv.ParseInt(codePoint, 16, 64) + if err != nil { + log.Printf("err: %v for '%s'", err, string(r)) + return tests, comments + } + + word += string(r) + } + t = append(t, []byte(word)) + } + } + tests = append(tests, t) + comments = append(comments, comment) + return tests, comments +} + +func generateTestTables(prefix string, tests []test, comments []string) { + fmt.Fprintf(output, testHeader, prefix) + for i, t := range tests { + fmt.Fprintf(output, "\t\t{\n") + fmt.Fprintf(output, "\t\t\tinput: %#v,\n", bytes.Join(t, []byte{})) + fmt.Fprintf(output, "\t\t\toutput: %s,\n", generateTest(t)) + fmt.Fprintf(output, "\t\t\tcomment: `%s`,\n", comments[i]) + fmt.Fprintf(output, "\t\t},\n") + } + fmt.Fprintf(output, "}\n") +} + +func generateTest(t test) string { + rv := "[][]byte{" + for _, te := range t { + rv += fmt.Sprintf("%#v,", te) + } + rv += "}" + return rv +} + +const fileHeader = `// Generated by running +// maketesttables --url=%s +// DO NOT EDIT + +package segment +` + +const testHeader = `var unicode%sTests = []struct { + input []byte + output [][]byte + comment string + }{ +` + +func setupOutput() { + output = bufio.NewWriter(startGofmt()) +} + +// startGofmt connects output to a gofmt process if -output is set. +func startGofmt() io.Writer { + if *outputFile == "" { + return os.Stdout + } + stdout, err := os.Create(*outputFile) + if err != nil { + log.Fatal(err) + } + // Pipe output to gofmt. + gofmt := exec.Command("gofmt") + fd, err := gofmt.StdinPipe() + if err != nil { + log.Fatal(err) + } + gofmt.Stdout = stdout + gofmt.Stderr = os.Stderr + err = gofmt.Start() + if err != nil { + log.Fatal(err) + } + return fd +} + +func flushOutput() { + err := output.Flush() + if err != nil { + log.Fatal(err) + } +} diff --git a/vendor/github.com/blevesearch/segment/segment_words.go b/vendor/github.com/blevesearch/segment/segment_words.go index 4328b52..9d17e62 100644 --- a/vendor/github.com/blevesearch/segment/segment_words.go +++ b/vendor/github.com/blevesearch/segment/segment_words.go @@ -1,5 +1,5 @@ - //line segment_words.rl:1 + // Copyright (c) 2015 Couchbase, Inc. // Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file // except in compliance with the License. You may obtain a copy of the License at @@ -14,8 +14,8 @@ package segment import ( - "fmt" - "unicode/utf8" + "fmt" + "unicode/utf8" ) var RagelFlags = "-T1" @@ -24,18513 +24,18512 @@ var ParseError = fmt.Errorf("unicode word segmentation parse error") // Word Types const ( - None = iota - Number - Letter - Kana - Ideo + None = iota + Number + Letter + Kana + Ideo ) - //line segment_words.go:36 var _s_key_offsets []uint16 = []uint16{ - 0, 1, 3, 5, 7, 10, 15, 20, - 23, 31, 35, 37, 39, 41, 71, 79, - 81, 83, 86, 91, 96, 106, 118, 124, - 129, 139, 142, 149, 153, 161, 171, 175, - 183, 185, 193, 196, 198, 203, 205, 212, - 214, 222, 223, 244, 246, 256, 261, 263, - 267, 271, 273, 277, 279, 280, 284, 286, - 291, 293, 297, 301, 305, 307, 309, 318, - 322, 328, 332, 336, 338, 340, 341, 343, - 345, 347, 349, 364, 368, 370, 372, 377, - 381, 385, 387, 389, 393, 397, 399, 404, - 411, 416, 420, 425, 426, 430, 432, 438, - 443, 444, 445, 447, 456, 458, 477, 481, - 483, 489, 493, 494, 498, 502, 504, 506, - 511, 524, 526, 528, 532, 536, 538, 540, - 542, 546, 548, 550, 552, 554, 555, 559, - 565, 569, 575, 577, 581, 585, 590, 591, - 593, 594, 600, 603, 605, 605, 628, 666, - 670, 676, 676, 678, 680, 689, 691, 701, - 709, 710, 713, 714, 718, 725, 734, 741, - 748, 761, 768, 772, 776, 783, 815, 822, - 826, 828, 830, 833, 840, 856, 874, 893, - 910, 927, 937, 954, 969, 990, 998, 1011, - 1024, 1039, 1054, 1065, 1080, 1089, 1099, 1102, - 1104, 1109, 1111, 1119, 1125, 1135, 1136, 1183, - 1185, 1195, 1202, 1208, 1215, 1223, 1230, 1233, - 1239, 1243, 1247, 1249, 1253, 1257, 1261, 1271, - 1281, 1283, 1287, 1291, 1293, 1298, 1300, 1306, - 1310, 1315, 1317, 1323, 1329, 1339, 1343, 1347, - 1351, 1364, 1368, 1372, 1382, 1387, 1401, 1419, - 1423, 1429, 1431, 1433, 1449, 1454, 1456, 1458, - 1460, 1464, 1465, 1471, 1477, 1482, 1492, 1502, - 1503, 1508, 1513, 1515, 1519, 1523, 1553, 1555, - 1557, 1563, 1570, 1576, 1580, 1584, 1590, 1592, - 1599, 1601, 1607, 1615, 1621, 1627, 1633, 1638, - 1642, 1649, 1656, 1665, 1677, 1680, 1686, 1686, - 1690, 1692, 1696, 1713, 1725, 1731, 1733, 1735, - 1737, 1739, 1741, 1745, 1749, 1753, 1756, 1758, - 1760, 1764, 1774, 1784, 1823, 1833, 1837, 1839, - 1841, 1842, 1846, 1849, 1853, 1859, 1863, 1868, - 1870, 1874, 1876, 1878, 1882, 1892, 1896, 1898, - 1902, 1906, 1910, 1926, 1928, 1930, 1936, 1938, - 1942, 1944, 1946, 1970, 1976, 1978, 1984, 1986, - 1992, 1996, 2002, 2010, 2016, 2027, 2031, 2048, - 2064, 2068, 2073, 2079, 2085, 2088, 2092, 2094, - 2096, 2100, 2102, 2112, 2114, 2116, 2118, 2122, - 2126, 2128, 2140, 2142, 2146, 2150, 2156, 2158, - 2164, 2168, 2171, 2175, 2183, 2203, 2207, 2213, - 2215, 2216, 2226, 2227, 2235, 2242, 2244, 2247, - 2249, 2251, 2253, 2256, 2260, 2264, 2269, 2276, - 2282, 2296, 2322, 2332, 2335, 2337, 2341, 2343, - 2344, 2350, 2353, 2355, 2355, 2357, 2380, 2381, - 2383, 2385, 2387, 2390, 2395, 2400, 2406, 2416, - 2420, 2422, 2424, 2428, 2458, 2466, 2468, 2470, - 2473, 2482, 2487, 2501, 2515, 2525, 2530, 2542, - 2545, 2554, 2558, 2570, 2582, 2586, 2598, 2600, - 2610, 2613, 2617, 2622, 2626, 2635, 2637, 2645, - 2646, 2670, 2672, 2684, 2691, 2693, 2697, 2701, - 2703, 2711, 2715, 2716, 2720, 2722, 2724, 2726, - 2731, 2737, 2741, 2749, 2755, 2757, 2759, 2763, - 2772, 2776, 2782, 2786, 2790, 2792, 2794, 2795, - 2797, 2799, 2801, 2803, 2819, 2821, 2825, 2827, - 2829, 2834, 2838, 2846, 2850, 2852, 2856, 2868, - 2870, 2877, 2884, 2889, 2895, 2900, 2901, 2905, - 2907, 2913, 2919, 2920, 2921, 2923, 2932, 2934, - 2956, 2960, 2966, 2972, 2974, 2980, 2981, 2985, - 2993, 2995, 2999, 3004, 3017, 3019, 3025, 3029, - 3033, 3039, 3041, 3043, 3047, 3053, 3055, 3057, - 3059, 3061, 3062, 3066, 3073, 3077, 3083, 3085, - 3087, 3091, 3095, 3100, 3101, 3103, 3104, 3110, - 3113, 3115, 3115, 3119, 3121, 3131, 3134, 3141, - 3151, 3172, 3173, 3175, 3177, 3179, 3182, 3191, - 3195, 3197, 3207, 3210, 3217, 3227, 3234, 3244, - 3257, 3264, 3268, 3272, 3281, 3313, 3320, 3324, - 3326, 3329, 3339, 3355, 3375, 3394, 3413, 3430, - 3444, 3461, 3478, 3499, 3509, 3522, 3539, 3554, - 3571, 3582, 3601, 3610, 3622, 3625, 3629, 3634, - 3638, 3648, 3654, 3664, 3665, 3714, 3716, 3728, - 3737, 3743, 3753, 3763, 3765, 3773, 3779, 3784, - 3790, 3794, 3799, 3805, 3811, 3821, 3833, 3837, - 3841, 3849, 3862, 3866, 3884, 3890, 3901, 3903, - 3909, 3914, 3924, 3929, 3934, 3936, 3966, 3972, - 3979, 3985, 3989, 3996, 4002, 4014, 4022, 4028, - 4034, 4047, 4051, 4060, 4067, 4076, 4084, 4101, - 4113, 4121, 4127, 4133, 4136, 4139, 4143, 4153, - 4163, 4202, 4203, 4206, 4212, 4218, 4234, 4240, - 4265, 4271, 4277, 4283, 4287, 4295, 4299, 4305, - 4318, 4324, 4332, 4349, 4365, 4369, 4378, 4384, - 4390, 4397, 4401, 4405, 4411, 4423, 4427, 4431, - 4435, 4443, 4449, 4453, 4456, 4464, 4484, 4488, - 4494, 4496, 4503, 4507, 4511, 4516, 4523, 4529, - 4530, 4536, 4539, 4541, 4541, 4543, 4548, 4551, - 4559, 4563, 4565, 4567, 4569, 4599, 4607, 4609, - 4611, 4614, 4619, 4624, 4634, 4646, 4652, 4657, - 4667, 4670, 4677, 4681, 4689, 4699, 4703, 4711, - 4713, 4721, 4724, 4726, 4731, 4733, 4740, 4742, - 4750, 4751, 4772, 4774, 4784, 4789, 4791, 4795, - 4799, 4801, 4805, 4807, 4808, 4812, 4814, 4819, - 4821, 4825, 4829, 4833, 4835, 4837, 4846, 4850, - 4856, 4860, 4864, 4866, 4868, 4869, 4871, 4873, - 4875, 4877, 4892, 4896, 4898, 4900, 4905, 4909, - 4913, 4915, 4917, 4921, 4925, 4927, 4932, 4939, - 4944, 4948, 4954, 4962, 4968, 4972, 4974, 4980, - 4985, 4986, 4987, 4989, 4998, 5000, 5019, 5023, - 5025, 5031, 5035, 5036, 5040, 5044, 5046, 5048, - 5053, 5066, 5068, 5070, 5074, 5078, 5080, 5082, - 5084, 5088, 5090, 5092, 5094, 5096, 5097, 5101, - 5107, 5111, 5117, 5119, 5123, 5127, 5132, 5133, - 5135, 5136, 5142, 5145, 5147, 5147, 5152, 5162, - 5164, 5174, 5182, 5185, 5192, 5203, 5210, 5220, - 5233, 5240, 5244, 5248, 5257, 5289, 5296, 5300, - 5302, 5305, 5315, 5331, 5351, 5370, 5389, 5406, - 5420, 5437, 5454, 5475, 5485, 5498, 5515, 5530, - 5547, 5558, 5577, 5586, 5598, 5601, 5605, 5610, - 5614, 5624, 5630, 5640, 5641, 5690, 5692, 5704, - 5713, 5719, 5729, 5739, 5741, 5749, 5755, 5760, - 5766, 5770, 5775, 5781, 5787, 5797, 5809, 5813, - 5817, 5830, 5834, 5852, 5862, 5873, 5875, 5881, - 5886, 5896, 5901, 5906, 5908, 5938, 5945, 5951, - 5955, 5962, 5968, 5980, 5988, 5994, 6000, 6013, - 6017, 6026, 6033, 6042, 6050, 6067, 6078, 6085, - 6093, 6096, 6102, 6106, 6116, 6126, 6165, 6166, - 6169, 6175, 6191, 6197, 6222, 6228, 6234, 6240, - 6248, 6252, 6258, 6271, 6277, 6285, 6302, 6318, - 6322, 6331, 6337, 6343, 6350, 6354, 6358, 6370, - 6374, 6378, 6384, 6388, 6391, 6399, 6419, 6423, - 6429, 6431, 6435, 6439, 6444, 6451, 6457, 6458, - 6464, 6467, 6469, 6469, 6471, 6478, 6488, 6501, - 6508, 6512, 6516, 6525, 6557, 6564, 6568, 6570, - 6573, 6583, 6599, 6619, 6638, 6657, 6674, 6688, - 6705, 6722, 6743, 6753, 6766, 6783, 6798, 6815, - 6826, 6845, 6854, 6866, 6869, 6873, 6878, 6882, - 6892, 6898, 6908, 6909, 6958, 6960, 6972, 6981, - 6987, 6997, 7007, 7009, 7017, 7023, 7028, 7034, - 7038, 7043, 7049, 7055, 7065, 7077, 7081, 7085, - 7098, 7102, 7120, 7126, 7135, 7137, 7143, 7148, - 7158, 7168, 7175, 7176, 7178, 7180, 7182, 7185, - 7190, 7195, 7198, 7206, 7210, 7212, 7214, 7216, - 7246, 7254, 7256, 7258, 7261, 7266, 7271, 7281, - 7293, 7299, 7304, 7314, 7317, 7324, 7328, 7336, - 7346, 7350, 7358, 7360, 7368, 7371, 7373, 7378, - 7380, 7387, 7389, 7397, 7398, 7419, 7421, 7431, - 7436, 7438, 7442, 7446, 7448, 7452, 7454, 7455, - 7459, 7461, 7466, 7468, 7472, 7476, 7480, 7482, - 7484, 7493, 7497, 7503, 7509, 7518, 7520, 7522, - 7523, 7525, 7532, 7536, 7540, 7543, 7545, 7547, - 7549, 7564, 7568, 7570, 7572, 7577, 7581, 7585, - 7587, 7589, 7593, 7597, 7599, 7604, 7611, 7616, - 7620, 7628, 7629, 7635, 7637, 7638, 7640, 7642, - 7644, 7650, 7655, 7656, 7657, 7659, 7668, 7670, - 7689, 7693, 7695, 7701, 7705, 7706, 7710, 7714, - 7716, 7718, 7723, 7736, 7738, 7740, 7744, 7748, - 7750, 7752, 7754, 7758, 7760, 7762, 7764, 7766, - 7768, 7769, 7773, 7779, 7783, 7789, 7791, 7795, - 7799, 7804, 7805, 7807, 7808, 7814, 7817, 7819, - 7819, 7825, 7855, 7862, 7868, 7872, 7879, 7885, - 7897, 7905, 7911, 7917, 7930, 7934, 7943, 7950, - 7959, 7967, 7984, 7996, 8002, 8005, 8009, 8015, - 8025, 8035, 8074, 8075, 8078, 8084, 8100, 8106, - 8131, 8137, 8143, 8149, 8157, 8161, 8167, 8180, - 8186, 8194, 8211, 8227, 8231, 8240, 8246, 8252, - 8259, 8263, 8267, 8279, 8283, 8287, 8293, 8297, - 8301, 8309, 8329, 8333, 8339, 8341, 8345, 8349, - 8354, 8361, 8367, 8368, 8374, 8377, 8379, 8379, - 8381, 8385, 8387, 8397, 8400, 8408, 8418, 8427, - 8436, 8449, 8456, 8460, 8464, 8474, 8506, 8513, - 8517, 8519, 8522, 8530, 8546, 8564, 8583, 8600, - 8617, 8629, 8646, 8663, 8684, 8694, 8707, 8722, - 8737, 8754, 8765, 8782, 8791, 8803, 8806, 8810, - 8815, 8819, 8829, 8835, 8845, 8846, 8895, 8897, - 8909, 8915, 8921, 8931, 8941, 8943, 8949, 8955, - 8960, 8966, 8970, 8975, 8981, 8987, 8995, 9007, - 9011, 9015, 9028, 9032, 9050, 9059, 9071, 9073, - 9079, 9084, 9094, 9099, 9104, 9106, 9136, 9143, - 9149, 9153, 9160, 9166, 9176, 9184, 9190, 9196, - 9205, 9209, 9218, 9225, 9234, 9242, 9259, 9271, - 9279, 9288, 9291, 9298, 9302, 9312, 9322, 9361, - 9362, 9365, 9371, 9387, 9393, 9418, 9424, 9428, - 9434, 9442, 9446, 9452, 9463, 9469, 9477, 9494, - 9510, 9514, 9521, 9527, 9533, 9538, 9542, 9546, - 9558, 9562, 9566, 9572, 9576, 9579, 9587, 9607, - 9611, 9617, 9619, 9623, 9627, 9632, 9639, 9645, - 9646, 9652, 9655, 9657, 9657, 9659, 9664, 9670, - 9671, 9676, 9687, 9694, 9701, 9710, 9712, 9714, - 9719, 9751, 9753, 9755, 9757, 9762, 9773, 9788, - 9807, 9822, 9838, 9852, 9868, 9883, 9904, 9914, - 9926, 9939, 9953, 9968, 9978, 9992, 10001, 10013, - 10016, 10020, 10025, 10029, 10039, 10045, 10051, 10052, - 10101, 10103, 10115, 10124, 10128, 10134, 10142, 10144, - 10152, 10158, 10162, 10168, 10173, 10179, 10187, 10193, - 10195, 10197, 10203, 10207, 10225, 10235, 10246, 10248, - 10252, 10258, 10268, 10273, 10278, 10280, 10310, 10315, - 10317, 10328, 10334, 10338, 10350, 10352, 10358, 10365, - 10370, 10376, 10393, 10405, 10412, 10416, 10418, 10428, - 10438, 10477, 10478, 10482, 10486, 10499, 10503, 10528, - 10534, 10538, 10542, 10545, 10554, 10558, 10564, 10580, - 10594, 10601, 10605, 10609, 10617, 10621, 10633, 10637, - 10641, 10643, 10646, 10654, 10674, 10678, 10684, 10686, - 10690, 10694, 10699, 10706, 10710, 10711, 10717, 10720, - 10722, 10726, 10728, 10738, 10741, 10748, 10758, 10765, - 10775, 10788, 10795, 10799, 10803, 10812, 10844, 10851, - 10855, 10857, 10860, 10870, 10886, 10906, 10925, 10944, - 10961, 10975, 10992, 11009, 11030, 11040, 11053, 11070, - 11085, 11102, 11113, 11132, 11141, 11153, 11156, 11160, - 11165, 11169, 11179, 11185, 11195, 11196, 11245, 11247, - 11259, 11268, 11274, 11284, 11294, 11296, 11304, 11310, - 11315, 11321, 11323, 11325, 11329, 11334, 11340, 11346, - 11356, 11368, 11372, 11376, 11384, 11397, 11401, 11419, - 11425, 11434, 11436, 11442, 11447, 11457, 11467, 11474, - 11480, 11510, 11516, 11523, 11529, 11533, 11540, 11546, - 11558, 11566, 11572, 11578, 11591, 11595, 11604, 11611, - 11620, 11628, 11645, 11657, 11663, 11669, 11672, 11675, - 11681, 11691, 11701, 11740, 11741, 11744, 11750, 11756, - 11772, 11778, 11803, 11809, 11815, 11821, 11825, 11833, - 11837, 11843, 11856, 11862, 11870, 11887, 11903, 11907, - 11916, 11922, 11928, 11935, 11939, 11941, 11945, 11951, - 11963, 11967, 11971, 11975, 11983, 11989, 11993, 11997, - 12005, 12025, 12029, 12035, 12037, 12044, 12048, 12052, - 12057, 12064, 12070, 12071, 12077, 12080, 12082, 12082, - 12084, 12088, 12090, 12100, 12103, 12111, 12121, 12130, - 12139, 12152, 12159, 12163, 12167, 12177, 12209, 12216, - 12220, 12222, 12225, 12233, 12249, 12267, 12286, 12303, - 12320, 12332, 12349, 12366, 12387, 12397, 12410, 12425, - 12440, 12457, 12468, 12485, 12494, 12506, 12509, 12513, - 12518, 12522, 12532, 12538, 12548, 12549, 12598, 12600, - 12612, 12618, 12624, 12634, 12644, 12646, 12652, 12658, - 12663, 12669, 12673, 12678, 12684, 12690, 12698, 12710, - 12714, 12718, 12731, 12735, 12753, 12762, 12774, 12776, - 12782, 12787, 12797, 12802, 12807, 12809, 12839, 12846, - 12852, 12856, 12863, 12869, 12879, 12887, 12893, 12899, - 12908, 12912, 12921, 12928, 12937, 12945, 12962, 12974, - 12982, 12991, 12994, 13001, 13005, 13015, 13025, 13064, - 13065, 13068, 13074, 13090, 13096, 13121, 13127, 13131, - 13137, 13145, 13149, 13155, 13166, 13172, 13180, 13197, - 13213, 13217, 13224, 13230, 13236, 13241, 13245, 13249, - 13261, 13265, 13269, 13275, 13279, 13282, 13290, 13310, - 13314, 13320, 13322, 13326, 13330, 13335, 13342, 13348, - 13349, 13355, 13358, 13360, 13360, 13362, 13363, 13365, - 13367, 13369, 13372, 13377, 13382, 13388, 13398, 13402, - 13404, 13406, 13410, 13440, 13448, 13450, 13452, 13455, - 13464, 13469, 13483, 13497, 13507, 13512, 13524, 13527, - 13536, 13540, 13552, 13564, 13568, 13580, 13582, 13592, - 13595, 13599, 13604, 13608, 13617, 13619, 13627, 13628, - 13652, 13654, 13666, 13673, 13675, 13679, 13683, 13685, - 13693, 13697, 13698, 13702, 13704, 13709, 13715, 13719, - 13727, 13733, 13735, 13737, 13741, 13750, 13754, 13760, - 13764, 13768, 13770, 13772, 13773, 13775, 13777, 13779, - 13781, 13797, 13799, 13803, 13805, 13807, 13812, 13816, - 13824, 13828, 13830, 13834, 13846, 13848, 13855, 13862, - 13867, 13873, 13878, 13879, 13883, 13885, 13891, 13897, - 13898, 13899, 13901, 13910, 13912, 13934, 13938, 13944, - 13950, 13952, 13958, 13959, 13963, 13971, 13973, 13977, - 13982, 13995, 13997, 14003, 14007, 14011, 14017, 14019, - 14023, 14029, 14031, 14033, 14035, 14037, 14038, 14042, - 14049, 14053, 14059, 14061, 14063, 14067, 14071, 14076, - 14077, 14079, 14080, 14086, 14089, 14091, 14091, 14095, - 14097, 14107, 14110, 14118, 14128, 14137, 14148, 14161, - 14168, 14172, 14176, 14186, 14218, 14225, 14229, 14231, - 14234, 14244, 14260, 14280, 14299, 14318, 14335, 14349, - 14366, 14383, 14404, 14414, 14427, 14444, 14459, 14476, - 14487, 14506, 14515, 14527, 14530, 14534, 14539, 14543, - 14553, 14559, 14569, 14570, 14619, 14621, 14633, 14642, - 14648, 14658, 14668, 14670, 14678, 14684, 14689, 14695, - 14699, 14704, 14710, 14716, 14726, 14738, 14742, 14746, - 14759, 14763, 14781, 14790, 14802, 14804, 14810, 14815, - 14825, 14830, 14835, 14837, 14867, 14874, 14880, 14884, - 14891, 14897, 14909, 14917, 14923, 14929, 14942, 14946, - 14955, 14962, 14971, 14979, 14996, 15008, 15016, 15019, - 15023, 15033, 15043, 15082, 15083, 15086, 15092, 15108, - 15114, 15139, 15145, 15151, 15157, 15165, 15169, 15175, - 15188, 15194, 15202, 15219, 15235, 15239, 15248, 15254, - 15260, 15267, 15271, 15275, 15287, 15291, 15295, 15301, - 15305, 15308, 15316, 15336, 15340, 15346, 15348, 15352, - 15356, 15361, 15368, 15374, 15375, 15381, 15384, 15386, - 15386, 15388, 15393, 15395, 15405, 15408, 15415, 15426, - 15433, 15443, 15456, 15463, 15467, 15471, 15480, 15512, - 15519, 15523, 15525, 15528, 15538, 15554, 15574, 15593, - 15612, 15629, 15643, 15660, 15677, 15698, 15708, 15721, - 15738, 15753, 15770, 15781, 15800, 15809, 15821, 15824, - 15828, 15833, 15837, 15847, 15853, 15863, 15864, 15913, - 15915, 15927, 15936, 15942, 15952, 15962, 15964, 15972, - 15978, 15983, 15989, 15993, 15998, 16004, 16010, 16020, - 16032, 16036, 16040, 16053, 16057, 16075, 16085, 16096, - 16098, 16104, 16109, 16119, 16124, 16129, 16131, 16161, - 16168, 16174, 16178, 16185, 16191, 16203, 16211, 16217, - 16223, 16236, 16240, 16249, 16256, 16265, 16273, 16290, - 16302, 16309, 16312, 16316, 16326, 16336, 16375, 16376, - 16379, 16385, 16401, 16407, 16432, 16438, 16444, 16450, - 16458, 16462, 16468, 16481, 16487, 16495, 16512, 16528, - 16532, 16541, 16547, 16553, 16560, 16564, 16568, 16580, - 16584, 16588, 16594, 16598, 16601, 16609, 16629, 16633, - 16639, 16641, 16645, 16649, 16654, 16661, 16667, 16668, - 16674, 16677, 16679, 16679, 16681, 16685, 16687, 16697, - 16700, 16707, 16717, 16724, 16734, 16747, 16754, 16758, - 16762, 16771, 16803, 16810, 16814, 16816, 16819, 16829, - 16845, 16865, 16884, 16903, 16920, 16934, 16951, 16968, - 16989, 16999, 17012, 17029, 17044, 17061, 17072, 17091, - 17100, 17112, 17115, 17119, 17124, 17128, 17138, 17144, - 17154, 17155, 17204, 17206, 17218, 17227, 17233, 17243, - 17253, 17255, 17263, 17269, 17274, 17280, 17284, 17289, - 17295, 17301, 17311, 17323, 17327, 17331, 17344, 17348, - 17366, 17372, 17381, 17383, 17389, 17394, 17404, 17414, - 17421, 17427, 17457, 17464, 17470, 17474, 17481, 17487, - 17499, 17507, 17513, 17519, 17532, 17536, 17545, 17552, - 17561, 17569, 17586, 17598, 17604, 17610, 17613, 17616, - 17622, 17632, 17642, 17681, 17682, 17685, 17691, 17707, - 17713, 17738, 17744, 17750, 17756, 17764, 17768, 17774, - 17787, 17793, 17801, 17818, 17834, 17838, 17847, 17853, - 17859, 17866, 17870, 17874, 17886, 17890, 17894, 17900, - 17904, 17908, 17916, 17936, 17940, 17946, 17948, 17952, - 17956, 17961, 17968, 17974, 17975, 17981, 17984, 17986, - 17986, 17988, 17992, 17994, 18004, 18007, 18014, 18024, - 18031, 18041, 18054, 18061, 18065, 18069, 18078, 18110, - 18117, 18121, 18123, 18126, 18136, 18152, 18172, 18191, - 18210, 18227, 18241, 18258, 18275, 18296, 18306, 18319, - 18336, 18351, 18368, 18379, 18398, 18407, 18419, 18422, - 18426, 18431, 18435, 18445, 18451, 18461, 18462, 18511, - 18513, 18525, 18534, 18540, 18550, 18560, 18562, 18570, - 18576, 18581, 18587, 18591, 18596, 18602, 18608, 18618, - 18630, 18634, 18638, 18651, 18655, 18673, 18679, 18690, - 18692, 18698, 18703, 18713, 18723, 18730, 18736, 18766, - 18773, 18779, 18783, 18790, 18796, 18808, 18816, 18822, - 18828, 18841, 18845, 18854, 18861, 18870, 18878, 18895, - 18907, 18913, 18916, 18922, 18932, 18942, 18981, 18982, - 18985, 18991, 19007, 19013, 19038, 19044, 19050, 19056, - 19064, 19068, 19074, 19087, 19093, 19101, 19118, 19134, - 19138, 19147, 19153, 19159, 19166, 19170, 19174, 19186, - 19190, 19194, 19200, 19204, 19208, 19216, 19236, 19240, - 19246, 19248, 19252, 19256, 19261, 19268, 19274, 19275, - 19281, 19284, 19286, 19286, 19288, 19289, 19291, 19293, - 19295, 19298, 19303, 19308, 19311, 19319, 19323, 19325, - 19327, 19329, 19359, 19367, 19369, 19371, 19374, 19379, - 19384, 19394, 19406, 19412, 19417, 19427, 19430, 19437, - 19441, 19449, 19459, 19463, 19471, 19473, 19481, 19484, - 19486, 19491, 19493, 19500, 19502, 19510, 19511, 19532, - 19534, 19544, 19549, 19551, 19555, 19559, 19561, 19565, - 19567, 19568, 19572, 19574, 19579, 19581, 19585, 19589, - 19593, 19595, 19597, 19606, 19610, 19616, 19620, 19624, - 19626, 19628, 19629, 19631, 19633, 19635, 19637, 19652, - 19656, 19658, 19660, 19665, 19669, 19673, 19675, 19677, - 19681, 19685, 19687, 19692, 19699, 19704, 19708, 19713, - 19714, 19718, 19720, 19726, 19731, 19732, 19733, 19735, - 19744, 19746, 19765, 19769, 19771, 19777, 19781, 19782, - 19786, 19790, 19792, 19794, 19799, 19812, 19814, 19816, - 19820, 19824, 19826, 19828, 19830, 19834, 19836, 19838, - 19840, 19842, 19843, 19847, 19853, 19857, 19863, 19865, - 19869, 19873, 19878, 19879, 19881, 19882, 19888, 19891, - 19893, 19893, 19897, 19899, 19909, 19912, 19919, 19928, - 19935, 19942, 19955, 19962, 19966, 19970, 19977, 20009, - 20016, 20020, 20022, 20025, 20032, 20048, 20066, 20085, - 20102, 20119, 20129, 20146, 20161, 20182, 20190, 20203, - 20216, 20231, 20246, 20257, 20272, 20281, 20291, 20294, - 20296, 20301, 20303, 20311, 20317, 20327, 20328, 20375, - 20377, 20387, 20394, 20400, 20410, 20420, 20422, 20426, - 20430, 20435, 20441, 20445, 20450, 20452, 20458, 20464, - 20474, 20478, 20482, 20495, 20499, 20517, 20521, 20527, - 20529, 20535, 20540, 20550, 20555, 20560, 20562, 20592, - 20599, 20605, 20609, 20616, 20622, 20630, 20636, 20642, - 20648, 20653, 20657, 20664, 20671, 20680, 20686, 20703, - 20715, 20719, 20722, 20726, 20736, 20746, 20785, 20786, - 20789, 20795, 20811, 20817, 20841, 20847, 20849, 20855, - 20861, 20865, 20871, 20879, 20885, 20889, 20906, 20922, - 20926, 20931, 20937, 20943, 20946, 20950, 20952, 20964, - 20968, 20972, 20978, 20982, 20985, 20993, 21013, 21017, - 21023, 21025, 21029, 21033, 21038, 21045, 21051, 21052, - 21058, 21061, 21063, 21063, 21065, 21069, 21071, 21081, - 21084, 21092, 21102, 21111, 21122, 21135, 21142, 21146, - 21150, 21160, 21192, 21199, 21203, 21205, 21208, 21218, - 21234, 21254, 21273, 21292, 21309, 21323, 21340, 21357, - 21378, 21388, 21401, 21418, 21433, 21450, 21461, 21480, - 21489, 21501, 21504, 21508, 21513, 21517, 21527, 21533, - 21543, 21544, 21593, 21595, 21607, 21616, 21622, 21632, - 21642, 21644, 21652, 21658, 21663, 21669, 21673, 21678, - 21684, 21690, 21700, 21712, 21716, 21720, 21733, 21737, - 21755, 21764, 21776, 21778, 21784, 21789, 21799, 21804, - 21809, 21811, 21841, 21848, 21854, 21858, 21865, 21871, - 21883, 21891, 21897, 21903, 21916, 21920, 21929, 21936, - 21945, 21953, 21970, 21982, 21990, 21993, 21997, 22007, - 22017, 22056, 22057, 22060, 22066, 22082, 22088, 22113, - 22119, 22125, 22131, 22139, 22143, 22149, 22162, 22168, - 22176, 22193, 22209, 22213, 22222, 22228, 22234, 22241, - 22245, 22249, 22261, 22265, 22269, 22275, 22279, 22282, - 22290, 22310, 22314, 22320, 22322, 22326, 22330, 22335, - 22342, 22348, 22349, 22355, 22358, 22360, 22360, 22362, - 22366, 22368, 22378, 22381, 22388, 22398, 22405, 22415, - 22428, 22435, 22439, 22443, 22452, 22484, 22491, 22495, - 22497, 22500, 22510, 22526, 22546, 22565, 22584, 22601, - 22615, 22632, 22649, 22670, 22680, 22693, 22710, 22725, - 22742, 22753, 22772, 22781, 22793, 22796, 22800, 22805, - 22809, 22819, 22825, 22835, 22836, 22885, 22887, 22899, - 22908, 22914, 22924, 22934, 22936, 22944, 22950, 22955, - 22961, 22965, 22970, 22976, 22982, 22992, 23004, 23008, - 23012, 23025, 23029, 23047, 23053, 23064, 23066, 23072, - 23077, 23087, 23097, 23104, 23110, 23140, 23147, 23153, - 23157, 23164, 23170, 23182, 23190, 23196, 23202, 23215, - 23219, 23228, 23235, 23244, 23252, 23269, 23281, 23287, - 23290, 23296, 23306, 23316, 23355, 23356, 23359, 23365, - 23381, 23387, 23412, 23418, 23424, 23430, 23438, 23442, - 23448, 23461, 23467, 23475, 23492, 23508, 23512, 23521, - 23527, 23533, 23540, 23544, 23548, 23560, 23564, 23568, - 23574, 23578, 23582, 23590, 23610, 23614, 23620, 23622, - 23626, 23630, 23635, 23642, 23648, 23649, 23655, 23658, - 23660, 23660, 23662, 23663, 23665, 23667, 23669, 23672, - 23677, 23682, 23685, 23693, 23697, 23699, 23701, 23703, - 23733, 23754, 23760, 23762, 23777, 23782, 23788, 23789, - 23796, 23800, 23803, 23813, 23829, 23849, 23868, 23887, - 23904, 23918, 23935, 23952, 23973, 23983, 23996, 24013, - 24028, 24045, 24056, 24075, 24084, 24096, 24100, 24104, - 24114, 24120, 24130, 24142, 24151, 24153, 24158, 24160, - 24170, 24173, 24180, 24191, 24198, 24208, 24221, 24228, - 24232, 24236, 24245, 24277, 24284, 24288, 24290, 24293, - 24303, 24319, 24339, 24358, 24377, 24394, 24408, 24425, - 24442, 24463, 24473, 24486, 24503, 24518, 24535, 24546, - 24565, 24574, 24586, 24589, 24593, 24598, 24602, 24612, - 24618, 24628, 24629, 24682, 24684, 24696, 24705, 24705, - 24707, 24713, 24723, 24733, 24735, 24743, 24749, 24754, - 24760, 24764, 24769, 24775, 24781, 24791, 24803, 24807, - 24811, 24824, 24828, 24846, 24856, 24867, 24869, 24875, - 24880, 24890, 24897, 24902, 24904, 24908, 24914, 24916, - 24917, 24919, 24921, 24923, 24926, 24931, 24936, 24939, - 24947, 24951, 24953, 24955, 24957, 24987, 24995, 24997, - 24999, 25002, 25007, 25012, 25022, 25034, 25040, 25045, - 25055, 25058, 25065, 25069, 25077, 25087, 25091, 25099, - 25101, 25109, 25112, 25114, 25119, 25121, 25128, 25130, - 25138, 25139, 25164, 25166, 25176, 25181, 25181, 25183, - 25185, 25189, 25193, 25195, 25199, 25201, 25202, 25206, - 25208, 25213, 25215, 25219, 25223, 25227, 25229, 25231, - 25240, 25244, 25250, 25254, 25258, 25260, 25262, 25263, - 25265, 25272, 25274, 25276, 25278, 25280, 25282, 25300, - 25304, 25306, 25308, 25313, 25317, 25321, 25323, 25327, - 25331, 25335, 25337, 25342, 25349, 25354, 25358, 25358, - 25362, 25364, 25368, 25373, 25374, 25378, 25380, 25390, - 25396, 25401, 25402, 25403, 25405, 25414, 25416, 25435, - 25439, 25441, 25447, 25451, 25452, 25456, 25460, 25462, - 25464, 25469, 25482, 25484, 25486, 25490, 25494, 25496, - 25498, 25500, 25504, 25506, 25508, 25510, 25512, 25513, - 25517, 25523, 25527, 25533, 25535, 25539, 25543, 25548, - 25549, 25551, 25552, 25558, 25561, 25593, 25600, 25606, - 25610, 25617, 25623, 25635, 25643, 25651, 25657, 25670, - 25674, 25683, 25690, 25699, 25707, 25707, 25711, 25713, - 25717, 25734, 25746, 25753, 25756, 25758, 25768, 25778, - 25817, 25818, 25821, 25827, 25843, 25849, 25874, 25880, - 25886, 25892, 25900, 25904, 25910, 25923, 25929, 25937, - 25954, 25970, 25974, 25983, 25989, 25995, 26002, 26006, - 26010, 26022, 26026, 26030, 26036, 26040, 26043, 26051, - 26071, 26075, 26081, 26083, 26087, 26091, 26096, 26103, - 26109, 26110, 26116, 26119, 26121, 26123, 26129, 26139, - 26149, 26157, 26163, 26168, 26174, 26178, 26184, 26190, - 26200, 26212, 26216, 26220, 26233, 26241, 26252, 26258, - 26263, 26273, 26277, 26278, 26280, 26282, 26284, 26287, - 26292, 26297, 26300, 26308, 26312, 26314, 26316, 26318, - 26348, 26356, 26358, 26360, 26363, 26368, 26373, 26383, - 26395, 26401, 26406, 26416, 26419, 26426, 26430, 26438, - 26448, 26452, 26460, 26462, 26470, 26473, 26475, 26480, - 26482, 26489, 26491, 26499, 26500, 26521, 26523, 26533, - 26538, 26540, 26544, 26548, 26550, 26554, 26556, 26557, - 26561, 26563, 26568, 26570, 26574, 26578, 26582, 26584, - 26586, 26595, 26599, 26605, 26609, 26613, 26615, 26617, - 26618, 26620, 26622, 26624, 26626, 26641, 26645, 26647, - 26649, 26654, 26658, 26662, 26664, 26666, 26670, 26674, - 26676, 26681, 26688, 26693, 26697, 26702, 26703, 26707, - 26709, 26715, 26720, 26721, 26722, 26724, 26733, 26735, - 26754, 26758, 26760, 26766, 26770, 26771, 26775, 26779, - 26781, 26783, 26788, 26801, 26803, 26805, 26809, 26813, - 26815, 26817, 26819, 26823, 26825, 26827, 26829, 26831, - 26832, 26836, 26842, 26846, 26852, 26854, 26858, 26862, - 26867, 26868, 26870, 26871, 26877, 26880, 26882, 26882, - 26884, 26886, 26900, 26905, 26907, 26917, 26920, 26927, - 26938, 26945, 26955, 26968, 26975, 26979, 26983, 26992, - 27024, 27031, 27035, 27037, 27040, 27050, 27066, 27086, - 27105, 27124, 27141, 27155, 27172, 27189, 27210, 27220, - 27233, 27250, 27265, 27282, 27293, 27312, 27321, 27333, - 27336, 27340, 27345, 27349, 27359, 27365, 27375, 27376, - 27425, 27427, 27439, 27448, 27454, 27464, 27474, 27476, - 27484, 27490, 27495, 27501, 27505, 27510, 27516, 27522, - 27532, 27544, 27548, 27552, 27565, 27569, 27587, 27597, - 27608, 27610, 27616, 27621, 27631, 27636, 27641, 27643, - 27673, 27680, 27686, 27690, 27697, 27703, 27715, 27723, - 27729, 27735, 27748, 27752, 27761, 27768, 27777, 27785, - 27802, 27814, 27821, 27824, 27828, 27838, 27848, 27887, - 27888, 27891, 27897, 27913, 27919, 27944, 27950, 27956, - 27962, 27970, 27974, 27980, 27993, 27999, 28007, 28024, - 28040, 28044, 28053, 28059, 28065, 28072, 28076, 28080, - 28092, 28096, 28100, 28106, 28110, 28113, 28121, 28141, - 28145, 28151, 28153, 28157, 28161, 28166, 28173, 28179, - 28180, 28186, 28189, 28191, 28191, 28193, 28194, 28196, - 28198, 28200, 28203, 28208, 28213, 28216, 28224, 28228, - 28230, 28232, 28234, 28264, 28272, 28274, 28276, 28279, - 28284, 28289, 28299, 28311, 28317, 28322, 28332, 28335, - 28342, 28346, 28354, 28364, 28368, 28376, 28378, 28386, - 28389, 28391, 28396, 28398, 28405, 28407, 28415, 28416, - 28441, 28443, 28453, 28458, 28460, 28464, 28468, 28470, - 28474, 28476, 28477, 28481, 28483, 28488, 28490, 28494, - 28498, 28502, 28504, 28506, 28515, 28519, 28525, 28529, - 28533, 28535, 28537, 28538, 28540, 28547, 28549, 28551, - 28569, 28573, 28575, 28577, 28582, 28586, 28590, 28592, - 28596, 28600, 28604, 28606, 28611, 28618, 28623, 28627, - 28632, 28633, 28637, 28641, 28651, 28657, 28662, 28663, - 28664, 28666, 28675, 28677, 28696, 28700, 28702, 28708, - 28712, 28713, 28717, 28721, 28723, 28725, 28730, 28743, - 28745, 28747, 28751, 28755, 28757, 28759, 28761, 28765, - 28767, 28769, 28771, 28773, 28774, 28778, 28784, 28788, - 28794, 28796, 28800, 28804, 28809, 28810, 28812, 28813, - 28819, 28822, 28824, 28824, 28825, 28827, 28829, 28831, - 28834, 28839, 28844, 28847, 28855, 28859, 28861, 28863, - 28865, 28895, 28903, 28905, 28907, 28910, 28915, 28920, - 28930, 28942, 28948, 28953, 28963, 28966, 28973, 28977, - 28985, 28995, 28999, 29007, 29009, 29017, 29020, 29022, - 29027, 29029, 29036, 29038, 29046, 29047, 29068, 29070, - 29080, 29085, 29087, 29091, 29095, 29097, 29101, 29103, - 29104, 29108, 29110, 29115, 29117, 29121, 29125, 29129, - 29131, 29133, 29142, 29146, 29152, 29158, 29167, 29169, - 29171, 29172, 29174, 29181, 29185, 29189, 29192, 29194, - 29196, 29198, 29213, 29217, 29219, 29221, 29226, 29230, - 29234, 29236, 29238, 29242, 29246, 29248, 29253, 29260, - 29265, 29269, 29277, 29278, 29284, 29286, 29288, 29290, - 29296, 29301, 29302, 29303, 29305, 29314, 29316, 29335, - 29339, 29341, 29347, 29351, 29352, 29356, 29360, 29362, - 29364, 29369, 29382, 29384, 29386, 29390, 29394, 29396, - 29398, 29400, 29404, 29406, 29408, 29410, 29412, 29414, - 29415, 29419, 29425, 29429, 29435, 29437, 29441, 29445, - 29450, 29451, 29453, 29454, 29460, 29463, 29465, 29465, - 29467, 29468, 29470, 29472, 29474, 29477, 29482, 29487, - 29490, 29498, 29502, 29504, 29506, 29508, 29538, 29546, - 29548, 29550, 29553, 29558, 29563, 29573, 29585, 29591, - 29596, 29606, 29609, 29616, 29620, 29628, 29638, 29642, - 29650, 29652, 29660, 29663, 29665, 29670, 29672, 29679, - 29681, 29689, 29690, 29711, 29713, 29723, 29728, 29730, - 29734, 29738, 29740, 29744, 29746, 29747, 29751, 29753, - 29758, 29760, 29764, 29768, 29772, 29774, 29776, 29785, - 29789, 29795, 29799, 29803, 29805, 29807, 29808, 29810, - 29812, 29814, 29816, 29831, 29835, 29837, 29839, 29844, - 29848, 29852, 29854, 29856, 29860, 29864, 29866, 29871, - 29878, 29883, 29887, 29892, 29893, 29897, 29899, 29905, - 29910, 29911, 29912, 29914, 29923, 29925, 29944, 29948, - 29950, 29956, 29960, 29961, 29965, 29969, 29971, 29973, - 29978, 29991, 29993, 29995, 29999, 30003, 30005, 30007, - 30009, 30013, 30015, 30017, 30019, 30021, 30022, 30026, - 30032, 30036, 30042, 30044, 30048, 30052, 30057, 30058, - 30060, 30061, 30067, 30070, 30072, 30072, 30080, 30081, - 30082, 30084, 30086, 30088, 30091, 30096, 30101, 30104, - 30112, 30116, 30118, 30120, 30122, 30152, 30160, 30162, - 30164, 30167, 30172, 30177, 30187, 30199, 30205, 30210, - 30220, 30223, 30230, 30234, 30242, 30252, 30256, 30264, - 30266, 30274, 30277, 30279, 30284, 30286, 30293, 30295, - 30303, 30304, 30325, 30327, 30337, 30342, 30344, 30348, - 30352, 30354, 30358, 30360, 30361, 30365, 30367, 30372, - 30374, 30378, 30382, 30386, 30388, 30390, 30399, 30403, - 30409, 30413, 30417, 30419, 30421, 30422, 30424, 30426, - 30428, 30430, 30445, 30449, 30451, 30453, 30458, 30462, - 30466, 30468, 30470, 30474, 30478, 30480, 30485, 30492, - 30497, 30501, 30506, 30507, 30511, 30513, 30519, 30524, - 30525, 30526, 30528, 30537, 30539, 30558, 30562, 30564, - 30570, 30574, 30575, 30579, 30583, 30585, 30587, 30592, - 30605, 30607, 30609, 30613, 30617, 30619, 30621, 30623, - 30627, 30629, 30631, 30633, 30635, 30636, 30640, 30646, - 30650, 30656, 30658, 30662, 30666, 30671, 30672, 30674, - 30675, 30681, 30684, 30686, 30686, 30688, 30690, 30692, - 30695, 30700, 30705, 30708, 30716, 30720, 30722, 30724, - 30726, 30756, 30777, 30783, 30785, 30800, 30805, 30811, - 30812, 30814, 30821, 30827, 30831, 30838, 30844, 30856, - 30864, 30872, 30878, 30891, 30895, 30904, 30913, 30921, - 30922, 30927, 30929, 30939, 30942, 30949, 30960, 30967, - 30977, 30990, 30997, 31001, 31005, 31014, 31046, 31053, - 31057, 31059, 31062, 31072, 31088, 31108, 31127, 31146, - 31163, 31177, 31194, 31211, 31232, 31242, 31255, 31272, - 31287, 31304, 31315, 31334, 31343, 31355, 31358, 31362, - 31367, 31371, 31381, 31387, 31397, 31398, 31451, 31453, - 31465, 31474, 31480, 31490, 31500, 31502, 31510, 31516, - 31521, 31527, 31531, 31536, 31542, 31548, 31558, 31570, - 31574, 31578, 31591, 31595, 31613, 31623, 31634, 31636, - 31642, 31647, 31657, 31664, 31669, 31671, 31703, 31710, - 31716, 31720, 31727, 31733, 31745, 31753, 31761, 31767, - 31780, 31784, 31793, 31800, 31809, 31817, 31834, 31846, - 31853, 31856, 31860, 31870, 31880, 31919, 31920, 31923, - 31929, 31945, 31951, 31976, 31982, 31988, 31994, 32002, - 32006, 32012, 32025, 32031, 32039, 32056, 32072, 32076, - 32085, 32091, 32097, 32104, 32108, 32112, 32124, 32128, - 32132, 32138, 32142, 32145, 32153, 32173, 32177, 32183, - 32185, 32189, 32193, 32198, 32205, 32211, 32212, 32218, - 32221, 32223, 32223, 32225, 32227, 32229, 32231, 32234, - 32239, 32244, 32247, 32255, 32259, 32261, 32263, 32265, - 32295, 32316, 32322, 32324, 32339, 32344, 32350, 32351, - 32353, 32355, 32367, 32373, 32376, 32380, 32386, 32396, - 32435, 32438, 32444, 32460, 32466, 32491, 32497, 32503, - 32509, 32517, 32521, 32527, 32540, 32546, 32554, 32571, - 32587, 32591, 32600, 32606, 32612, 32619, 32623, 32627, - 32639, 32643, 32647, 32653, 32657, 32661, 32663, 32671, - 32691, 32698, 32704, 32709, 32711, 32712, 32714, 32716, - 32718, 32721, 32726, 32731, 32734, 32742, 32746, 32748, - 32750, 32752, 32782, 32790, 32792, 32794, 32797, 32802, - 32807, 32817, 32829, 32835, 32840, 32850, 32853, 32860, - 32864, 32872, 32882, 32886, 32894, 32896, 32904, 32907, - 32909, 32914, 32916, 32923, 32925, 32933, 32934, 32955, - 32957, 32967, 32972, 32974, 32978, 32982, 32984, 32988, - 32990, 32991, 32995, 32997, 33002, 33004, 33008, 33012, - 33016, 33018, 33020, 33029, 33033, 33039, 33043, 33047, - 33049, 33051, 33052, 33054, 33056, 33058, 33060, 33075, - 33079, 33081, 33083, 33088, 33092, 33096, 33098, 33100, - 33104, 33108, 33110, 33115, 33122, 33127, 33131, 33136, - 33137, 33141, 33143, 33150, 33155, 33156, 33157, 33159, - 33168, 33170, 33189, 33193, 33195, 33201, 33205, 33206, - 33210, 33214, 33216, 33218, 33223, 33236, 33238, 33240, - 33244, 33248, 33250, 33252, 33254, 33258, 33260, 33262, - 33264, 33266, 33267, 33271, 33277, 33281, 33287, 33289, - 33293, 33297, 33302, 33303, 33305, 33306, 33307, 33313, - 33316, 33318, 33318, 33319, 33322, 33322, 33324, 33326, - 33329, 33331, 33333, 33336, 33338, 33342, 33344, 33393, - 33414, 33415, 33460, 33505, 33549, 33594, 33635, 33680, - 33721, 33743, 33784, 33828, 33869, 33910, 33936, 33957, - 33984, 34029, 34081, 34107, 34128, 34178, 34216, 34261, - 34302, 34348, 34395, 34444, 34493, 34540, 34592, 34644, - 34667, 34690, 34742, 34788, 34834, 34908, 34973, 35023, - 35069, 35128, 35177, 35227, 35272, 35303, 35330, 35359, - 35381, 35403, 35425, 35450, 35476, 35508, 35536, 35564, - 35594, 35617, 35640, 35663, 35689, 35742, 35812, 35851, - 35877, 35928, 35980, 36026, 36076, 36097, 36143, 36197, - 36246, 36292, 36340, 36388, 36438, 36463, 36501, 36532, - 36554, 36606, 36652, 36697, 36745, 36791, 36840, 36886, - 36938, 36990, 37038, 37084, 37130, 37183, 37231, 37279, - 37327, 37373, 37419, 37464, 37510, 37556, 37602, 37650, - 37696, 37742, 37791, 37843, 37895, 37941, 37987, 38039, - 38092, 38138, 38187, 38238, 38287, 38335, 38380, 38428, - 38474, 38523, 38586, 38634, 38679, 38729, 38774, 38824, - 38871, 38924, 38977, 39035, 39095, 39149, 39198, 39252, - 39299, 39350, 39402, 39458, 39512, 39564, 39620, 39666, - 39718, 39765, 39811, 39860, 39906, 39957, 40003, 40055, - 40100, 40130, 40153, 40175, 40198, 40220, 40243, 40266, - 40290, 40316, 40342, 40366, 40395, 40420, 40443, 40466, - 40490, 40516, 40542, 40566, 40595, 40620, 40643, 40666, - 40689, 40740, 40782, 40809, 40832, 40868, 40894, 40921, - 40943, 40966, 40989, 41012, 41063, 41105, 41132, 41155, - 41191, 41217, 41244, 41266, 41297, 41326, 41350, 41378, - 41409, 41437, 41468, 41502, 41530, 41555, 41580, 41610, - 41663, 41737, 41781, 41805, 41850, 41871, 41908, 41952, - 41976, 41998, 42019, 42040, 42069, 42092, 42115, 42137, - 42160, 42182, 42205, 42228, 42251, 42275, 42301, 42327, - 42351, 42380, 42405, 42428, 42451, 42475, 42501, 42527, - 42551, 42580, 42605, 42628, 42651, 42674, 42725, 42767, - 42794, 42817, 42853, 42879, 42906, 42928, 42951, 42974, - 42997, 43048, 43090, 43117, 43140, 43176, 43202, 43229, - 43251, 43275, 43301, 43327, 43358, 43391, 43418, 43444, - 43475, 43499, 43527, 43552, 43581, 43612, 43637, 43666, - 43689, 43718, 43742, 43765, 43791, 43814, 43842, 43865, - 43894, 43916, 43939, 43970, 43996, 44019, 44044, 44069, - 44092, 44117, 44140, 44162, 44187, 44210, 44236, 44259, - 44284, 44309, 44334, 44357, 44380, 44410, 44435, 44460, - 44485, 44508, 44531, 44553, 44576, 44599, 44622, 44647, - 44670, 44693, 44719, 44744, 44769, 44792, 44815, 44840, - 44865, 44888, 44914, 44942, 44968, 44993, 45015, 45040, - 45063, 45089, 45129, 45154, 45176, 45203, 45225, 45252, - 45276, 45297, 45321, 45374, 45418, 45470, 45516, 45566, - 45592, 45615, 45660, 45712, 45743, 45767, 45795, 45827, - 45855, 45886, 45920, 45948, 45998, 46044, 46091, 46140, - 46189, 46236, 46288, 46340, 46365, 46390, 46420, 46473, - 46547, 46586, 46614, 46667, 46713, 46767, 46816, 46862, - 46910, 46958, 47008, 47029, 47077, 47125, 47171, 47217, - 47262, 47308, 47354, 47400, 47448, 47494, 47540, 47589, - 47641, 47666, 47704, 47735, 47757, 47809, 47855, 47901, - 47953, 48006, 48052, 48101, 48152, 48201, 48249, 48294, - 48342, 48388, 48437, 48500, 48548, 48593, 48643, 48688, - 48738, 48790, 48836, 48881, 48929, 48975, 49024, 49070, - 49122, 49174, 49222, 49268, 49314, 49367, 49415, 49467, - 49513, 49559, 49633, 49698, 49748, 49794, 49853, 49902, - 49952, 49997, 50044, 50097, 50150, 50208, 50268, 50322, - 50371, 50425, 50472, 50523, 50575, 50631, 50685, 50737, - 50793, 50839, 50891, 50938, 50984, 51033, 51079, 51130, - 51176, 51228, 51273, 51316, 51354, + 0, 1, 3, 5, 7, 10, 15, 20, + 23, 31, 35, 37, 39, 41, 71, 79, + 81, 83, 86, 91, 96, 106, 118, 124, + 129, 139, 142, 149, 153, 161, 171, 175, + 183, 185, 193, 196, 198, 203, 205, 212, + 214, 222, 223, 244, 246, 256, 261, 263, + 267, 271, 273, 277, 279, 280, 284, 286, + 291, 293, 297, 301, 305, 307, 309, 318, + 322, 328, 332, 336, 338, 340, 341, 343, + 345, 347, 349, 364, 368, 370, 372, 377, + 381, 385, 387, 389, 393, 397, 399, 404, + 411, 416, 420, 425, 426, 430, 432, 438, + 443, 444, 445, 447, 456, 458, 477, 481, + 483, 489, 493, 494, 498, 502, 504, 506, + 511, 524, 526, 528, 532, 536, 538, 540, + 542, 546, 548, 550, 552, 554, 555, 559, + 565, 569, 575, 577, 581, 585, 590, 591, + 593, 594, 600, 603, 605, 605, 628, 666, + 670, 676, 676, 678, 680, 689, 691, 701, + 709, 710, 713, 714, 718, 725, 734, 741, + 748, 761, 768, 772, 776, 783, 815, 822, + 826, 828, 830, 833, 840, 856, 874, 893, + 910, 927, 937, 954, 969, 990, 998, 1011, + 1024, 1039, 1054, 1065, 1080, 1089, 1099, 1102, + 1104, 1109, 1111, 1119, 1125, 1135, 1136, 1183, + 1185, 1195, 1202, 1208, 1215, 1223, 1230, 1233, + 1239, 1243, 1247, 1249, 1253, 1257, 1261, 1271, + 1281, 1283, 1287, 1291, 1293, 1298, 1300, 1306, + 1310, 1315, 1317, 1323, 1329, 1339, 1343, 1347, + 1351, 1364, 1368, 1372, 1382, 1387, 1401, 1419, + 1423, 1429, 1431, 1433, 1449, 1454, 1456, 1458, + 1460, 1464, 1465, 1471, 1477, 1482, 1492, 1502, + 1503, 1508, 1513, 1515, 1519, 1523, 1553, 1555, + 1557, 1563, 1570, 1576, 1580, 1584, 1590, 1592, + 1599, 1601, 1607, 1615, 1621, 1627, 1633, 1638, + 1642, 1649, 1656, 1665, 1677, 1680, 1686, 1686, + 1690, 1692, 1696, 1713, 1725, 1731, 1733, 1735, + 1737, 1739, 1741, 1745, 1749, 1753, 1756, 1758, + 1760, 1764, 1774, 1784, 1823, 1833, 1837, 1839, + 1841, 1842, 1846, 1849, 1853, 1859, 1863, 1868, + 1870, 1874, 1876, 1878, 1882, 1892, 1896, 1898, + 1902, 1906, 1910, 1926, 1928, 1930, 1936, 1938, + 1942, 1944, 1946, 1970, 1976, 1978, 1984, 1986, + 1992, 1996, 2002, 2010, 2016, 2027, 2031, 2048, + 2064, 2068, 2073, 2079, 2085, 2088, 2092, 2094, + 2096, 2100, 2102, 2112, 2114, 2116, 2118, 2122, + 2126, 2128, 2140, 2142, 2146, 2150, 2156, 2158, + 2164, 2168, 2171, 2175, 2183, 2203, 2207, 2213, + 2215, 2216, 2226, 2227, 2235, 2242, 2244, 2247, + 2249, 2251, 2253, 2256, 2260, 2264, 2269, 2276, + 2282, 2296, 2322, 2332, 2335, 2337, 2341, 2343, + 2344, 2350, 2353, 2355, 2355, 2357, 2380, 2381, + 2383, 2385, 2387, 2390, 2395, 2400, 2406, 2416, + 2420, 2422, 2424, 2428, 2458, 2466, 2468, 2470, + 2473, 2482, 2487, 2501, 2515, 2525, 2530, 2542, + 2545, 2554, 2558, 2570, 2582, 2586, 2598, 2600, + 2610, 2613, 2617, 2622, 2626, 2635, 2637, 2645, + 2646, 2670, 2672, 2684, 2691, 2693, 2697, 2701, + 2703, 2711, 2715, 2716, 2720, 2722, 2724, 2726, + 2731, 2737, 2741, 2749, 2755, 2757, 2759, 2763, + 2772, 2776, 2782, 2786, 2790, 2792, 2794, 2795, + 2797, 2799, 2801, 2803, 2819, 2821, 2825, 2827, + 2829, 2834, 2838, 2846, 2850, 2852, 2856, 2868, + 2870, 2877, 2884, 2889, 2895, 2900, 2901, 2905, + 2907, 2913, 2919, 2920, 2921, 2923, 2932, 2934, + 2956, 2960, 2966, 2972, 2974, 2980, 2981, 2985, + 2993, 2995, 2999, 3004, 3017, 3019, 3025, 3029, + 3033, 3039, 3041, 3043, 3047, 3053, 3055, 3057, + 3059, 3061, 3062, 3066, 3073, 3077, 3083, 3085, + 3087, 3091, 3095, 3100, 3101, 3103, 3104, 3110, + 3113, 3115, 3115, 3119, 3121, 3131, 3134, 3141, + 3151, 3172, 3173, 3175, 3177, 3179, 3182, 3191, + 3195, 3197, 3207, 3210, 3217, 3227, 3234, 3244, + 3257, 3264, 3268, 3272, 3281, 3313, 3320, 3324, + 3326, 3329, 3339, 3355, 3375, 3394, 3413, 3430, + 3444, 3461, 3478, 3499, 3509, 3522, 3539, 3554, + 3571, 3582, 3601, 3610, 3622, 3625, 3629, 3634, + 3638, 3648, 3654, 3664, 3665, 3714, 3716, 3728, + 3737, 3743, 3753, 3763, 3765, 3773, 3779, 3784, + 3790, 3794, 3799, 3805, 3811, 3821, 3833, 3837, + 3841, 3849, 3862, 3866, 3884, 3890, 3901, 3903, + 3909, 3914, 3924, 3929, 3934, 3936, 3966, 3972, + 3979, 3985, 3989, 3996, 4002, 4014, 4022, 4028, + 4034, 4047, 4051, 4060, 4067, 4076, 4084, 4101, + 4113, 4121, 4127, 4133, 4136, 4139, 4143, 4153, + 4163, 4202, 4203, 4206, 4212, 4218, 4234, 4240, + 4265, 4271, 4277, 4283, 4287, 4295, 4299, 4305, + 4318, 4324, 4332, 4349, 4365, 4369, 4378, 4384, + 4390, 4397, 4401, 4405, 4411, 4423, 4427, 4431, + 4435, 4443, 4449, 4453, 4456, 4464, 4484, 4488, + 4494, 4496, 4503, 4507, 4511, 4516, 4523, 4529, + 4530, 4536, 4539, 4541, 4541, 4543, 4548, 4551, + 4559, 4563, 4565, 4567, 4569, 4599, 4607, 4609, + 4611, 4614, 4619, 4624, 4634, 4646, 4652, 4657, + 4667, 4670, 4677, 4681, 4689, 4699, 4703, 4711, + 4713, 4721, 4724, 4726, 4731, 4733, 4740, 4742, + 4750, 4751, 4772, 4774, 4784, 4789, 4791, 4795, + 4799, 4801, 4805, 4807, 4808, 4812, 4814, 4819, + 4821, 4825, 4829, 4833, 4835, 4837, 4846, 4850, + 4856, 4860, 4864, 4866, 4868, 4869, 4871, 4873, + 4875, 4877, 4892, 4896, 4898, 4900, 4905, 4909, + 4913, 4915, 4917, 4921, 4925, 4927, 4932, 4939, + 4944, 4948, 4954, 4962, 4968, 4972, 4974, 4980, + 4985, 4986, 4987, 4989, 4998, 5000, 5019, 5023, + 5025, 5031, 5035, 5036, 5040, 5044, 5046, 5048, + 5053, 5066, 5068, 5070, 5074, 5078, 5080, 5082, + 5084, 5088, 5090, 5092, 5094, 5096, 5097, 5101, + 5107, 5111, 5117, 5119, 5123, 5127, 5132, 5133, + 5135, 5136, 5142, 5145, 5147, 5147, 5152, 5162, + 5164, 5174, 5182, 5185, 5192, 5203, 5210, 5220, + 5233, 5240, 5244, 5248, 5257, 5289, 5296, 5300, + 5302, 5305, 5315, 5331, 5351, 5370, 5389, 5406, + 5420, 5437, 5454, 5475, 5485, 5498, 5515, 5530, + 5547, 5558, 5577, 5586, 5598, 5601, 5605, 5610, + 5614, 5624, 5630, 5640, 5641, 5690, 5692, 5704, + 5713, 5719, 5729, 5739, 5741, 5749, 5755, 5760, + 5766, 5770, 5775, 5781, 5787, 5797, 5809, 5813, + 5817, 5830, 5834, 5852, 5862, 5873, 5875, 5881, + 5886, 5896, 5901, 5906, 5908, 5938, 5945, 5951, + 5955, 5962, 5968, 5980, 5988, 5994, 6000, 6013, + 6017, 6026, 6033, 6042, 6050, 6067, 6078, 6085, + 6093, 6096, 6102, 6106, 6116, 6126, 6165, 6166, + 6169, 6175, 6191, 6197, 6222, 6228, 6234, 6240, + 6248, 6252, 6258, 6271, 6277, 6285, 6302, 6318, + 6322, 6331, 6337, 6343, 6350, 6354, 6358, 6370, + 6374, 6378, 6384, 6388, 6391, 6399, 6419, 6423, + 6429, 6431, 6435, 6439, 6444, 6451, 6457, 6458, + 6464, 6467, 6469, 6469, 6471, 6478, 6488, 6501, + 6508, 6512, 6516, 6525, 6557, 6564, 6568, 6570, + 6573, 6583, 6599, 6619, 6638, 6657, 6674, 6688, + 6705, 6722, 6743, 6753, 6766, 6783, 6798, 6815, + 6826, 6845, 6854, 6866, 6869, 6873, 6878, 6882, + 6892, 6898, 6908, 6909, 6958, 6960, 6972, 6981, + 6987, 6997, 7007, 7009, 7017, 7023, 7028, 7034, + 7038, 7043, 7049, 7055, 7065, 7077, 7081, 7085, + 7098, 7102, 7120, 7126, 7135, 7137, 7143, 7148, + 7158, 7168, 7175, 7176, 7178, 7180, 7182, 7185, + 7190, 7195, 7198, 7206, 7210, 7212, 7214, 7216, + 7246, 7254, 7256, 7258, 7261, 7266, 7271, 7281, + 7293, 7299, 7304, 7314, 7317, 7324, 7328, 7336, + 7346, 7350, 7358, 7360, 7368, 7371, 7373, 7378, + 7380, 7387, 7389, 7397, 7398, 7419, 7421, 7431, + 7436, 7438, 7442, 7446, 7448, 7452, 7454, 7455, + 7459, 7461, 7466, 7468, 7472, 7476, 7480, 7482, + 7484, 7493, 7497, 7503, 7509, 7518, 7520, 7522, + 7523, 7525, 7532, 7536, 7540, 7543, 7545, 7547, + 7549, 7564, 7568, 7570, 7572, 7577, 7581, 7585, + 7587, 7589, 7593, 7597, 7599, 7604, 7611, 7616, + 7620, 7628, 7629, 7635, 7637, 7638, 7640, 7642, + 7644, 7650, 7655, 7656, 7657, 7659, 7668, 7670, + 7689, 7693, 7695, 7701, 7705, 7706, 7710, 7714, + 7716, 7718, 7723, 7736, 7738, 7740, 7744, 7748, + 7750, 7752, 7754, 7758, 7760, 7762, 7764, 7766, + 7768, 7769, 7773, 7779, 7783, 7789, 7791, 7795, + 7799, 7804, 7805, 7807, 7808, 7814, 7817, 7819, + 7819, 7825, 7855, 7862, 7868, 7872, 7879, 7885, + 7897, 7905, 7911, 7917, 7930, 7934, 7943, 7950, + 7959, 7967, 7984, 7996, 8002, 8005, 8009, 8015, + 8025, 8035, 8074, 8075, 8078, 8084, 8100, 8106, + 8131, 8137, 8143, 8149, 8157, 8161, 8167, 8180, + 8186, 8194, 8211, 8227, 8231, 8240, 8246, 8252, + 8259, 8263, 8267, 8279, 8283, 8287, 8293, 8297, + 8301, 8309, 8329, 8333, 8339, 8341, 8345, 8349, + 8354, 8361, 8367, 8368, 8374, 8377, 8379, 8379, + 8381, 8385, 8387, 8397, 8400, 8408, 8418, 8427, + 8436, 8449, 8456, 8460, 8464, 8474, 8506, 8513, + 8517, 8519, 8522, 8530, 8546, 8564, 8583, 8600, + 8617, 8629, 8646, 8663, 8684, 8694, 8707, 8722, + 8737, 8754, 8765, 8782, 8791, 8803, 8806, 8810, + 8815, 8819, 8829, 8835, 8845, 8846, 8895, 8897, + 8909, 8915, 8921, 8931, 8941, 8943, 8949, 8955, + 8960, 8966, 8970, 8975, 8981, 8987, 8995, 9007, + 9011, 9015, 9028, 9032, 9050, 9059, 9071, 9073, + 9079, 9084, 9094, 9099, 9104, 9106, 9136, 9143, + 9149, 9153, 9160, 9166, 9176, 9184, 9190, 9196, + 9205, 9209, 9218, 9225, 9234, 9242, 9259, 9271, + 9279, 9288, 9291, 9298, 9302, 9312, 9322, 9361, + 9362, 9365, 9371, 9387, 9393, 9418, 9424, 9428, + 9434, 9442, 9446, 9452, 9463, 9469, 9477, 9494, + 9510, 9514, 9521, 9527, 9533, 9538, 9542, 9546, + 9558, 9562, 9566, 9572, 9576, 9579, 9587, 9607, + 9611, 9617, 9619, 9623, 9627, 9632, 9639, 9645, + 9646, 9652, 9655, 9657, 9657, 9659, 9664, 9670, + 9671, 9676, 9687, 9694, 9701, 9710, 9712, 9714, + 9719, 9751, 9753, 9755, 9757, 9762, 9773, 9788, + 9807, 9822, 9838, 9852, 9868, 9883, 9904, 9914, + 9926, 9939, 9953, 9968, 9978, 9992, 10001, 10013, + 10016, 10020, 10025, 10029, 10039, 10045, 10051, 10052, + 10101, 10103, 10115, 10124, 10128, 10134, 10142, 10144, + 10152, 10158, 10162, 10168, 10173, 10179, 10187, 10193, + 10195, 10197, 10203, 10207, 10225, 10235, 10246, 10248, + 10252, 10258, 10268, 10273, 10278, 10280, 10310, 10315, + 10317, 10328, 10334, 10338, 10350, 10352, 10358, 10365, + 10370, 10376, 10393, 10405, 10412, 10416, 10418, 10428, + 10438, 10477, 10478, 10482, 10486, 10499, 10503, 10528, + 10534, 10538, 10542, 10545, 10554, 10558, 10564, 10580, + 10594, 10601, 10605, 10609, 10617, 10621, 10633, 10637, + 10641, 10643, 10646, 10654, 10674, 10678, 10684, 10686, + 10690, 10694, 10699, 10706, 10710, 10711, 10717, 10720, + 10722, 10726, 10728, 10738, 10741, 10748, 10758, 10765, + 10775, 10788, 10795, 10799, 10803, 10812, 10844, 10851, + 10855, 10857, 10860, 10870, 10886, 10906, 10925, 10944, + 10961, 10975, 10992, 11009, 11030, 11040, 11053, 11070, + 11085, 11102, 11113, 11132, 11141, 11153, 11156, 11160, + 11165, 11169, 11179, 11185, 11195, 11196, 11245, 11247, + 11259, 11268, 11274, 11284, 11294, 11296, 11304, 11310, + 11315, 11321, 11323, 11325, 11329, 11334, 11340, 11346, + 11356, 11368, 11372, 11376, 11384, 11397, 11401, 11419, + 11425, 11434, 11436, 11442, 11447, 11457, 11467, 11474, + 11480, 11510, 11516, 11523, 11529, 11533, 11540, 11546, + 11558, 11566, 11572, 11578, 11591, 11595, 11604, 11611, + 11620, 11628, 11645, 11657, 11663, 11669, 11672, 11675, + 11681, 11691, 11701, 11740, 11741, 11744, 11750, 11756, + 11772, 11778, 11803, 11809, 11815, 11821, 11825, 11833, + 11837, 11843, 11856, 11862, 11870, 11887, 11903, 11907, + 11916, 11922, 11928, 11935, 11939, 11941, 11945, 11951, + 11963, 11967, 11971, 11975, 11983, 11989, 11993, 11997, + 12005, 12025, 12029, 12035, 12037, 12044, 12048, 12052, + 12057, 12064, 12070, 12071, 12077, 12080, 12082, 12082, + 12084, 12088, 12090, 12100, 12103, 12111, 12121, 12130, + 12139, 12152, 12159, 12163, 12167, 12177, 12209, 12216, + 12220, 12222, 12225, 12233, 12249, 12267, 12286, 12303, + 12320, 12332, 12349, 12366, 12387, 12397, 12410, 12425, + 12440, 12457, 12468, 12485, 12494, 12506, 12509, 12513, + 12518, 12522, 12532, 12538, 12548, 12549, 12598, 12600, + 12612, 12618, 12624, 12634, 12644, 12646, 12652, 12658, + 12663, 12669, 12673, 12678, 12684, 12690, 12698, 12710, + 12714, 12718, 12731, 12735, 12753, 12762, 12774, 12776, + 12782, 12787, 12797, 12802, 12807, 12809, 12839, 12846, + 12852, 12856, 12863, 12869, 12879, 12887, 12893, 12899, + 12908, 12912, 12921, 12928, 12937, 12945, 12962, 12974, + 12982, 12991, 12994, 13001, 13005, 13015, 13025, 13064, + 13065, 13068, 13074, 13090, 13096, 13121, 13127, 13131, + 13137, 13145, 13149, 13155, 13166, 13172, 13180, 13197, + 13213, 13217, 13224, 13230, 13236, 13241, 13245, 13249, + 13261, 13265, 13269, 13275, 13279, 13282, 13290, 13310, + 13314, 13320, 13322, 13326, 13330, 13335, 13342, 13348, + 13349, 13355, 13358, 13360, 13360, 13362, 13363, 13365, + 13367, 13369, 13372, 13377, 13382, 13388, 13398, 13402, + 13404, 13406, 13410, 13440, 13448, 13450, 13452, 13455, + 13464, 13469, 13483, 13497, 13507, 13512, 13524, 13527, + 13536, 13540, 13552, 13564, 13568, 13580, 13582, 13592, + 13595, 13599, 13604, 13608, 13617, 13619, 13627, 13628, + 13652, 13654, 13666, 13673, 13675, 13679, 13683, 13685, + 13693, 13697, 13698, 13702, 13704, 13709, 13715, 13719, + 13727, 13733, 13735, 13737, 13741, 13750, 13754, 13760, + 13764, 13768, 13770, 13772, 13773, 13775, 13777, 13779, + 13781, 13797, 13799, 13803, 13805, 13807, 13812, 13816, + 13824, 13828, 13830, 13834, 13846, 13848, 13855, 13862, + 13867, 13873, 13878, 13879, 13883, 13885, 13891, 13897, + 13898, 13899, 13901, 13910, 13912, 13934, 13938, 13944, + 13950, 13952, 13958, 13959, 13963, 13971, 13973, 13977, + 13982, 13995, 13997, 14003, 14007, 14011, 14017, 14019, + 14023, 14029, 14031, 14033, 14035, 14037, 14038, 14042, + 14049, 14053, 14059, 14061, 14063, 14067, 14071, 14076, + 14077, 14079, 14080, 14086, 14089, 14091, 14091, 14095, + 14097, 14107, 14110, 14118, 14128, 14137, 14148, 14161, + 14168, 14172, 14176, 14186, 14218, 14225, 14229, 14231, + 14234, 14244, 14260, 14280, 14299, 14318, 14335, 14349, + 14366, 14383, 14404, 14414, 14427, 14444, 14459, 14476, + 14487, 14506, 14515, 14527, 14530, 14534, 14539, 14543, + 14553, 14559, 14569, 14570, 14619, 14621, 14633, 14642, + 14648, 14658, 14668, 14670, 14678, 14684, 14689, 14695, + 14699, 14704, 14710, 14716, 14726, 14738, 14742, 14746, + 14759, 14763, 14781, 14790, 14802, 14804, 14810, 14815, + 14825, 14830, 14835, 14837, 14867, 14874, 14880, 14884, + 14891, 14897, 14909, 14917, 14923, 14929, 14942, 14946, + 14955, 14962, 14971, 14979, 14996, 15008, 15016, 15019, + 15023, 15033, 15043, 15082, 15083, 15086, 15092, 15108, + 15114, 15139, 15145, 15151, 15157, 15165, 15169, 15175, + 15188, 15194, 15202, 15219, 15235, 15239, 15248, 15254, + 15260, 15267, 15271, 15275, 15287, 15291, 15295, 15301, + 15305, 15308, 15316, 15336, 15340, 15346, 15348, 15352, + 15356, 15361, 15368, 15374, 15375, 15381, 15384, 15386, + 15386, 15388, 15393, 15395, 15405, 15408, 15415, 15426, + 15433, 15443, 15456, 15463, 15467, 15471, 15480, 15512, + 15519, 15523, 15525, 15528, 15538, 15554, 15574, 15593, + 15612, 15629, 15643, 15660, 15677, 15698, 15708, 15721, + 15738, 15753, 15770, 15781, 15800, 15809, 15821, 15824, + 15828, 15833, 15837, 15847, 15853, 15863, 15864, 15913, + 15915, 15927, 15936, 15942, 15952, 15962, 15964, 15972, + 15978, 15983, 15989, 15993, 15998, 16004, 16010, 16020, + 16032, 16036, 16040, 16053, 16057, 16075, 16085, 16096, + 16098, 16104, 16109, 16119, 16124, 16129, 16131, 16161, + 16168, 16174, 16178, 16185, 16191, 16203, 16211, 16217, + 16223, 16236, 16240, 16249, 16256, 16265, 16273, 16290, + 16302, 16309, 16312, 16316, 16326, 16336, 16375, 16376, + 16379, 16385, 16401, 16407, 16432, 16438, 16444, 16450, + 16458, 16462, 16468, 16481, 16487, 16495, 16512, 16528, + 16532, 16541, 16547, 16553, 16560, 16564, 16568, 16580, + 16584, 16588, 16594, 16598, 16601, 16609, 16629, 16633, + 16639, 16641, 16645, 16649, 16654, 16661, 16667, 16668, + 16674, 16677, 16679, 16679, 16681, 16685, 16687, 16697, + 16700, 16707, 16717, 16724, 16734, 16747, 16754, 16758, + 16762, 16771, 16803, 16810, 16814, 16816, 16819, 16829, + 16845, 16865, 16884, 16903, 16920, 16934, 16951, 16968, + 16989, 16999, 17012, 17029, 17044, 17061, 17072, 17091, + 17100, 17112, 17115, 17119, 17124, 17128, 17138, 17144, + 17154, 17155, 17204, 17206, 17218, 17227, 17233, 17243, + 17253, 17255, 17263, 17269, 17274, 17280, 17284, 17289, + 17295, 17301, 17311, 17323, 17327, 17331, 17344, 17348, + 17366, 17372, 17381, 17383, 17389, 17394, 17404, 17414, + 17421, 17427, 17457, 17464, 17470, 17474, 17481, 17487, + 17499, 17507, 17513, 17519, 17532, 17536, 17545, 17552, + 17561, 17569, 17586, 17598, 17604, 17610, 17613, 17616, + 17622, 17632, 17642, 17681, 17682, 17685, 17691, 17707, + 17713, 17738, 17744, 17750, 17756, 17764, 17768, 17774, + 17787, 17793, 17801, 17818, 17834, 17838, 17847, 17853, + 17859, 17866, 17870, 17874, 17886, 17890, 17894, 17900, + 17904, 17908, 17916, 17936, 17940, 17946, 17948, 17952, + 17956, 17961, 17968, 17974, 17975, 17981, 17984, 17986, + 17986, 17988, 17992, 17994, 18004, 18007, 18014, 18024, + 18031, 18041, 18054, 18061, 18065, 18069, 18078, 18110, + 18117, 18121, 18123, 18126, 18136, 18152, 18172, 18191, + 18210, 18227, 18241, 18258, 18275, 18296, 18306, 18319, + 18336, 18351, 18368, 18379, 18398, 18407, 18419, 18422, + 18426, 18431, 18435, 18445, 18451, 18461, 18462, 18511, + 18513, 18525, 18534, 18540, 18550, 18560, 18562, 18570, + 18576, 18581, 18587, 18591, 18596, 18602, 18608, 18618, + 18630, 18634, 18638, 18651, 18655, 18673, 18679, 18690, + 18692, 18698, 18703, 18713, 18723, 18730, 18736, 18766, + 18773, 18779, 18783, 18790, 18796, 18808, 18816, 18822, + 18828, 18841, 18845, 18854, 18861, 18870, 18878, 18895, + 18907, 18913, 18916, 18922, 18932, 18942, 18981, 18982, + 18985, 18991, 19007, 19013, 19038, 19044, 19050, 19056, + 19064, 19068, 19074, 19087, 19093, 19101, 19118, 19134, + 19138, 19147, 19153, 19159, 19166, 19170, 19174, 19186, + 19190, 19194, 19200, 19204, 19208, 19216, 19236, 19240, + 19246, 19248, 19252, 19256, 19261, 19268, 19274, 19275, + 19281, 19284, 19286, 19286, 19288, 19289, 19291, 19293, + 19295, 19298, 19303, 19308, 19311, 19319, 19323, 19325, + 19327, 19329, 19359, 19367, 19369, 19371, 19374, 19379, + 19384, 19394, 19406, 19412, 19417, 19427, 19430, 19437, + 19441, 19449, 19459, 19463, 19471, 19473, 19481, 19484, + 19486, 19491, 19493, 19500, 19502, 19510, 19511, 19532, + 19534, 19544, 19549, 19551, 19555, 19559, 19561, 19565, + 19567, 19568, 19572, 19574, 19579, 19581, 19585, 19589, + 19593, 19595, 19597, 19606, 19610, 19616, 19620, 19624, + 19626, 19628, 19629, 19631, 19633, 19635, 19637, 19652, + 19656, 19658, 19660, 19665, 19669, 19673, 19675, 19677, + 19681, 19685, 19687, 19692, 19699, 19704, 19708, 19713, + 19714, 19718, 19720, 19726, 19731, 19732, 19733, 19735, + 19744, 19746, 19765, 19769, 19771, 19777, 19781, 19782, + 19786, 19790, 19792, 19794, 19799, 19812, 19814, 19816, + 19820, 19824, 19826, 19828, 19830, 19834, 19836, 19838, + 19840, 19842, 19843, 19847, 19853, 19857, 19863, 19865, + 19869, 19873, 19878, 19879, 19881, 19882, 19888, 19891, + 19893, 19893, 19897, 19899, 19909, 19912, 19919, 19928, + 19935, 19942, 19955, 19962, 19966, 19970, 19977, 20009, + 20016, 20020, 20022, 20025, 20032, 20048, 20066, 20085, + 20102, 20119, 20129, 20146, 20161, 20182, 20190, 20203, + 20216, 20231, 20246, 20257, 20272, 20281, 20291, 20294, + 20296, 20301, 20303, 20311, 20317, 20327, 20328, 20375, + 20377, 20387, 20394, 20400, 20410, 20420, 20422, 20426, + 20430, 20435, 20441, 20445, 20450, 20452, 20458, 20464, + 20474, 20478, 20482, 20495, 20499, 20517, 20521, 20527, + 20529, 20535, 20540, 20550, 20555, 20560, 20562, 20592, + 20599, 20605, 20609, 20616, 20622, 20630, 20636, 20642, + 20648, 20653, 20657, 20664, 20671, 20680, 20686, 20703, + 20715, 20719, 20722, 20726, 20736, 20746, 20785, 20786, + 20789, 20795, 20811, 20817, 20841, 20847, 20849, 20855, + 20861, 20865, 20871, 20879, 20885, 20889, 20906, 20922, + 20926, 20931, 20937, 20943, 20946, 20950, 20952, 20964, + 20968, 20972, 20978, 20982, 20985, 20993, 21013, 21017, + 21023, 21025, 21029, 21033, 21038, 21045, 21051, 21052, + 21058, 21061, 21063, 21063, 21065, 21069, 21071, 21081, + 21084, 21092, 21102, 21111, 21122, 21135, 21142, 21146, + 21150, 21160, 21192, 21199, 21203, 21205, 21208, 21218, + 21234, 21254, 21273, 21292, 21309, 21323, 21340, 21357, + 21378, 21388, 21401, 21418, 21433, 21450, 21461, 21480, + 21489, 21501, 21504, 21508, 21513, 21517, 21527, 21533, + 21543, 21544, 21593, 21595, 21607, 21616, 21622, 21632, + 21642, 21644, 21652, 21658, 21663, 21669, 21673, 21678, + 21684, 21690, 21700, 21712, 21716, 21720, 21733, 21737, + 21755, 21764, 21776, 21778, 21784, 21789, 21799, 21804, + 21809, 21811, 21841, 21848, 21854, 21858, 21865, 21871, + 21883, 21891, 21897, 21903, 21916, 21920, 21929, 21936, + 21945, 21953, 21970, 21982, 21990, 21993, 21997, 22007, + 22017, 22056, 22057, 22060, 22066, 22082, 22088, 22113, + 22119, 22125, 22131, 22139, 22143, 22149, 22162, 22168, + 22176, 22193, 22209, 22213, 22222, 22228, 22234, 22241, + 22245, 22249, 22261, 22265, 22269, 22275, 22279, 22282, + 22290, 22310, 22314, 22320, 22322, 22326, 22330, 22335, + 22342, 22348, 22349, 22355, 22358, 22360, 22360, 22362, + 22366, 22368, 22378, 22381, 22388, 22398, 22405, 22415, + 22428, 22435, 22439, 22443, 22452, 22484, 22491, 22495, + 22497, 22500, 22510, 22526, 22546, 22565, 22584, 22601, + 22615, 22632, 22649, 22670, 22680, 22693, 22710, 22725, + 22742, 22753, 22772, 22781, 22793, 22796, 22800, 22805, + 22809, 22819, 22825, 22835, 22836, 22885, 22887, 22899, + 22908, 22914, 22924, 22934, 22936, 22944, 22950, 22955, + 22961, 22965, 22970, 22976, 22982, 22992, 23004, 23008, + 23012, 23025, 23029, 23047, 23053, 23064, 23066, 23072, + 23077, 23087, 23097, 23104, 23110, 23140, 23147, 23153, + 23157, 23164, 23170, 23182, 23190, 23196, 23202, 23215, + 23219, 23228, 23235, 23244, 23252, 23269, 23281, 23287, + 23290, 23296, 23306, 23316, 23355, 23356, 23359, 23365, + 23381, 23387, 23412, 23418, 23424, 23430, 23438, 23442, + 23448, 23461, 23467, 23475, 23492, 23508, 23512, 23521, + 23527, 23533, 23540, 23544, 23548, 23560, 23564, 23568, + 23574, 23578, 23582, 23590, 23610, 23614, 23620, 23622, + 23626, 23630, 23635, 23642, 23648, 23649, 23655, 23658, + 23660, 23660, 23662, 23663, 23665, 23667, 23669, 23672, + 23677, 23682, 23685, 23693, 23697, 23699, 23701, 23703, + 23733, 23754, 23760, 23762, 23777, 23782, 23788, 23789, + 23796, 23800, 23803, 23813, 23829, 23849, 23868, 23887, + 23904, 23918, 23935, 23952, 23973, 23983, 23996, 24013, + 24028, 24045, 24056, 24075, 24084, 24096, 24100, 24104, + 24114, 24120, 24130, 24142, 24151, 24153, 24158, 24160, + 24170, 24173, 24180, 24191, 24198, 24208, 24221, 24228, + 24232, 24236, 24245, 24277, 24284, 24288, 24290, 24293, + 24303, 24319, 24339, 24358, 24377, 24394, 24408, 24425, + 24442, 24463, 24473, 24486, 24503, 24518, 24535, 24546, + 24565, 24574, 24586, 24589, 24593, 24598, 24602, 24612, + 24618, 24628, 24629, 24682, 24684, 24696, 24705, 24705, + 24707, 24713, 24723, 24733, 24735, 24743, 24749, 24754, + 24760, 24764, 24769, 24775, 24781, 24791, 24803, 24807, + 24811, 24824, 24828, 24846, 24856, 24867, 24869, 24875, + 24880, 24890, 24897, 24902, 24904, 24908, 24914, 24916, + 24917, 24919, 24921, 24923, 24926, 24931, 24936, 24939, + 24947, 24951, 24953, 24955, 24957, 24987, 24995, 24997, + 24999, 25002, 25007, 25012, 25022, 25034, 25040, 25045, + 25055, 25058, 25065, 25069, 25077, 25087, 25091, 25099, + 25101, 25109, 25112, 25114, 25119, 25121, 25128, 25130, + 25138, 25139, 25164, 25166, 25176, 25181, 25181, 25183, + 25185, 25189, 25193, 25195, 25199, 25201, 25202, 25206, + 25208, 25213, 25215, 25219, 25223, 25227, 25229, 25231, + 25240, 25244, 25250, 25254, 25258, 25260, 25262, 25263, + 25265, 25272, 25274, 25276, 25278, 25280, 25282, 25300, + 25304, 25306, 25308, 25313, 25317, 25321, 25323, 25327, + 25331, 25335, 25337, 25342, 25349, 25354, 25358, 25358, + 25362, 25364, 25368, 25373, 25374, 25378, 25380, 25390, + 25396, 25401, 25402, 25403, 25405, 25414, 25416, 25435, + 25439, 25441, 25447, 25451, 25452, 25456, 25460, 25462, + 25464, 25469, 25482, 25484, 25486, 25490, 25494, 25496, + 25498, 25500, 25504, 25506, 25508, 25510, 25512, 25513, + 25517, 25523, 25527, 25533, 25535, 25539, 25543, 25548, + 25549, 25551, 25552, 25558, 25561, 25593, 25600, 25606, + 25610, 25617, 25623, 25635, 25643, 25651, 25657, 25670, + 25674, 25683, 25690, 25699, 25707, 25707, 25711, 25713, + 25717, 25734, 25746, 25753, 25756, 25758, 25768, 25778, + 25817, 25818, 25821, 25827, 25843, 25849, 25874, 25880, + 25886, 25892, 25900, 25904, 25910, 25923, 25929, 25937, + 25954, 25970, 25974, 25983, 25989, 25995, 26002, 26006, + 26010, 26022, 26026, 26030, 26036, 26040, 26043, 26051, + 26071, 26075, 26081, 26083, 26087, 26091, 26096, 26103, + 26109, 26110, 26116, 26119, 26121, 26123, 26129, 26139, + 26149, 26157, 26163, 26168, 26174, 26178, 26184, 26190, + 26200, 26212, 26216, 26220, 26233, 26241, 26252, 26258, + 26263, 26273, 26277, 26278, 26280, 26282, 26284, 26287, + 26292, 26297, 26300, 26308, 26312, 26314, 26316, 26318, + 26348, 26356, 26358, 26360, 26363, 26368, 26373, 26383, + 26395, 26401, 26406, 26416, 26419, 26426, 26430, 26438, + 26448, 26452, 26460, 26462, 26470, 26473, 26475, 26480, + 26482, 26489, 26491, 26499, 26500, 26521, 26523, 26533, + 26538, 26540, 26544, 26548, 26550, 26554, 26556, 26557, + 26561, 26563, 26568, 26570, 26574, 26578, 26582, 26584, + 26586, 26595, 26599, 26605, 26609, 26613, 26615, 26617, + 26618, 26620, 26622, 26624, 26626, 26641, 26645, 26647, + 26649, 26654, 26658, 26662, 26664, 26666, 26670, 26674, + 26676, 26681, 26688, 26693, 26697, 26702, 26703, 26707, + 26709, 26715, 26720, 26721, 26722, 26724, 26733, 26735, + 26754, 26758, 26760, 26766, 26770, 26771, 26775, 26779, + 26781, 26783, 26788, 26801, 26803, 26805, 26809, 26813, + 26815, 26817, 26819, 26823, 26825, 26827, 26829, 26831, + 26832, 26836, 26842, 26846, 26852, 26854, 26858, 26862, + 26867, 26868, 26870, 26871, 26877, 26880, 26882, 26882, + 26884, 26886, 26900, 26905, 26907, 26917, 26920, 26927, + 26938, 26945, 26955, 26968, 26975, 26979, 26983, 26992, + 27024, 27031, 27035, 27037, 27040, 27050, 27066, 27086, + 27105, 27124, 27141, 27155, 27172, 27189, 27210, 27220, + 27233, 27250, 27265, 27282, 27293, 27312, 27321, 27333, + 27336, 27340, 27345, 27349, 27359, 27365, 27375, 27376, + 27425, 27427, 27439, 27448, 27454, 27464, 27474, 27476, + 27484, 27490, 27495, 27501, 27505, 27510, 27516, 27522, + 27532, 27544, 27548, 27552, 27565, 27569, 27587, 27597, + 27608, 27610, 27616, 27621, 27631, 27636, 27641, 27643, + 27673, 27680, 27686, 27690, 27697, 27703, 27715, 27723, + 27729, 27735, 27748, 27752, 27761, 27768, 27777, 27785, + 27802, 27814, 27821, 27824, 27828, 27838, 27848, 27887, + 27888, 27891, 27897, 27913, 27919, 27944, 27950, 27956, + 27962, 27970, 27974, 27980, 27993, 27999, 28007, 28024, + 28040, 28044, 28053, 28059, 28065, 28072, 28076, 28080, + 28092, 28096, 28100, 28106, 28110, 28113, 28121, 28141, + 28145, 28151, 28153, 28157, 28161, 28166, 28173, 28179, + 28180, 28186, 28189, 28191, 28191, 28193, 28194, 28196, + 28198, 28200, 28203, 28208, 28213, 28216, 28224, 28228, + 28230, 28232, 28234, 28264, 28272, 28274, 28276, 28279, + 28284, 28289, 28299, 28311, 28317, 28322, 28332, 28335, + 28342, 28346, 28354, 28364, 28368, 28376, 28378, 28386, + 28389, 28391, 28396, 28398, 28405, 28407, 28415, 28416, + 28441, 28443, 28453, 28458, 28460, 28464, 28468, 28470, + 28474, 28476, 28477, 28481, 28483, 28488, 28490, 28494, + 28498, 28502, 28504, 28506, 28515, 28519, 28525, 28529, + 28533, 28535, 28537, 28538, 28540, 28547, 28549, 28551, + 28569, 28573, 28575, 28577, 28582, 28586, 28590, 28592, + 28596, 28600, 28604, 28606, 28611, 28618, 28623, 28627, + 28632, 28633, 28637, 28641, 28651, 28657, 28662, 28663, + 28664, 28666, 28675, 28677, 28696, 28700, 28702, 28708, + 28712, 28713, 28717, 28721, 28723, 28725, 28730, 28743, + 28745, 28747, 28751, 28755, 28757, 28759, 28761, 28765, + 28767, 28769, 28771, 28773, 28774, 28778, 28784, 28788, + 28794, 28796, 28800, 28804, 28809, 28810, 28812, 28813, + 28819, 28822, 28824, 28824, 28825, 28827, 28829, 28831, + 28834, 28839, 28844, 28847, 28855, 28859, 28861, 28863, + 28865, 28895, 28903, 28905, 28907, 28910, 28915, 28920, + 28930, 28942, 28948, 28953, 28963, 28966, 28973, 28977, + 28985, 28995, 28999, 29007, 29009, 29017, 29020, 29022, + 29027, 29029, 29036, 29038, 29046, 29047, 29068, 29070, + 29080, 29085, 29087, 29091, 29095, 29097, 29101, 29103, + 29104, 29108, 29110, 29115, 29117, 29121, 29125, 29129, + 29131, 29133, 29142, 29146, 29152, 29158, 29167, 29169, + 29171, 29172, 29174, 29181, 29185, 29189, 29192, 29194, + 29196, 29198, 29213, 29217, 29219, 29221, 29226, 29230, + 29234, 29236, 29238, 29242, 29246, 29248, 29253, 29260, + 29265, 29269, 29277, 29278, 29284, 29286, 29288, 29290, + 29296, 29301, 29302, 29303, 29305, 29314, 29316, 29335, + 29339, 29341, 29347, 29351, 29352, 29356, 29360, 29362, + 29364, 29369, 29382, 29384, 29386, 29390, 29394, 29396, + 29398, 29400, 29404, 29406, 29408, 29410, 29412, 29414, + 29415, 29419, 29425, 29429, 29435, 29437, 29441, 29445, + 29450, 29451, 29453, 29454, 29460, 29463, 29465, 29465, + 29467, 29468, 29470, 29472, 29474, 29477, 29482, 29487, + 29490, 29498, 29502, 29504, 29506, 29508, 29538, 29546, + 29548, 29550, 29553, 29558, 29563, 29573, 29585, 29591, + 29596, 29606, 29609, 29616, 29620, 29628, 29638, 29642, + 29650, 29652, 29660, 29663, 29665, 29670, 29672, 29679, + 29681, 29689, 29690, 29711, 29713, 29723, 29728, 29730, + 29734, 29738, 29740, 29744, 29746, 29747, 29751, 29753, + 29758, 29760, 29764, 29768, 29772, 29774, 29776, 29785, + 29789, 29795, 29799, 29803, 29805, 29807, 29808, 29810, + 29812, 29814, 29816, 29831, 29835, 29837, 29839, 29844, + 29848, 29852, 29854, 29856, 29860, 29864, 29866, 29871, + 29878, 29883, 29887, 29892, 29893, 29897, 29899, 29905, + 29910, 29911, 29912, 29914, 29923, 29925, 29944, 29948, + 29950, 29956, 29960, 29961, 29965, 29969, 29971, 29973, + 29978, 29991, 29993, 29995, 29999, 30003, 30005, 30007, + 30009, 30013, 30015, 30017, 30019, 30021, 30022, 30026, + 30032, 30036, 30042, 30044, 30048, 30052, 30057, 30058, + 30060, 30061, 30067, 30070, 30072, 30072, 30080, 30081, + 30082, 30084, 30086, 30088, 30091, 30096, 30101, 30104, + 30112, 30116, 30118, 30120, 30122, 30152, 30160, 30162, + 30164, 30167, 30172, 30177, 30187, 30199, 30205, 30210, + 30220, 30223, 30230, 30234, 30242, 30252, 30256, 30264, + 30266, 30274, 30277, 30279, 30284, 30286, 30293, 30295, + 30303, 30304, 30325, 30327, 30337, 30342, 30344, 30348, + 30352, 30354, 30358, 30360, 30361, 30365, 30367, 30372, + 30374, 30378, 30382, 30386, 30388, 30390, 30399, 30403, + 30409, 30413, 30417, 30419, 30421, 30422, 30424, 30426, + 30428, 30430, 30445, 30449, 30451, 30453, 30458, 30462, + 30466, 30468, 30470, 30474, 30478, 30480, 30485, 30492, + 30497, 30501, 30506, 30507, 30511, 30513, 30519, 30524, + 30525, 30526, 30528, 30537, 30539, 30558, 30562, 30564, + 30570, 30574, 30575, 30579, 30583, 30585, 30587, 30592, + 30605, 30607, 30609, 30613, 30617, 30619, 30621, 30623, + 30627, 30629, 30631, 30633, 30635, 30636, 30640, 30646, + 30650, 30656, 30658, 30662, 30666, 30671, 30672, 30674, + 30675, 30681, 30684, 30686, 30686, 30688, 30690, 30692, + 30695, 30700, 30705, 30708, 30716, 30720, 30722, 30724, + 30726, 30756, 30777, 30783, 30785, 30800, 30805, 30811, + 30812, 30814, 30821, 30827, 30831, 30838, 30844, 30856, + 30864, 30872, 30878, 30891, 30895, 30904, 30913, 30921, + 30922, 30927, 30929, 30939, 30942, 30949, 30960, 30967, + 30977, 30990, 30997, 31001, 31005, 31014, 31046, 31053, + 31057, 31059, 31062, 31072, 31088, 31108, 31127, 31146, + 31163, 31177, 31194, 31211, 31232, 31242, 31255, 31272, + 31287, 31304, 31315, 31334, 31343, 31355, 31358, 31362, + 31367, 31371, 31381, 31387, 31397, 31398, 31451, 31453, + 31465, 31474, 31480, 31490, 31500, 31502, 31510, 31516, + 31521, 31527, 31531, 31536, 31542, 31548, 31558, 31570, + 31574, 31578, 31591, 31595, 31613, 31623, 31634, 31636, + 31642, 31647, 31657, 31664, 31669, 31671, 31703, 31710, + 31716, 31720, 31727, 31733, 31745, 31753, 31761, 31767, + 31780, 31784, 31793, 31800, 31809, 31817, 31834, 31846, + 31853, 31856, 31860, 31870, 31880, 31919, 31920, 31923, + 31929, 31945, 31951, 31976, 31982, 31988, 31994, 32002, + 32006, 32012, 32025, 32031, 32039, 32056, 32072, 32076, + 32085, 32091, 32097, 32104, 32108, 32112, 32124, 32128, + 32132, 32138, 32142, 32145, 32153, 32173, 32177, 32183, + 32185, 32189, 32193, 32198, 32205, 32211, 32212, 32218, + 32221, 32223, 32223, 32225, 32227, 32229, 32231, 32234, + 32239, 32244, 32247, 32255, 32259, 32261, 32263, 32265, + 32295, 32316, 32322, 32324, 32339, 32344, 32350, 32351, + 32353, 32355, 32367, 32373, 32376, 32380, 32386, 32396, + 32435, 32438, 32444, 32460, 32466, 32491, 32497, 32503, + 32509, 32517, 32521, 32527, 32540, 32546, 32554, 32571, + 32587, 32591, 32600, 32606, 32612, 32619, 32623, 32627, + 32639, 32643, 32647, 32653, 32657, 32661, 32663, 32671, + 32691, 32698, 32704, 32709, 32711, 32712, 32714, 32716, + 32718, 32721, 32726, 32731, 32734, 32742, 32746, 32748, + 32750, 32752, 32782, 32790, 32792, 32794, 32797, 32802, + 32807, 32817, 32829, 32835, 32840, 32850, 32853, 32860, + 32864, 32872, 32882, 32886, 32894, 32896, 32904, 32907, + 32909, 32914, 32916, 32923, 32925, 32933, 32934, 32955, + 32957, 32967, 32972, 32974, 32978, 32982, 32984, 32988, + 32990, 32991, 32995, 32997, 33002, 33004, 33008, 33012, + 33016, 33018, 33020, 33029, 33033, 33039, 33043, 33047, + 33049, 33051, 33052, 33054, 33056, 33058, 33060, 33075, + 33079, 33081, 33083, 33088, 33092, 33096, 33098, 33100, + 33104, 33108, 33110, 33115, 33122, 33127, 33131, 33136, + 33137, 33141, 33143, 33150, 33155, 33156, 33157, 33159, + 33168, 33170, 33189, 33193, 33195, 33201, 33205, 33206, + 33210, 33214, 33216, 33218, 33223, 33236, 33238, 33240, + 33244, 33248, 33250, 33252, 33254, 33258, 33260, 33262, + 33264, 33266, 33267, 33271, 33277, 33281, 33287, 33289, + 33293, 33297, 33302, 33303, 33305, 33306, 33307, 33313, + 33316, 33318, 33318, 33319, 33322, 33322, 33324, 33326, + 33329, 33331, 33333, 33336, 33338, 33342, 33344, 33393, + 33414, 33415, 33460, 33505, 33549, 33594, 33635, 33680, + 33721, 33743, 33784, 33828, 33869, 33910, 33936, 33957, + 33984, 34029, 34081, 34107, 34128, 34178, 34216, 34261, + 34302, 34348, 34395, 34444, 34493, 34540, 34592, 34644, + 34667, 34690, 34742, 34788, 34834, 34908, 34973, 35023, + 35069, 35128, 35177, 35227, 35272, 35303, 35330, 35359, + 35381, 35403, 35425, 35450, 35476, 35508, 35536, 35564, + 35594, 35617, 35640, 35663, 35689, 35742, 35812, 35851, + 35877, 35928, 35980, 36026, 36076, 36097, 36143, 36197, + 36246, 36292, 36340, 36388, 36438, 36463, 36501, 36532, + 36554, 36606, 36652, 36697, 36745, 36791, 36840, 36886, + 36938, 36990, 37038, 37084, 37130, 37183, 37231, 37279, + 37327, 37373, 37419, 37464, 37510, 37556, 37602, 37650, + 37696, 37742, 37791, 37843, 37895, 37941, 37987, 38039, + 38092, 38138, 38187, 38238, 38287, 38335, 38380, 38428, + 38474, 38523, 38586, 38634, 38679, 38729, 38774, 38824, + 38871, 38924, 38977, 39035, 39095, 39149, 39198, 39252, + 39299, 39350, 39402, 39458, 39512, 39564, 39620, 39666, + 39718, 39765, 39811, 39860, 39906, 39957, 40003, 40055, + 40100, 40130, 40153, 40175, 40198, 40220, 40243, 40266, + 40290, 40316, 40342, 40366, 40395, 40420, 40443, 40466, + 40490, 40516, 40542, 40566, 40595, 40620, 40643, 40666, + 40689, 40740, 40782, 40809, 40832, 40868, 40894, 40921, + 40943, 40966, 40989, 41012, 41063, 41105, 41132, 41155, + 41191, 41217, 41244, 41266, 41297, 41326, 41350, 41378, + 41409, 41437, 41468, 41502, 41530, 41555, 41580, 41610, + 41663, 41737, 41781, 41805, 41850, 41871, 41908, 41952, + 41976, 41998, 42019, 42040, 42069, 42092, 42115, 42137, + 42160, 42182, 42205, 42228, 42251, 42275, 42301, 42327, + 42351, 42380, 42405, 42428, 42451, 42475, 42501, 42527, + 42551, 42580, 42605, 42628, 42651, 42674, 42725, 42767, + 42794, 42817, 42853, 42879, 42906, 42928, 42951, 42974, + 42997, 43048, 43090, 43117, 43140, 43176, 43202, 43229, + 43251, 43275, 43301, 43327, 43358, 43391, 43418, 43444, + 43475, 43499, 43527, 43552, 43581, 43612, 43637, 43666, + 43689, 43718, 43742, 43765, 43791, 43814, 43842, 43865, + 43894, 43916, 43939, 43970, 43996, 44019, 44044, 44069, + 44092, 44117, 44140, 44162, 44187, 44210, 44236, 44259, + 44284, 44309, 44334, 44357, 44380, 44410, 44435, 44460, + 44485, 44508, 44531, 44553, 44576, 44599, 44622, 44647, + 44670, 44693, 44719, 44744, 44769, 44792, 44815, 44840, + 44865, 44888, 44914, 44942, 44968, 44993, 45015, 45040, + 45063, 45089, 45129, 45154, 45176, 45203, 45225, 45252, + 45276, 45297, 45321, 45374, 45418, 45470, 45516, 45566, + 45592, 45615, 45660, 45712, 45743, 45767, 45795, 45827, + 45855, 45886, 45920, 45948, 45998, 46044, 46091, 46140, + 46189, 46236, 46288, 46340, 46365, 46390, 46420, 46473, + 46547, 46586, 46614, 46667, 46713, 46767, 46816, 46862, + 46910, 46958, 47008, 47029, 47077, 47125, 47171, 47217, + 47262, 47308, 47354, 47400, 47448, 47494, 47540, 47589, + 47641, 47666, 47704, 47735, 47757, 47809, 47855, 47901, + 47953, 48006, 48052, 48101, 48152, 48201, 48249, 48294, + 48342, 48388, 48437, 48500, 48548, 48593, 48643, 48688, + 48738, 48790, 48836, 48881, 48929, 48975, 49024, 49070, + 49122, 49174, 49222, 49268, 49314, 49367, 49415, 49467, + 49513, 49559, 49633, 49698, 49748, 49794, 49853, 49902, + 49952, 49997, 50044, 50097, 50150, 50208, 50268, 50322, + 50371, 50425, 50472, 50523, 50575, 50631, 50685, 50737, + 50793, 50839, 50891, 50938, 50984, 51033, 51079, 51130, + 51176, 51228, 51273, 51316, 51354, } var _s_trans_keys []byte = []byte{ - 173, 0, 127, 176, 255, 131, 137, 191, - 145, 189, 135, 129, 130, 132, 133, 156, - 128, 133, 144, 154, 176, 139, 159, 150, - 157, 159, 164, 167, 168, 170, 173, 143, - 145, 176, 255, 139, 255, 166, 176, 171, - 179, 160, 161, 163, 164, 165, 167, 169, - 171, 173, 174, 175, 176, 177, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 166, 170, 172, 178, 150, - 153, 155, 163, 165, 167, 169, 173, 153, - 155, 163, 255, 189, 132, 185, 144, 152, - 161, 164, 255, 188, 129, 131, 190, 255, - 133, 134, 137, 138, 142, 150, 152, 161, - 164, 255, 131, 134, 137, 138, 142, 144, - 146, 175, 178, 180, 182, 255, 134, 138, - 142, 161, 164, 255, 188, 129, 131, 190, - 191, 128, 132, 135, 136, 139, 141, 150, - 151, 162, 163, 130, 190, 191, 151, 128, - 130, 134, 136, 138, 141, 128, 131, 190, - 255, 133, 137, 142, 148, 151, 161, 164, - 255, 128, 132, 134, 136, 138, 141, 149, - 150, 162, 163, 129, 131, 190, 255, 133, - 137, 142, 150, 152, 161, 164, 255, 130, - 131, 138, 150, 143, 148, 152, 159, 178, - 179, 177, 180, 186, 135, 142, 177, 180, - 185, 187, 188, 136, 141, 181, 183, 185, - 152, 153, 190, 191, 177, 191, 128, 132, - 134, 135, 141, 151, 153, 188, 134, 128, - 129, 130, 141, 156, 157, 158, 159, 160, - 162, 164, 168, 169, 170, 172, 173, 174, - 175, 176, 179, 183, 171, 190, 150, 153, - 158, 160, 162, 164, 167, 173, 177, 180, - 143, 130, 141, 154, 157, 157, 159, 146, - 148, 178, 180, 146, 147, 178, 179, 180, - 255, 148, 156, 158, 255, 139, 142, 169, - 160, 171, 176, 187, 151, 155, 191, 149, - 158, 160, 188, 176, 190, 128, 132, 180, - 255, 133, 170, 180, 255, 128, 130, 161, - 173, 166, 179, 164, 183, 173, 144, 146, - 148, 168, 178, 180, 184, 185, 128, 181, - 188, 191, 128, 129, 131, 179, 181, 183, - 140, 143, 170, 174, 160, 164, 166, 175, - 144, 176, 175, 177, 191, 160, 191, 128, - 130, 170, 175, 153, 154, 153, 154, 155, - 160, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 175, 175, 178, 180, 189, - 158, 159, 176, 177, 130, 134, 139, 163, - 167, 128, 129, 180, 255, 133, 159, 178, - 255, 166, 173, 135, 147, 128, 131, 179, - 255, 129, 164, 166, 255, 169, 182, 131, - 140, 141, 187, 189, 176, 178, 180, 183, - 184, 190, 191, 129, 171, 175, 181, 182, - 163, 170, 172, 173, 172, 184, 187, 190, - 191, 158, 128, 143, 160, 175, 185, 187, - 144, 145, 150, 155, 157, 158, 135, 139, - 141, 168, 171, 189, 160, 182, 186, 191, - 129, 131, 133, 134, 140, 143, 184, 186, - 165, 166, 128, 129, 130, 132, 133, 134, - 135, 136, 139, 140, 141, 146, 147, 150, - 151, 152, 153, 154, 156, 128, 130, 184, - 255, 135, 190, 131, 175, 187, 188, 190, - 255, 128, 130, 167, 180, 179, 128, 130, - 179, 255, 129, 137, 141, 255, 172, 183, - 159, 170, 188, 128, 131, 190, 191, 151, - 128, 132, 135, 136, 139, 141, 162, 163, - 166, 172, 176, 180, 176, 255, 132, 255, - 175, 181, 184, 255, 129, 155, 158, 255, - 129, 255, 171, 183, 157, 171, 171, 172, - 189, 190, 176, 180, 176, 182, 145, 190, - 143, 146, 178, 157, 158, 160, 163, 133, - 134, 137, 168, 169, 170, 165, 169, 173, - 255, 131, 132, 140, 169, 174, 255, 130, - 132, 128, 182, 187, 255, 173, 180, 182, - 255, 132, 155, 159, 161, 175, 163, 144, - 150, 160, 128, 129, 132, 135, 133, 134, - 129, 160, 255, 192, 255, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 48, 57, 194, 195, 198, 199, - 203, 204, 205, 206, 207, 210, 212, 213, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 237, 239, - 240, 243, 65, 90, 97, 122, 196, 218, - 235, 236, 170, 173, 181, 186, 128, 150, - 152, 182, 184, 255, 192, 255, 128, 255, - 173, 130, 133, 146, 159, 165, 171, 175, - 255, 0, 127, 181, 190, 176, 183, 184, - 185, 186, 191, 192, 255, 134, 140, 136, - 138, 142, 161, 163, 255, 182, 130, 131, - 137, 176, 151, 152, 154, 160, 190, 136, - 144, 145, 191, 192, 255, 135, 129, 130, - 132, 133, 144, 170, 176, 179, 156, 128, - 133, 144, 154, 160, 191, 176, 128, 138, - 139, 159, 174, 255, 148, 158, 169, 150, - 164, 167, 173, 176, 185, 189, 190, 192, - 255, 144, 143, 145, 146, 175, 176, 255, - 139, 140, 141, 255, 166, 176, 178, 255, - 186, 138, 170, 171, 179, 180, 181, 160, - 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 154, - 164, 168, 128, 149, 150, 173, 128, 152, - 153, 155, 160, 180, 163, 255, 189, 132, - 185, 144, 152, 161, 164, 176, 177, 255, - 132, 169, 177, 188, 129, 131, 141, 142, - 145, 146, 179, 181, 186, 187, 190, 255, - 142, 158, 133, 134, 137, 138, 143, 150, - 152, 155, 156, 161, 164, 175, 176, 177, - 178, 255, 188, 129, 131, 133, 138, 143, - 144, 147, 168, 170, 176, 178, 179, 181, - 182, 184, 185, 190, 255, 157, 131, 134, - 137, 138, 142, 144, 146, 152, 153, 158, - 159, 175, 178, 180, 182, 255, 189, 129, - 131, 133, 141, 143, 145, 147, 168, 170, - 176, 178, 179, 181, 185, 188, 255, 134, - 138, 144, 185, 142, 159, 160, 161, 164, - 255, 189, 129, 131, 133, 140, 143, 144, - 147, 168, 170, 176, 178, 179, 181, 185, - 188, 191, 177, 128, 132, 135, 136, 139, - 141, 150, 151, 156, 157, 159, 161, 162, - 163, 130, 131, 156, 133, 138, 142, 144, - 146, 149, 153, 154, 158, 159, 163, 164, - 168, 170, 174, 185, 190, 191, 144, 151, - 128, 130, 134, 136, 138, 141, 189, 128, - 131, 133, 140, 142, 144, 146, 168, 170, - 185, 190, 255, 133, 137, 151, 142, 148, - 152, 154, 155, 159, 160, 161, 164, 255, - 189, 129, 131, 133, 140, 142, 144, 146, - 168, 170, 179, 181, 185, 188, 191, 158, - 128, 132, 134, 136, 138, 141, 149, 150, - 160, 161, 162, 163, 177, 178, 189, 129, - 131, 133, 140, 142, 144, 146, 186, 190, - 255, 133, 137, 142, 143, 150, 152, 158, - 159, 161, 164, 185, 186, 191, 192, 255, - 189, 130, 131, 133, 150, 154, 177, 179, - 187, 138, 150, 128, 134, 143, 148, 152, - 159, 178, 179, 177, 180, 186, 135, 142, - 177, 180, 185, 187, 188, 136, 141, 128, - 181, 183, 185, 152, 153, 190, 191, 128, - 135, 137, 172, 177, 191, 128, 132, 134, - 135, 136, 140, 141, 151, 153, 188, 134, - 128, 129, 130, 131, 137, 138, 139, 140, - 141, 142, 143, 144, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, - 168, 169, 170, 172, 173, 174, 175, 176, - 177, 179, 181, 182, 183, 188, 189, 190, - 191, 132, 152, 180, 184, 185, 187, 171, - 190, 150, 153, 158, 160, 162, 164, 167, - 173, 177, 180, 143, 130, 141, 154, 157, - 160, 255, 134, 187, 136, 140, 142, 143, - 137, 151, 153, 142, 143, 158, 159, 137, - 177, 142, 143, 182, 183, 191, 255, 128, - 130, 133, 136, 150, 152, 255, 145, 150, - 151, 155, 156, 157, 159, 160, 255, 128, - 143, 160, 255, 182, 183, 190, 255, 129, - 255, 173, 174, 192, 255, 129, 154, 160, - 255, 171, 173, 185, 255, 128, 140, 142, - 145, 146, 148, 160, 177, 178, 180, 128, - 145, 146, 147, 160, 172, 174, 176, 178, - 179, 180, 255, 148, 156, 158, 255, 139, - 142, 160, 255, 184, 255, 169, 128, 170, - 176, 255, 182, 255, 128, 158, 160, 171, - 176, 187, 128, 150, 151, 155, 191, 149, - 158, 160, 188, 176, 190, 128, 132, 133, - 179, 180, 255, 133, 139, 140, 170, 180, - 255, 128, 130, 131, 160, 161, 173, 174, - 175, 186, 255, 166, 179, 180, 255, 128, - 163, 164, 183, 141, 143, 154, 189, 173, - 144, 146, 148, 168, 169, 177, 178, 180, - 181, 182, 184, 185, 128, 181, 188, 191, - 150, 151, 158, 159, 152, 154, 156, 158, - 134, 135, 142, 143, 190, 255, 190, 128, - 180, 182, 188, 130, 132, 134, 140, 144, - 147, 150, 155, 160, 172, 178, 180, 182, - 188, 128, 129, 130, 131, 132, 133, 134, - 146, 147, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 140, 143, 170, 174, 177, - 191, 160, 164, 166, 175, 144, 156, 144, - 176, 130, 135, 149, 164, 166, 168, 138, - 147, 153, 157, 170, 173, 175, 185, 188, - 191, 142, 133, 137, 160, 255, 137, 255, - 182, 255, 170, 255, 128, 174, 176, 255, - 159, 165, 170, 175, 177, 180, 255, 167, - 173, 128, 165, 176, 255, 191, 168, 174, - 176, 255, 128, 150, 160, 166, 168, 174, - 176, 182, 184, 190, 128, 134, 136, 142, - 144, 150, 152, 158, 160, 191, 175, 128, - 130, 132, 133, 134, 133, 170, 175, 187, - 188, 153, 154, 133, 173, 177, 255, 143, - 159, 187, 255, 128, 146, 147, 148, 152, - 153, 154, 155, 156, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 129, - 255, 141, 255, 144, 189, 141, 143, 160, - 169, 172, 255, 191, 128, 174, 175, 178, - 180, 189, 128, 157, 158, 159, 160, 255, - 176, 177, 178, 255, 151, 159, 162, 255, - 137, 138, 174, 175, 184, 255, 183, 255, - 130, 134, 139, 163, 167, 168, 255, 128, - 179, 128, 129, 130, 179, 180, 255, 187, - 189, 133, 159, 178, 183, 184, 255, 138, - 165, 166, 173, 176, 255, 135, 147, 148, - 159, 189, 255, 128, 131, 132, 178, 179, - 255, 143, 129, 164, 166, 255, 128, 168, - 169, 182, 131, 128, 139, 140, 141, 187, - 189, 176, 178, 180, 183, 184, 190, 191, - 129, 160, 170, 171, 175, 178, 180, 181, - 182, 129, 134, 137, 142, 145, 150, 160, - 166, 168, 174, 176, 255, 155, 166, 175, - 128, 162, 163, 170, 172, 173, 158, 159, - 160, 255, 164, 175, 135, 138, 188, 255, - 172, 173, 174, 175, 180, 181, 182, 183, - 184, 185, 187, 188, 189, 190, 191, 176, - 186, 158, 190, 128, 134, 147, 151, 157, - 168, 170, 182, 184, 188, 128, 129, 131, - 132, 134, 255, 178, 255, 147, 255, 190, - 255, 144, 255, 144, 145, 136, 175, 188, - 255, 128, 143, 160, 175, 176, 180, 182, - 255, 191, 189, 255, 161, 186, 129, 154, - 158, 159, 160, 190, 130, 135, 138, 143, - 146, 151, 154, 156, 185, 187, 144, 145, - 146, 147, 148, 150, 155, 157, 158, 159, - 128, 129, 130, 131, 133, 135, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 148, - 149, 152, 156, 157, 160, 161, 162, 163, - 164, 166, 168, 169, 170, 171, 172, 173, - 174, 176, 177, 153, 155, 178, 179, 128, - 139, 141, 166, 168, 186, 188, 189, 191, - 255, 142, 143, 158, 255, 187, 255, 128, - 180, 189, 128, 156, 160, 255, 160, 145, - 255, 128, 159, 176, 255, 139, 143, 182, - 186, 187, 255, 128, 157, 160, 255, 144, - 132, 135, 150, 255, 158, 255, 128, 167, - 176, 255, 164, 255, 183, 255, 128, 149, - 160, 167, 136, 188, 128, 133, 138, 181, - 183, 184, 191, 255, 150, 159, 183, 255, - 128, 158, 160, 178, 180, 181, 128, 149, - 160, 185, 128, 183, 190, 191, 128, 191, - 129, 131, 133, 134, 140, 143, 144, 147, - 149, 151, 153, 179, 184, 186, 160, 188, - 128, 156, 128, 135, 137, 164, 165, 166, - 128, 181, 128, 149, 160, 178, 128, 145, - 128, 178, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 138, 139, 140, 141, 146, - 147, 150, 151, 152, 153, 154, 156, 162, - 163, 171, 128, 130, 131, 183, 184, 255, - 135, 190, 131, 175, 187, 188, 190, 255, - 144, 168, 128, 130, 131, 166, 167, 180, - 179, 182, 144, 178, 128, 130, 131, 178, - 179, 255, 154, 156, 129, 132, 133, 137, - 141, 255, 128, 145, 147, 171, 172, 183, - 136, 128, 134, 138, 141, 143, 157, 159, - 168, 176, 255, 159, 170, 171, 255, 189, - 128, 131, 133, 140, 143, 144, 147, 168, - 170, 176, 178, 179, 181, 185, 188, 191, - 144, 151, 128, 132, 135, 136, 139, 141, - 157, 161, 162, 163, 166, 172, 176, 180, - 128, 175, 176, 255, 134, 132, 135, 136, - 255, 128, 174, 175, 181, 184, 255, 129, - 151, 152, 155, 158, 255, 132, 129, 255, - 128, 170, 171, 183, 157, 171, 160, 255, - 160, 190, 192, 255, 128, 184, 128, 142, - 145, 149, 129, 141, 144, 146, 147, 148, - 154, 255, 175, 255, 132, 255, 128, 144, - 129, 143, 144, 153, 145, 152, 135, 255, - 160, 168, 169, 171, 172, 173, 174, 188, - 189, 190, 161, 167, 185, 255, 144, 173, - 176, 180, 128, 175, 176, 182, 128, 131, - 163, 183, 189, 255, 144, 255, 133, 143, - 145, 190, 191, 255, 143, 146, 147, 159, - 176, 177, 178, 171, 175, 189, 255, 128, - 136, 144, 153, 157, 158, 160, 163, 133, - 134, 137, 144, 145, 146, 147, 148, 149, - 154, 155, 156, 157, 158, 159, 168, 169, - 170, 150, 153, 165, 169, 173, 255, 131, - 132, 140, 169, 174, 255, 130, 132, 149, - 157, 173, 186, 188, 160, 161, 163, 164, - 167, 168, 132, 134, 149, 157, 186, 139, - 140, 191, 255, 134, 128, 132, 138, 144, - 146, 255, 166, 167, 129, 155, 187, 149, - 181, 143, 175, 137, 169, 131, 140, 255, - 128, 182, 187, 255, 173, 180, 182, 255, - 132, 155, 159, 161, 175, 160, 163, 184, - 185, 186, 161, 162, 133, 143, 144, 150, - 151, 255, 164, 167, 185, 187, 128, 131, - 133, 159, 161, 162, 169, 178, 180, 183, - 130, 135, 137, 139, 148, 151, 153, 155, - 157, 159, 164, 190, 141, 143, 145, 146, - 161, 162, 167, 170, 172, 178, 180, 183, - 185, 188, 128, 137, 139, 155, 161, 163, - 165, 169, 171, 187, 132, 133, 134, 176, - 255, 138, 143, 170, 175, 138, 255, 160, - 128, 129, 132, 135, 133, 134, 129, 160, - 255, 192, 255, 176, 255, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 48, 57, 173, 128, 255, 176, - 255, 131, 137, 191, 145, 189, 135, 129, - 130, 132, 133, 156, 128, 133, 144, 154, - 171, 176, 139, 159, 160, 169, 150, 157, - 159, 164, 167, 168, 170, 173, 176, 185, - 143, 145, 176, 255, 139, 255, 166, 176, - 128, 137, 171, 179, 160, 161, 163, 164, - 165, 167, 169, 171, 173, 174, 175, 176, - 177, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 166, 170, - 172, 178, 150, 153, 155, 163, 165, 167, - 169, 173, 153, 155, 163, 255, 189, 132, - 185, 144, 152, 161, 164, 165, 166, 175, - 176, 255, 188, 129, 131, 190, 255, 133, - 134, 137, 138, 142, 150, 152, 161, 164, - 165, 166, 175, 176, 255, 131, 134, 137, - 138, 142, 144, 146, 165, 166, 175, 178, - 180, 182, 255, 134, 138, 142, 161, 164, - 165, 166, 175, 176, 255, 188, 129, 131, - 190, 191, 128, 132, 135, 136, 139, 141, - 150, 151, 162, 163, 166, 175, 130, 190, - 191, 151, 128, 130, 134, 136, 138, 141, - 166, 175, 128, 131, 190, 255, 133, 137, - 142, 148, 151, 161, 164, 165, 166, 175, - 176, 255, 128, 132, 134, 136, 138, 141, - 149, 150, 162, 163, 166, 175, 129, 131, - 190, 255, 133, 137, 142, 150, 152, 161, - 164, 165, 166, 175, 176, 255, 130, 131, - 138, 150, 143, 148, 152, 159, 166, 175, - 178, 179, 177, 180, 186, 135, 142, 144, - 153, 177, 180, 185, 187, 188, 136, 141, - 144, 153, 181, 183, 185, 152, 153, 160, - 169, 190, 191, 177, 191, 128, 132, 134, - 135, 141, 151, 153, 188, 134, 128, 129, - 130, 141, 156, 157, 158, 159, 160, 162, - 164, 165, 167, 168, 169, 170, 172, 173, - 174, 175, 176, 177, 179, 183, 171, 190, - 128, 137, 150, 153, 158, 160, 162, 164, - 167, 173, 177, 180, 143, 130, 141, 144, - 153, 154, 157, 157, 159, 146, 148, 178, - 180, 146, 147, 178, 179, 180, 255, 148, - 156, 158, 159, 160, 169, 170, 255, 139, - 142, 144, 153, 169, 160, 171, 176, 187, - 134, 143, 144, 153, 151, 155, 191, 149, - 158, 160, 188, 128, 137, 144, 153, 176, - 190, 128, 132, 180, 255, 133, 143, 144, - 153, 154, 170, 180, 255, 128, 130, 161, - 173, 176, 185, 166, 179, 164, 183, 128, - 137, 144, 153, 173, 144, 146, 148, 168, - 178, 180, 184, 185, 128, 181, 188, 191, - 128, 129, 131, 179, 181, 183, 140, 143, - 170, 174, 160, 164, 166, 175, 144, 176, - 175, 177, 191, 160, 191, 128, 130, 170, - 175, 153, 154, 152, 153, 154, 155, 160, - 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 175, 160, 169, 175, 178, 180, - 189, 158, 159, 176, 177, 130, 134, 139, - 163, 167, 128, 129, 180, 255, 133, 143, - 144, 153, 154, 159, 178, 255, 128, 137, - 166, 173, 135, 147, 128, 131, 179, 255, - 129, 143, 144, 153, 154, 164, 166, 175, - 176, 185, 186, 255, 169, 182, 131, 140, - 141, 144, 153, 187, 189, 176, 178, 180, - 183, 184, 190, 191, 129, 171, 175, 181, - 182, 163, 170, 172, 173, 176, 185, 172, - 184, 187, 190, 191, 158, 128, 143, 160, - 175, 185, 187, 144, 145, 150, 155, 157, - 158, 135, 139, 141, 146, 168, 171, 189, - 160, 182, 186, 191, 129, 131, 133, 134, - 140, 143, 184, 186, 165, 166, 128, 129, - 130, 131, 132, 133, 134, 135, 136, 139, - 140, 141, 146, 147, 150, 151, 152, 153, - 154, 155, 156, 163, 128, 130, 184, 255, - 135, 165, 166, 175, 176, 190, 131, 175, - 187, 188, 190, 255, 176, 185, 128, 130, - 167, 180, 182, 191, 179, 128, 130, 179, - 255, 129, 137, 141, 143, 144, 153, 154, - 255, 172, 183, 159, 170, 176, 185, 188, - 128, 131, 190, 191, 151, 128, 132, 135, - 136, 139, 141, 162, 163, 166, 172, 176, - 180, 176, 255, 132, 143, 144, 153, 154, - 255, 175, 181, 184, 255, 129, 155, 158, - 255, 129, 143, 144, 153, 154, 255, 171, - 183, 128, 137, 157, 171, 176, 185, 169, - 171, 172, 173, 189, 190, 176, 180, 176, - 182, 145, 190, 143, 146, 178, 157, 158, - 160, 163, 133, 134, 137, 159, 168, 169, - 170, 165, 169, 173, 255, 131, 132, 140, - 169, 174, 255, 130, 132, 142, 191, 128, - 182, 187, 255, 173, 180, 182, 255, 132, - 155, 159, 161, 175, 163, 144, 150, 160, - 128, 129, 132, 135, 133, 134, 129, 160, - 255, 192, 255, 170, 173, 181, 186, 128, - 255, 181, 190, 176, 183, 184, 185, 186, - 191, 192, 255, 130, 131, 137, 190, 136, - 144, 145, 191, 192, 255, 135, 179, 129, - 130, 132, 133, 144, 170, 176, 178, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 173, 128, 255, 176, - 255, 131, 137, 191, 145, 189, 135, 129, - 130, 132, 133, 144, 170, 176, 178, 170, - 173, 181, 186, 0, 127, 181, 190, 176, - 183, 184, 185, 186, 191, 192, 255, 130, - 131, 137, 190, 136, 144, 145, 191, 192, - 255, 135, 179, 129, 130, 132, 133, 144, - 170, 176, 178, 156, 128, 133, 144, 154, - 160, 191, 171, 176, 128, 138, 139, 159, - 160, 169, 174, 255, 148, 158, 169, 150, - 164, 167, 173, 176, 185, 189, 190, 192, - 255, 144, 143, 145, 146, 175, 176, 255, - 139, 140, 141, 255, 166, 176, 178, 255, - 186, 128, 137, 138, 170, 171, 179, 180, - 181, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, - 191, 154, 164, 168, 128, 149, 150, 173, - 128, 152, 153, 155, 163, 255, 189, 132, - 185, 144, 176, 152, 161, 164, 165, 166, - 175, 177, 255, 132, 169, 177, 188, 129, - 131, 141, 142, 145, 146, 179, 181, 186, - 187, 190, 255, 142, 158, 133, 134, 137, - 138, 143, 150, 152, 155, 156, 161, 164, - 165, 166, 175, 176, 177, 178, 255, 188, - 129, 131, 133, 138, 143, 144, 147, 168, - 170, 176, 178, 179, 181, 182, 184, 185, - 190, 255, 157, 131, 134, 137, 138, 142, - 144, 146, 152, 153, 158, 159, 165, 166, - 175, 178, 180, 182, 255, 189, 129, 131, - 133, 141, 143, 145, 147, 168, 170, 176, - 178, 179, 181, 185, 188, 255, 134, 138, - 144, 185, 142, 159, 160, 161, 164, 165, - 166, 175, 176, 255, 189, 129, 131, 133, - 140, 143, 144, 147, 168, 170, 176, 178, - 179, 181, 185, 188, 191, 177, 128, 132, - 135, 136, 139, 141, 150, 151, 156, 157, - 159, 161, 162, 163, 166, 175, 130, 131, - 156, 133, 138, 142, 144, 146, 149, 153, - 154, 158, 159, 163, 164, 168, 170, 174, - 185, 190, 191, 144, 151, 128, 130, 134, - 136, 138, 141, 166, 175, 189, 128, 131, - 133, 140, 142, 144, 146, 168, 170, 185, - 190, 255, 133, 137, 151, 142, 148, 152, - 154, 155, 159, 160, 161, 164, 165, 166, - 175, 176, 255, 189, 129, 131, 133, 140, - 142, 144, 146, 168, 170, 179, 181, 185, - 188, 191, 158, 128, 132, 134, 136, 138, - 141, 149, 150, 160, 161, 162, 163, 166, - 175, 177, 178, 189, 129, 131, 133, 140, - 142, 144, 146, 186, 190, 255, 133, 137, - 142, 143, 150, 152, 158, 159, 161, 164, - 165, 166, 175, 176, 185, 186, 191, 192, - 255, 189, 130, 131, 133, 150, 154, 177, - 179, 187, 138, 150, 128, 134, 143, 148, - 152, 159, 166, 175, 178, 179, 177, 180, - 186, 135, 142, 144, 153, 177, 180, 185, - 187, 188, 136, 141, 144, 153, 128, 181, - 183, 185, 152, 153, 160, 169, 190, 191, - 128, 135, 137, 172, 177, 191, 128, 132, - 134, 135, 136, 140, 141, 151, 153, 188, - 134, 128, 129, 130, 131, 137, 138, 139, - 140, 141, 142, 143, 144, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, - 164, 165, 167, 168, 169, 170, 172, 173, - 174, 175, 176, 177, 179, 181, 182, 183, - 188, 189, 190, 191, 132, 152, 180, 184, - 185, 187, 171, 190, 128, 137, 150, 153, - 158, 160, 162, 164, 167, 173, 177, 180, - 143, 130, 141, 144, 153, 154, 157, 160, - 255, 155, 156, 157, 159, 160, 255, 128, - 140, 142, 145, 146, 148, 160, 177, 178, - 180, 128, 145, 146, 147, 160, 172, 174, - 176, 178, 179, 180, 255, 148, 156, 158, - 159, 160, 169, 170, 255, 139, 142, 144, - 153, 160, 255, 169, 128, 170, 176, 255, - 128, 158, 160, 171, 176, 187, 128, 150, - 151, 155, 191, 149, 158, 160, 188, 128, - 137, 144, 153, 176, 190, 128, 132, 133, - 179, 180, 255, 133, 139, 140, 143, 144, - 153, 154, 170, 180, 255, 128, 130, 131, - 160, 161, 173, 174, 175, 176, 185, 186, - 255, 166, 179, 180, 255, 128, 163, 164, - 183, 128, 137, 141, 143, 144, 153, 154, - 189, 173, 144, 146, 148, 168, 169, 177, - 178, 180, 181, 182, 184, 185, 128, 181, - 188, 191, 128, 129, 130, 131, 132, 133, - 134, 146, 147, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 140, 143, 170, 174, - 191, 255, 165, 177, 191, 129, 147, 149, - 159, 160, 175, 176, 255, 144, 176, 165, - 170, 175, 177, 180, 255, 191, 168, 174, - 176, 255, 128, 134, 136, 142, 144, 150, - 152, 158, 160, 191, 128, 130, 132, 133, - 134, 133, 170, 175, 187, 188, 153, 154, - 128, 146, 147, 148, 152, 153, 154, 155, - 156, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 129, 255, 141, 143, - 160, 169, 172, 255, 191, 128, 174, 175, - 178, 180, 189, 128, 157, 158, 159, 160, - 255, 176, 177, 178, 255, 130, 134, 139, - 163, 167, 168, 255, 128, 129, 130, 179, - 180, 255, 187, 189, 133, 143, 144, 153, - 154, 159, 178, 183, 184, 255, 128, 137, - 138, 165, 166, 173, 176, 255, 135, 147, - 148, 159, 189, 255, 128, 131, 132, 178, - 179, 255, 143, 129, 142, 144, 153, 154, - 164, 166, 175, 176, 185, 186, 255, 128, - 168, 169, 182, 131, 128, 139, 140, 141, - 144, 153, 187, 189, 176, 178, 180, 183, - 184, 190, 191, 129, 160, 170, 171, 175, - 178, 180, 181, 182, 128, 162, 163, 170, - 172, 173, 176, 185, 172, 173, 174, 175, - 180, 181, 182, 183, 184, 185, 187, 188, - 189, 190, 191, 176, 186, 158, 190, 128, - 134, 147, 151, 157, 168, 170, 182, 184, - 188, 128, 129, 131, 132, 134, 143, 144, - 255, 128, 143, 160, 175, 179, 180, 141, - 143, 176, 180, 182, 255, 191, 189, 255, - 191, 161, 186, 158, 159, 160, 190, 130, - 135, 138, 143, 146, 151, 154, 156, 185, - 187, 144, 145, 146, 147, 148, 150, 155, - 157, 158, 159, 128, 129, 130, 131, 133, - 135, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 148, 149, 152, 156, 157, 160, - 161, 162, 163, 164, 166, 168, 169, 170, - 171, 172, 173, 174, 176, 177, 153, 155, - 178, 179, 189, 160, 145, 255, 139, 143, - 182, 186, 187, 255, 158, 159, 160, 169, - 170, 255, 128, 191, 129, 131, 133, 134, - 140, 143, 144, 147, 149, 151, 153, 179, - 184, 186, 128, 135, 137, 164, 165, 166, - 128, 129, 130, 131, 132, 133, 134, 135, - 136, 138, 139, 140, 141, 146, 147, 150, - 151, 152, 153, 154, 155, 156, 162, 163, - 171, 128, 130, 131, 183, 184, 255, 135, - 165, 166, 175, 176, 190, 131, 175, 187, - 188, 190, 255, 144, 168, 176, 185, 128, - 130, 131, 166, 167, 180, 182, 191, 179, - 182, 144, 178, 128, 130, 131, 178, 179, - 255, 155, 129, 132, 133, 137, 141, 143, - 144, 153, 154, 156, 157, 255, 128, 145, - 147, 171, 172, 183, 159, 170, 171, 175, - 176, 185, 186, 255, 189, 128, 131, 133, - 140, 143, 144, 147, 168, 170, 176, 178, - 179, 181, 185, 188, 191, 144, 151, 128, - 132, 135, 136, 139, 141, 157, 161, 162, - 163, 166, 172, 176, 180, 128, 175, 176, - 255, 134, 132, 135, 136, 143, 144, 153, - 154, 255, 128, 174, 175, 181, 184, 255, - 129, 151, 152, 155, 158, 255, 132, 129, - 143, 144, 153, 154, 255, 128, 170, 171, - 183, 157, 171, 176, 185, 160, 169, 170, - 190, 192, 255, 160, 168, 169, 171, 172, - 173, 174, 188, 189, 190, 161, 167, 128, - 158, 160, 169, 144, 173, 176, 180, 128, - 175, 176, 182, 128, 131, 144, 153, 163, - 183, 189, 255, 133, 143, 145, 190, 191, - 255, 143, 146, 147, 159, 176, 177, 178, - 128, 136, 144, 153, 157, 158, 160, 163, - 133, 134, 137, 144, 145, 146, 147, 148, - 149, 154, 155, 156, 157, 158, 159, 168, - 169, 170, 150, 153, 165, 169, 173, 255, - 131, 132, 140, 169, 174, 255, 130, 132, - 131, 140, 141, 142, 191, 192, 255, 128, - 182, 187, 255, 173, 180, 182, 255, 132, - 155, 159, 161, 175, 160, 163, 184, 185, - 186, 161, 162, 133, 143, 144, 150, 151, - 255, 160, 128, 129, 132, 135, 133, 134, - 129, 160, 255, 192, 255, 176, 255, 156, - 128, 133, 144, 154, 176, 139, 159, 150, - 157, 159, 164, 167, 168, 170, 173, 143, - 145, 176, 255, 139, 255, 166, 176, 171, - 179, 160, 161, 163, 164, 165, 167, 169, - 171, 173, 174, 175, 176, 177, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 166, 170, 172, 178, 150, - 153, 155, 163, 165, 167, 169, 173, 153, - 155, 163, 255, 189, 132, 185, 144, 152, - 161, 164, 255, 188, 129, 131, 190, 255, - 133, 134, 137, 138, 142, 150, 152, 161, - 164, 255, 131, 134, 137, 138, 142, 144, - 146, 175, 178, 180, 182, 255, 134, 138, - 142, 161, 164, 255, 188, 129, 131, 190, - 191, 128, 132, 135, 136, 139, 141, 150, - 151, 162, 163, 130, 190, 191, 151, 128, - 130, 134, 136, 138, 141, 128, 131, 190, - 255, 133, 137, 142, 148, 151, 161, 164, - 255, 128, 132, 134, 136, 138, 141, 149, - 150, 162, 163, 129, 131, 190, 255, 133, - 137, 142, 150, 152, 161, 164, 255, 130, - 131, 138, 150, 143, 148, 152, 159, 178, - 179, 177, 180, 186, 135, 142, 177, 180, - 185, 187, 188, 136, 141, 181, 183, 185, - 152, 153, 190, 191, 177, 191, 128, 132, - 134, 135, 141, 151, 153, 188, 134, 128, - 129, 130, 141, 156, 157, 158, 159, 160, - 162, 164, 168, 169, 170, 172, 173, 174, - 175, 176, 179, 183, 171, 190, 150, 153, - 158, 160, 162, 164, 167, 173, 177, 180, - 143, 130, 141, 154, 157, 157, 159, 146, - 148, 178, 180, 146, 147, 178, 179, 180, - 255, 148, 156, 158, 255, 139, 142, 169, - 160, 171, 176, 187, 151, 155, 191, 149, - 158, 160, 188, 176, 190, 128, 132, 180, - 255, 133, 170, 180, 255, 128, 130, 161, - 173, 166, 179, 164, 183, 173, 144, 146, - 148, 168, 178, 180, 184, 185, 128, 181, - 188, 191, 128, 129, 131, 179, 181, 183, - 140, 143, 170, 174, 160, 164, 166, 175, - 144, 176, 175, 177, 191, 160, 191, 128, - 130, 170, 175, 153, 154, 153, 154, 155, - 160, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 175, 175, 178, 180, 189, - 158, 159, 176, 177, 130, 134, 139, 163, - 167, 128, 129, 180, 255, 133, 159, 178, - 255, 166, 173, 135, 147, 128, 131, 179, - 255, 129, 164, 166, 255, 169, 182, 131, - 140, 141, 187, 189, 176, 178, 180, 183, - 184, 190, 191, 129, 171, 175, 181, 182, - 163, 170, 172, 173, 172, 173, 184, 187, - 190, 191, 158, 190, 157, 168, 170, 182, - 184, 188, 128, 129, 131, 132, 134, 143, - 128, 143, 160, 175, 185, 187, 144, 145, - 150, 155, 157, 158, 135, 139, 141, 168, - 171, 189, 160, 182, 186, 191, 129, 131, - 133, 134, 140, 143, 184, 186, 165, 166, - 128, 129, 130, 132, 133, 134, 135, 136, - 139, 140, 141, 146, 147, 150, 151, 152, - 153, 154, 156, 128, 130, 184, 255, 135, - 190, 131, 175, 187, 188, 190, 255, 128, - 130, 167, 180, 179, 128, 130, 179, 255, - 129, 137, 141, 255, 172, 183, 159, 170, - 188, 128, 131, 190, 191, 151, 128, 132, - 135, 136, 139, 141, 162, 163, 166, 172, - 176, 180, 176, 255, 132, 255, 175, 181, - 184, 255, 129, 155, 158, 255, 129, 255, - 171, 183, 157, 171, 171, 172, 189, 190, - 176, 180, 176, 182, 145, 190, 143, 146, - 178, 157, 158, 160, 163, 133, 134, 137, - 168, 169, 170, 165, 169, 173, 255, 131, - 132, 140, 169, 174, 255, 130, 132, 128, - 182, 187, 255, 173, 180, 182, 255, 132, - 155, 159, 161, 175, 163, 144, 150, 160, - 128, 129, 132, 135, 133, 134, 129, 160, - 255, 192, 255, 170, 173, 181, 183, 186, - 151, 173, 130, 133, 146, 159, 165, 171, - 175, 255, 128, 255, 181, 190, 176, 183, - 184, 185, 186, 191, 192, 255, 135, 140, - 134, 138, 142, 161, 163, 255, 130, 131, - 137, 190, 136, 144, 145, 191, 192, 255, - 135, 179, 180, 129, 130, 132, 133, 144, - 170, 176, 178, 156, 128, 133, 144, 154, - 160, 191, 171, 176, 128, 138, 139, 159, - 160, 169, 174, 255, 148, 158, 169, 150, - 164, 167, 173, 176, 185, 189, 190, 192, - 255, 144, 143, 145, 146, 175, 176, 255, - 139, 140, 141, 255, 166, 176, 178, 255, - 186, 128, 137, 138, 170, 171, 179, 180, - 181, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, - 191, 154, 164, 168, 128, 149, 150, 173, - 128, 152, 153, 155, 163, 255, 189, 132, - 185, 144, 176, 152, 161, 164, 165, 166, - 175, 177, 255, 132, 169, 177, 188, 129, - 131, 141, 142, 145, 146, 179, 181, 186, - 187, 190, 255, 142, 158, 133, 134, 137, - 138, 143, 150, 152, 155, 156, 161, 164, - 165, 166, 175, 176, 177, 178, 255, 188, - 129, 131, 133, 138, 143, 144, 147, 168, - 170, 176, 178, 179, 181, 182, 184, 185, - 190, 255, 157, 131, 134, 137, 138, 142, - 144, 146, 152, 153, 158, 159, 165, 166, - 175, 178, 180, 182, 255, 189, 129, 131, - 133, 141, 143, 145, 147, 168, 170, 176, - 178, 179, 181, 185, 188, 255, 134, 138, - 144, 185, 142, 159, 160, 161, 164, 165, - 166, 175, 176, 255, 189, 129, 131, 133, - 140, 143, 144, 147, 168, 170, 176, 178, - 179, 181, 185, 188, 191, 177, 128, 132, - 135, 136, 139, 141, 150, 151, 156, 157, - 159, 161, 162, 163, 166, 175, 130, 131, - 156, 133, 138, 142, 144, 146, 149, 153, - 154, 158, 159, 163, 164, 168, 170, 174, - 185, 190, 191, 144, 151, 128, 130, 134, - 136, 138, 141, 166, 175, 189, 128, 131, - 133, 140, 142, 144, 146, 168, 170, 185, - 190, 255, 133, 137, 151, 142, 148, 152, - 154, 155, 159, 160, 161, 164, 165, 166, - 175, 176, 255, 189, 129, 131, 133, 140, - 142, 144, 146, 168, 170, 179, 181, 185, - 188, 191, 158, 128, 132, 134, 136, 138, - 141, 149, 150, 160, 161, 162, 163, 166, - 175, 177, 178, 189, 129, 131, 133, 140, - 142, 144, 146, 186, 190, 255, 133, 137, - 142, 143, 150, 152, 158, 159, 161, 164, - 165, 166, 175, 176, 185, 186, 191, 192, - 255, 189, 130, 131, 133, 150, 154, 177, - 179, 187, 138, 150, 128, 134, 143, 148, - 152, 159, 166, 175, 178, 179, 177, 180, - 186, 135, 142, 144, 153, 177, 180, 185, - 187, 188, 136, 141, 144, 153, 128, 181, - 183, 185, 152, 153, 160, 169, 190, 191, - 128, 135, 137, 172, 177, 191, 128, 132, - 134, 135, 136, 140, 141, 151, 153, 188, - 134, 128, 129, 130, 131, 137, 138, 139, - 140, 141, 142, 143, 144, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, - 164, 165, 167, 168, 169, 170, 172, 173, - 174, 175, 176, 177, 179, 181, 182, 183, - 188, 189, 190, 191, 132, 152, 180, 184, - 185, 187, 171, 190, 128, 137, 150, 153, - 158, 160, 162, 164, 167, 173, 177, 180, - 143, 130, 141, 144, 153, 154, 157, 160, - 255, 155, 156, 157, 159, 160, 255, 128, - 140, 142, 145, 146, 148, 160, 177, 178, - 180, 128, 145, 146, 147, 160, 172, 174, - 176, 178, 179, 180, 255, 148, 156, 158, - 159, 160, 169, 170, 255, 139, 142, 144, - 153, 160, 255, 169, 128, 170, 176, 255, - 128, 158, 160, 171, 176, 187, 128, 150, - 151, 155, 191, 149, 158, 160, 188, 128, - 137, 144, 153, 176, 190, 128, 132, 133, - 179, 180, 255, 133, 139, 140, 143, 144, - 153, 154, 170, 180, 255, 128, 130, 131, - 160, 161, 173, 174, 175, 176, 185, 186, - 255, 166, 179, 180, 255, 128, 163, 164, - 183, 173, 144, 146, 148, 168, 169, 177, - 178, 180, 181, 182, 184, 185, 128, 181, - 188, 191, 128, 129, 130, 131, 132, 133, - 134, 146, 147, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 164, 167, 140, 143, - 152, 153, 170, 174, 191, 255, 165, 177, - 191, 129, 147, 149, 159, 160, 175, 176, - 255, 144, 176, 165, 170, 175, 177, 180, - 255, 191, 168, 174, 176, 255, 128, 134, - 136, 142, 144, 150, 152, 158, 160, 191, - 128, 130, 132, 133, 134, 133, 170, 175, - 187, 188, 153, 154, 128, 146, 147, 148, - 152, 153, 154, 155, 156, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, - 129, 255, 191, 128, 174, 175, 178, 180, - 189, 128, 157, 158, 159, 160, 255, 176, - 177, 178, 255, 130, 134, 139, 163, 167, - 168, 255, 128, 129, 130, 179, 180, 255, - 187, 189, 133, 143, 144, 153, 154, 159, - 178, 183, 184, 255, 128, 137, 138, 165, - 166, 173, 176, 255, 135, 147, 148, 159, - 189, 255, 128, 131, 132, 178, 179, 255, - 143, 129, 142, 144, 153, 154, 164, 166, - 175, 176, 185, 186, 255, 128, 168, 169, - 182, 131, 128, 139, 140, 141, 144, 153, - 187, 189, 176, 178, 180, 183, 184, 190, - 191, 129, 160, 170, 171, 175, 178, 180, - 181, 182, 128, 162, 163, 170, 172, 173, - 176, 185, 172, 173, 174, 175, 180, 181, - 182, 183, 184, 185, 187, 188, 189, 190, - 191, 176, 186, 190, 128, 134, 147, 151, - 157, 168, 170, 182, 184, 188, 147, 128, - 143, 160, 175, 179, 180, 146, 149, 141, - 143, 176, 180, 182, 255, 191, 189, 255, - 135, 142, 154, 191, 161, 186, 158, 159, - 160, 190, 130, 135, 138, 143, 146, 151, - 154, 156, 185, 187, 144, 145, 146, 147, - 148, 150, 155, 157, 158, 159, 128, 129, - 130, 131, 133, 135, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 148, 149, 152, - 156, 157, 160, 161, 162, 163, 164, 166, - 168, 169, 170, 171, 172, 173, 174, 176, - 177, 153, 155, 178, 179, 189, 160, 145, - 255, 139, 143, 182, 186, 187, 255, 128, - 191, 129, 131, 133, 134, 140, 143, 144, - 147, 149, 151, 153, 179, 184, 186, 128, - 135, 137, 164, 165, 166, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 138, 139, - 140, 141, 146, 147, 150, 151, 152, 153, - 154, 155, 156, 162, 163, 171, 128, 130, - 131, 183, 184, 255, 135, 165, 166, 175, - 176, 190, 131, 175, 187, 188, 190, 255, - 128, 130, 131, 166, 167, 180, 182, 191, - 179, 182, 144, 178, 128, 130, 131, 178, - 179, 255, 155, 129, 132, 133, 137, 141, - 143, 144, 153, 154, 156, 157, 255, 128, - 145, 147, 171, 172, 183, 159, 170, 171, - 175, 176, 185, 186, 255, 189, 128, 131, - 133, 140, 143, 144, 147, 168, 170, 176, - 178, 179, 181, 185, 188, 191, 144, 151, - 128, 132, 135, 136, 139, 141, 157, 161, - 162, 163, 166, 172, 176, 180, 128, 175, - 176, 255, 134, 132, 135, 136, 143, 144, - 153, 154, 255, 128, 174, 175, 181, 184, - 255, 129, 151, 152, 155, 158, 255, 132, - 129, 143, 144, 153, 154, 255, 128, 170, - 171, 183, 157, 171, 176, 185, 160, 168, - 169, 171, 172, 173, 174, 188, 189, 190, - 161, 167, 144, 173, 176, 180, 128, 175, - 176, 182, 133, 143, 145, 190, 191, 255, - 143, 146, 147, 159, 176, 177, 178, 128, - 136, 144, 153, 157, 158, 160, 163, 133, - 134, 137, 144, 145, 146, 147, 148, 149, - 154, 155, 156, 157, 158, 159, 168, 169, - 170, 150, 153, 165, 169, 173, 255, 131, - 132, 140, 169, 174, 255, 130, 132, 128, - 182, 187, 255, 173, 180, 182, 255, 132, - 155, 159, 161, 175, 160, 163, 184, 185, - 186, 161, 162, 133, 143, 144, 150, 151, - 255, 160, 128, 129, 132, 135, 133, 134, - 129, 160, 255, 192, 255, 176, 255, 156, - 128, 133, 144, 154, 160, 191, 171, 176, - 128, 138, 139, 159, 160, 169, 174, 255, - 148, 158, 169, 150, 164, 167, 173, 176, - 185, 189, 190, 192, 255, 144, 143, 145, - 146, 175, 176, 255, 139, 140, 141, 255, - 166, 176, 178, 255, 186, 128, 137, 138, - 170, 171, 179, 180, 181, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 154, 164, 168, - 128, 149, 150, 173, 128, 152, 153, 155, - 163, 255, 189, 132, 185, 144, 176, 152, - 161, 164, 165, 166, 175, 177, 255, 132, - 169, 177, 188, 129, 131, 141, 142, 145, - 146, 179, 181, 186, 187, 190, 255, 142, - 158, 133, 134, 137, 138, 143, 150, 152, - 155, 156, 161, 164, 165, 166, 175, 176, - 177, 178, 255, 188, 129, 131, 133, 138, - 143, 144, 147, 168, 170, 176, 178, 179, - 181, 182, 184, 185, 190, 255, 157, 131, - 134, 137, 138, 142, 144, 146, 152, 153, - 158, 159, 165, 166, 175, 178, 180, 182, - 255, 189, 129, 131, 133, 141, 143, 145, - 147, 168, 170, 176, 178, 179, 181, 185, - 188, 255, 134, 138, 144, 185, 142, 159, - 160, 161, 164, 165, 166, 175, 176, 255, - 189, 129, 131, 133, 140, 143, 144, 147, - 168, 170, 176, 178, 179, 181, 185, 188, - 191, 177, 128, 132, 135, 136, 139, 141, - 150, 151, 156, 157, 159, 161, 162, 163, - 166, 175, 130, 131, 156, 133, 138, 142, - 144, 146, 149, 153, 154, 158, 159, 163, - 164, 168, 170, 174, 185, 190, 191, 144, - 151, 128, 130, 134, 136, 138, 141, 166, - 175, 189, 128, 131, 133, 140, 142, 144, - 146, 168, 170, 185, 190, 255, 133, 137, - 151, 142, 148, 152, 154, 155, 159, 160, - 161, 164, 165, 166, 175, 176, 255, 189, - 129, 131, 133, 140, 142, 144, 146, 168, - 170, 179, 181, 185, 188, 191, 158, 128, - 132, 134, 136, 138, 141, 149, 150, 160, - 161, 162, 163, 166, 175, 177, 178, 189, - 129, 131, 133, 140, 142, 144, 146, 186, - 190, 255, 133, 137, 142, 143, 150, 152, - 158, 159, 161, 164, 165, 166, 175, 176, - 185, 186, 191, 192, 255, 189, 130, 131, - 133, 150, 154, 177, 179, 187, 138, 150, - 128, 134, 143, 148, 152, 159, 166, 175, - 178, 179, 177, 180, 186, 135, 142, 144, - 153, 177, 180, 185, 187, 188, 136, 141, - 144, 153, 128, 181, 183, 185, 152, 153, - 160, 169, 190, 191, 128, 135, 137, 172, - 177, 191, 128, 132, 134, 135, 136, 140, - 141, 151, 153, 188, 134, 128, 129, 130, - 131, 137, 138, 139, 140, 141, 142, 143, - 144, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 167, 168, - 169, 170, 172, 173, 174, 175, 176, 177, - 179, 181, 182, 183, 188, 189, 190, 191, - 132, 152, 180, 184, 185, 187, 171, 190, - 128, 137, 150, 153, 158, 160, 162, 164, - 167, 173, 177, 180, 143, 130, 141, 144, - 153, 154, 157, 160, 255, 155, 156, 157, - 159, 160, 255, 128, 140, 142, 145, 146, - 148, 160, 177, 178, 180, 128, 145, 146, - 147, 160, 172, 174, 176, 178, 179, 180, - 255, 148, 156, 158, 159, 160, 169, 170, - 255, 139, 142, 144, 153, 160, 255, 169, - 128, 170, 176, 255, 128, 158, 160, 171, - 176, 187, 128, 150, 151, 155, 191, 149, - 158, 160, 188, 128, 137, 144, 153, 176, - 190, 128, 132, 133, 179, 180, 255, 133, - 139, 140, 143, 144, 153, 154, 170, 180, - 255, 128, 130, 131, 160, 161, 173, 174, - 175, 176, 185, 186, 255, 166, 179, 180, - 255, 128, 163, 164, 183, 173, 144, 146, - 148, 168, 169, 177, 178, 180, 181, 182, - 184, 185, 128, 181, 188, 191, 128, 129, - 130, 131, 132, 133, 134, 146, 147, 176, - 177, 178, 179, 180, 181, 182, 183, 184, - 140, 143, 170, 174, 191, 255, 165, 177, - 191, 129, 147, 149, 159, 176, 255, 144, - 176, 165, 170, 175, 177, 180, 255, 191, - 168, 174, 176, 255, 128, 134, 136, 142, - 144, 150, 152, 158, 160, 191, 128, 130, - 131, 132, 133, 134, 135, 139, 140, 141, - 133, 170, 175, 177, 181, 187, 188, 173, - 128, 255, 176, 255, 131, 137, 191, 145, - 189, 135, 129, 130, 132, 133, 156, 128, - 133, 144, 154, 176, 139, 159, 150, 157, - 159, 164, 167, 168, 170, 173, 143, 145, - 176, 255, 139, 255, 166, 176, 171, 179, - 160, 161, 163, 164, 165, 167, 169, 171, - 173, 174, 175, 176, 177, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 166, 170, 172, 178, 150, 153, - 155, 163, 165, 167, 169, 173, 153, 155, - 163, 255, 189, 132, 185, 144, 152, 161, - 164, 255, 188, 129, 131, 190, 255, 133, - 134, 137, 138, 142, 150, 152, 161, 164, - 255, 131, 134, 137, 138, 142, 144, 146, - 175, 178, 180, 182, 255, 134, 138, 142, - 161, 164, 255, 188, 129, 131, 190, 191, - 128, 132, 135, 136, 139, 141, 150, 151, - 162, 163, 130, 190, 191, 151, 128, 130, - 134, 136, 138, 141, 128, 131, 190, 255, - 133, 137, 142, 148, 151, 161, 164, 255, - 128, 132, 134, 136, 138, 141, 149, 150, - 162, 163, 129, 131, 190, 255, 133, 137, - 142, 150, 152, 161, 164, 255, 130, 131, - 138, 150, 143, 148, 152, 159, 178, 179, - 177, 180, 186, 135, 142, 177, 180, 185, - 187, 188, 136, 141, 181, 183, 185, 152, - 153, 190, 191, 177, 191, 128, 132, 134, - 135, 141, 151, 153, 188, 134, 128, 129, - 130, 141, 156, 157, 158, 159, 160, 162, - 164, 168, 169, 170, 172, 173, 174, 175, - 176, 179, 183, 171, 190, 150, 153, 158, - 160, 162, 164, 167, 173, 177, 180, 143, - 130, 141, 154, 157, 157, 159, 146, 148, - 178, 180, 146, 147, 178, 179, 180, 255, - 148, 156, 158, 255, 139, 142, 169, 160, - 171, 176, 187, 151, 155, 191, 149, 158, - 160, 188, 176, 190, 128, 132, 180, 255, - 133, 170, 180, 255, 128, 130, 161, 173, - 166, 179, 164, 183, 173, 144, 146, 148, - 168, 178, 180, 184, 185, 128, 181, 188, - 191, 128, 129, 131, 179, 181, 183, 140, - 143, 170, 174, 191, 255, 165, 129, 147, - 149, 159, 160, 175, 176, 255, 144, 176, - 175, 177, 191, 160, 191, 128, 130, 131, - 135, 139, 140, 141, 170, 175, 177, 181, - 153, 156, 160, 255, 187, 192, 255, 176, - 191, 144, 190, 152, 255, 153, 154, 155, - 160, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 175, 175, 178, 180, 189, - 158, 159, 176, 177, 130, 134, 139, 163, - 167, 128, 129, 180, 255, 133, 159, 178, - 255, 166, 173, 135, 147, 128, 131, 179, - 255, 129, 164, 166, 255, 169, 182, 131, - 140, 141, 187, 189, 176, 178, 180, 183, - 184, 190, 191, 129, 171, 175, 181, 182, - 163, 170, 172, 173, 172, 184, 185, 187, - 188, 189, 190, 191, 158, 128, 143, 160, - 175, 179, 180, 141, 143, 191, 166, 255, - 160, 255, 185, 187, 144, 145, 150, 155, - 157, 158, 135, 139, 141, 168, 171, 189, - 160, 182, 186, 191, 129, 131, 133, 134, - 140, 143, 184, 186, 165, 166, 128, 129, - 130, 132, 133, 134, 135, 136, 139, 140, - 141, 146, 147, 150, 151, 152, 153, 154, - 156, 128, 130, 184, 255, 135, 190, 131, - 175, 187, 188, 190, 255, 128, 130, 167, - 180, 179, 128, 130, 179, 255, 129, 137, - 141, 255, 172, 183, 159, 170, 188, 128, - 131, 190, 191, 151, 128, 132, 135, 136, - 139, 141, 162, 163, 166, 172, 176, 180, - 176, 255, 132, 255, 175, 181, 184, 255, - 129, 155, 158, 255, 129, 255, 171, 183, - 157, 171, 171, 172, 189, 190, 176, 180, - 176, 182, 145, 190, 143, 146, 128, 178, - 128, 157, 158, 160, 163, 133, 134, 137, - 168, 169, 170, 165, 169, 173, 255, 131, - 132, 140, 169, 174, 255, 130, 132, 128, - 182, 187, 255, 173, 180, 182, 255, 132, - 155, 159, 161, 175, 163, 144, 150, 160, - 128, 129, 132, 135, 133, 134, 129, 160, - 255, 192, 255, 153, 154, 155, 156, 160, - 255, 128, 146, 147, 148, 152, 153, 154, - 155, 156, 158, 159, 160, 161, 162, 163, - 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 129, 255, 191, - 128, 174, 175, 178, 180, 189, 128, 157, - 158, 159, 160, 255, 176, 177, 178, 255, - 130, 134, 139, 163, 167, 168, 255, 128, - 129, 130, 179, 180, 255, 187, 189, 133, - 143, 144, 153, 154, 159, 178, 183, 184, - 255, 128, 137, 138, 165, 166, 173, 176, - 255, 135, 147, 148, 159, 189, 255, 128, - 131, 132, 178, 179, 255, 143, 129, 142, - 144, 153, 154, 164, 166, 175, 176, 185, - 186, 255, 128, 168, 169, 182, 131, 128, - 139, 140, 141, 144, 153, 187, 189, 176, - 178, 180, 183, 184, 190, 191, 129, 160, - 170, 171, 175, 178, 180, 181, 182, 128, - 162, 163, 170, 172, 173, 176, 185, 172, - 173, 174, 175, 180, 181, 182, 183, 184, - 185, 187, 188, 189, 190, 191, 176, 186, - 158, 190, 128, 134, 147, 151, 157, 168, - 170, 182, 184, 188, 128, 143, 160, 175, - 179, 180, 191, 189, 255, 129, 154, 166, - 255, 158, 159, 160, 190, 191, 255, 130, - 135, 138, 143, 146, 151, 154, 156, 185, - 187, 144, 145, 146, 147, 148, 150, 155, - 157, 158, 159, 128, 129, 130, 131, 133, - 135, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 148, 149, 152, 156, 157, 160, - 161, 162, 163, 164, 166, 168, 169, 170, - 171, 172, 173, 174, 176, 177, 153, 155, - 178, 179, 189, 160, 145, 255, 139, 143, - 182, 186, 187, 255, 128, 191, 129, 131, - 133, 134, 140, 143, 144, 147, 149, 151, - 153, 179, 184, 186, 128, 135, 137, 164, - 165, 166, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 138, 139, 140, 141, 146, - 147, 150, 151, 152, 153, 154, 155, 156, - 162, 163, 171, 128, 130, 131, 183, 184, - 255, 135, 165, 166, 175, 176, 190, 131, - 175, 187, 188, 190, 255, 128, 130, 131, - 166, 167, 180, 182, 191, 179, 182, 144, - 178, 128, 130, 131, 178, 179, 255, 155, - 129, 132, 133, 137, 141, 143, 144, 153, - 154, 156, 157, 255, 128, 145, 147, 171, - 172, 183, 159, 170, 171, 175, 176, 185, - 186, 255, 189, 128, 131, 133, 140, 143, - 144, 147, 168, 170, 176, 178, 179, 181, - 185, 188, 191, 144, 151, 128, 132, 135, - 136, 139, 141, 157, 161, 162, 163, 166, - 172, 176, 180, 128, 175, 176, 255, 134, - 132, 135, 136, 143, 144, 153, 154, 255, - 128, 174, 175, 181, 184, 255, 129, 151, - 152, 155, 158, 255, 132, 129, 143, 144, - 153, 154, 255, 128, 170, 171, 183, 157, - 171, 176, 185, 160, 168, 169, 171, 172, - 173, 174, 188, 189, 190, 161, 167, 144, - 173, 176, 180, 128, 175, 176, 182, 133, - 143, 145, 190, 191, 255, 143, 146, 147, - 159, 128, 176, 177, 178, 128, 136, 144, - 153, 157, 158, 160, 163, 133, 134, 137, - 144, 145, 146, 147, 148, 149, 154, 155, - 156, 157, 158, 159, 168, 169, 170, 150, - 153, 165, 169, 173, 255, 131, 132, 140, - 169, 174, 255, 130, 132, 128, 182, 187, - 255, 173, 180, 182, 255, 132, 155, 159, - 161, 175, 160, 163, 184, 185, 186, 161, - 162, 133, 143, 144, 150, 151, 255, 160, - 128, 129, 132, 135, 133, 134, 129, 160, - 255, 192, 255, 176, 255, 170, 173, 181, - 186, 0, 127, 181, 190, 176, 183, 184, - 185, 186, 191, 192, 255, 130, 131, 137, - 137, 190, 136, 144, 145, 191, 192, 255, - 135, 179, 129, 130, 132, 133, 144, 170, - 176, 178, 156, 128, 133, 140, 141, 144, - 154, 160, 191, 171, 172, 176, 128, 138, - 139, 169, 174, 255, 148, 158, 169, 150, - 164, 167, 173, 176, 185, 189, 190, 192, - 255, 144, 143, 145, 146, 175, 176, 255, - 139, 140, 141, 255, 166, 176, 178, 255, - 184, 186, 128, 137, 138, 170, 171, 179, - 180, 181, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 154, 164, 168, 128, 149, 150, - 173, 128, 152, 153, 155, 163, 255, 189, - 132, 185, 144, 176, 152, 161, 164, 165, - 177, 255, 132, 169, 177, 188, 129, 131, - 141, 142, 145, 146, 179, 181, 186, 187, - 190, 255, 142, 158, 133, 134, 137, 138, - 143, 150, 152, 155, 156, 161, 164, 165, - 176, 177, 178, 255, 188, 129, 131, 133, - 138, 143, 144, 147, 168, 170, 176, 178, - 179, 181, 182, 184, 185, 190, 255, 157, - 131, 134, 137, 138, 142, 144, 146, 152, - 153, 158, 159, 165, 178, 180, 182, 255, - 189, 129, 131, 133, 141, 143, 145, 147, - 168, 170, 176, 178, 179, 181, 185, 188, - 255, 134, 138, 144, 185, 142, 159, 160, - 161, 164, 165, 176, 255, 189, 129, 131, - 133, 140, 143, 144, 147, 168, 170, 176, - 178, 179, 181, 185, 188, 191, 177, 128, - 132, 135, 136, 139, 141, 150, 151, 156, - 157, 159, 161, 162, 163, 166, 175, 130, - 131, 156, 133, 138, 142, 144, 146, 149, - 153, 154, 158, 159, 163, 164, 168, 170, - 174, 185, 190, 191, 144, 151, 128, 130, - 134, 136, 138, 141, 166, 175, 189, 128, - 131, 133, 140, 142, 144, 146, 168, 170, - 185, 190, 255, 133, 137, 151, 142, 148, - 152, 154, 155, 159, 160, 161, 164, 165, - 176, 255, 189, 129, 131, 133, 140, 142, - 144, 146, 168, 170, 179, 181, 185, 188, - 191, 158, 128, 132, 134, 136, 138, 141, - 149, 150, 160, 161, 162, 163, 166, 175, - 177, 178, 189, 129, 131, 133, 140, 142, - 144, 146, 186, 190, 255, 133, 137, 142, - 143, 150, 152, 158, 159, 161, 164, 165, - 176, 185, 186, 191, 192, 255, 189, 130, - 131, 133, 150, 154, 177, 179, 187, 138, - 150, 128, 134, 143, 148, 152, 159, 166, - 175, 178, 179, 177, 180, 186, 135, 142, - 144, 153, 177, 180, 185, 187, 188, 136, - 141, 144, 153, 128, 181, 183, 185, 152, - 153, 160, 169, 190, 191, 128, 135, 137, - 172, 177, 191, 128, 132, 134, 135, 136, - 140, 141, 151, 153, 188, 134, 128, 129, - 130, 131, 137, 138, 139, 140, 141, 142, - 143, 144, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 167, - 168, 169, 170, 172, 173, 174, 175, 176, - 177, 179, 181, 182, 183, 188, 189, 190, - 191, 132, 152, 180, 184, 185, 187, 171, - 190, 128, 137, 150, 153, 158, 160, 162, - 164, 167, 173, 177, 180, 130, 141, 143, - 157, 160, 255, 155, 156, 157, 159, 160, - 255, 128, 140, 142, 145, 146, 148, 160, - 177, 178, 180, 128, 145, 146, 147, 160, - 172, 174, 176, 178, 179, 180, 255, 148, - 156, 158, 159, 170, 255, 139, 142, 144, - 153, 160, 255, 169, 128, 170, 176, 255, - 128, 158, 160, 171, 176, 187, 128, 150, - 151, 155, 191, 149, 158, 160, 188, 128, - 137, 144, 153, 176, 190, 128, 132, 133, - 179, 180, 255, 133, 139, 140, 143, 154, - 170, 180, 255, 128, 130, 131, 160, 161, - 173, 174, 175, 176, 185, 186, 255, 166, - 179, 180, 255, 128, 163, 164, 183, 173, - 144, 146, 148, 168, 169, 177, 178, 180, - 181, 182, 184, 185, 128, 181, 188, 191, - 128, 129, 130, 131, 132, 133, 134, 146, - 147, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 164, 140, 143, 152, 153, 170, - 174, 191, 255, 132, 165, 177, 191, 129, - 147, 149, 159, 160, 175, 176, 255, 144, - 176, 165, 170, 175, 177, 180, 255, 191, - 168, 174, 176, 255, 128, 134, 136, 142, - 144, 150, 152, 158, 160, 191, 128, 130, - 132, 133, 134, 133, 170, 175, 187, 188, - 153, 154, 128, 146, 147, 148, 152, 153, - 154, 155, 156, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 129, 255, - 191, 128, 174, 175, 178, 180, 189, 128, - 157, 158, 159, 160, 255, 176, 177, 178, - 255, 130, 134, 139, 163, 167, 168, 255, - 128, 129, 130, 179, 180, 255, 187, 189, - 133, 143, 154, 159, 178, 183, 184, 255, - 128, 137, 138, 165, 166, 173, 176, 255, - 135, 147, 148, 159, 189, 255, 128, 131, - 132, 178, 179, 255, 143, 129, 142, 154, - 164, 166, 175, 186, 255, 128, 168, 169, - 182, 131, 128, 139, 140, 141, 144, 153, - 187, 189, 176, 178, 180, 183, 184, 190, - 191, 129, 160, 170, 171, 175, 178, 180, - 181, 182, 128, 162, 163, 170, 172, 173, - 176, 185, 172, 173, 174, 175, 180, 181, - 182, 183, 184, 185, 187, 188, 189, 190, - 191, 176, 186, 158, 190, 128, 134, 147, - 151, 157, 168, 170, 182, 184, 188, 144, - 148, 128, 143, 160, 175, 179, 180, 144, - 146, 148, 141, 143, 176, 180, 182, 255, - 191, 189, 255, 135, 140, 142, 155, 191, - 161, 186, 158, 159, 160, 190, 130, 135, - 138, 143, 146, 151, 154, 156, 185, 187, - 144, 145, 146, 147, 148, 150, 155, 157, - 158, 159, 128, 129, 130, 131, 133, 135, - 138, 139, 140, 141, 142, 143, 144, 145, - 146, 148, 149, 152, 156, 157, 160, 161, - 162, 163, 164, 166, 168, 169, 170, 171, - 172, 173, 174, 176, 177, 153, 155, 178, - 179, 189, 160, 145, 255, 139, 143, 182, - 186, 187, 255, 128, 191, 129, 131, 133, - 134, 140, 143, 144, 147, 149, 151, 153, - 179, 184, 186, 128, 135, 137, 164, 165, - 166, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 138, 139, 140, 141, 146, 147, - 150, 151, 152, 153, 154, 155, 156, 162, - 163, 171, 128, 130, 131, 183, 184, 255, - 135, 165, 176, 190, 131, 175, 187, 188, - 190, 255, 128, 130, 131, 166, 167, 180, - 182, 191, 179, 182, 144, 178, 128, 130, - 131, 178, 179, 255, 155, 129, 132, 133, - 137, 141, 143, 154, 156, 157, 255, 128, - 145, 147, 171, 172, 183, 159, 170, 171, - 175, 176, 185, 186, 255, 189, 128, 131, - 133, 140, 143, 144, 147, 168, 170, 176, - 178, 179, 181, 185, 188, 191, 144, 151, - 128, 132, 135, 136, 139, 141, 157, 161, - 162, 163, 166, 172, 176, 180, 128, 175, - 176, 255, 134, 132, 135, 136, 143, 154, - 255, 128, 174, 175, 181, 184, 255, 129, - 151, 152, 155, 158, 255, 132, 129, 143, - 154, 255, 128, 170, 171, 183, 157, 171, - 176, 185, 160, 168, 169, 171, 172, 173, - 174, 188, 189, 190, 161, 167, 144, 173, - 176, 180, 128, 175, 176, 182, 133, 143, - 145, 190, 191, 255, 143, 146, 147, 159, - 176, 177, 178, 128, 136, 144, 153, 157, - 158, 160, 163, 133, 134, 137, 144, 145, - 146, 147, 148, 149, 154, 155, 156, 157, - 158, 159, 168, 169, 170, 150, 153, 165, - 169, 173, 255, 131, 132, 140, 169, 174, - 255, 130, 132, 128, 182, 187, 255, 173, - 180, 182, 255, 132, 155, 159, 161, 175, - 160, 163, 184, 185, 186, 161, 162, 133, - 143, 144, 150, 151, 255, 160, 128, 129, - 132, 135, 133, 134, 129, 160, 255, 192, - 255, 176, 255, 170, 173, 181, 183, 186, - 181, 190, 184, 185, 192, 255, 130, 190, - 136, 144, 192, 255, 135, 179, 180, 129, - 130, 132, 133, 144, 170, 176, 178, 156, - 128, 133, 144, 154, 160, 191, 171, 128, - 159, 160, 169, 174, 255, 148, 158, 169, - 176, 185, 189, 190, 192, 255, 143, 255, - 139, 140, 186, 128, 137, 138, 181, 160, - 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 128, - 173, 128, 155, 163, 255, 176, 164, 165, - 166, 175, 132, 169, 177, 141, 142, 145, - 146, 179, 181, 186, 187, 158, 133, 134, - 137, 138, 143, 150, 152, 155, 164, 165, - 166, 175, 178, 255, 188, 129, 131, 133, - 138, 143, 144, 147, 168, 170, 176, 178, - 179, 181, 182, 184, 185, 190, 255, 157, - 131, 134, 137, 138, 142, 144, 146, 152, - 159, 165, 166, 175, 182, 255, 129, 131, - 133, 141, 143, 145, 147, 168, 170, 176, - 178, 179, 181, 185, 188, 255, 134, 138, - 142, 143, 145, 159, 164, 165, 166, 175, - 176, 184, 186, 255, 129, 131, 133, 140, - 143, 144, 147, 168, 170, 176, 178, 179, - 181, 185, 188, 191, 177, 128, 132, 135, - 136, 139, 141, 150, 151, 156, 157, 159, - 163, 166, 175, 156, 130, 131, 133, 138, - 142, 144, 146, 149, 153, 154, 158, 159, - 163, 164, 168, 170, 174, 185, 190, 191, - 144, 151, 128, 130, 134, 136, 138, 141, - 166, 175, 128, 131, 133, 140, 142, 144, - 146, 168, 170, 185, 189, 255, 133, 137, - 151, 142, 148, 155, 159, 164, 165, 166, - 175, 176, 255, 129, 131, 133, 140, 142, - 144, 146, 168, 170, 179, 181, 185, 188, - 191, 158, 128, 132, 134, 136, 138, 141, - 149, 150, 160, 163, 166, 175, 177, 178, - 129, 131, 133, 140, 142, 144, 146, 186, - 189, 255, 133, 137, 143, 150, 152, 158, - 164, 165, 166, 175, 176, 185, 192, 255, - 189, 130, 131, 133, 150, 154, 177, 179, - 187, 138, 150, 128, 134, 143, 148, 152, - 159, 166, 175, 178, 179, 177, 180, 186, - 135, 142, 144, 153, 177, 180, 185, 187, - 188, 136, 141, 144, 153, 128, 181, 183, - 185, 152, 153, 160, 169, 190, 191, 128, - 135, 137, 172, 177, 191, 128, 132, 134, - 151, 153, 188, 134, 128, 129, 130, 131, - 137, 138, 139, 140, 141, 142, 143, 144, - 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 167, 168, 169, - 170, 172, 173, 174, 175, 176, 177, 179, - 181, 182, 183, 188, 189, 190, 191, 132, - 152, 180, 184, 185, 187, 171, 190, 128, - 137, 150, 153, 158, 160, 162, 164, 167, - 173, 177, 180, 143, 130, 141, 144, 153, - 154, 157, 160, 255, 155, 156, 160, 255, - 128, 140, 142, 148, 160, 180, 128, 147, - 160, 172, 174, 176, 178, 179, 180, 255, - 148, 156, 158, 159, 160, 169, 170, 255, - 139, 142, 144, 153, 160, 255, 128, 170, - 176, 255, 128, 158, 160, 171, 176, 187, - 191, 149, 158, 160, 188, 128, 137, 144, - 153, 176, 190, 140, 143, 144, 153, 154, - 170, 180, 255, 128, 175, 176, 185, 186, - 255, 180, 255, 128, 183, 144, 146, 148, - 182, 184, 185, 128, 181, 188, 191, 128, - 129, 130, 131, 132, 133, 134, 146, 147, - 176, 177, 178, 179, 180, 181, 182, 183, - 184, 164, 167, 140, 143, 152, 153, 170, - 174, 191, 255, 165, 176, 191, 129, 147, - 149, 159, 160, 177, 178, 255, 144, 176, - 165, 170, 180, 255, 168, 174, 176, 190, - 192, 255, 128, 134, 136, 142, 144, 150, - 152, 158, 160, 191, 128, 130, 132, 133, - 134, 133, 170, 175, 187, 188, 153, 154, - 128, 146, 147, 148, 152, 153, 154, 155, - 156, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 129, 255, 191, 128, - 178, 180, 189, 168, 255, 188, 133, 143, - 144, 153, 154, 159, 184, 186, 190, 255, - 128, 137, 138, 173, 176, 255, 148, 159, - 189, 255, 129, 142, 144, 153, 154, 164, - 166, 175, 176, 185, 186, 255, 128, 182, - 128, 141, 144, 153, 187, 189, 176, 178, - 180, 183, 184, 190, 191, 129, 160, 175, - 178, 182, 128, 170, 172, 173, 176, 185, - 172, 173, 174, 175, 180, 181, 182, 183, - 184, 185, 187, 188, 189, 190, 191, 176, - 186, 158, 190, 128, 134, 147, 151, 157, - 168, 170, 182, 184, 188, 147, 128, 143, - 160, 175, 179, 180, 189, 190, 192, 255, - 158, 190, 130, 135, 138, 143, 146, 151, - 154, 156, 185, 187, 144, 145, 146, 147, - 148, 150, 155, 157, 158, 159, 128, 129, - 130, 131, 133, 135, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 148, 149, 152, - 156, 157, 160, 161, 162, 163, 164, 166, - 168, 169, 170, 171, 172, 173, 174, 176, - 177, 153, 155, 178, 179, 189, 145, 159, - 161, 255, 139, 143, 187, 255, 191, 128, - 131, 133, 134, 140, 147, 149, 151, 153, - 179, 184, 186, 128, 135, 137, 166, 129, - 130, 131, 132, 133, 135, 136, 138, 139, - 140, 141, 146, 147, 150, 151, 152, 153, - 154, 155, 156, 162, 163, 171, 128, 134, - 135, 165, 166, 175, 176, 190, 187, 188, - 190, 255, 128, 180, 182, 191, 182, 144, - 179, 155, 133, 137, 141, 143, 144, 153, - 157, 255, 128, 145, 147, 183, 171, 175, - 176, 185, 186, 255, 128, 131, 133, 140, - 143, 144, 147, 168, 170, 176, 178, 179, - 181, 185, 188, 191, 144, 151, 128, 132, - 135, 136, 139, 141, 157, 163, 166, 172, - 176, 180, 134, 136, 143, 144, 153, 154, - 255, 128, 181, 184, 255, 129, 151, 158, - 255, 129, 131, 133, 143, 144, 153, 154, - 255, 157, 171, 176, 185, 160, 168, 169, - 171, 172, 173, 174, 188, 189, 190, 161, - 167, 144, 173, 176, 180, 133, 143, 191, - 255, 143, 159, 176, 177, 178, 128, 136, - 144, 153, 157, 158, 160, 163, 133, 134, - 137, 144, 145, 146, 147, 148, 149, 154, - 155, 156, 157, 158, 159, 168, 169, 170, - 150, 153, 165, 169, 173, 255, 131, 132, - 140, 169, 174, 255, 130, 132, 128, 182, - 187, 255, 173, 180, 182, 255, 132, 155, - 159, 161, 175, 160, 163, 184, 185, 186, - 161, 162, 133, 143, 151, 255, 160, 128, - 129, 132, 135, 133, 134, 129, 160, 255, - 176, 255, 170, 173, 181, 186, 128, 255, - 181, 190, 176, 183, 184, 185, 186, 191, - 192, 255, 130, 131, 137, 190, 136, 144, - 145, 191, 192, 255, 135, 179, 129, 130, - 132, 133, 144, 170, 176, 178, 156, 128, - 133, 144, 154, 160, 191, 171, 176, 128, - 138, 139, 159, 160, 169, 174, 255, 148, - 158, 169, 150, 164, 167, 173, 176, 185, - 189, 190, 192, 255, 144, 143, 145, 146, - 175, 176, 255, 139, 140, 141, 255, 166, - 176, 178, 255, 186, 128, 137, 138, 170, - 171, 179, 180, 181, 160, 161, 162, 163, - 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 154, 164, 168, 128, - 149, 150, 173, 128, 152, 153, 155, 163, - 255, 189, 132, 185, 144, 176, 152, 161, - 164, 165, 166, 175, 177, 255, 132, 169, - 177, 188, 129, 131, 141, 142, 145, 146, - 179, 181, 186, 187, 190, 255, 142, 158, - 133, 134, 137, 138, 143, 150, 152, 155, - 156, 161, 164, 165, 166, 175, 176, 177, - 178, 255, 188, 129, 131, 133, 138, 143, - 144, 147, 168, 170, 176, 178, 179, 181, - 182, 184, 185, 190, 255, 157, 131, 134, - 137, 138, 142, 144, 146, 152, 153, 158, - 159, 165, 166, 175, 178, 180, 182, 255, - 189, 129, 131, 133, 141, 143, 145, 147, - 168, 170, 176, 178, 179, 181, 185, 188, - 255, 134, 138, 144, 185, 142, 159, 160, - 161, 164, 165, 166, 175, 176, 255, 189, - 129, 131, 133, 140, 143, 144, 147, 168, - 170, 176, 178, 179, 181, 185, 188, 191, - 177, 128, 132, 135, 136, 139, 141, 150, - 151, 156, 157, 159, 161, 162, 163, 166, - 175, 130, 131, 156, 133, 138, 142, 144, - 146, 149, 153, 154, 158, 159, 163, 164, - 168, 170, 174, 185, 190, 191, 144, 151, - 128, 130, 134, 136, 138, 141, 166, 175, - 189, 128, 131, 133, 140, 142, 144, 146, - 168, 170, 185, 190, 255, 133, 137, 151, - 142, 148, 152, 154, 155, 159, 160, 161, - 164, 165, 166, 175, 176, 255, 189, 129, - 131, 133, 140, 142, 144, 146, 168, 170, - 179, 181, 185, 188, 191, 158, 128, 132, - 134, 136, 138, 141, 149, 150, 160, 161, - 162, 163, 166, 175, 177, 178, 189, 129, - 131, 133, 140, 142, 144, 146, 186, 190, - 255, 133, 137, 142, 143, 150, 152, 158, - 159, 161, 164, 165, 166, 175, 176, 185, - 186, 191, 192, 255, 189, 130, 131, 133, - 150, 154, 177, 179, 187, 138, 150, 128, - 134, 143, 148, 152, 159, 166, 175, 178, - 179, 177, 180, 186, 135, 142, 144, 153, - 177, 180, 185, 187, 188, 136, 141, 144, - 153, 128, 181, 183, 185, 152, 153, 160, - 169, 190, 191, 128, 135, 137, 172, 177, - 191, 128, 132, 134, 135, 136, 140, 141, - 151, 153, 188, 134, 128, 129, 130, 131, - 137, 138, 139, 140, 141, 142, 143, 144, - 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 167, 168, 169, - 170, 172, 173, 174, 175, 176, 177, 179, - 181, 182, 183, 188, 189, 190, 191, 132, - 152, 180, 184, 185, 187, 171, 190, 128, - 137, 150, 153, 158, 160, 162, 164, 167, - 173, 177, 180, 143, 130, 141, 144, 153, - 154, 157, 160, 255, 155, 156, 157, 159, - 160, 255, 128, 140, 142, 145, 146, 148, - 160, 177, 178, 180, 128, 145, 146, 147, - 160, 172, 174, 176, 178, 179, 180, 255, - 148, 156, 158, 159, 160, 169, 170, 255, - 139, 142, 144, 153, 160, 255, 169, 128, - 170, 176, 255, 128, 158, 160, 171, 176, - 187, 134, 143, 144, 153, 128, 150, 151, - 155, 191, 149, 158, 160, 188, 128, 137, - 144, 153, 176, 190, 128, 132, 133, 179, - 180, 255, 133, 139, 140, 143, 144, 153, - 154, 170, 180, 255, 128, 130, 131, 160, - 161, 173, 174, 175, 176, 185, 186, 255, - 166, 179, 180, 255, 128, 163, 164, 183, - 128, 137, 141, 143, 144, 153, 154, 189, - 173, 144, 146, 148, 168, 169, 177, 178, - 180, 181, 182, 184, 185, 128, 181, 188, - 191, 128, 129, 130, 131, 132, 133, 134, - 146, 147, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 140, 143, 170, 174, 191, - 255, 165, 177, 191, 129, 147, 149, 159, - 176, 255, 144, 176, 165, 170, 175, 177, - 180, 255, 191, 168, 174, 176, 255, 128, - 134, 136, 142, 144, 150, 152, 158, 160, - 191, 128, 130, 131, 132, 133, 134, 135, - 139, 140, 141, 133, 170, 175, 177, 181, - 187, 188, 153, 154, 155, 156, 160, 255, - 128, 146, 147, 148, 152, 153, 154, 155, - 156, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 129, 255, 141, 143, - 160, 169, 172, 255, 191, 128, 174, 175, - 178, 180, 189, 128, 157, 158, 159, 160, - 255, 176, 177, 178, 255, 130, 134, 139, - 163, 167, 168, 255, 128, 129, 130, 179, - 180, 255, 187, 189, 133, 143, 144, 153, - 154, 159, 178, 183, 184, 255, 128, 137, - 138, 165, 166, 173, 176, 255, 135, 147, - 148, 159, 189, 255, 128, 131, 132, 178, - 179, 255, 143, 129, 142, 144, 153, 154, - 164, 166, 175, 176, 185, 186, 255, 128, - 168, 169, 182, 131, 128, 139, 140, 141, - 144, 153, 187, 189, 176, 178, 180, 183, - 184, 190, 191, 129, 160, 170, 171, 175, - 178, 180, 181, 182, 128, 162, 163, 170, - 172, 173, 176, 185, 172, 173, 174, 175, - 180, 181, 182, 183, 184, 185, 187, 188, - 189, 190, 191, 176, 186, 158, 190, 128, - 134, 147, 151, 157, 168, 170, 182, 184, - 188, 128, 143, 160, 175, 179, 180, 141, - 143, 176, 180, 182, 255, 191, 189, 255, - 191, 161, 186, 158, 159, 160, 190, 191, - 255, 130, 135, 138, 143, 146, 151, 154, - 156, 185, 187, 144, 145, 146, 147, 148, - 150, 155, 157, 158, 159, 128, 129, 130, - 131, 133, 135, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 148, 149, 152, 156, - 157, 160, 161, 162, 163, 164, 166, 168, - 169, 170, 171, 172, 173, 174, 176, 177, - 153, 155, 178, 179, 189, 160, 145, 255, - 139, 143, 182, 186, 187, 255, 158, 159, - 160, 169, 170, 255, 128, 191, 129, 131, - 133, 134, 140, 143, 144, 147, 149, 151, - 153, 179, 184, 186, 128, 135, 137, 164, - 165, 166, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 138, 139, 140, 141, 146, - 147, 150, 151, 152, 153, 154, 155, 156, - 162, 163, 171, 128, 130, 131, 183, 184, - 255, 135, 165, 166, 175, 176, 190, 131, - 175, 187, 188, 190, 255, 144, 168, 176, - 185, 128, 130, 131, 166, 167, 180, 182, - 191, 179, 182, 144, 178, 128, 130, 131, - 178, 179, 255, 155, 129, 132, 133, 137, - 141, 143, 144, 153, 154, 156, 157, 255, - 128, 145, 147, 171, 172, 183, 159, 170, - 171, 175, 176, 185, 186, 255, 189, 128, - 131, 133, 140, 143, 144, 147, 168, 170, - 176, 178, 179, 181, 185, 188, 191, 144, - 151, 128, 132, 135, 136, 139, 141, 157, - 161, 162, 163, 166, 172, 176, 180, 128, - 175, 176, 255, 134, 132, 135, 136, 143, - 144, 153, 154, 255, 128, 174, 175, 181, - 184, 255, 129, 151, 152, 155, 158, 255, - 132, 129, 143, 144, 153, 154, 255, 128, - 170, 171, 183, 128, 137, 157, 171, 176, - 185, 160, 169, 170, 190, 192, 255, 160, - 168, 169, 171, 172, 173, 174, 188, 189, - 190, 161, 167, 128, 158, 160, 169, 144, - 173, 176, 180, 128, 175, 176, 182, 128, - 131, 144, 153, 163, 183, 189, 255, 133, - 143, 145, 190, 191, 255, 143, 146, 147, - 159, 128, 176, 177, 178, 128, 136, 144, - 153, 157, 158, 160, 163, 133, 134, 137, - 144, 145, 146, 147, 148, 149, 154, 155, - 156, 157, 158, 159, 168, 169, 170, 150, - 153, 165, 169, 173, 255, 131, 132, 140, - 169, 174, 255, 130, 132, 131, 140, 141, - 142, 191, 192, 255, 128, 182, 187, 255, - 173, 180, 182, 255, 132, 155, 159, 161, - 175, 160, 163, 184, 185, 186, 161, 162, - 133, 143, 144, 150, 151, 255, 160, 128, - 129, 132, 135, 133, 134, 129, 160, 255, - 192, 255, 176, 255, 170, 173, 181, 186, - 128, 255, 181, 190, 176, 183, 184, 185, - 186, 191, 192, 255, 130, 131, 137, 137, - 190, 136, 144, 145, 191, 192, 255, 135, - 179, 129, 130, 132, 133, 144, 170, 176, - 178, 156, 128, 133, 140, 141, 144, 154, - 160, 191, 171, 172, 176, 128, 138, 139, - 169, 174, 255, 148, 158, 169, 150, 164, - 167, 173, 176, 185, 189, 190, 192, 255, - 144, 143, 145, 146, 175, 176, 255, 139, - 140, 141, 255, 166, 176, 178, 255, 184, - 186, 128, 137, 138, 170, 171, 179, 180, - 181, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, - 191, 154, 164, 168, 128, 149, 150, 173, - 128, 152, 153, 155, 163, 255, 189, 132, - 185, 144, 176, 152, 161, 164, 165, 177, - 255, 132, 169, 177, 188, 129, 131, 141, - 142, 145, 146, 179, 181, 186, 187, 190, - 255, 142, 158, 133, 134, 137, 138, 143, - 150, 152, 155, 156, 161, 164, 165, 176, - 177, 178, 255, 188, 129, 131, 133, 138, - 143, 144, 147, 168, 170, 176, 178, 179, - 181, 182, 184, 185, 190, 255, 157, 131, - 134, 137, 138, 142, 144, 146, 152, 153, - 158, 159, 165, 178, 180, 182, 255, 189, - 129, 131, 133, 141, 143, 145, 147, 168, - 170, 176, 178, 179, 181, 185, 188, 255, - 134, 138, 144, 185, 142, 159, 160, 161, - 164, 165, 176, 255, 189, 129, 131, 133, - 140, 143, 144, 147, 168, 170, 176, 178, - 179, 181, 185, 188, 191, 177, 128, 132, - 135, 136, 139, 141, 150, 151, 156, 157, - 159, 161, 162, 163, 166, 175, 130, 131, - 156, 133, 138, 142, 144, 146, 149, 153, - 154, 158, 159, 163, 164, 168, 170, 174, - 185, 190, 191, 144, 151, 128, 130, 134, - 136, 138, 141, 166, 175, 189, 128, 131, - 133, 140, 142, 144, 146, 168, 170, 185, - 190, 255, 133, 137, 151, 142, 148, 152, - 154, 155, 159, 160, 161, 164, 165, 176, - 255, 189, 129, 131, 133, 140, 142, 144, - 146, 168, 170, 179, 181, 185, 188, 191, - 158, 128, 132, 134, 136, 138, 141, 149, - 150, 160, 161, 162, 163, 166, 175, 177, - 178, 189, 129, 131, 133, 140, 142, 144, - 146, 186, 190, 255, 133, 137, 142, 143, - 150, 152, 158, 159, 161, 164, 165, 176, - 185, 186, 191, 192, 255, 189, 130, 131, - 133, 150, 154, 177, 179, 187, 138, 150, - 128, 134, 143, 148, 152, 159, 166, 175, - 178, 179, 177, 180, 186, 135, 142, 144, - 153, 177, 180, 185, 187, 188, 136, 141, - 144, 153, 128, 181, 183, 185, 152, 153, - 160, 169, 190, 191, 128, 135, 137, 172, - 177, 191, 128, 132, 134, 135, 136, 140, - 141, 151, 153, 188, 134, 128, 129, 130, - 131, 137, 138, 139, 140, 141, 142, 143, - 144, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, 164, 165, 167, 168, - 169, 170, 172, 173, 174, 175, 176, 177, - 179, 181, 182, 183, 188, 189, 190, 191, - 132, 152, 180, 184, 185, 187, 171, 190, - 128, 137, 150, 153, 158, 160, 162, 164, - 167, 173, 177, 180, 130, 141, 143, 157, - 160, 255, 155, 156, 157, 159, 160, 255, - 128, 140, 142, 145, 146, 148, 160, 177, - 178, 180, 128, 145, 146, 147, 160, 172, - 174, 176, 178, 179, 180, 255, 148, 156, - 158, 159, 170, 255, 139, 142, 144, 153, - 160, 255, 169, 128, 170, 176, 255, 128, - 158, 160, 171, 176, 187, 128, 150, 151, - 155, 191, 149, 158, 160, 188, 128, 137, - 144, 153, 176, 190, 128, 132, 133, 179, - 180, 255, 133, 139, 140, 143, 154, 170, - 180, 255, 128, 130, 131, 160, 161, 173, - 174, 175, 176, 185, 186, 255, 166, 179, - 180, 255, 128, 163, 164, 183, 173, 144, - 146, 148, 168, 169, 177, 178, 180, 181, - 182, 184, 185, 128, 181, 188, 191, 128, - 129, 130, 131, 132, 133, 134, 146, 147, - 176, 177, 178, 179, 180, 181, 182, 183, - 184, 164, 140, 143, 152, 153, 170, 174, - 191, 255, 132, 165, 177, 191, 129, 147, - 149, 159, 160, 175, 176, 255, 144, 176, - 165, 170, 175, 177, 180, 255, 191, 168, - 174, 176, 255, 128, 134, 136, 142, 144, - 150, 152, 158, 160, 191, 128, 130, 132, - 133, 134, 133, 170, 175, 187, 188, 153, - 154, 128, 146, 147, 148, 152, 153, 154, - 155, 156, 158, 159, 160, 161, 162, 163, - 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 129, 255, 191, - 128, 174, 175, 178, 180, 189, 128, 157, - 158, 159, 160, 255, 176, 177, 178, 255, - 130, 134, 139, 163, 167, 168, 255, 128, - 129, 130, 179, 180, 255, 187, 189, 133, - 143, 154, 159, 178, 183, 184, 255, 128, - 137, 138, 165, 166, 173, 176, 255, 135, - 147, 148, 159, 189, 255, 128, 131, 132, - 178, 179, 255, 143, 129, 142, 154, 164, - 166, 175, 186, 255, 128, 168, 169, 182, - 131, 128, 139, 140, 141, 144, 153, 187, - 189, 176, 178, 180, 183, 184, 190, 191, - 129, 160, 170, 171, 175, 178, 180, 181, - 182, 128, 162, 163, 170, 172, 173, 176, - 185, 172, 173, 174, 175, 180, 181, 182, - 183, 184, 185, 187, 188, 189, 190, 191, - 176, 186, 158, 190, 128, 134, 147, 151, - 157, 168, 170, 182, 184, 188, 144, 148, - 128, 143, 160, 175, 179, 180, 144, 146, - 148, 141, 143, 176, 180, 182, 255, 191, - 189, 255, 135, 140, 142, 155, 191, 161, - 186, 158, 159, 160, 190, 130, 135, 138, - 143, 146, 151, 154, 156, 185, 187, 144, - 145, 146, 147, 148, 150, 155, 157, 158, - 159, 128, 129, 130, 131, 133, 135, 138, - 139, 140, 141, 142, 143, 144, 145, 146, - 148, 149, 152, 156, 157, 160, 161, 162, - 163, 164, 166, 168, 169, 170, 171, 172, - 173, 174, 176, 177, 153, 155, 178, 179, - 189, 160, 145, 255, 139, 143, 182, 186, - 187, 255, 128, 191, 129, 131, 133, 134, - 140, 143, 144, 147, 149, 151, 153, 179, - 184, 186, 128, 135, 137, 164, 165, 166, - 128, 129, 130, 131, 132, 133, 134, 135, - 136, 138, 139, 140, 141, 146, 147, 150, - 151, 152, 153, 154, 155, 156, 162, 163, - 171, 128, 130, 131, 183, 184, 255, 135, - 165, 176, 190, 131, 175, 187, 188, 190, - 255, 128, 130, 131, 166, 167, 180, 182, - 191, 179, 182, 144, 178, 128, 130, 131, - 178, 179, 255, 155, 129, 132, 133, 137, - 141, 143, 154, 156, 157, 255, 128, 145, - 147, 171, 172, 183, 159, 170, 171, 175, - 176, 185, 186, 255, 189, 128, 131, 133, - 140, 143, 144, 147, 168, 170, 176, 178, - 179, 181, 185, 188, 191, 144, 151, 128, - 132, 135, 136, 139, 141, 157, 161, 162, - 163, 166, 172, 176, 180, 128, 175, 176, - 255, 134, 132, 135, 136, 143, 154, 255, - 128, 174, 175, 181, 184, 255, 129, 151, - 152, 155, 158, 255, 132, 129, 143, 154, - 255, 128, 170, 171, 183, 157, 171, 176, - 185, 160, 168, 169, 171, 172, 173, 174, - 188, 189, 190, 161, 167, 144, 173, 176, - 180, 128, 175, 176, 182, 133, 143, 145, - 190, 191, 255, 143, 146, 147, 159, 176, - 177, 178, 128, 136, 144, 153, 157, 158, - 160, 163, 133, 134, 137, 144, 145, 146, - 147, 148, 149, 154, 155, 156, 157, 158, - 159, 168, 169, 170, 150, 153, 165, 169, - 173, 255, 131, 132, 140, 169, 174, 255, - 130, 132, 128, 182, 187, 255, 173, 180, - 182, 255, 132, 155, 159, 161, 175, 160, - 163, 184, 185, 186, 161, 162, 133, 143, - 144, 150, 151, 255, 160, 128, 129, 132, - 135, 133, 134, 129, 160, 255, 192, 255, - 176, 255, 173, 128, 255, 176, 255, 131, - 137, 191, 145, 189, 135, 129, 130, 132, - 133, 156, 128, 133, 144, 154, 171, 176, - 139, 159, 160, 169, 150, 157, 159, 164, - 167, 168, 170, 173, 176, 185, 143, 145, - 176, 255, 139, 255, 166, 176, 128, 137, - 171, 179, 160, 161, 163, 164, 165, 167, - 169, 171, 173, 174, 175, 176, 177, 179, - 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 166, 170, 172, 178, - 150, 153, 155, 163, 165, 167, 169, 173, - 153, 155, 163, 255, 189, 132, 185, 144, - 152, 161, 164, 165, 166, 175, 176, 255, - 188, 129, 131, 190, 255, 133, 134, 137, - 138, 142, 150, 152, 161, 164, 165, 166, - 175, 176, 255, 131, 134, 137, 138, 142, - 144, 146, 165, 166, 175, 178, 180, 182, - 255, 134, 138, 142, 161, 164, 165, 166, - 175, 176, 255, 188, 129, 131, 190, 191, - 128, 132, 135, 136, 139, 141, 150, 151, - 162, 163, 166, 175, 130, 190, 191, 151, - 128, 130, 134, 136, 138, 141, 166, 175, - 128, 131, 190, 255, 133, 137, 142, 148, - 151, 161, 164, 165, 166, 175, 176, 255, - 128, 132, 134, 136, 138, 141, 149, 150, - 162, 163, 166, 175, 129, 131, 190, 255, - 133, 137, 142, 150, 152, 161, 164, 165, - 166, 175, 176, 255, 130, 131, 138, 150, - 143, 148, 152, 159, 166, 175, 178, 179, - 177, 180, 186, 135, 142, 144, 153, 177, - 180, 185, 187, 188, 136, 141, 144, 153, - 181, 183, 185, 152, 153, 160, 169, 190, - 191, 177, 191, 128, 132, 134, 135, 141, - 151, 153, 188, 134, 128, 129, 130, 141, - 156, 157, 158, 159, 160, 162, 164, 165, - 167, 168, 169, 170, 172, 173, 174, 175, - 176, 177, 179, 183, 171, 190, 128, 137, - 150, 153, 158, 160, 162, 164, 167, 173, - 177, 180, 143, 130, 141, 144, 153, 154, - 157, 157, 159, 146, 148, 178, 180, 146, - 147, 178, 179, 180, 255, 148, 156, 158, - 159, 160, 169, 170, 255, 139, 142, 144, - 153, 169, 160, 171, 176, 187, 151, 155, - 191, 149, 158, 160, 188, 128, 137, 144, - 153, 176, 190, 128, 132, 180, 255, 133, - 143, 144, 153, 154, 170, 180, 255, 128, - 130, 161, 173, 176, 185, 166, 179, 164, - 183, 128, 137, 144, 153, 173, 144, 146, - 148, 168, 178, 180, 184, 185, 128, 181, - 188, 191, 128, 129, 131, 179, 181, 183, - 140, 143, 170, 174, 160, 164, 166, 175, - 144, 176, 175, 177, 191, 160, 191, 128, - 130, 170, 175, 153, 154, 152, 153, 154, - 155, 160, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 175, 160, 169, 175, - 178, 180, 189, 158, 159, 176, 177, 130, - 134, 139, 163, 167, 128, 129, 180, 255, - 133, 143, 144, 153, 154, 159, 178, 255, - 128, 137, 166, 173, 135, 147, 128, 131, - 179, 255, 129, 143, 144, 153, 154, 164, - 166, 175, 176, 185, 186, 255, 169, 182, - 131, 140, 141, 144, 153, 187, 189, 176, - 178, 180, 183, 184, 190, 191, 129, 171, - 175, 181, 182, 163, 170, 172, 173, 176, - 185, 172, 184, 187, 190, 191, 158, 128, - 143, 160, 175, 185, 187, 144, 145, 150, - 155, 157, 158, 135, 139, 141, 146, 168, - 171, 189, 160, 182, 186, 191, 129, 131, - 133, 134, 140, 143, 184, 186, 165, 166, - 128, 129, 130, 131, 132, 133, 134, 135, - 136, 139, 140, 141, 146, 147, 150, 151, - 152, 153, 154, 155, 156, 163, 128, 130, - 184, 255, 135, 165, 166, 175, 176, 190, - 131, 175, 187, 188, 190, 255, 176, 185, - 128, 130, 167, 180, 182, 191, 179, 128, - 130, 179, 255, 129, 137, 141, 143, 144, - 153, 154, 255, 172, 183, 159, 170, 176, - 185, 188, 128, 131, 190, 191, 151, 128, - 132, 135, 136, 139, 141, 162, 163, 166, - 172, 176, 180, 176, 255, 132, 143, 144, - 153, 154, 255, 175, 181, 184, 255, 129, - 155, 158, 255, 129, 143, 144, 153, 154, - 255, 171, 183, 157, 171, 176, 185, 169, - 171, 172, 173, 189, 190, 176, 180, 176, - 182, 145, 190, 143, 146, 178, 157, 158, - 160, 163, 133, 134, 137, 159, 168, 169, - 170, 165, 169, 173, 255, 131, 132, 140, - 169, 174, 255, 130, 132, 142, 191, 128, - 182, 187, 255, 173, 180, 182, 255, 132, - 155, 159, 161, 175, 163, 144, 150, 160, - 128, 129, 132, 135, 133, 134, 129, 160, - 255, 192, 255, 170, 173, 181, 186, 128, - 255, 181, 190, 176, 183, 184, 185, 186, - 191, 192, 255, 130, 131, 137, 137, 190, - 136, 144, 145, 191, 192, 255, 135, 179, - 129, 130, 132, 133, 144, 170, 176, 178, - 156, 128, 133, 140, 141, 144, 154, 160, - 191, 171, 172, 176, 128, 138, 139, 159, - 160, 169, 174, 255, 148, 158, 169, 150, - 164, 167, 173, 176, 185, 189, 190, 192, - 255, 144, 143, 145, 146, 175, 176, 255, - 139, 140, 141, 255, 166, 176, 178, 255, - 184, 186, 128, 137, 138, 170, 171, 179, - 180, 181, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 154, 164, 168, 128, 149, 150, - 173, 128, 152, 153, 155, 163, 255, 189, - 132, 185, 144, 176, 152, 161, 164, 165, - 166, 175, 177, 255, 132, 169, 177, 188, - 129, 131, 141, 142, 145, 146, 179, 181, - 186, 187, 190, 255, 142, 158, 133, 134, - 137, 138, 143, 150, 152, 155, 156, 161, - 164, 165, 166, 175, 176, 177, 178, 255, - 188, 129, 131, 133, 138, 143, 144, 147, - 168, 170, 176, 178, 179, 181, 182, 184, - 185, 190, 255, 157, 131, 134, 137, 138, - 142, 144, 146, 152, 153, 158, 159, 165, - 166, 175, 178, 180, 182, 255, 189, 129, - 131, 133, 141, 143, 145, 147, 168, 170, - 176, 178, 179, 181, 185, 188, 255, 134, - 138, 144, 185, 142, 159, 160, 161, 164, - 165, 166, 175, 176, 255, 189, 129, 131, - 133, 140, 143, 144, 147, 168, 170, 176, - 178, 179, 181, 185, 188, 191, 177, 128, - 132, 135, 136, 139, 141, 150, 151, 156, - 157, 159, 161, 162, 163, 166, 175, 130, - 131, 156, 133, 138, 142, 144, 146, 149, - 153, 154, 158, 159, 163, 164, 168, 170, - 174, 185, 190, 191, 144, 151, 128, 130, - 134, 136, 138, 141, 166, 175, 189, 128, - 131, 133, 140, 142, 144, 146, 168, 170, - 185, 190, 255, 133, 137, 151, 142, 148, - 152, 154, 155, 159, 160, 161, 164, 165, - 166, 175, 176, 255, 189, 129, 131, 133, - 140, 142, 144, 146, 168, 170, 179, 181, - 185, 188, 191, 158, 128, 132, 134, 136, - 138, 141, 149, 150, 160, 161, 162, 163, - 166, 175, 177, 178, 189, 129, 131, 133, - 140, 142, 144, 146, 186, 190, 255, 133, - 137, 142, 143, 150, 152, 158, 159, 161, - 164, 165, 166, 175, 176, 185, 186, 191, - 192, 255, 189, 130, 131, 133, 150, 154, - 177, 179, 187, 138, 150, 128, 134, 143, - 148, 152, 159, 166, 175, 178, 179, 177, - 180, 186, 135, 142, 144, 153, 177, 180, - 185, 187, 188, 136, 141, 144, 153, 128, - 181, 183, 185, 152, 153, 160, 169, 190, - 191, 128, 135, 137, 172, 177, 191, 128, - 132, 134, 135, 136, 140, 141, 151, 153, - 188, 134, 128, 129, 130, 131, 137, 138, - 139, 140, 141, 142, 143, 144, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 167, 168, 169, 170, 172, - 173, 174, 175, 176, 177, 179, 181, 182, - 183, 188, 189, 190, 191, 132, 152, 180, - 184, 185, 187, 171, 190, 128, 137, 150, - 153, 158, 160, 162, 164, 167, 173, 177, - 180, 143, 130, 141, 144, 153, 154, 157, - 160, 255, 155, 156, 157, 159, 160, 255, - 128, 140, 142, 145, 146, 148, 160, 177, - 178, 180, 128, 145, 146, 147, 160, 172, - 174, 176, 178, 179, 180, 255, 148, 156, - 158, 159, 160, 169, 170, 255, 139, 142, - 144, 153, 160, 255, 169, 128, 170, 176, - 255, 128, 158, 160, 171, 176, 187, 128, - 150, 151, 155, 191, 149, 158, 160, 188, - 128, 137, 144, 153, 176, 190, 128, 132, - 133, 179, 180, 255, 133, 139, 140, 143, - 144, 153, 154, 170, 180, 255, 128, 130, - 131, 160, 161, 173, 174, 175, 176, 185, - 186, 255, 166, 179, 180, 255, 128, 163, - 164, 183, 173, 144, 146, 148, 168, 169, - 177, 178, 180, 181, 182, 184, 185, 128, - 181, 188, 191, 128, 129, 130, 131, 132, - 133, 134, 146, 147, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 164, 140, 143, - 152, 153, 170, 174, 191, 255, 132, 165, - 177, 191, 129, 147, 149, 159, 160, 175, - 176, 255, 144, 176, 165, 170, 175, 177, - 180, 255, 191, 168, 174, 176, 255, 128, - 134, 136, 142, 144, 150, 152, 158, 160, - 191, 128, 130, 132, 133, 134, 133, 170, - 175, 187, 188, 153, 154, 128, 146, 147, - 148, 152, 153, 154, 155, 156, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, - 176, 129, 255, 191, 128, 174, 175, 178, - 180, 189, 128, 157, 158, 159, 160, 255, - 176, 177, 178, 255, 130, 134, 139, 163, - 167, 168, 255, 128, 129, 130, 179, 180, - 255, 187, 189, 133, 143, 144, 153, 154, - 159, 178, 183, 184, 255, 128, 137, 138, - 165, 166, 173, 176, 255, 135, 147, 148, - 159, 189, 255, 128, 131, 132, 178, 179, - 255, 143, 129, 142, 144, 153, 154, 164, - 166, 175, 176, 185, 186, 255, 128, 168, - 169, 182, 131, 128, 139, 140, 141, 144, - 153, 187, 189, 176, 178, 180, 183, 184, - 190, 191, 129, 160, 170, 171, 175, 178, - 180, 181, 182, 128, 162, 163, 170, 172, - 173, 176, 185, 172, 173, 174, 175, 180, - 181, 182, 183, 184, 185, 187, 188, 189, - 190, 191, 176, 186, 158, 190, 128, 134, - 147, 151, 157, 168, 170, 182, 184, 188, - 144, 148, 128, 143, 160, 175, 179, 180, - 191, 189, 255, 158, 159, 160, 190, 130, - 135, 138, 143, 146, 151, 154, 156, 185, - 187, 144, 145, 146, 147, 148, 150, 155, - 157, 158, 159, 128, 129, 130, 131, 133, - 135, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 148, 149, 152, 156, 157, 160, - 161, 162, 163, 164, 166, 168, 169, 170, - 171, 172, 173, 174, 176, 177, 153, 155, - 178, 179, 189, 160, 145, 255, 139, 143, - 182, 186, 187, 255, 128, 191, 129, 131, - 133, 134, 140, 143, 144, 147, 149, 151, - 153, 179, 184, 186, 128, 135, 137, 164, - 165, 166, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 138, 139, 140, 141, 146, - 147, 150, 151, 152, 153, 154, 155, 156, - 162, 163, 171, 128, 130, 131, 183, 184, - 255, 135, 165, 166, 175, 176, 190, 131, - 175, 187, 188, 190, 255, 128, 130, 131, - 166, 167, 180, 182, 191, 179, 182, 144, - 178, 128, 130, 131, 178, 179, 255, 155, - 129, 132, 133, 137, 141, 143, 144, 153, - 154, 156, 157, 255, 128, 145, 147, 171, - 172, 183, 159, 170, 171, 175, 176, 185, - 186, 255, 189, 128, 131, 133, 140, 143, - 144, 147, 168, 170, 176, 178, 179, 181, - 185, 188, 191, 144, 151, 128, 132, 135, - 136, 139, 141, 157, 161, 162, 163, 166, - 172, 176, 180, 128, 175, 176, 255, 134, - 132, 135, 136, 143, 144, 153, 154, 255, - 128, 174, 175, 181, 184, 255, 129, 151, - 152, 155, 158, 255, 132, 129, 143, 144, - 153, 154, 255, 128, 170, 171, 183, 157, - 171, 176, 185, 160, 168, 169, 171, 172, - 173, 174, 188, 189, 190, 161, 167, 144, - 173, 176, 180, 128, 175, 176, 182, 133, - 143, 145, 190, 191, 255, 143, 146, 147, - 159, 176, 177, 178, 128, 136, 144, 153, - 157, 158, 160, 163, 133, 134, 137, 144, - 145, 146, 147, 148, 149, 154, 155, 156, - 157, 158, 159, 168, 169, 170, 150, 153, - 165, 169, 173, 255, 131, 132, 140, 169, - 174, 255, 130, 132, 128, 182, 187, 255, - 173, 180, 182, 255, 132, 155, 159, 161, - 175, 160, 163, 184, 185, 186, 161, 162, - 133, 143, 144, 150, 151, 255, 160, 128, - 129, 132, 135, 133, 134, 129, 160, 255, - 192, 255, 176, 255, 170, 173, 181, 183, - 186, 128, 255, 181, 190, 176, 183, 184, - 185, 186, 191, 192, 255, 130, 131, 137, - 190, 136, 144, 145, 191, 192, 255, 135, - 179, 180, 129, 130, 132, 133, 144, 170, - 176, 178, 156, 128, 133, 144, 154, 160, - 191, 171, 176, 128, 138, 139, 159, 160, - 169, 174, 255, 148, 158, 169, 150, 164, - 167, 173, 176, 185, 189, 190, 192, 255, - 144, 143, 145, 146, 175, 176, 255, 139, - 140, 141, 255, 166, 176, 178, 255, 186, - 128, 137, 138, 170, 171, 179, 180, 181, - 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, - 154, 164, 168, 128, 149, 150, 173, 128, - 152, 153, 155, 163, 255, 189, 132, 185, - 144, 176, 152, 161, 164, 165, 166, 175, - 177, 255, 132, 169, 177, 188, 129, 131, - 141, 142, 145, 146, 179, 181, 186, 187, - 190, 255, 142, 158, 133, 134, 137, 138, - 143, 150, 152, 155, 156, 161, 164, 165, - 166, 175, 176, 177, 178, 255, 188, 129, - 131, 133, 138, 143, 144, 147, 168, 170, - 176, 178, 179, 181, 182, 184, 185, 190, - 255, 157, 131, 134, 137, 138, 142, 144, - 146, 152, 153, 158, 159, 165, 166, 175, - 178, 180, 182, 255, 189, 129, 131, 133, - 141, 143, 145, 147, 168, 170, 176, 178, - 179, 181, 185, 188, 255, 134, 138, 144, - 185, 142, 159, 160, 161, 164, 165, 166, - 175, 176, 255, 189, 129, 131, 133, 140, - 143, 144, 147, 168, 170, 176, 178, 179, - 181, 185, 188, 191, 177, 128, 132, 135, - 136, 139, 141, 150, 151, 156, 157, 159, - 161, 162, 163, 166, 175, 130, 131, 156, - 133, 138, 142, 144, 146, 149, 153, 154, - 158, 159, 163, 164, 168, 170, 174, 185, - 190, 191, 144, 151, 128, 130, 134, 136, - 138, 141, 166, 175, 189, 128, 131, 133, - 140, 142, 144, 146, 168, 170, 185, 190, - 255, 133, 137, 151, 142, 148, 152, 154, - 155, 159, 160, 161, 164, 165, 166, 175, - 176, 255, 189, 129, 131, 133, 140, 142, - 144, 146, 168, 170, 179, 181, 185, 188, - 191, 158, 128, 132, 134, 136, 138, 141, - 149, 150, 160, 161, 162, 163, 166, 175, - 177, 178, 189, 129, 131, 133, 140, 142, - 144, 146, 186, 190, 255, 133, 137, 142, - 143, 150, 152, 158, 159, 161, 164, 165, - 166, 175, 176, 185, 186, 191, 192, 255, - 189, 130, 131, 133, 150, 154, 177, 179, - 187, 138, 150, 128, 134, 143, 148, 152, - 159, 166, 175, 178, 179, 177, 180, 186, - 135, 142, 144, 153, 177, 180, 185, 187, - 188, 136, 141, 144, 153, 128, 181, 183, - 185, 152, 153, 160, 169, 190, 191, 128, - 135, 137, 172, 177, 191, 128, 132, 134, - 135, 136, 140, 141, 151, 153, 188, 134, - 128, 129, 130, 131, 137, 138, 139, 140, - 141, 142, 143, 144, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, - 165, 167, 168, 169, 170, 172, 173, 174, - 175, 176, 177, 179, 181, 182, 183, 188, - 189, 190, 191, 132, 152, 180, 184, 185, - 187, 171, 190, 128, 137, 150, 153, 158, - 160, 162, 164, 167, 173, 177, 180, 143, - 130, 141, 144, 153, 154, 157, 160, 255, - 155, 156, 157, 159, 160, 255, 128, 140, - 142, 145, 146, 148, 160, 177, 178, 180, - 128, 145, 146, 147, 160, 172, 174, 176, - 178, 179, 180, 255, 148, 156, 158, 159, - 160, 169, 170, 255, 139, 142, 144, 153, - 160, 255, 169, 128, 170, 176, 255, 128, - 158, 160, 171, 176, 187, 128, 150, 151, - 155, 191, 149, 158, 160, 188, 128, 137, - 144, 153, 176, 190, 128, 132, 133, 179, - 180, 255, 133, 139, 140, 143, 144, 153, - 154, 170, 180, 255, 128, 130, 131, 160, - 161, 173, 174, 175, 176, 185, 186, 255, - 166, 179, 180, 255, 128, 163, 164, 183, - 173, 144, 146, 148, 168, 169, 177, 178, - 180, 181, 182, 184, 185, 128, 181, 188, - 191, 128, 129, 130, 131, 132, 133, 134, - 146, 147, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 164, 167, 140, 143, 152, - 153, 170, 174, 191, 255, 165, 177, 191, - 129, 147, 149, 159, 160, 175, 176, 255, - 144, 176, 165, 170, 175, 177, 180, 255, - 191, 168, 174, 176, 255, 128, 134, 136, - 142, 144, 150, 152, 158, 160, 191, 128, - 130, 132, 133, 134, 133, 170, 175, 187, - 188, 153, 154, 128, 146, 147, 148, 152, - 153, 154, 155, 156, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 129, - 255, 191, 128, 174, 175, 178, 180, 189, - 128, 157, 158, 159, 160, 255, 176, 177, - 178, 255, 130, 134, 139, 163, 167, 168, - 255, 128, 129, 130, 179, 180, 255, 187, - 189, 133, 143, 144, 153, 154, 159, 178, - 183, 184, 255, 128, 137, 138, 165, 166, - 173, 176, 255, 135, 147, 148, 159, 189, - 255, 128, 131, 132, 178, 179, 255, 143, - 129, 142, 144, 153, 154, 164, 166, 175, - 176, 185, 186, 255, 128, 168, 169, 182, - 131, 128, 139, 140, 141, 144, 153, 187, - 189, 176, 178, 180, 183, 184, 190, 191, - 129, 160, 170, 171, 175, 178, 180, 181, - 182, 128, 162, 163, 170, 172, 173, 176, - 185, 172, 173, 174, 175, 180, 181, 182, - 183, 184, 185, 187, 188, 189, 190, 191, - 176, 186, 158, 190, 128, 134, 147, 151, - 157, 168, 170, 182, 184, 188, 147, 128, - 143, 160, 175, 179, 180, 191, 189, 255, - 158, 159, 160, 190, 130, 135, 138, 143, - 146, 151, 154, 156, 185, 187, 144, 145, - 146, 147, 148, 150, 155, 157, 158, 159, - 128, 129, 130, 131, 133, 135, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 148, - 149, 152, 156, 157, 160, 161, 162, 163, - 164, 166, 168, 169, 170, 171, 172, 173, - 174, 176, 177, 153, 155, 178, 179, 189, - 160, 145, 255, 139, 143, 182, 186, 187, - 255, 128, 191, 129, 131, 133, 134, 140, - 143, 144, 147, 149, 151, 153, 179, 184, - 186, 128, 135, 137, 164, 165, 166, 128, - 129, 130, 131, 132, 133, 134, 135, 136, - 138, 139, 140, 141, 146, 147, 150, 151, - 152, 153, 154, 155, 156, 162, 163, 171, - 128, 130, 131, 183, 184, 255, 135, 165, - 166, 175, 176, 190, 131, 175, 187, 188, - 190, 255, 128, 130, 131, 166, 167, 180, - 182, 191, 179, 182, 144, 178, 128, 130, - 131, 178, 179, 255, 155, 129, 132, 133, - 137, 141, 143, 144, 153, 154, 156, 157, - 255, 128, 145, 147, 171, 172, 183, 159, - 170, 171, 175, 176, 185, 186, 255, 189, - 128, 131, 133, 140, 143, 144, 147, 168, - 170, 176, 178, 179, 181, 185, 188, 191, - 144, 151, 128, 132, 135, 136, 139, 141, - 157, 161, 162, 163, 166, 172, 176, 180, - 128, 175, 176, 255, 134, 132, 135, 136, - 143, 144, 153, 154, 255, 128, 174, 175, - 181, 184, 255, 129, 151, 152, 155, 158, - 255, 132, 129, 143, 144, 153, 154, 255, - 128, 170, 171, 183, 157, 171, 176, 185, - 160, 168, 169, 171, 172, 173, 174, 188, - 189, 190, 161, 167, 144, 173, 176, 180, - 128, 175, 176, 182, 133, 143, 145, 190, - 191, 255, 143, 146, 147, 159, 176, 177, - 178, 128, 136, 144, 153, 157, 158, 160, - 163, 133, 134, 137, 144, 145, 146, 147, - 148, 149, 154, 155, 156, 157, 158, 159, - 168, 169, 170, 150, 153, 165, 169, 173, - 255, 131, 132, 140, 169, 174, 255, 130, - 132, 128, 182, 187, 255, 173, 180, 182, - 255, 132, 155, 159, 161, 175, 160, 163, - 184, 185, 186, 161, 162, 133, 143, 144, - 150, 151, 255, 160, 128, 129, 132, 135, - 133, 134, 129, 160, 255, 192, 255, 176, - 255, 170, 173, 181, 186, 128, 255, 181, - 190, 176, 183, 184, 185, 186, 191, 192, - 255, 130, 131, 137, 190, 136, 144, 145, - 191, 192, 255, 135, 179, 129, 130, 132, - 133, 144, 170, 176, 178, 156, 128, 133, - 144, 154, 160, 191, 171, 176, 128, 138, - 139, 159, 160, 169, 174, 255, 148, 158, - 169, 150, 164, 167, 173, 176, 185, 189, - 190, 192, 255, 144, 143, 145, 146, 175, - 176, 255, 139, 140, 141, 255, 166, 176, - 178, 255, 186, 128, 137, 138, 170, 171, - 179, 180, 181, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 177, 178, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 154, 164, 168, 128, 149, - 150, 173, 128, 152, 153, 155, 163, 255, - 189, 132, 185, 144, 176, 152, 161, 164, - 165, 166, 175, 177, 255, 132, 169, 177, - 188, 129, 131, 141, 142, 145, 146, 179, - 181, 186, 187, 190, 255, 142, 158, 133, - 134, 137, 138, 143, 150, 152, 155, 156, - 161, 164, 165, 166, 175, 176, 177, 178, - 255, 188, 129, 131, 133, 138, 143, 144, - 147, 168, 170, 176, 178, 179, 181, 182, - 184, 185, 190, 255, 157, 131, 134, 137, - 138, 142, 144, 146, 152, 153, 158, 159, - 165, 166, 175, 178, 180, 182, 255, 189, - 129, 131, 133, 141, 143, 145, 147, 168, - 170, 176, 178, 179, 181, 185, 188, 255, - 134, 138, 144, 185, 142, 159, 160, 161, - 164, 165, 166, 175, 176, 255, 189, 129, - 131, 133, 140, 143, 144, 147, 168, 170, - 176, 178, 179, 181, 185, 188, 191, 177, - 128, 132, 135, 136, 139, 141, 150, 151, - 156, 157, 159, 161, 162, 163, 166, 175, - 130, 131, 156, 133, 138, 142, 144, 146, - 149, 153, 154, 158, 159, 163, 164, 168, - 170, 174, 185, 190, 191, 144, 151, 128, - 130, 134, 136, 138, 141, 166, 175, 189, - 128, 131, 133, 140, 142, 144, 146, 168, - 170, 185, 190, 255, 133, 137, 151, 142, - 148, 152, 154, 155, 159, 160, 161, 164, - 165, 166, 175, 176, 255, 189, 129, 131, - 133, 140, 142, 144, 146, 168, 170, 179, - 181, 185, 188, 191, 158, 128, 132, 134, - 136, 138, 141, 149, 150, 160, 161, 162, - 163, 166, 175, 177, 178, 189, 129, 131, - 133, 140, 142, 144, 146, 186, 190, 255, - 133, 137, 142, 143, 150, 152, 158, 159, - 161, 164, 165, 166, 175, 176, 185, 186, - 191, 192, 255, 189, 130, 131, 133, 150, - 154, 177, 179, 187, 138, 150, 128, 134, - 143, 148, 152, 159, 166, 175, 178, 179, - 177, 180, 186, 135, 142, 144, 153, 177, - 180, 185, 187, 188, 136, 141, 144, 153, - 128, 181, 183, 185, 152, 153, 160, 169, - 190, 191, 128, 135, 137, 172, 177, 191, - 128, 132, 134, 135, 136, 140, 141, 151, - 153, 188, 134, 128, 129, 130, 131, 137, - 138, 139, 140, 141, 142, 143, 144, 153, - 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 167, 168, 169, 170, - 172, 173, 174, 175, 176, 177, 179, 181, - 182, 183, 188, 189, 190, 191, 132, 152, - 180, 184, 185, 187, 171, 190, 128, 137, - 150, 153, 158, 160, 162, 164, 167, 173, - 177, 180, 143, 130, 141, 144, 153, 154, - 157, 160, 255, 155, 156, 157, 159, 160, - 255, 128, 140, 142, 145, 146, 148, 160, - 177, 178, 180, 128, 145, 146, 147, 160, - 172, 174, 176, 178, 179, 180, 255, 148, - 156, 158, 159, 160, 169, 170, 255, 139, - 142, 144, 153, 160, 255, 169, 128, 170, - 176, 255, 128, 158, 160, 171, 176, 187, - 128, 150, 151, 155, 191, 149, 158, 160, - 188, 128, 137, 144, 153, 176, 190, 128, - 132, 133, 179, 180, 255, 133, 139, 140, - 143, 144, 153, 154, 170, 180, 255, 128, - 130, 131, 160, 161, 173, 174, 175, 176, - 185, 186, 255, 166, 179, 180, 255, 128, - 163, 164, 183, 173, 144, 146, 148, 168, - 169, 177, 178, 180, 181, 182, 184, 185, - 128, 181, 188, 191, 128, 129, 130, 131, - 132, 133, 134, 146, 147, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 140, 143, - 170, 174, 191, 255, 165, 177, 191, 129, - 147, 149, 159, 176, 255, 144, 176, 165, - 170, 175, 177, 180, 255, 191, 168, 174, - 176, 255, 128, 134, 136, 142, 144, 150, - 152, 158, 160, 191, 128, 130, 131, 132, - 133, 134, 135, 139, 140, 141, 133, 170, - 175, 177, 181, 187, 188, 153, 154, 155, - 156, 160, 255, 128, 146, 147, 148, 152, - 153, 154, 155, 156, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 129, - 255, 191, 128, 174, 175, 178, 180, 189, - 128, 157, 158, 159, 160, 255, 176, 177, - 178, 255, 130, 134, 139, 163, 167, 168, - 255, 128, 129, 130, 179, 180, 255, 187, - 189, 133, 143, 144, 153, 154, 159, 178, - 183, 184, 255, 128, 137, 138, 165, 166, - 173, 176, 255, 135, 147, 148, 159, 189, - 255, 128, 131, 132, 178, 179, 255, 143, - 129, 142, 144, 153, 154, 164, 166, 175, - 176, 185, 186, 255, 128, 168, 169, 182, - 131, 128, 139, 140, 141, 144, 153, 187, - 189, 176, 178, 180, 183, 184, 190, 191, - 129, 160, 170, 171, 175, 178, 180, 181, - 182, 128, 162, 163, 170, 172, 173, 176, - 185, 172, 173, 174, 175, 180, 181, 182, - 183, 184, 185, 187, 188, 189, 190, 191, - 176, 186, 158, 190, 128, 134, 147, 151, - 157, 168, 170, 182, 184, 188, 128, 143, - 160, 175, 179, 180, 141, 143, 176, 180, - 182, 255, 191, 189, 255, 191, 161, 186, - 158, 159, 160, 190, 191, 255, 130, 135, - 138, 143, 146, 151, 154, 156, 185, 187, - 144, 145, 146, 147, 148, 150, 155, 157, - 158, 159, 128, 129, 130, 131, 133, 135, - 138, 139, 140, 141, 142, 143, 144, 145, - 146, 148, 149, 152, 156, 157, 160, 161, - 162, 163, 164, 166, 168, 169, 170, 171, - 172, 173, 174, 176, 177, 153, 155, 178, - 179, 189, 160, 145, 255, 139, 143, 182, - 186, 187, 255, 128, 191, 129, 131, 133, - 134, 140, 143, 144, 147, 149, 151, 153, - 179, 184, 186, 128, 135, 137, 164, 165, - 166, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 138, 139, 140, 141, 146, 147, - 150, 151, 152, 153, 154, 155, 156, 162, - 163, 171, 128, 130, 131, 183, 184, 255, - 135, 165, 166, 175, 176, 190, 131, 175, - 187, 188, 190, 255, 128, 130, 131, 166, - 167, 180, 182, 191, 179, 182, 144, 178, - 128, 130, 131, 178, 179, 255, 155, 129, - 132, 133, 137, 141, 143, 144, 153, 154, - 156, 157, 255, 128, 145, 147, 171, 172, - 183, 159, 170, 171, 175, 176, 185, 186, - 255, 189, 128, 131, 133, 140, 143, 144, - 147, 168, 170, 176, 178, 179, 181, 185, - 188, 191, 144, 151, 128, 132, 135, 136, - 139, 141, 157, 161, 162, 163, 166, 172, - 176, 180, 128, 175, 176, 255, 134, 132, - 135, 136, 143, 144, 153, 154, 255, 128, - 174, 175, 181, 184, 255, 129, 151, 152, - 155, 158, 255, 132, 129, 143, 144, 153, - 154, 255, 128, 170, 171, 183, 157, 171, - 176, 185, 160, 168, 169, 171, 172, 173, - 174, 188, 189, 190, 161, 167, 144, 173, - 176, 180, 128, 175, 176, 182, 133, 143, - 145, 190, 191, 255, 143, 146, 147, 159, - 128, 176, 177, 178, 128, 136, 144, 153, - 157, 158, 160, 163, 133, 134, 137, 144, - 145, 146, 147, 148, 149, 154, 155, 156, - 157, 158, 159, 168, 169, 170, 150, 153, - 165, 169, 173, 255, 131, 132, 140, 169, - 174, 255, 130, 132, 128, 182, 187, 255, - 173, 180, 182, 255, 132, 155, 159, 161, - 175, 160, 163, 184, 185, 186, 161, 162, - 133, 143, 144, 150, 151, 255, 160, 128, - 129, 132, 135, 133, 134, 129, 160, 255, - 192, 255, 176, 255, 170, 173, 181, 186, - 0, 127, 181, 190, 176, 183, 184, 185, - 186, 191, 192, 255, 130, 131, 137, 190, - 136, 144, 145, 191, 192, 255, 135, 179, - 129, 130, 132, 133, 144, 170, 176, 178, - 156, 128, 133, 144, 154, 160, 191, 171, - 176, 128, 138, 139, 159, 160, 169, 174, - 255, 148, 158, 169, 150, 164, 167, 173, - 176, 185, 189, 190, 192, 255, 144, 143, - 145, 146, 175, 176, 255, 139, 140, 141, - 255, 166, 176, 178, 255, 186, 128, 137, - 138, 170, 171, 179, 180, 181, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 154, 164, - 168, 128, 149, 150, 173, 128, 152, 153, - 155, 163, 255, 189, 132, 185, 144, 176, - 152, 161, 164, 165, 166, 175, 177, 255, - 132, 169, 177, 188, 129, 131, 141, 142, - 145, 146, 179, 181, 186, 187, 190, 255, - 142, 158, 133, 134, 137, 138, 143, 150, - 152, 155, 156, 161, 164, 165, 166, 175, - 176, 177, 178, 255, 188, 129, 131, 133, - 138, 143, 144, 147, 168, 170, 176, 178, - 179, 181, 182, 184, 185, 190, 255, 157, - 131, 134, 137, 138, 142, 144, 146, 152, - 153, 158, 159, 165, 166, 175, 178, 180, - 182, 255, 189, 129, 131, 133, 141, 143, - 145, 147, 168, 170, 176, 178, 179, 181, - 185, 188, 255, 134, 138, 144, 185, 142, - 159, 160, 161, 164, 165, 166, 175, 176, - 255, 189, 129, 131, 133, 140, 143, 144, - 147, 168, 170, 176, 178, 179, 181, 185, - 188, 191, 177, 128, 132, 135, 136, 139, - 141, 150, 151, 156, 157, 159, 161, 162, - 163, 166, 175, 130, 131, 156, 133, 138, - 142, 144, 146, 149, 153, 154, 158, 159, - 163, 164, 168, 170, 174, 185, 190, 191, - 144, 151, 128, 130, 134, 136, 138, 141, - 166, 175, 189, 128, 131, 133, 140, 142, - 144, 146, 168, 170, 185, 190, 255, 133, - 137, 151, 142, 148, 152, 154, 155, 159, - 160, 161, 164, 165, 166, 175, 176, 255, - 189, 129, 131, 133, 140, 142, 144, 146, - 168, 170, 179, 181, 185, 188, 191, 158, - 128, 132, 134, 136, 138, 141, 149, 150, - 160, 161, 162, 163, 166, 175, 177, 178, - 189, 129, 131, 133, 140, 142, 144, 146, - 186, 190, 255, 133, 137, 142, 143, 150, - 152, 158, 159, 161, 164, 165, 166, 175, - 176, 185, 186, 191, 192, 255, 189, 130, - 131, 133, 150, 154, 177, 179, 187, 138, - 150, 128, 134, 143, 148, 152, 159, 166, - 175, 178, 179, 177, 180, 186, 135, 142, - 144, 153, 177, 180, 185, 187, 188, 136, - 141, 144, 153, 128, 181, 183, 185, 152, - 153, 160, 169, 190, 191, 128, 135, 137, - 172, 177, 191, 128, 132, 134, 135, 136, - 140, 141, 151, 153, 188, 134, 128, 129, - 130, 131, 137, 138, 139, 140, 141, 142, - 143, 144, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 167, - 168, 169, 170, 172, 173, 174, 175, 176, - 177, 179, 181, 182, 183, 188, 189, 190, - 191, 132, 152, 180, 184, 185, 187, 171, - 190, 128, 137, 150, 153, 158, 160, 162, - 164, 167, 173, 177, 180, 143, 130, 141, - 144, 153, 154, 157, 160, 255, 155, 156, - 157, 159, 160, 255, 128, 140, 142, 145, - 146, 148, 160, 177, 178, 180, 128, 145, - 146, 147, 160, 172, 174, 176, 178, 179, - 180, 255, 148, 156, 158, 159, 160, 169, - 170, 255, 139, 142, 144, 153, 160, 255, - 169, 128, 170, 176, 255, 128, 158, 160, - 171, 176, 187, 128, 150, 151, 155, 191, - 149, 158, 160, 188, 128, 137, 144, 153, - 176, 190, 128, 132, 133, 179, 180, 255, - 133, 139, 140, 143, 144, 153, 154, 170, - 180, 255, 128, 130, 131, 160, 161, 173, - 174, 175, 176, 185, 186, 255, 166, 179, - 180, 255, 128, 163, 164, 183, 173, 144, - 146, 148, 168, 169, 177, 178, 180, 181, - 182, 184, 185, 128, 181, 188, 191, 128, - 129, 130, 131, 132, 133, 134, 146, 147, - 176, 177, 178, 179, 180, 181, 182, 183, - 184, 140, 143, 170, 174, 191, 255, 165, - 177, 191, 129, 147, 149, 159, 160, 175, - 176, 255, 144, 176, 165, 170, 175, 177, - 180, 255, 191, 168, 174, 176, 255, 128, - 134, 136, 142, 144, 150, 152, 158, 160, - 191, 128, 130, 131, 132, 133, 134, 135, - 139, 140, 141, 133, 170, 175, 177, 181, - 187, 188, 153, 154, 155, 156, 160, 255, - 128, 146, 147, 148, 152, 153, 154, 155, - 156, 158, 159, 160, 161, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, - 173, 174, 175, 176, 129, 255, 191, 128, - 174, 175, 178, 180, 189, 128, 157, 158, - 159, 160, 255, 176, 177, 178, 255, 130, - 134, 139, 163, 167, 168, 255, 128, 129, - 130, 179, 180, 255, 187, 189, 133, 143, - 144, 153, 154, 159, 178, 183, 184, 255, - 128, 137, 138, 165, 166, 173, 176, 255, - 135, 147, 148, 159, 189, 255, 128, 131, - 132, 178, 179, 255, 143, 129, 142, 144, - 153, 154, 164, 166, 175, 176, 185, 186, - 255, 128, 168, 169, 182, 131, 128, 139, - 140, 141, 144, 153, 187, 189, 176, 178, - 180, 183, 184, 190, 191, 129, 160, 170, - 171, 175, 178, 180, 181, 182, 128, 162, - 163, 170, 172, 173, 176, 185, 172, 173, - 174, 175, 180, 181, 182, 183, 184, 185, - 187, 188, 189, 190, 191, 176, 186, 158, - 190, 128, 134, 147, 151, 157, 168, 170, - 182, 184, 188, 128, 143, 160, 175, 179, - 180, 191, 189, 255, 158, 159, 160, 190, - 191, 255, 130, 135, 138, 143, 146, 151, - 154, 156, 185, 187, 144, 145, 146, 147, - 148, 150, 155, 157, 158, 159, 128, 129, - 130, 131, 133, 135, 138, 139, 140, 141, - 142, 143, 144, 145, 146, 148, 149, 152, - 156, 157, 160, 161, 162, 163, 164, 166, - 168, 169, 170, 171, 172, 173, 174, 176, - 177, 153, 155, 178, 179, 189, 160, 145, - 255, 139, 143, 182, 186, 187, 255, 128, - 191, 129, 131, 133, 134, 140, 143, 144, - 147, 149, 151, 153, 179, 184, 186, 128, - 135, 137, 164, 165, 166, 128, 129, 130, - 131, 132, 133, 134, 135, 136, 138, 139, - 140, 141, 146, 147, 150, 151, 152, 153, - 154, 155, 156, 162, 163, 171, 128, 130, - 131, 183, 184, 255, 135, 165, 166, 175, - 176, 190, 131, 175, 187, 188, 190, 255, - 128, 130, 131, 166, 167, 180, 182, 191, - 179, 182, 144, 178, 128, 130, 131, 178, - 179, 255, 155, 129, 132, 133, 137, 141, - 143, 144, 153, 154, 156, 157, 255, 128, - 145, 147, 171, 172, 183, 159, 170, 171, - 175, 176, 185, 186, 255, 189, 128, 131, - 133, 140, 143, 144, 147, 168, 170, 176, - 178, 179, 181, 185, 188, 191, 144, 151, - 128, 132, 135, 136, 139, 141, 157, 161, - 162, 163, 166, 172, 176, 180, 128, 175, - 176, 255, 134, 132, 135, 136, 143, 144, - 153, 154, 255, 128, 174, 175, 181, 184, - 255, 129, 151, 152, 155, 158, 255, 132, - 129, 143, 144, 153, 154, 255, 128, 170, - 171, 183, 157, 171, 176, 185, 160, 168, - 169, 171, 172, 173, 174, 188, 189, 190, - 161, 167, 144, 173, 176, 180, 128, 175, - 176, 182, 133, 143, 145, 190, 191, 255, - 143, 146, 147, 159, 128, 176, 177, 178, - 128, 136, 144, 153, 157, 158, 160, 163, - 133, 134, 137, 144, 145, 146, 147, 148, - 149, 154, 155, 156, 157, 158, 159, 168, - 169, 170, 150, 153, 165, 169, 173, 255, - 131, 132, 140, 169, 174, 255, 130, 132, - 128, 182, 187, 255, 173, 180, 182, 255, - 132, 155, 159, 161, 175, 160, 163, 184, - 185, 186, 161, 162, 133, 143, 144, 150, - 151, 255, 160, 128, 129, 132, 135, 133, - 134, 129, 160, 255, 192, 255, 176, 255, - 173, 0, 127, 176, 255, 131, 137, 191, - 145, 189, 135, 129, 130, 132, 133, 156, - 128, 133, 144, 154, 176, 139, 159, 150, - 157, 159, 164, 167, 168, 170, 173, 143, - 145, 176, 255, 139, 255, 166, 176, 171, - 179, 160, 161, 163, 164, 165, 167, 169, - 171, 173, 174, 175, 176, 177, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 166, 170, 172, 178, 150, - 153, 155, 163, 165, 167, 169, 173, 153, - 155, 163, 255, 189, 132, 185, 144, 152, - 161, 164, 255, 188, 129, 131, 190, 255, - 133, 134, 137, 138, 142, 150, 152, 161, - 164, 255, 131, 134, 137, 138, 142, 144, - 146, 175, 178, 180, 182, 255, 134, 138, - 142, 161, 164, 255, 188, 129, 131, 190, - 191, 128, 132, 135, 136, 139, 141, 150, - 151, 162, 163, 130, 190, 191, 151, 128, - 130, 134, 136, 138, 141, 128, 131, 190, - 255, 133, 137, 142, 148, 151, 161, 164, - 255, 128, 132, 134, 136, 138, 141, 149, - 150, 162, 163, 129, 131, 190, 255, 133, - 137, 142, 150, 152, 161, 164, 255, 130, - 131, 138, 150, 143, 148, 152, 159, 178, - 179, 177, 180, 186, 135, 142, 177, 180, - 185, 187, 188, 136, 141, 181, 183, 185, - 152, 153, 190, 191, 177, 191, 128, 132, - 134, 135, 141, 151, 153, 188, 134, 128, - 129, 130, 141, 156, 157, 158, 159, 160, - 162, 164, 168, 169, 170, 172, 173, 174, - 175, 176, 179, 183, 171, 190, 150, 153, - 158, 160, 162, 164, 167, 173, 177, 180, - 143, 130, 141, 154, 157, 157, 159, 146, - 148, 178, 180, 146, 147, 178, 179, 180, - 255, 148, 156, 158, 255, 139, 142, 169, - 160, 171, 176, 187, 151, 155, 191, 149, - 158, 160, 188, 176, 190, 128, 132, 180, - 255, 133, 170, 180, 255, 128, 130, 161, - 173, 166, 179, 164, 183, 173, 144, 146, - 148, 168, 178, 180, 184, 185, 128, 181, - 188, 191, 128, 129, 131, 179, 181, 183, - 140, 143, 170, 174, 160, 164, 166, 175, - 144, 176, 175, 177, 191, 160, 191, 128, - 130, 170, 175, 153, 154, 153, 154, 155, - 160, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 175, 175, 178, 180, 189, - 158, 159, 176, 177, 130, 134, 139, 163, - 167, 128, 129, 180, 255, 133, 159, 178, - 255, 166, 173, 135, 147, 128, 131, 179, - 255, 129, 164, 166, 255, 169, 182, 131, - 140, 141, 187, 189, 176, 178, 180, 183, - 184, 190, 191, 129, 171, 175, 181, 182, - 163, 170, 172, 173, 172, 184, 187, 190, - 191, 158, 128, 143, 160, 175, 185, 187, - 144, 145, 150, 155, 157, 158, 135, 139, - 141, 168, 171, 189, 160, 182, 186, 191, - 129, 131, 133, 134, 140, 143, 184, 186, - 165, 166, 128, 129, 130, 132, 133, 134, - 135, 136, 139, 140, 141, 146, 147, 150, - 151, 152, 153, 154, 156, 128, 130, 184, - 255, 135, 190, 131, 175, 187, 188, 190, - 255, 128, 130, 167, 180, 179, 128, 130, - 179, 255, 129, 137, 141, 255, 172, 183, - 159, 170, 188, 128, 131, 190, 191, 151, - 128, 132, 135, 136, 139, 141, 162, 163, - 166, 172, 176, 180, 176, 255, 132, 255, - 175, 181, 184, 255, 129, 155, 158, 255, - 129, 255, 171, 183, 157, 171, 171, 172, - 189, 190, 176, 180, 176, 182, 145, 190, - 143, 146, 178, 157, 158, 160, 163, 133, - 134, 137, 168, 169, 170, 165, 169, 173, - 255, 131, 132, 140, 169, 174, 255, 130, - 132, 128, 182, 187, 255, 173, 180, 182, - 255, 132, 155, 159, 161, 175, 163, 144, - 150, 160, 128, 129, 132, 135, 133, 134, - 129, 160, 255, 192, 255, 170, 173, 181, - 186, 0, 127, 181, 190, 176, 183, 184, - 185, 186, 191, 192, 255, 130, 131, 137, - 190, 136, 144, 145, 191, 192, 255, 135, - 129, 130, 132, 133, 144, 170, 176, 179, - 156, 128, 133, 144, 154, 160, 191, 176, - 128, 138, 139, 159, 174, 255, 148, 158, - 169, 150, 164, 167, 173, 176, 185, 189, - 190, 192, 255, 144, 143, 145, 146, 175, - 176, 255, 139, 140, 141, 255, 166, 176, - 178, 255, 186, 138, 170, 171, 179, 180, - 181, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, - 191, 154, 164, 168, 128, 149, 150, 173, - 128, 152, 153, 155, 163, 255, 189, 132, - 185, 144, 152, 161, 164, 176, 177, 255, - 132, 169, 177, 188, 129, 131, 141, 142, - 145, 146, 179, 181, 186, 187, 190, 255, - 142, 158, 133, 134, 137, 138, 143, 150, - 152, 155, 156, 161, 164, 175, 176, 177, - 178, 255, 188, 129, 131, 133, 138, 143, - 144, 147, 168, 170, 176, 178, 179, 181, - 182, 184, 185, 190, 255, 157, 131, 134, - 137, 138, 142, 144, 146, 152, 153, 158, - 159, 175, 178, 180, 182, 255, 189, 129, - 131, 133, 141, 143, 145, 147, 168, 170, - 176, 178, 179, 181, 185, 188, 255, 134, - 138, 144, 185, 142, 159, 160, 161, 164, - 255, 189, 129, 131, 133, 140, 143, 144, - 147, 168, 170, 176, 178, 179, 181, 185, - 188, 191, 177, 128, 132, 135, 136, 139, - 141, 150, 151, 156, 157, 159, 161, 162, - 163, 130, 131, 156, 133, 138, 142, 144, - 146, 149, 153, 154, 158, 159, 163, 164, - 168, 170, 174, 185, 190, 191, 144, 151, - 128, 130, 134, 136, 138, 141, 189, 128, - 131, 133, 140, 142, 144, 146, 168, 170, - 185, 190, 255, 133, 137, 151, 142, 148, - 152, 154, 155, 159, 160, 161, 164, 255, - 189, 129, 131, 133, 140, 142, 144, 146, - 168, 170, 179, 181, 185, 188, 191, 158, - 128, 132, 134, 136, 138, 141, 149, 150, - 160, 161, 162, 163, 177, 178, 189, 129, - 131, 133, 140, 142, 144, 146, 186, 190, - 255, 133, 137, 142, 143, 150, 152, 158, - 159, 161, 164, 185, 186, 191, 192, 255, - 189, 130, 131, 133, 150, 154, 177, 179, - 187, 138, 150, 128, 134, 143, 148, 152, - 159, 178, 179, 177, 180, 186, 135, 142, - 177, 180, 185, 187, 188, 136, 141, 128, - 181, 183, 185, 152, 153, 190, 191, 128, - 135, 137, 172, 177, 191, 128, 132, 134, - 135, 136, 140, 141, 151, 153, 188, 134, - 128, 129, 130, 131, 137, 138, 139, 140, - 141, 142, 143, 144, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, - 168, 169, 170, 172, 173, 174, 175, 176, - 177, 179, 181, 182, 183, 188, 189, 190, - 191, 132, 152, 180, 184, 185, 187, 171, - 190, 150, 153, 158, 160, 162, 164, 167, - 173, 177, 180, 143, 130, 141, 154, 157, - 160, 255, 155, 156, 157, 159, 160, 255, - 128, 140, 142, 145, 146, 148, 160, 177, - 178, 180, 128, 145, 146, 147, 160, 172, - 174, 176, 178, 179, 180, 255, 148, 156, - 158, 255, 139, 142, 160, 255, 169, 128, - 170, 176, 255, 128, 158, 160, 171, 176, - 187, 128, 150, 151, 155, 191, 149, 158, - 160, 188, 176, 190, 128, 132, 133, 179, - 180, 255, 133, 139, 140, 170, 180, 255, - 128, 130, 131, 160, 161, 173, 174, 175, - 186, 255, 166, 179, 180, 255, 128, 163, - 164, 183, 173, 144, 146, 148, 168, 169, - 177, 178, 180, 181, 182, 184, 185, 128, - 181, 188, 191, 128, 129, 130, 131, 132, - 133, 134, 146, 147, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 140, 143, 170, - 174, 177, 191, 160, 164, 166, 175, 144, - 176, 165, 170, 175, 177, 180, 255, 191, - 168, 174, 176, 255, 128, 134, 136, 142, - 144, 150, 152, 158, 160, 191, 128, 130, - 132, 133, 134, 133, 170, 175, 187, 188, - 153, 154, 128, 146, 147, 148, 152, 153, - 154, 155, 156, 158, 159, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 129, 255, - 191, 128, 174, 175, 178, 180, 189, 128, - 157, 158, 159, 160, 255, 176, 177, 178, - 255, 130, 134, 139, 163, 167, 168, 255, - 128, 129, 130, 179, 180, 255, 187, 189, - 133, 159, 178, 183, 184, 255, 138, 165, - 166, 173, 176, 255, 135, 147, 148, 159, - 189, 255, 128, 131, 132, 178, 179, 255, - 143, 129, 164, 166, 255, 128, 168, 169, - 182, 131, 128, 139, 140, 141, 187, 189, - 176, 178, 180, 183, 184, 190, 191, 129, - 160, 170, 171, 175, 178, 180, 181, 182, - 128, 162, 163, 170, 172, 173, 172, 173, - 174, 175, 180, 181, 182, 183, 184, 185, - 187, 188, 189, 190, 191, 176, 186, 158, - 190, 128, 134, 147, 151, 157, 168, 170, - 182, 184, 188, 128, 143, 160, 175, 191, - 189, 255, 158, 159, 160, 190, 130, 135, - 138, 143, 146, 151, 154, 156, 185, 187, - 144, 145, 146, 147, 148, 150, 155, 157, - 158, 159, 128, 129, 130, 131, 133, 135, - 138, 139, 140, 141, 142, 143, 144, 145, - 146, 148, 149, 152, 156, 157, 160, 161, - 162, 163, 164, 166, 168, 169, 170, 171, - 172, 173, 174, 176, 177, 153, 155, 178, - 179, 189, 160, 145, 255, 139, 143, 182, - 186, 187, 255, 128, 191, 129, 131, 133, - 134, 140, 143, 144, 147, 149, 151, 153, - 179, 184, 186, 128, 135, 137, 164, 165, - 166, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 138, 139, 140, 141, 146, 147, - 150, 151, 152, 153, 154, 156, 162, 163, - 171, 128, 130, 131, 183, 184, 255, 135, - 190, 131, 175, 187, 188, 190, 255, 128, - 130, 131, 166, 167, 180, 179, 182, 144, - 178, 128, 130, 131, 178, 179, 255, 154, - 156, 129, 132, 133, 137, 141, 255, 128, - 145, 147, 171, 172, 183, 159, 170, 171, - 255, 189, 128, 131, 133, 140, 143, 144, - 147, 168, 170, 176, 178, 179, 181, 185, - 188, 191, 144, 151, 128, 132, 135, 136, - 139, 141, 157, 161, 162, 163, 166, 172, - 176, 180, 128, 175, 176, 255, 134, 132, - 135, 136, 255, 128, 174, 175, 181, 184, - 255, 129, 151, 152, 155, 158, 255, 132, - 129, 255, 128, 170, 171, 183, 157, 171, - 160, 168, 169, 171, 172, 173, 174, 188, - 189, 190, 161, 167, 144, 173, 176, 180, - 128, 175, 176, 182, 133, 143, 145, 190, - 191, 255, 143, 146, 147, 159, 176, 177, - 178, 128, 136, 144, 153, 157, 158, 160, - 163, 133, 134, 137, 144, 145, 146, 147, - 148, 149, 154, 155, 156, 157, 158, 159, - 168, 169, 170, 150, 153, 165, 169, 173, - 255, 131, 132, 140, 169, 174, 255, 130, - 132, 128, 182, 187, 255, 173, 180, 182, - 255, 132, 155, 159, 161, 175, 160, 163, - 184, 185, 186, 161, 162, 133, 143, 144, - 150, 151, 255, 160, 128, 129, 132, 135, - 133, 134, 129, 160, 255, 192, 255, 176, - 255, 170, 173, 181, 186, 0, 127, 181, - 190, 176, 183, 184, 185, 186, 191, 192, - 255, 130, 131, 137, 137, 190, 136, 144, - 145, 191, 192, 255, 135, 179, 129, 130, - 132, 133, 144, 170, 176, 178, 156, 128, - 133, 140, 141, 144, 154, 160, 191, 171, - 172, 176, 128, 138, 139, 159, 160, 169, - 174, 255, 148, 158, 169, 150, 164, 167, - 173, 176, 185, 189, 190, 192, 255, 144, - 143, 145, 146, 175, 176, 255, 139, 140, - 141, 255, 166, 176, 178, 255, 184, 186, - 128, 137, 138, 170, 171, 179, 180, 181, - 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, - 154, 164, 168, 128, 149, 150, 173, 128, - 152, 153, 155, 163, 255, 189, 132, 185, - 144, 176, 152, 161, 164, 165, 166, 175, - 177, 255, 132, 169, 177, 188, 129, 131, - 141, 142, 145, 146, 179, 181, 186, 187, - 190, 255, 142, 158, 133, 134, 137, 138, - 143, 150, 152, 155, 156, 161, 164, 165, - 166, 175, 176, 177, 178, 255, 188, 129, - 131, 133, 138, 143, 144, 147, 168, 170, - 176, 178, 179, 181, 182, 184, 185, 190, - 255, 157, 131, 134, 137, 138, 142, 144, - 146, 152, 153, 158, 159, 165, 166, 175, - 178, 180, 182, 255, 189, 129, 131, 133, - 141, 143, 145, 147, 168, 170, 176, 178, - 179, 181, 185, 188, 255, 134, 138, 144, - 185, 142, 159, 160, 161, 164, 165, 166, - 175, 176, 255, 189, 129, 131, 133, 140, - 143, 144, 147, 168, 170, 176, 178, 179, - 181, 185, 188, 191, 177, 128, 132, 135, - 136, 139, 141, 150, 151, 156, 157, 159, - 161, 162, 163, 166, 175, 130, 131, 156, - 133, 138, 142, 144, 146, 149, 153, 154, - 158, 159, 163, 164, 168, 170, 174, 185, - 190, 191, 144, 151, 128, 130, 134, 136, - 138, 141, 166, 175, 189, 128, 131, 133, - 140, 142, 144, 146, 168, 170, 185, 190, - 255, 133, 137, 151, 142, 148, 152, 154, - 155, 159, 160, 161, 164, 165, 166, 175, - 176, 255, 189, 129, 131, 133, 140, 142, - 144, 146, 168, 170, 179, 181, 185, 188, - 191, 158, 128, 132, 134, 136, 138, 141, - 149, 150, 160, 161, 162, 163, 166, 175, - 177, 178, 189, 129, 131, 133, 140, 142, - 144, 146, 186, 190, 255, 133, 137, 142, - 143, 150, 152, 158, 159, 161, 164, 165, - 166, 175, 176, 185, 186, 191, 192, 255, - 189, 130, 131, 133, 150, 154, 177, 179, - 187, 138, 150, 128, 134, 143, 148, 152, - 159, 166, 175, 178, 179, 177, 180, 186, - 135, 142, 144, 153, 177, 180, 185, 187, - 188, 136, 141, 144, 153, 128, 181, 183, - 185, 152, 153, 160, 169, 190, 191, 128, - 135, 137, 172, 177, 191, 128, 132, 134, - 135, 136, 140, 141, 151, 153, 188, 134, - 128, 129, 130, 131, 137, 138, 139, 140, - 141, 142, 143, 144, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, - 165, 167, 168, 169, 170, 172, 173, 174, - 175, 176, 177, 179, 181, 182, 183, 188, - 189, 190, 191, 132, 152, 180, 184, 185, - 187, 171, 190, 128, 137, 150, 153, 158, - 160, 162, 164, 167, 173, 177, 180, 143, - 130, 141, 144, 153, 154, 157, 160, 255, - 155, 156, 157, 159, 160, 255, 128, 140, - 142, 145, 146, 148, 160, 177, 178, 180, - 128, 145, 146, 147, 160, 172, 174, 176, - 178, 179, 180, 255, 148, 156, 158, 159, - 160, 169, 170, 255, 139, 142, 144, 153, - 160, 255, 169, 128, 170, 176, 255, 128, - 158, 160, 171, 176, 187, 128, 150, 151, - 155, 191, 149, 158, 160, 188, 128, 137, - 144, 153, 176, 190, 128, 132, 133, 179, - 180, 255, 133, 139, 140, 143, 144, 153, - 154, 170, 180, 255, 128, 130, 131, 160, - 161, 173, 174, 175, 176, 185, 186, 255, - 166, 179, 180, 255, 128, 163, 164, 183, - 173, 144, 146, 148, 168, 169, 177, 178, - 180, 181, 182, 184, 185, 128, 181, 188, - 191, 128, 129, 130, 131, 132, 133, 134, - 146, 147, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 164, 140, 143, 152, 153, - 170, 174, 191, 255, 132, 165, 177, 191, - 129, 147, 149, 159, 160, 175, 176, 255, - 144, 176, 165, 170, 175, 177, 180, 255, - 191, 168, 174, 176, 255, 128, 134, 136, - 142, 144, 150, 152, 158, 160, 191, 128, - 130, 132, 133, 134, 133, 170, 175, 187, - 188, 153, 154, 128, 146, 147, 148, 152, - 153, 154, 155, 156, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 129, - 255, 191, 128, 174, 175, 178, 180, 189, - 128, 157, 158, 159, 160, 255, 176, 177, - 178, 255, 130, 134, 139, 163, 167, 168, - 255, 128, 129, 130, 179, 180, 255, 187, - 189, 133, 143, 144, 153, 154, 159, 178, - 183, 184, 255, 128, 137, 138, 165, 166, - 173, 176, 255, 135, 147, 148, 159, 189, - 255, 128, 131, 132, 178, 179, 255, 143, - 129, 142, 144, 153, 154, 164, 166, 175, - 176, 185, 186, 255, 128, 168, 169, 182, - 131, 128, 139, 140, 141, 144, 153, 187, - 189, 176, 178, 180, 183, 184, 190, 191, - 129, 160, 170, 171, 175, 178, 180, 181, - 182, 128, 162, 163, 170, 172, 173, 176, - 185, 172, 173, 174, 175, 180, 181, 182, - 183, 184, 185, 187, 188, 189, 190, 191, - 176, 186, 158, 190, 128, 134, 147, 151, - 157, 168, 170, 182, 184, 188, 144, 148, - 128, 143, 160, 175, 179, 180, 191, 189, - 255, 158, 159, 160, 190, 130, 135, 138, - 143, 146, 151, 154, 156, 185, 187, 144, - 145, 146, 147, 148, 150, 155, 157, 158, - 159, 128, 129, 130, 131, 133, 135, 138, - 139, 140, 141, 142, 143, 144, 145, 146, - 148, 149, 152, 156, 157, 160, 161, 162, - 163, 164, 166, 168, 169, 170, 171, 172, - 173, 174, 176, 177, 153, 155, 178, 179, - 189, 160, 145, 255, 139, 143, 182, 186, - 187, 255, 128, 191, 129, 131, 133, 134, - 140, 143, 144, 147, 149, 151, 153, 179, - 184, 186, 128, 135, 137, 164, 165, 166, - 128, 129, 130, 131, 132, 133, 134, 135, - 136, 138, 139, 140, 141, 146, 147, 150, - 151, 152, 153, 154, 155, 156, 162, 163, - 171, 128, 130, 131, 183, 184, 255, 135, - 165, 166, 175, 176, 190, 131, 175, 187, - 188, 190, 255, 128, 130, 131, 166, 167, - 180, 182, 191, 179, 182, 144, 178, 128, - 130, 131, 178, 179, 255, 155, 129, 132, - 133, 137, 141, 143, 144, 153, 154, 156, - 157, 255, 128, 145, 147, 171, 172, 183, - 159, 170, 171, 175, 176, 185, 186, 255, - 189, 128, 131, 133, 140, 143, 144, 147, - 168, 170, 176, 178, 179, 181, 185, 188, - 191, 144, 151, 128, 132, 135, 136, 139, - 141, 157, 161, 162, 163, 166, 172, 176, - 180, 128, 175, 176, 255, 134, 132, 135, - 136, 143, 144, 153, 154, 255, 128, 174, - 175, 181, 184, 255, 129, 151, 152, 155, - 158, 255, 132, 129, 143, 144, 153, 154, - 255, 128, 170, 171, 183, 157, 171, 176, - 185, 160, 168, 169, 171, 172, 173, 174, - 188, 189, 190, 161, 167, 144, 173, 176, - 180, 128, 175, 176, 182, 133, 143, 145, - 190, 191, 255, 143, 146, 147, 159, 176, - 177, 178, 128, 136, 144, 153, 157, 158, - 160, 163, 133, 134, 137, 144, 145, 146, - 147, 148, 149, 154, 155, 156, 157, 158, - 159, 168, 169, 170, 150, 153, 165, 169, - 173, 255, 131, 132, 140, 169, 174, 255, - 130, 132, 128, 182, 187, 255, 173, 180, - 182, 255, 132, 155, 159, 161, 175, 160, - 163, 184, 185, 186, 161, 162, 133, 143, - 144, 150, 151, 255, 160, 128, 129, 132, - 135, 133, 134, 129, 160, 255, 192, 255, - 176, 255, 170, 173, 181, 186, 0, 127, - 181, 190, 176, 183, 184, 185, 186, 191, - 192, 255, 130, 131, 137, 190, 136, 144, - 145, 191, 192, 255, 135, 179, 129, 130, - 132, 133, 144, 170, 176, 178, 156, 128, - 133, 144, 154, 160, 191, 171, 176, 128, - 138, 139, 159, 160, 169, 174, 255, 148, - 158, 169, 150, 164, 167, 173, 176, 185, - 189, 190, 192, 255, 144, 143, 145, 146, - 175, 176, 255, 139, 140, 141, 255, 166, - 176, 178, 255, 186, 128, 137, 138, 170, - 171, 179, 180, 181, 160, 161, 162, 163, - 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 154, 164, 168, 128, - 149, 150, 173, 128, 152, 153, 155, 163, - 255, 189, 132, 185, 144, 176, 152, 161, - 164, 165, 166, 175, 177, 255, 132, 169, - 177, 188, 129, 131, 141, 142, 145, 146, - 179, 181, 186, 187, 190, 255, 142, 158, - 133, 134, 137, 138, 143, 150, 152, 155, - 156, 161, 164, 165, 166, 175, 176, 177, - 178, 255, 188, 129, 131, 133, 138, 143, - 144, 147, 168, 170, 176, 178, 179, 181, - 182, 184, 185, 190, 255, 157, 131, 134, - 137, 138, 142, 144, 146, 152, 153, 158, - 159, 165, 166, 175, 178, 180, 182, 255, - 189, 129, 131, 133, 141, 143, 145, 147, - 168, 170, 176, 178, 179, 181, 185, 188, - 255, 134, 138, 144, 185, 142, 159, 160, - 161, 164, 165, 166, 175, 176, 255, 189, - 129, 131, 133, 140, 143, 144, 147, 168, - 170, 176, 178, 179, 181, 185, 188, 191, - 177, 128, 132, 135, 136, 139, 141, 150, - 151, 156, 157, 159, 161, 162, 163, 166, - 175, 130, 131, 156, 133, 138, 142, 144, - 146, 149, 153, 154, 158, 159, 163, 164, - 168, 170, 174, 185, 190, 191, 144, 151, - 128, 130, 134, 136, 138, 141, 166, 175, - 189, 128, 131, 133, 140, 142, 144, 146, - 168, 170, 185, 190, 255, 133, 137, 151, - 142, 148, 152, 154, 155, 159, 160, 161, - 164, 165, 166, 175, 176, 255, 189, 129, - 131, 133, 140, 142, 144, 146, 168, 170, - 179, 181, 185, 188, 191, 158, 128, 132, - 134, 136, 138, 141, 149, 150, 160, 161, - 162, 163, 166, 175, 177, 178, 189, 129, - 131, 133, 140, 142, 144, 146, 186, 190, - 255, 133, 137, 142, 143, 150, 152, 158, - 159, 161, 164, 165, 166, 175, 176, 185, - 186, 191, 192, 255, 189, 130, 131, 133, - 150, 154, 177, 179, 187, 138, 150, 128, - 134, 143, 148, 152, 159, 166, 175, 178, - 179, 177, 180, 186, 135, 142, 144, 153, - 177, 180, 185, 187, 188, 136, 141, 144, - 153, 128, 181, 183, 185, 152, 153, 160, - 169, 190, 191, 128, 135, 137, 172, 177, - 191, 128, 132, 134, 135, 136, 140, 141, - 151, 153, 188, 134, 128, 129, 130, 131, - 137, 138, 139, 140, 141, 142, 143, 144, - 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 167, 168, 169, - 170, 172, 173, 174, 175, 176, 177, 179, - 181, 182, 183, 188, 189, 190, 191, 132, - 152, 180, 184, 185, 187, 171, 190, 128, - 137, 150, 153, 158, 160, 162, 164, 167, - 173, 177, 180, 143, 130, 141, 144, 153, - 154, 157, 160, 255, 155, 156, 157, 159, - 160, 255, 128, 140, 142, 145, 146, 148, - 160, 177, 178, 180, 128, 145, 146, 147, - 160, 172, 174, 176, 178, 179, 180, 255, - 148, 156, 158, 159, 160, 169, 170, 255, - 139, 142, 144, 153, 160, 255, 169, 128, - 170, 176, 255, 128, 158, 160, 171, 176, - 187, 128, 150, 151, 155, 191, 149, 158, - 160, 188, 128, 137, 144, 153, 176, 190, - 128, 132, 133, 179, 180, 255, 133, 139, - 140, 143, 144, 153, 154, 170, 180, 255, - 128, 130, 131, 160, 161, 173, 174, 175, - 176, 185, 186, 255, 166, 179, 180, 255, - 128, 163, 164, 183, 173, 144, 146, 148, - 168, 169, 177, 178, 180, 181, 182, 184, - 185, 128, 181, 188, 191, 128, 129, 130, - 131, 132, 133, 134, 146, 147, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 140, - 143, 170, 174, 191, 255, 165, 177, 191, - 129, 147, 149, 159, 160, 175, 176, 255, - 144, 176, 165, 170, 175, 177, 180, 255, - 191, 168, 174, 176, 255, 128, 134, 136, - 142, 144, 150, 152, 158, 160, 191, 128, - 130, 131, 132, 133, 134, 135, 139, 140, - 141, 133, 170, 175, 177, 181, 187, 188, - 153, 154, 155, 156, 160, 255, 128, 146, - 147, 148, 152, 153, 154, 155, 156, 158, - 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 129, 255, 191, 128, 174, 175, - 178, 180, 189, 128, 157, 158, 159, 160, - 255, 176, 177, 178, 255, 130, 134, 139, - 163, 167, 168, 255, 128, 129, 130, 179, - 180, 255, 187, 189, 133, 143, 144, 153, - 154, 159, 178, 183, 184, 255, 128, 137, - 138, 165, 166, 173, 176, 255, 135, 147, - 148, 159, 189, 255, 128, 131, 132, 178, - 179, 255, 143, 129, 142, 144, 153, 154, - 164, 166, 175, 176, 185, 186, 255, 128, - 168, 169, 182, 131, 128, 139, 140, 141, - 144, 153, 187, 189, 176, 178, 180, 183, - 184, 190, 191, 129, 160, 170, 171, 175, - 178, 180, 181, 182, 128, 162, 163, 170, - 172, 173, 176, 185, 172, 173, 174, 175, - 180, 181, 182, 183, 184, 185, 187, 188, - 189, 190, 191, 176, 186, 158, 190, 128, - 134, 147, 151, 157, 168, 170, 182, 184, - 188, 128, 143, 160, 175, 179, 180, 191, - 189, 255, 158, 159, 160, 190, 191, 255, - 130, 135, 138, 143, 146, 151, 154, 156, - 185, 187, 144, 145, 146, 147, 148, 150, - 155, 157, 158, 159, 128, 129, 130, 131, - 133, 135, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 148, 149, 152, 156, 157, - 160, 161, 162, 163, 164, 166, 168, 169, - 170, 171, 172, 173, 174, 176, 177, 153, - 155, 178, 179, 189, 160, 145, 255, 139, - 143, 182, 186, 187, 255, 128, 191, 129, - 131, 133, 134, 140, 143, 144, 147, 149, - 151, 153, 179, 184, 186, 128, 135, 137, - 164, 165, 166, 128, 129, 130, 131, 132, - 133, 134, 135, 136, 138, 139, 140, 141, - 146, 147, 150, 151, 152, 153, 154, 155, - 156, 162, 163, 171, 128, 130, 131, 183, - 184, 255, 135, 165, 166, 175, 176, 190, - 131, 175, 187, 188, 190, 255, 128, 130, - 131, 166, 167, 180, 182, 191, 179, 182, - 144, 178, 128, 130, 131, 178, 179, 255, - 155, 129, 132, 133, 137, 141, 143, 144, - 153, 154, 156, 157, 255, 128, 145, 147, - 171, 172, 183, 159, 170, 171, 175, 176, - 185, 186, 255, 189, 128, 131, 133, 140, - 143, 144, 147, 168, 170, 176, 178, 179, - 181, 185, 188, 191, 144, 151, 128, 132, - 135, 136, 139, 141, 157, 161, 162, 163, - 166, 172, 176, 180, 128, 175, 176, 255, - 134, 132, 135, 136, 143, 144, 153, 154, - 255, 128, 174, 175, 181, 184, 255, 129, - 151, 152, 155, 158, 255, 132, 129, 143, - 144, 153, 154, 255, 128, 170, 171, 183, - 157, 171, 176, 185, 160, 168, 169, 171, - 172, 173, 174, 188, 189, 190, 161, 167, - 144, 173, 176, 180, 128, 175, 176, 182, - 133, 143, 145, 190, 191, 255, 143, 146, - 147, 159, 128, 176, 177, 178, 128, 136, - 144, 153, 157, 158, 160, 163, 133, 134, - 137, 144, 145, 146, 147, 148, 149, 154, - 155, 156, 157, 158, 159, 168, 169, 170, - 150, 153, 165, 169, 173, 255, 131, 132, - 140, 169, 174, 255, 130, 132, 128, 182, - 187, 255, 173, 180, 182, 255, 132, 155, - 159, 161, 175, 160, 163, 184, 185, 186, - 161, 162, 133, 143, 144, 150, 151, 255, - 160, 128, 129, 132, 135, 133, 134, 129, - 160, 255, 192, 255, 176, 255, 173, 0, - 127, 176, 255, 131, 137, 191, 145, 189, - 135, 129, 130, 132, 133, 156, 128, 133, - 144, 154, 176, 139, 159, 150, 157, 159, - 164, 167, 168, 170, 173, 143, 145, 176, - 255, 139, 255, 166, 176, 171, 179, 160, - 161, 163, 164, 165, 167, 169, 171, 173, - 174, 175, 176, 177, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, - 191, 166, 170, 172, 178, 128, 129, 130, - 141, 156, 157, 158, 159, 160, 162, 164, - 168, 169, 170, 172, 173, 174, 175, 176, - 179, 183, 128, 129, 131, 179, 181, 183, - 128, 130, 153, 154, 155, 160, 162, 163, - 164, 165, 166, 167, 168, 169, 170, 171, - 175, 172, 184, 187, 190, 191, 144, 145, - 150, 155, 157, 158, 160, 154, 164, 168, - 128, 149, 150, 173, 128, 152, 153, 155, - 189, 132, 185, 144, 176, 152, 161, 164, - 165, 166, 175, 177, 255, 132, 169, 177, - 188, 129, 131, 141, 142, 145, 146, 179, - 181, 186, 187, 190, 255, 142, 158, 133, - 134, 137, 138, 143, 150, 152, 155, 156, - 161, 164, 165, 166, 175, 176, 177, 178, - 255, 188, 129, 131, 133, 138, 143, 144, - 147, 168, 170, 176, 178, 179, 181, 182, - 184, 185, 190, 255, 157, 131, 134, 137, - 138, 142, 144, 146, 152, 153, 158, 159, - 165, 166, 175, 178, 180, 182, 255, 189, - 129, 131, 133, 141, 143, 145, 147, 168, - 170, 176, 178, 179, 181, 185, 188, 255, - 134, 138, 144, 185, 142, 159, 160, 161, - 164, 165, 166, 175, 176, 255, 189, 129, - 131, 133, 140, 143, 144, 147, 168, 170, - 176, 178, 179, 181, 185, 188, 191, 177, - 128, 132, 135, 136, 139, 141, 150, 151, - 156, 157, 159, 161, 162, 163, 166, 175, - 130, 131, 156, 133, 138, 142, 144, 146, - 149, 153, 154, 158, 159, 163, 164, 168, - 170, 174, 185, 190, 191, 144, 151, 128, - 130, 134, 136, 138, 141, 166, 175, 189, - 128, 131, 133, 140, 142, 144, 146, 168, - 170, 185, 190, 255, 133, 137, 151, 142, - 148, 152, 154, 155, 159, 160, 161, 164, - 165, 166, 175, 176, 255, 189, 129, 131, - 133, 140, 142, 144, 146, 168, 170, 179, - 181, 185, 188, 191, 158, 128, 132, 134, - 136, 138, 141, 149, 150, 160, 161, 162, - 163, 166, 175, 177, 178, 189, 129, 131, - 133, 140, 142, 144, 146, 186, 190, 255, - 133, 137, 142, 143, 150, 152, 158, 159, - 161, 164, 165, 166, 175, 176, 185, 186, - 191, 192, 255, 189, 130, 131, 133, 150, - 154, 177, 179, 187, 138, 150, 128, 134, - 143, 148, 152, 159, 166, 175, 178, 179, - 135, 142, 144, 153, 136, 141, 144, 153, - 128, 181, 183, 185, 152, 153, 160, 169, - 190, 191, 128, 135, 137, 172, 177, 191, - 128, 132, 134, 135, 136, 140, 141, 151, - 153, 188, 128, 137, 150, 153, 158, 160, - 162, 164, 167, 173, 177, 180, 143, 130, - 141, 144, 153, 154, 157, 160, 255, 0, - 127, 170, 173, 181, 183, 186, 0, 127, - 181, 190, 176, 183, 184, 185, 186, 191, - 192, 255, 130, 131, 137, 190, 136, 144, - 145, 191, 192, 255, 135, 179, 180, 129, - 130, 132, 133, 144, 170, 176, 178, 156, - 128, 133, 144, 154, 160, 191, 171, 176, - 128, 138, 139, 159, 160, 169, 174, 255, - 148, 158, 169, 150, 164, 167, 173, 176, - 185, 189, 190, 192, 255, 144, 143, 145, - 146, 175, 176, 255, 139, 140, 141, 255, - 166, 176, 178, 255, 186, 128, 137, 138, - 170, 171, 179, 180, 181, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 154, 164, 168, - 128, 149, 150, 173, 128, 152, 153, 155, - 163, 255, 189, 132, 185, 144, 176, 152, - 161, 164, 165, 166, 175, 177, 255, 132, - 169, 177, 188, 129, 131, 141, 142, 145, - 146, 179, 181, 186, 187, 190, 255, 142, - 158, 133, 134, 137, 138, 143, 150, 152, - 155, 156, 161, 164, 165, 166, 175, 176, - 177, 178, 255, 188, 129, 131, 133, 138, - 143, 144, 147, 168, 170, 176, 178, 179, - 181, 182, 184, 185, 190, 255, 157, 131, - 134, 137, 138, 142, 144, 146, 152, 153, - 158, 159, 165, 166, 175, 178, 180, 182, - 255, 189, 129, 131, 133, 141, 143, 145, - 147, 168, 170, 176, 178, 179, 181, 185, - 188, 255, 134, 138, 144, 185, 142, 159, - 160, 161, 164, 165, 166, 175, 176, 255, - 189, 129, 131, 133, 140, 143, 144, 147, - 168, 170, 176, 178, 179, 181, 185, 188, - 191, 177, 128, 132, 135, 136, 139, 141, - 150, 151, 156, 157, 159, 161, 162, 163, - 166, 175, 130, 131, 156, 133, 138, 142, - 144, 146, 149, 153, 154, 158, 159, 163, - 164, 168, 170, 174, 185, 190, 191, 144, - 151, 128, 130, 134, 136, 138, 141, 166, - 175, 189, 128, 131, 133, 140, 142, 144, - 146, 168, 170, 185, 190, 255, 133, 137, - 151, 142, 148, 152, 154, 155, 159, 160, - 161, 164, 165, 166, 175, 176, 255, 189, - 129, 131, 133, 140, 142, 144, 146, 168, - 170, 179, 181, 185, 188, 191, 158, 128, - 132, 134, 136, 138, 141, 149, 150, 160, - 161, 162, 163, 166, 175, 177, 178, 189, - 129, 131, 133, 140, 142, 144, 146, 186, - 190, 255, 133, 137, 142, 143, 150, 152, - 158, 159, 161, 164, 165, 166, 175, 176, - 185, 186, 191, 192, 255, 189, 130, 131, - 133, 150, 154, 177, 179, 187, 138, 150, - 128, 134, 143, 148, 152, 159, 166, 175, - 178, 179, 177, 180, 186, 135, 142, 144, - 153, 177, 180, 185, 187, 188, 136, 141, - 144, 153, 128, 181, 183, 185, 152, 153, - 160, 169, 190, 191, 128, 135, 137, 172, - 177, 191, 128, 132, 134, 135, 136, 140, - 141, 151, 153, 188, 134, 128, 129, 130, - 131, 132, 135, 137, 138, 139, 140, 141, - 142, 143, 144, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, 164, 165, - 167, 168, 169, 170, 172, 173, 174, 175, - 176, 177, 179, 181, 182, 183, 188, 189, - 190, 191, 133, 134, 136, 152, 180, 184, - 185, 187, 171, 190, 128, 137, 150, 153, - 158, 160, 162, 164, 167, 173, 177, 180, - 143, 130, 141, 144, 153, 154, 157, 160, - 255, 192, 255, 155, 156, 157, 159, 160, - 255, 128, 140, 142, 145, 146, 148, 160, - 177, 178, 180, 128, 145, 146, 147, 160, - 172, 174, 176, 178, 179, 180, 255, 148, - 156, 158, 159, 160, 169, 170, 255, 139, - 142, 144, 153, 160, 255, 169, 128, 170, - 176, 255, 128, 158, 160, 171, 176, 187, - 128, 150, 151, 155, 191, 149, 158, 160, - 188, 128, 137, 144, 153, 176, 190, 128, - 132, 133, 179, 180, 255, 133, 139, 140, - 143, 144, 153, 154, 170, 180, 255, 128, - 130, 131, 160, 161, 173, 174, 175, 176, - 185, 186, 255, 166, 179, 180, 255, 128, - 163, 164, 183, 173, 144, 146, 148, 168, - 169, 177, 178, 180, 181, 182, 184, 185, - 128, 181, 188, 191, 128, 129, 130, 131, - 132, 133, 134, 146, 147, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 164, 167, - 140, 143, 152, 153, 170, 174, 191, 255, - 165, 177, 191, 129, 147, 149, 159, 160, - 175, 176, 255, 144, 176, 165, 170, 175, - 177, 180, 255, 191, 168, 174, 176, 255, - 128, 134, 136, 142, 144, 150, 152, 158, - 160, 191, 128, 130, 132, 133, 134, 136, - 137, 133, 170, 175, 187, 188, 153, 154, - 133, 173, 177, 255, 143, 159, 160, 186, - 187, 255, 128, 158, 173, 0, 127, 176, - 255, 131, 137, 191, 145, 189, 135, 129, - 130, 132, 133, 156, 128, 133, 144, 154, - 176, 139, 159, 150, 157, 159, 164, 167, - 168, 170, 173, 143, 145, 176, 255, 139, - 255, 166, 176, 171, 179, 160, 161, 163, - 164, 165, 167, 169, 171, 173, 174, 175, - 176, 177, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 166, - 170, 172, 178, 150, 153, 155, 163, 165, - 167, 169, 173, 153, 155, 163, 255, 189, - 132, 185, 144, 152, 161, 164, 255, 188, - 129, 131, 190, 255, 133, 134, 137, 138, - 142, 150, 152, 161, 164, 255, 131, 134, - 137, 138, 142, 144, 146, 175, 178, 180, - 182, 255, 134, 138, 142, 161, 164, 255, - 188, 129, 131, 190, 191, 128, 132, 135, - 136, 139, 141, 150, 151, 162, 163, 130, - 190, 191, 151, 128, 130, 134, 136, 138, - 141, 128, 131, 190, 255, 133, 137, 142, - 148, 151, 161, 164, 255, 128, 132, 134, - 136, 138, 141, 149, 150, 162, 163, 129, - 131, 190, 255, 133, 137, 142, 150, 152, - 161, 164, 255, 130, 131, 138, 150, 143, - 148, 152, 159, 178, 179, 177, 180, 186, - 135, 142, 177, 180, 185, 187, 188, 136, - 141, 181, 183, 185, 152, 153, 190, 191, - 177, 191, 128, 132, 134, 135, 141, 151, - 153, 188, 134, 128, 129, 130, 132, 135, - 141, 156, 157, 158, 159, 160, 162, 164, - 168, 169, 170, 172, 173, 174, 175, 176, - 179, 183, 133, 134, 171, 190, 150, 153, - 158, 160, 162, 164, 167, 173, 177, 180, - 143, 130, 141, 154, 157, 192, 255, 157, - 159, 146, 148, 178, 180, 146, 147, 178, - 179, 180, 255, 148, 156, 158, 255, 139, - 142, 169, 160, 171, 176, 187, 151, 155, - 191, 149, 158, 160, 188, 176, 190, 128, - 132, 180, 255, 133, 170, 180, 255, 128, - 130, 161, 173, 166, 179, 164, 183, 173, - 144, 146, 148, 168, 178, 180, 184, 185, - 128, 181, 188, 191, 128, 129, 131, 179, - 181, 183, 140, 143, 170, 174, 160, 164, - 166, 175, 144, 176, 175, 177, 191, 160, - 191, 128, 130, 132, 133, 134, 136, 137, - 170, 175, 153, 154, 177, 255, 143, 255, - 160, 190, 153, 154, 155, 160, 162, 163, - 164, 165, 166, 167, 168, 169, 170, 171, - 175, 176, 177, 255, 175, 178, 180, 189, - 158, 159, 176, 177, 130, 134, 139, 163, - 167, 128, 129, 180, 255, 133, 159, 178, - 255, 166, 173, 135, 147, 160, 188, 128, - 131, 179, 255, 129, 164, 166, 255, 169, - 182, 131, 140, 141, 187, 189, 176, 178, - 180, 183, 184, 190, 191, 129, 171, 175, - 181, 182, 163, 170, 172, 173, 158, 159, - 160, 255, 164, 175, 135, 138, 188, 255, - 172, 184, 187, 190, 191, 158, 128, 143, - 160, 175, 158, 190, 130, 135, 138, 143, - 146, 151, 154, 156, 185, 187, 144, 145, - 150, 155, 157, 158, 135, 139, 141, 168, - 171, 189, 160, 182, 186, 191, 129, 131, - 133, 134, 140, 143, 184, 186, 165, 166, - 128, 129, 130, 132, 133, 134, 135, 136, - 139, 140, 141, 146, 147, 150, 151, 152, - 153, 154, 156, 128, 130, 184, 255, 135, - 190, 131, 175, 187, 188, 190, 255, 128, - 130, 167, 180, 179, 128, 130, 179, 255, - 129, 137, 141, 255, 172, 183, 159, 170, - 188, 128, 131, 190, 191, 151, 128, 132, - 135, 136, 139, 141, 162, 163, 166, 172, - 176, 180, 176, 255, 132, 255, 175, 181, - 184, 255, 129, 155, 158, 255, 129, 255, - 171, 183, 157, 171, 171, 172, 189, 190, - 176, 180, 176, 182, 145, 190, 143, 146, - 178, 157, 158, 160, 163, 133, 134, 137, - 168, 169, 170, 165, 169, 173, 255, 131, - 132, 140, 169, 174, 255, 130, 132, 128, - 182, 187, 255, 173, 180, 182, 255, 132, - 155, 159, 161, 175, 163, 144, 150, 160, - 128, 129, 132, 135, 133, 134, 129, 160, - 255, 128, 146, 147, 148, 152, 153, 154, - 155, 156, 158, 159, 160, 161, 162, 163, - 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 129, 157, 177, - 255, 191, 128, 174, 175, 178, 180, 189, - 128, 157, 158, 159, 160, 255, 176, 177, - 178, 255, 130, 134, 139, 163, 167, 168, - 255, 128, 129, 130, 179, 180, 255, 187, - 189, 133, 143, 144, 153, 154, 159, 178, - 183, 184, 255, 128, 137, 138, 165, 166, - 173, 176, 255, 135, 147, 148, 159, 160, - 188, 189, 255, 128, 131, 132, 178, 179, - 255, 143, 129, 142, 144, 153, 154, 164, - 166, 175, 176, 185, 186, 255, 128, 168, - 169, 182, 131, 128, 139, 140, 141, 144, - 153, 187, 189, 176, 178, 180, 183, 184, - 190, 191, 129, 160, 170, 171, 175, 178, - 180, 181, 182, 128, 162, 163, 170, 172, - 173, 176, 185, 158, 159, 160, 255, 164, - 175, 135, 138, 188, 255, 172, 173, 174, - 175, 180, 181, 182, 183, 184, 185, 187, - 188, 189, 190, 191, 176, 186, 158, 190, - 128, 134, 147, 151, 157, 168, 170, 182, - 184, 188, 147, 128, 143, 160, 175, 179, - 180, 191, 189, 255, 158, 190, 130, 135, - 138, 143, 146, 151, 154, 156, 185, 187, - 144, 145, 146, 147, 148, 150, 155, 157, - 158, 159, 128, 129, 130, 131, 133, 135, - 138, 139, 140, 141, 142, 143, 144, 145, - 146, 148, 149, 152, 156, 157, 160, 161, - 162, 163, 164, 166, 168, 169, 170, 171, - 172, 173, 174, 176, 177, 153, 155, 178, - 179, 189, 160, 145, 255, 139, 143, 182, - 186, 187, 255, 128, 191, 129, 131, 133, - 134, 140, 143, 144, 147, 149, 151, 153, - 179, 184, 186, 128, 135, 137, 164, 165, - 166, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 138, 139, 140, 141, 146, 147, - 150, 151, 152, 153, 154, 155, 156, 162, - 163, 171, 128, 130, 131, 183, 184, 255, - 135, 165, 166, 175, 176, 190, 131, 175, - 187, 188, 190, 255, 128, 130, 131, 166, - 167, 180, 182, 191, 179, 182, 144, 178, - 128, 130, 131, 178, 179, 255, 155, 129, - 132, 133, 137, 141, 143, 144, 153, 154, - 156, 157, 255, 128, 145, 147, 171, 172, - 183, 159, 170, 171, 175, 176, 185, 186, - 255, 189, 128, 131, 133, 140, 143, 144, - 147, 168, 170, 176, 178, 179, 181, 185, - 188, 191, 144, 151, 128, 132, 135, 136, - 139, 141, 157, 161, 162, 163, 166, 172, - 176, 180, 128, 175, 176, 255, 134, 132, - 135, 136, 143, 144, 153, 154, 255, 128, - 174, 175, 181, 184, 255, 129, 151, 152, - 155, 158, 255, 132, 129, 143, 144, 153, - 154, 255, 128, 170, 171, 183, 157, 171, - 176, 185, 160, 168, 169, 171, 172, 173, - 174, 188, 189, 190, 161, 167, 144, 173, - 176, 180, 128, 175, 176, 182, 133, 143, - 145, 190, 191, 255, 143, 146, 147, 159, - 176, 177, 178, 128, 136, 144, 153, 157, - 158, 160, 163, 133, 134, 137, 144, 145, - 146, 147, 148, 149, 154, 155, 156, 157, - 158, 159, 168, 169, 170, 150, 153, 165, - 169, 173, 255, 131, 132, 140, 169, 174, - 255, 130, 132, 128, 182, 187, 255, 173, - 180, 182, 255, 132, 155, 159, 161, 175, - 160, 163, 184, 185, 186, 161, 162, 133, - 143, 144, 150, 151, 255, 160, 128, 129, - 132, 135, 133, 134, 129, 160, 255, 192, - 255, 176, 255, 155, 156, 157, 159, 160, - 255, 128, 140, 142, 145, 146, 148, 160, - 177, 178, 180, 128, 145, 146, 147, 160, - 172, 174, 176, 178, 179, 148, 156, 158, - 159, 160, 169, 170, 255, 139, 142, 144, - 153, 160, 255, 169, 128, 170, 176, 255, - 128, 158, 160, 171, 176, 187, 128, 150, - 151, 155, 128, 137, 144, 153, 176, 190, - 128, 132, 133, 179, 180, 255, 133, 139, - 140, 143, 144, 153, 154, 170, 180, 255, - 128, 130, 131, 160, 161, 173, 174, 175, - 176, 185, 186, 255, 166, 179, 180, 255, - 128, 163, 164, 183, 173, 144, 146, 148, - 168, 169, 177, 178, 180, 181, 182, 184, - 185, 140, 143, 168, 169, 170, 174, 191, - 255, 165, 177, 191, 129, 147, 149, 159, - 160, 175, 176, 255, 165, 170, 175, 177, - 180, 255, 191, 168, 174, 176, 255, 128, - 134, 136, 142, 144, 150, 152, 158, 160, - 191, 128, 153, 155, 255, 173, 0, 127, - 176, 255, 131, 137, 191, 145, 189, 135, - 129, 130, 132, 133, 156, 128, 133, 144, - 154, 176, 139, 159, 150, 157, 159, 164, - 167, 168, 170, 173, 143, 145, 176, 255, - 139, 255, 166, 176, 171, 179, 160, 161, - 163, 164, 165, 167, 169, 171, 173, 174, - 175, 176, 177, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, - 166, 170, 172, 178, 150, 153, 155, 163, - 165, 167, 169, 173, 153, 155, 163, 255, - 189, 132, 185, 144, 152, 161, 164, 255, - 188, 129, 131, 190, 255, 133, 134, 137, - 138, 142, 150, 152, 161, 164, 255, 131, - 134, 137, 138, 142, 144, 146, 175, 178, - 180, 182, 255, 134, 138, 142, 161, 164, - 255, 188, 129, 131, 190, 191, 128, 132, - 135, 136, 139, 141, 150, 151, 162, 163, - 130, 190, 191, 151, 128, 130, 134, 136, - 138, 141, 128, 131, 190, 255, 133, 137, - 142, 148, 151, 161, 164, 255, 128, 132, - 134, 136, 138, 141, 149, 150, 162, 163, - 129, 131, 190, 255, 133, 137, 142, 150, - 152, 161, 164, 255, 130, 131, 138, 150, - 143, 148, 152, 159, 178, 179, 177, 180, - 186, 135, 142, 177, 180, 185, 187, 188, - 136, 141, 181, 183, 185, 152, 153, 190, - 191, 177, 191, 128, 132, 134, 135, 141, - 151, 153, 188, 134, 128, 129, 130, 141, - 156, 157, 158, 159, 160, 162, 164, 168, - 169, 170, 172, 173, 174, 175, 176, 179, - 183, 171, 190, 150, 153, 158, 160, 162, - 164, 167, 173, 177, 180, 143, 130, 141, - 154, 157, 157, 159, 146, 148, 178, 180, - 146, 147, 178, 179, 180, 255, 148, 156, - 158, 255, 139, 142, 169, 160, 171, 176, - 187, 151, 155, 191, 149, 158, 160, 188, - 176, 190, 128, 132, 180, 255, 133, 170, - 180, 255, 128, 130, 161, 173, 166, 179, - 164, 183, 173, 144, 146, 148, 168, 178, - 180, 184, 185, 128, 181, 188, 191, 128, - 129, 131, 179, 181, 183, 140, 143, 170, - 174, 160, 164, 166, 175, 144, 176, 175, - 177, 191, 160, 191, 128, 130, 170, 175, - 153, 154, 153, 154, 155, 160, 162, 163, - 164, 165, 166, 167, 168, 169, 170, 171, - 175, 175, 178, 180, 189, 158, 159, 176, - 177, 130, 134, 139, 163, 167, 128, 129, - 180, 255, 133, 159, 178, 255, 166, 173, - 135, 147, 128, 131, 179, 255, 129, 164, - 166, 255, 169, 182, 131, 140, 141, 187, - 189, 176, 178, 180, 183, 184, 190, 191, - 129, 171, 175, 181, 182, 163, 170, 172, - 173, 172, 184, 187, 190, 191, 158, 128, - 143, 160, 175, 185, 187, 144, 145, 150, - 155, 157, 158, 135, 139, 141, 168, 171, - 189, 160, 182, 186, 191, 129, 131, 133, - 134, 140, 143, 184, 186, 165, 166, 128, - 129, 130, 132, 133, 134, 135, 136, 139, - 140, 141, 146, 147, 150, 151, 152, 153, - 154, 156, 128, 130, 184, 255, 135, 190, - 131, 175, 187, 188, 190, 255, 128, 130, - 167, 180, 179, 128, 130, 179, 255, 129, - 137, 141, 255, 172, 183, 159, 170, 188, - 128, 131, 190, 191, 151, 128, 132, 135, - 136, 139, 141, 162, 163, 166, 172, 176, - 180, 176, 255, 132, 255, 175, 181, 184, - 255, 129, 155, 158, 255, 129, 255, 171, - 183, 157, 171, 171, 172, 189, 190, 176, - 180, 176, 182, 145, 190, 143, 146, 178, - 157, 158, 160, 163, 133, 134, 137, 168, - 169, 170, 165, 169, 173, 255, 131, 132, - 140, 169, 174, 255, 130, 132, 128, 182, - 187, 255, 173, 180, 182, 255, 132, 155, - 159, 161, 175, 163, 144, 150, 160, 128, - 129, 132, 135, 133, 134, 129, 160, 255, - 192, 255, 180, 255, 150, 255, 133, 135, - 187, 188, 161, 169, 170, 173, 174, 175, - 177, 181, 184, 186, 170, 173, 181, 183, - 186, 0, 127, 181, 190, 176, 183, 184, - 185, 186, 191, 192, 255, 130, 131, 137, - 190, 136, 144, 145, 191, 192, 255, 135, - 179, 180, 129, 130, 132, 133, 144, 170, - 176, 178, 156, 128, 133, 144, 154, 160, - 191, 171, 176, 128, 138, 139, 159, 160, - 169, 174, 255, 148, 158, 169, 150, 164, - 167, 173, 176, 185, 189, 190, 192, 255, - 144, 143, 145, 146, 175, 176, 255, 139, - 140, 141, 255, 166, 176, 178, 255, 186, - 128, 137, 138, 170, 171, 179, 180, 181, - 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, - 154, 164, 168, 128, 149, 150, 173, 128, - 152, 153, 155, 163, 255, 189, 132, 185, - 144, 176, 152, 161, 164, 165, 166, 175, - 177, 255, 132, 169, 177, 188, 129, 131, - 141, 142, 145, 146, 179, 181, 186, 187, - 190, 255, 142, 158, 133, 134, 137, 138, - 143, 150, 152, 155, 156, 161, 164, 165, - 166, 175, 176, 177, 178, 255, 188, 129, - 131, 133, 138, 143, 144, 147, 168, 170, - 176, 178, 179, 181, 182, 184, 185, 190, - 255, 157, 131, 134, 137, 138, 142, 144, - 146, 152, 153, 158, 159, 165, 166, 175, - 178, 180, 182, 255, 189, 129, 131, 133, - 141, 143, 145, 147, 168, 170, 176, 178, - 179, 181, 185, 188, 255, 134, 138, 144, - 185, 142, 159, 160, 161, 164, 165, 166, - 175, 176, 255, 189, 129, 131, 133, 140, - 143, 144, 147, 168, 170, 176, 178, 179, - 181, 185, 188, 191, 177, 128, 132, 135, - 136, 139, 141, 150, 151, 156, 157, 159, - 161, 162, 163, 166, 175, 130, 131, 156, - 133, 138, 142, 144, 146, 149, 153, 154, - 158, 159, 163, 164, 168, 170, 174, 185, - 190, 191, 144, 151, 128, 130, 134, 136, - 138, 141, 166, 175, 189, 128, 131, 133, - 140, 142, 144, 146, 168, 170, 185, 190, - 255, 133, 137, 151, 142, 148, 152, 154, - 155, 159, 160, 161, 164, 165, 166, 175, - 176, 255, 189, 129, 131, 133, 140, 142, - 144, 146, 168, 170, 179, 181, 185, 188, - 191, 158, 128, 132, 134, 136, 138, 141, - 149, 150, 160, 161, 162, 163, 166, 175, - 177, 178, 189, 129, 131, 133, 140, 142, - 144, 146, 186, 190, 255, 133, 137, 142, - 143, 150, 152, 158, 159, 161, 164, 165, - 166, 175, 176, 185, 186, 191, 192, 255, - 189, 130, 131, 133, 150, 154, 177, 179, - 187, 138, 150, 128, 134, 143, 148, 152, - 159, 166, 175, 178, 179, 177, 180, 186, - 135, 142, 144, 153, 177, 180, 185, 187, - 188, 136, 141, 144, 153, 128, 181, 183, - 185, 152, 153, 160, 169, 190, 191, 128, - 135, 137, 172, 177, 191, 128, 132, 134, - 135, 136, 140, 141, 151, 153, 188, 134, - 128, 129, 130, 131, 137, 138, 139, 140, - 141, 142, 143, 144, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, - 165, 167, 168, 169, 170, 172, 173, 174, - 175, 176, 177, 179, 181, 182, 183, 188, - 189, 190, 191, 132, 152, 180, 184, 185, - 187, 171, 190, 128, 137, 150, 153, 158, - 160, 162, 164, 167, 173, 177, 180, 143, - 130, 141, 144, 153, 154, 157, 160, 255, - 155, 156, 157, 159, 160, 255, 128, 140, - 142, 145, 146, 148, 160, 177, 178, 180, - 128, 145, 146, 147, 160, 172, 174, 176, - 178, 179, 180, 255, 148, 156, 158, 159, - 160, 169, 170, 255, 139, 142, 144, 153, - 160, 255, 169, 128, 170, 176, 255, 128, - 158, 160, 171, 176, 187, 128, 150, 151, - 155, 191, 149, 158, 160, 188, 128, 137, - 144, 153, 176, 190, 128, 132, 133, 179, - 180, 255, 133, 139, 140, 143, 144, 153, - 154, 170, 180, 255, 128, 130, 131, 160, - 161, 173, 174, 175, 176, 185, 186, 255, - 166, 179, 180, 255, 128, 163, 164, 183, - 173, 144, 146, 148, 168, 169, 177, 178, - 180, 181, 182, 184, 185, 128, 181, 188, - 191, 128, 129, 130, 131, 132, 133, 134, - 146, 147, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 164, 167, 140, 143, 152, - 153, 170, 174, 191, 255, 165, 177, 191, - 129, 147, 149, 159, 160, 175, 176, 255, - 144, 176, 165, 170, 175, 177, 180, 255, - 191, 168, 174, 176, 255, 128, 134, 136, - 142, 144, 150, 152, 158, 160, 191, 128, - 130, 132, 133, 134, 133, 170, 175, 187, - 188, 153, 154, 128, 146, 147, 148, 152, - 153, 154, 155, 156, 158, 159, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 129, - 255, 191, 128, 174, 175, 178, 180, 189, - 128, 157, 158, 159, 160, 255, 176, 177, - 178, 255, 130, 134, 139, 163, 167, 168, - 255, 128, 129, 130, 179, 180, 255, 187, - 189, 133, 143, 144, 153, 154, 159, 178, - 183, 184, 255, 128, 137, 138, 165, 166, - 173, 176, 255, 135, 147, 148, 159, 189, - 255, 128, 131, 132, 178, 179, 255, 143, - 129, 142, 144, 153, 154, 164, 166, 175, - 176, 185, 186, 255, 128, 168, 169, 182, - 131, 128, 139, 140, 141, 144, 153, 187, - 189, 176, 178, 180, 183, 184, 190, 191, - 129, 160, 170, 171, 175, 178, 180, 181, - 182, 128, 162, 163, 170, 172, 173, 176, - 185, 172, 173, 174, 175, 180, 181, 182, - 183, 184, 185, 187, 188, 189, 190, 191, - 176, 186, 158, 190, 128, 134, 147, 151, - 157, 168, 170, 182, 184, 188, 147, 128, - 143, 160, 175, 179, 180, 191, 189, 255, - 158, 159, 160, 190, 130, 135, 138, 143, - 146, 151, 154, 156, 185, 187, 144, 145, - 146, 147, 148, 150, 155, 157, 158, 159, - 128, 129, 130, 131, 133, 135, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 148, - 149, 152, 156, 157, 160, 161, 162, 163, - 164, 166, 168, 169, 170, 171, 172, 173, - 174, 176, 177, 153, 155, 178, 179, 189, - 160, 145, 255, 139, 143, 182, 186, 187, - 255, 128, 191, 129, 131, 133, 134, 140, - 143, 144, 147, 149, 151, 153, 179, 184, - 186, 128, 135, 137, 164, 165, 166, 128, - 129, 130, 131, 132, 133, 134, 135, 136, - 138, 139, 140, 141, 146, 147, 150, 151, - 152, 153, 154, 155, 156, 162, 163, 171, - 128, 130, 131, 183, 184, 255, 135, 165, - 166, 175, 176, 190, 131, 175, 187, 188, - 190, 255, 128, 130, 131, 166, 167, 180, - 182, 191, 179, 182, 144, 178, 128, 130, - 131, 178, 179, 255, 155, 129, 132, 133, - 137, 141, 143, 144, 153, 154, 156, 157, - 255, 128, 145, 147, 171, 172, 183, 159, - 170, 171, 175, 176, 185, 186, 255, 189, - 128, 131, 133, 140, 143, 144, 147, 168, - 170, 176, 178, 179, 181, 185, 188, 191, - 144, 151, 128, 132, 135, 136, 139, 141, - 157, 161, 162, 163, 166, 172, 176, 180, - 128, 175, 176, 255, 134, 132, 135, 136, - 143, 144, 153, 154, 255, 128, 174, 175, - 181, 184, 255, 129, 151, 152, 155, 158, - 255, 132, 129, 143, 144, 153, 154, 255, - 128, 170, 171, 183, 157, 171, 176, 185, - 160, 168, 169, 171, 172, 173, 174, 188, - 189, 190, 161, 167, 144, 173, 176, 180, - 128, 175, 176, 182, 133, 143, 145, 190, - 191, 255, 143, 146, 147, 159, 176, 177, - 178, 128, 136, 144, 153, 157, 158, 160, - 163, 133, 134, 137, 144, 145, 146, 147, - 148, 149, 154, 155, 156, 157, 158, 159, - 168, 169, 170, 150, 153, 165, 169, 173, - 255, 131, 132, 140, 169, 174, 255, 130, - 132, 128, 182, 187, 255, 173, 180, 182, - 255, 132, 155, 159, 161, 175, 160, 163, - 184, 185, 186, 161, 162, 133, 143, 144, - 150, 151, 255, 160, 128, 129, 132, 135, - 133, 134, 129, 160, 255, 192, 255, 176, - 255, 173, 0, 127, 176, 255, 131, 137, - 191, 145, 189, 135, 129, 130, 132, 133, - 156, 128, 133, 144, 154, 176, 139, 159, - 150, 157, 159, 164, 167, 168, 170, 173, - 143, 145, 176, 255, 139, 255, 166, 176, - 171, 179, 160, 161, 163, 164, 165, 167, - 169, 171, 173, 174, 175, 176, 177, 179, - 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 166, 170, 172, 178, - 150, 153, 155, 163, 165, 167, 169, 173, - 153, 155, 163, 255, 189, 132, 185, 144, - 152, 161, 164, 255, 188, 129, 131, 190, - 255, 133, 134, 137, 138, 142, 150, 152, - 161, 164, 255, 131, 134, 137, 138, 142, - 144, 146, 175, 178, 180, 182, 255, 134, - 138, 142, 161, 164, 255, 188, 129, 131, - 190, 191, 128, 132, 135, 136, 139, 141, - 150, 151, 162, 163, 130, 190, 191, 151, - 128, 130, 134, 136, 138, 141, 128, 131, - 190, 255, 133, 137, 142, 148, 151, 161, - 164, 255, 128, 132, 134, 136, 138, 141, - 149, 150, 162, 163, 129, 131, 190, 255, - 133, 137, 142, 150, 152, 161, 164, 255, - 130, 131, 138, 150, 143, 148, 152, 159, - 178, 179, 177, 180, 186, 135, 142, 177, - 180, 185, 187, 188, 136, 141, 181, 183, - 185, 152, 153, 190, 191, 177, 191, 128, - 132, 134, 135, 141, 151, 153, 188, 134, - 128, 129, 130, 132, 135, 141, 156, 157, - 158, 159, 160, 162, 164, 168, 169, 170, - 172, 173, 174, 175, 176, 179, 183, 133, - 134, 171, 190, 150, 153, 158, 160, 162, - 164, 167, 173, 177, 180, 143, 130, 141, - 154, 157, 157, 159, 146, 148, 178, 180, - 146, 147, 178, 179, 180, 255, 148, 156, - 158, 255, 139, 142, 169, 160, 171, 176, - 187, 151, 155, 191, 149, 158, 160, 188, - 176, 190, 128, 132, 180, 255, 133, 170, - 180, 255, 128, 130, 161, 173, 166, 179, - 164, 183, 173, 144, 146, 148, 168, 178, - 180, 184, 185, 128, 181, 188, 191, 128, - 129, 131, 179, 181, 183, 140, 143, 170, - 174, 160, 164, 166, 175, 144, 176, 175, - 177, 191, 160, 191, 128, 130, 132, 133, - 134, 136, 137, 170, 175, 153, 154, 153, - 154, 155, 160, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 175, 176, 177, - 255, 175, 178, 180, 189, 158, 159, 176, - 177, 130, 134, 139, 163, 167, 128, 129, - 180, 255, 133, 159, 178, 255, 166, 173, - 135, 147, 160, 188, 128, 131, 179, 255, - 129, 164, 166, 255, 169, 182, 131, 140, - 141, 187, 189, 176, 178, 180, 183, 184, - 190, 191, 129, 171, 175, 181, 182, 163, - 170, 172, 173, 172, 184, 187, 190, 191, - 158, 128, 143, 160, 175, 158, 159, 160, - 190, 130, 135, 138, 143, 146, 151, 154, - 156, 185, 187, 144, 145, 150, 155, 157, - 158, 135, 139, 141, 168, 171, 189, 160, - 182, 186, 191, 129, 131, 133, 134, 140, - 143, 184, 186, 165, 166, 128, 129, 130, - 132, 133, 134, 135, 136, 139, 140, 141, - 146, 147, 150, 151, 152, 153, 154, 156, - 128, 130, 184, 255, 135, 190, 131, 175, - 187, 188, 190, 255, 128, 130, 167, 180, - 179, 128, 130, 179, 255, 129, 137, 141, - 255, 172, 183, 159, 170, 188, 128, 131, - 190, 191, 151, 128, 132, 135, 136, 139, - 141, 162, 163, 166, 172, 176, 180, 176, - 255, 132, 255, 175, 181, 184, 255, 129, - 155, 158, 255, 129, 255, 171, 183, 157, - 171, 171, 172, 189, 190, 176, 180, 176, - 182, 145, 190, 143, 146, 178, 157, 158, - 160, 163, 133, 134, 137, 168, 169, 170, - 165, 169, 173, 255, 131, 132, 140, 169, - 174, 255, 130, 132, 128, 182, 187, 255, - 173, 180, 182, 255, 132, 155, 159, 161, - 175, 163, 144, 150, 160, 128, 129, 132, - 135, 133, 134, 129, 160, 255, 192, 255, - 173, 0, 127, 176, 255, 131, 137, 191, - 145, 189, 135, 129, 130, 132, 133, 156, - 128, 133, 144, 154, 176, 139, 159, 150, - 157, 159, 164, 167, 168, 170, 173, 143, - 145, 176, 255, 139, 255, 166, 176, 171, - 179, 160, 161, 163, 164, 165, 167, 169, - 171, 173, 174, 175, 176, 177, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 166, 170, 172, 178, 150, - 153, 155, 163, 165, 167, 169, 173, 153, - 155, 163, 255, 189, 132, 185, 144, 152, - 161, 164, 255, 188, 129, 131, 190, 255, - 133, 134, 137, 138, 142, 150, 152, 161, - 164, 255, 131, 134, 137, 138, 142, 144, - 146, 175, 178, 180, 182, 255, 134, 138, - 142, 161, 164, 255, 188, 129, 131, 190, - 191, 128, 132, 135, 136, 139, 141, 150, - 151, 162, 163, 130, 190, 191, 151, 128, - 130, 134, 136, 138, 141, 128, 131, 190, - 255, 133, 137, 142, 148, 151, 161, 164, - 255, 128, 132, 134, 136, 138, 141, 149, - 150, 162, 163, 129, 131, 190, 255, 133, - 137, 142, 150, 152, 161, 164, 255, 130, - 131, 138, 150, 143, 148, 152, 159, 178, - 179, 177, 180, 186, 135, 142, 177, 180, - 185, 187, 188, 136, 141, 181, 183, 185, - 152, 153, 190, 191, 177, 191, 128, 132, - 134, 135, 141, 151, 153, 188, 134, 128, - 129, 130, 141, 156, 157, 158, 159, 160, - 162, 164, 168, 169, 170, 172, 173, 174, - 175, 176, 179, 183, 171, 190, 150, 153, - 158, 160, 162, 164, 167, 173, 177, 180, - 143, 130, 141, 154, 157, 157, 159, 146, - 148, 178, 180, 146, 147, 178, 179, 180, - 255, 148, 156, 158, 255, 139, 142, 169, - 160, 171, 176, 187, 151, 155, 191, 149, - 158, 160, 188, 176, 190, 128, 132, 180, - 255, 133, 170, 180, 255, 128, 130, 161, - 173, 166, 179, 164, 183, 173, 144, 146, - 148, 168, 178, 180, 184, 185, 128, 181, - 188, 191, 128, 129, 131, 179, 181, 183, - 140, 143, 170, 174, 191, 255, 165, 129, - 147, 149, 159, 160, 175, 176, 255, 144, - 176, 175, 177, 191, 160, 191, 128, 130, - 131, 135, 139, 140, 141, 170, 175, 177, - 181, 153, 156, 160, 255, 187, 192, 255, - 176, 191, 144, 190, 152, 255, 153, 154, - 155, 160, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 175, 175, 178, 180, - 189, 158, 159, 176, 177, 130, 134, 139, - 163, 167, 128, 129, 180, 255, 133, 159, - 178, 255, 166, 173, 135, 147, 128, 131, - 179, 255, 129, 164, 166, 255, 169, 182, - 131, 140, 141, 187, 189, 176, 178, 180, - 183, 184, 190, 191, 129, 171, 175, 181, - 182, 163, 170, 172, 173, 172, 184, 185, - 187, 188, 189, 190, 191, 158, 128, 143, - 160, 175, 179, 180, 166, 255, 160, 255, - 185, 187, 144, 145, 150, 155, 157, 158, - 135, 139, 141, 168, 171, 189, 160, 182, - 186, 191, 129, 131, 133, 134, 140, 143, - 184, 186, 165, 166, 128, 129, 130, 132, - 133, 134, 135, 136, 139, 140, 141, 146, - 147, 150, 151, 152, 153, 154, 156, 128, - 130, 184, 255, 135, 190, 131, 175, 187, - 188, 190, 255, 128, 130, 167, 180, 179, - 128, 130, 179, 255, 129, 137, 141, 255, - 172, 183, 159, 170, 188, 128, 131, 190, - 191, 151, 128, 132, 135, 136, 139, 141, - 162, 163, 166, 172, 176, 180, 176, 255, - 132, 255, 175, 181, 184, 255, 129, 155, - 158, 255, 129, 255, 171, 183, 157, 171, - 171, 172, 189, 190, 176, 180, 176, 182, - 145, 190, 143, 146, 128, 178, 128, 157, - 158, 160, 163, 133, 134, 137, 168, 169, - 170, 165, 169, 173, 255, 131, 132, 140, - 169, 174, 255, 130, 132, 128, 182, 187, - 255, 173, 180, 182, 255, 132, 155, 159, - 161, 175, 163, 144, 150, 160, 128, 129, - 132, 135, 133, 134, 129, 160, 255, 192, - 255, 129, 255, 173, 128, 255, 176, 255, - 131, 137, 191, 145, 189, 135, 129, 130, - 132, 133, 156, 128, 133, 144, 154, 176, - 139, 159, 150, 157, 159, 164, 167, 168, - 170, 173, 143, 145, 176, 255, 139, 255, - 166, 176, 171, 179, 160, 161, 163, 164, - 165, 167, 169, 171, 173, 174, 175, 176, - 177, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 166, 170, - 172, 178, 150, 153, 155, 163, 165, 167, - 169, 173, 153, 155, 163, 255, 189, 132, - 185, 144, 152, 161, 164, 255, 188, 129, - 131, 190, 255, 133, 134, 137, 138, 142, - 150, 152, 161, 164, 255, 131, 134, 137, - 138, 142, 144, 146, 175, 178, 180, 182, - 255, 134, 138, 142, 161, 164, 255, 188, - 129, 131, 190, 191, 128, 132, 135, 136, - 139, 141, 150, 151, 162, 163, 130, 190, - 191, 151, 128, 130, 134, 136, 138, 141, - 128, 131, 190, 255, 133, 137, 142, 148, - 151, 161, 164, 255, 128, 132, 134, 136, - 138, 141, 149, 150, 162, 163, 129, 131, - 190, 255, 133, 137, 142, 150, 152, 161, - 164, 255, 130, 131, 138, 150, 143, 148, - 152, 159, 178, 179, 177, 180, 186, 135, - 142, 177, 180, 185, 187, 188, 136, 141, - 181, 183, 185, 152, 153, 190, 191, 177, - 191, 128, 132, 134, 135, 141, 151, 153, - 188, 134, 128, 129, 130, 141, 156, 157, - 158, 159, 160, 162, 164, 168, 169, 170, - 172, 173, 174, 175, 176, 179, 183, 171, - 190, 150, 153, 158, 160, 162, 164, 167, - 173, 177, 180, 143, 130, 141, 154, 157, - 157, 159, 146, 148, 178, 180, 146, 147, - 178, 179, 180, 255, 148, 156, 158, 255, - 139, 142, 169, 160, 171, 176, 187, 151, - 155, 191, 149, 158, 160, 188, 176, 190, - 128, 132, 180, 255, 133, 170, 180, 255, - 128, 130, 161, 173, 166, 179, 164, 183, - 173, 144, 146, 148, 168, 178, 180, 184, - 185, 128, 181, 188, 191, 128, 129, 131, - 179, 181, 183, 140, 143, 170, 174, 160, - 164, 166, 175, 144, 176, 175, 177, 191, - 160, 191, 128, 130, 170, 175, 153, 154, - 153, 154, 155, 160, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 175, 175, - 178, 180, 189, 158, 159, 176, 177, 130, - 134, 139, 163, 167, 128, 129, 180, 255, - 133, 159, 178, 255, 166, 173, 135, 147, - 128, 131, 179, 255, 129, 164, 166, 255, - 169, 182, 131, 140, 141, 187, 189, 176, - 178, 180, 183, 184, 190, 191, 129, 171, - 175, 181, 182, 163, 170, 172, 173, 172, - 184, 187, 190, 191, 158, 128, 143, 160, - 175, 185, 187, 144, 145, 150, 155, 157, - 158, 135, 139, 141, 168, 171, 189, 160, - 182, 186, 191, 129, 131, 133, 134, 140, - 143, 184, 186, 165, 166, 128, 129, 130, - 132, 133, 134, 135, 136, 139, 140, 141, - 146, 147, 150, 151, 152, 153, 154, 156, - 128, 130, 184, 255, 135, 190, 131, 175, - 187, 188, 190, 255, 128, 130, 167, 180, - 179, 128, 130, 179, 255, 129, 137, 141, - 255, 172, 183, 159, 170, 188, 128, 131, - 190, 191, 151, 128, 132, 135, 136, 139, - 141, 162, 163, 166, 172, 176, 180, 176, - 255, 132, 255, 175, 181, 184, 255, 129, - 155, 158, 255, 129, 255, 171, 183, 157, - 171, 171, 172, 189, 190, 176, 180, 176, - 182, 145, 190, 143, 146, 178, 157, 158, - 160, 163, 133, 134, 137, 168, 169, 170, - 165, 169, 173, 255, 131, 132, 140, 169, - 174, 255, 130, 132, 128, 182, 187, 255, - 173, 180, 182, 255, 132, 155, 159, 161, - 175, 163, 144, 150, 160, 128, 129, 132, - 135, 133, 134, 129, 160, 255, 192, 255, - 151, 152, 153, 154, 155, 156, 160, 255, - 173, 173, 128, 255, 176, 255, 131, 137, - 191, 145, 189, 135, 129, 130, 132, 133, - 156, 128, 133, 144, 154, 176, 139, 159, - 150, 157, 159, 164, 167, 168, 170, 173, - 143, 145, 176, 255, 139, 255, 166, 176, - 171, 179, 160, 161, 163, 164, 165, 167, - 169, 171, 173, 174, 175, 176, 177, 179, - 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 166, 170, 172, 178, - 150, 153, 155, 163, 165, 167, 169, 173, - 153, 155, 163, 255, 189, 132, 185, 144, - 152, 161, 164, 255, 188, 129, 131, 190, - 255, 133, 134, 137, 138, 142, 150, 152, - 161, 164, 255, 131, 134, 137, 138, 142, - 144, 146, 175, 178, 180, 182, 255, 134, - 138, 142, 161, 164, 255, 188, 129, 131, - 190, 191, 128, 132, 135, 136, 139, 141, - 150, 151, 162, 163, 130, 190, 191, 151, - 128, 130, 134, 136, 138, 141, 128, 131, - 190, 255, 133, 137, 142, 148, 151, 161, - 164, 255, 128, 132, 134, 136, 138, 141, - 149, 150, 162, 163, 129, 131, 190, 255, - 133, 137, 142, 150, 152, 161, 164, 255, - 130, 131, 138, 150, 143, 148, 152, 159, - 178, 179, 177, 180, 186, 135, 142, 177, - 180, 185, 187, 188, 136, 141, 181, 183, - 185, 152, 153, 190, 191, 177, 191, 128, - 132, 134, 135, 141, 151, 153, 188, 134, - 128, 129, 130, 141, 156, 157, 158, 159, - 160, 162, 164, 168, 169, 170, 172, 173, - 174, 175, 176, 179, 183, 171, 190, 150, - 153, 158, 160, 162, 164, 167, 173, 177, - 180, 143, 130, 141, 154, 157, 157, 159, - 146, 148, 178, 180, 146, 147, 178, 179, - 180, 255, 148, 156, 158, 255, 139, 142, - 169, 160, 171, 176, 187, 151, 155, 191, - 149, 158, 160, 188, 176, 190, 128, 132, - 180, 255, 133, 170, 180, 255, 128, 130, - 161, 173, 166, 179, 164, 183, 173, 144, - 146, 148, 168, 178, 180, 184, 185, 128, - 181, 188, 191, 128, 129, 131, 179, 181, - 183, 140, 143, 170, 174, 160, 164, 166, - 175, 144, 176, 175, 177, 191, 160, 191, - 128, 130, 170, 175, 153, 154, 153, 154, - 155, 160, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 175, 175, 178, 180, - 189, 158, 159, 176, 177, 130, 134, 139, - 163, 167, 128, 129, 180, 255, 133, 159, - 178, 255, 166, 173, 135, 147, 128, 131, - 179, 255, 129, 164, 166, 255, 169, 182, - 131, 140, 141, 187, 189, 176, 178, 180, - 183, 184, 190, 191, 129, 171, 175, 181, - 182, 163, 170, 172, 173, 172, 184, 187, - 190, 191, 158, 128, 143, 160, 175, 185, - 187, 144, 145, 150, 155, 157, 158, 135, - 139, 141, 168, 171, 189, 160, 182, 186, - 191, 129, 131, 133, 134, 140, 143, 184, - 186, 165, 166, 128, 129, 130, 132, 133, - 134, 135, 136, 139, 140, 141, 146, 147, - 150, 151, 152, 153, 154, 156, 128, 130, - 184, 255, 135, 190, 131, 175, 187, 188, - 190, 255, 128, 130, 167, 180, 179, 128, - 130, 179, 255, 129, 137, 141, 255, 172, - 183, 159, 170, 188, 128, 131, 190, 191, - 151, 128, 132, 135, 136, 139, 141, 162, - 163, 166, 172, 176, 180, 176, 255, 132, - 255, 175, 181, 184, 255, 129, 155, 158, - 255, 129, 255, 171, 183, 157, 171, 171, - 172, 189, 190, 176, 180, 176, 182, 145, - 190, 143, 146, 178, 157, 158, 160, 163, - 133, 134, 137, 168, 169, 170, 165, 169, - 173, 255, 131, 132, 140, 169, 174, 255, - 130, 132, 128, 182, 187, 255, 173, 180, - 182, 255, 132, 155, 159, 161, 175, 163, - 144, 150, 160, 128, 129, 132, 135, 133, - 134, 129, 160, 255, 192, 255, 128, 255, - 176, 255, 131, 137, 191, 145, 189, 135, - 129, 130, 132, 133, 156, 128, 133, 144, - 154, 176, 139, 159, 150, 157, 159, 164, - 167, 168, 170, 173, 143, 145, 176, 255, - 139, 255, 166, 176, 171, 179, 160, 161, - 163, 164, 165, 167, 169, 171, 173, 174, - 175, 176, 177, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, - 166, 170, 172, 178, 128, 129, 130, 141, - 156, 157, 158, 159, 160, 162, 164, 168, - 169, 170, 172, 173, 174, 175, 176, 179, - 183, 128, 129, 131, 179, 181, 183, 128, - 130, 153, 154, 155, 160, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 175, - 172, 184, 187, 190, 191, 144, 145, 150, - 155, 157, 158, 160, 182, 255, 191, 128, - 174, 175, 178, 180, 189, 128, 157, 158, - 159, 160, 255, 176, 177, 178, 255, 130, - 134, 139, 163, 167, 168, 255, 128, 129, - 130, 179, 180, 255, 187, 189, 133, 143, - 144, 153, 154, 159, 178, 183, 184, 255, - 128, 137, 138, 165, 166, 173, 176, 255, - 135, 147, 148, 159, 160, 188, 189, 255, - 128, 131, 132, 178, 179, 255, 143, 129, - 142, 144, 153, 154, 164, 166, 175, 176, - 185, 186, 255, 128, 168, 169, 182, 131, - 128, 139, 140, 141, 144, 153, 187, 189, - 129, 160, 170, 171, 175, 178, 180, 181, - 182, 128, 162, 163, 170, 172, 173, 176, - 185, 173, 170, 173, 181, 183, 186, 128, - 255, 181, 190, 176, 183, 184, 185, 186, - 191, 192, 255, 130, 131, 137, 190, 136, - 144, 145, 191, 192, 255, 135, 179, 180, - 129, 130, 132, 133, 144, 170, 176, 178, - 156, 128, 133, 144, 154, 160, 191, 171, - 176, 128, 138, 139, 159, 160, 169, 174, - 255, 148, 158, 169, 150, 164, 167, 173, - 176, 185, 189, 190, 192, 255, 144, 143, - 145, 146, 175, 176, 255, 139, 140, 141, - 255, 166, 176, 178, 255, 186, 128, 137, - 138, 170, 171, 179, 180, 181, 160, 161, - 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 154, 164, - 168, 128, 149, 150, 173, 128, 152, 153, - 155, 163, 255, 189, 132, 185, 144, 176, - 152, 161, 164, 165, 166, 175, 177, 255, - 132, 169, 177, 188, 129, 131, 141, 142, - 145, 146, 179, 181, 186, 187, 190, 255, - 142, 158, 133, 134, 137, 138, 143, 150, - 152, 155, 156, 161, 164, 165, 166, 175, - 176, 177, 178, 255, 188, 129, 131, 133, - 138, 143, 144, 147, 168, 170, 176, 178, - 179, 181, 182, 184, 185, 190, 255, 157, - 131, 134, 137, 138, 142, 144, 146, 152, - 153, 158, 159, 165, 166, 175, 178, 180, - 182, 255, 189, 129, 131, 133, 141, 143, - 145, 147, 168, 170, 176, 178, 179, 181, - 185, 188, 255, 134, 138, 144, 185, 142, - 159, 160, 161, 164, 165, 166, 175, 176, - 255, 189, 129, 131, 133, 140, 143, 144, - 147, 168, 170, 176, 178, 179, 181, 185, - 188, 191, 177, 128, 132, 135, 136, 139, - 141, 150, 151, 156, 157, 159, 161, 162, - 163, 166, 175, 130, 131, 156, 133, 138, - 142, 144, 146, 149, 153, 154, 158, 159, - 163, 164, 168, 170, 174, 185, 190, 191, - 144, 151, 128, 130, 134, 136, 138, 141, - 166, 175, 189, 128, 131, 133, 140, 142, - 144, 146, 168, 170, 185, 190, 255, 133, - 137, 151, 142, 148, 152, 154, 155, 159, - 160, 161, 164, 165, 166, 175, 176, 255, - 189, 129, 131, 133, 140, 142, 144, 146, - 168, 170, 179, 181, 185, 188, 191, 158, - 128, 132, 134, 136, 138, 141, 149, 150, - 160, 161, 162, 163, 166, 175, 177, 178, - 189, 129, 131, 133, 140, 142, 144, 146, - 186, 190, 255, 133, 137, 142, 143, 150, - 152, 158, 159, 161, 164, 165, 166, 175, - 176, 185, 186, 191, 192, 255, 189, 130, - 131, 133, 150, 154, 177, 179, 187, 138, - 150, 128, 134, 143, 148, 152, 159, 166, - 175, 178, 179, 177, 180, 186, 135, 142, - 144, 153, 177, 180, 185, 187, 188, 136, - 141, 144, 153, 128, 181, 183, 185, 152, - 153, 160, 169, 190, 191, 128, 135, 137, - 172, 177, 191, 128, 132, 134, 135, 136, - 140, 141, 151, 153, 188, 134, 128, 129, - 130, 131, 132, 135, 137, 138, 139, 140, - 141, 142, 143, 144, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, 164, - 165, 167, 168, 169, 170, 172, 173, 174, - 175, 176, 177, 179, 181, 182, 183, 188, - 189, 190, 191, 133, 134, 136, 152, 180, - 184, 185, 187, 171, 190, 128, 137, 150, - 153, 158, 160, 162, 164, 167, 173, 177, - 180, 143, 130, 141, 144, 153, 154, 157, - 160, 255, 155, 156, 157, 159, 160, 255, - 128, 140, 142, 145, 146, 148, 160, 177, - 178, 180, 128, 145, 146, 147, 160, 172, - 174, 176, 178, 179, 180, 255, 148, 156, - 158, 159, 160, 169, 170, 255, 139, 142, - 144, 153, 160, 255, 169, 128, 170, 176, - 255, 128, 158, 160, 171, 176, 187, 128, - 150, 151, 155, 191, 149, 158, 160, 188, - 128, 137, 144, 153, 176, 190, 128, 132, - 133, 179, 180, 255, 133, 139, 140, 143, - 144, 153, 154, 170, 180, 255, 128, 130, - 131, 160, 161, 173, 174, 175, 176, 185, - 186, 255, 166, 179, 180, 255, 128, 163, - 164, 183, 173, 144, 146, 148, 168, 169, - 177, 178, 180, 181, 182, 184, 185, 128, - 181, 188, 191, 128, 129, 130, 131, 132, - 133, 134, 146, 147, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 164, 167, 140, - 143, 152, 153, 170, 174, 191, 255, 165, - 177, 191, 129, 147, 149, 159, 160, 175, - 176, 255, 144, 176, 165, 170, 175, 177, - 180, 255, 191, 168, 174, 176, 255, 128, - 134, 136, 142, 144, 150, 152, 158, 160, - 191, 128, 130, 132, 133, 134, 136, 137, - 133, 170, 175, 187, 188, 153, 154, 128, - 146, 147, 148, 152, 153, 154, 155, 156, - 158, 159, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, - 174, 175, 176, 129, 157, 177, 255, 191, - 128, 174, 175, 178, 180, 189, 128, 157, - 158, 159, 160, 255, 176, 177, 178, 255, - 130, 134, 139, 163, 167, 168, 255, 128, - 129, 130, 179, 180, 255, 187, 189, 133, - 143, 144, 153, 154, 159, 178, 183, 184, - 255, 128, 137, 138, 165, 166, 173, 176, - 255, 135, 147, 148, 159, 160, 188, 189, - 255, 128, 131, 132, 178, 179, 255, 143, - 129, 142, 144, 153, 154, 164, 166, 175, - 176, 185, 186, 255, 128, 168, 169, 182, - 131, 128, 139, 140, 141, 144, 153, 187, - 189, 176, 178, 180, 183, 184, 190, 191, - 129, 160, 170, 171, 175, 178, 180, 181, - 182, 128, 162, 163, 170, 172, 173, 176, - 185, 172, 173, 174, 175, 180, 181, 182, - 183, 184, 185, 187, 188, 189, 190, 191, - 176, 186, 158, 190, 128, 134, 147, 151, - 157, 168, 170, 182, 184, 188, 147, 128, - 143, 160, 175, 179, 180, 191, 189, 255, - 158, 159, 160, 190, 130, 135, 138, 143, - 146, 151, 154, 156, 185, 187, 144, 145, - 146, 147, 148, 150, 155, 157, 158, 159, - 128, 129, 130, 131, 133, 135, 138, 139, - 140, 141, 142, 143, 144, 145, 146, 148, - 149, 152, 156, 157, 160, 161, 162, 163, - 164, 166, 168, 169, 170, 171, 172, 173, - 174, 176, 177, 153, 155, 178, 179, 189, - 160, 145, 255, 139, 143, 182, 186, 187, - 255, 128, 191, 129, 131, 133, 134, 140, - 143, 144, 147, 149, 151, 153, 179, 184, - 186, 128, 135, 137, 164, 165, 166, 128, - 129, 130, 131, 132, 133, 134, 135, 136, - 138, 139, 140, 141, 146, 147, 150, 151, - 152, 153, 154, 155, 156, 162, 163, 171, - 128, 130, 131, 183, 184, 255, 135, 165, - 166, 175, 176, 190, 131, 175, 187, 188, - 190, 255, 128, 130, 131, 166, 167, 180, - 182, 191, 179, 182, 144, 178, 128, 130, - 131, 178, 179, 255, 155, 129, 132, 133, - 137, 141, 143, 144, 153, 154, 156, 157, - 255, 128, 145, 147, 171, 172, 183, 159, - 170, 171, 175, 176, 185, 186, 255, 189, - 128, 131, 133, 140, 143, 144, 147, 168, - 170, 176, 178, 179, 181, 185, 188, 191, - 144, 151, 128, 132, 135, 136, 139, 141, - 157, 161, 162, 163, 166, 172, 176, 180, - 128, 175, 176, 255, 134, 132, 135, 136, - 143, 144, 153, 154, 255, 128, 174, 175, - 181, 184, 255, 129, 151, 152, 155, 158, - 255, 132, 129, 143, 144, 153, 154, 255, - 128, 170, 171, 183, 157, 171, 176, 185, - 160, 168, 169, 171, 172, 173, 174, 188, - 189, 190, 161, 167, 144, 173, 176, 180, - 128, 175, 176, 182, 133, 143, 145, 190, - 191, 255, 143, 146, 147, 159, 176, 177, - 178, 128, 136, 144, 153, 157, 158, 160, - 163, 133, 134, 137, 144, 145, 146, 147, - 148, 149, 154, 155, 156, 157, 158, 159, - 168, 169, 170, 150, 153, 165, 169, 173, - 255, 131, 132, 140, 169, 174, 255, 130, - 132, 128, 182, 187, 255, 173, 180, 182, - 255, 132, 155, 159, 161, 175, 160, 163, - 184, 185, 186, 161, 162, 133, 143, 144, - 150, 151, 255, 160, 128, 129, 132, 135, - 133, 134, 129, 160, 255, 192, 255, 176, - 255, 128, 255, 176, 255, 131, 137, 191, - 145, 189, 135, 129, 130, 132, 133, 156, - 128, 133, 144, 154, 176, 139, 159, 150, - 157, 159, 164, 167, 168, 170, 173, 143, - 145, 176, 255, 139, 255, 166, 176, 171, - 179, 160, 161, 163, 164, 165, 167, 169, - 171, 173, 174, 175, 176, 177, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 166, 170, 172, 178, 128, - 129, 130, 141, 156, 157, 158, 159, 160, - 162, 164, 168, 169, 170, 172, 173, 174, - 175, 176, 179, 183, 128, 129, 131, 179, - 181, 183, 128, 130, 153, 154, 155, 160, - 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 175, 172, 184, 187, 190, 191, - 144, 145, 150, 155, 157, 158, 160, 174, - 175, 154, 255, 158, 190, 128, 134, 147, - 151, 157, 168, 170, 182, 184, 188, 128, - 143, 160, 175, 179, 180, 191, 189, 255, - 129, 154, 166, 255, 158, 159, 160, 190, - 191, 255, 130, 135, 138, 143, 146, 151, - 154, 156, 185, 187, 128, 129, 130, 131, - 133, 135, 138, 139, 140, 141, 142, 143, - 144, 145, 146, 148, 149, 152, 156, 157, - 160, 161, 162, 163, 164, 166, 168, 169, - 170, 171, 172, 173, 174, 176, 177, 153, - 155, 178, 179, 160, 145, 255, 139, 143, - 182, 186, 187, 255, 128, 191, 129, 131, - 133, 134, 140, 143, 144, 147, 149, 151, - 153, 179, 184, 186, 128, 135, 137, 164, - 165, 166, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 138, 139, 140, 141, 146, - 147, 150, 151, 152, 153, 154, 155, 156, - 162, 163, 171, 128, 130, 131, 183, 184, - 255, 135, 165, 166, 175, 176, 190, 131, - 175, 187, 188, 190, 255, 128, 130, 131, - 166, 167, 180, 182, 191, 179, 182, 144, - 178, 128, 130, 131, 178, 179, 255, 155, - 129, 132, 133, 137, 141, 143, 144, 153, - 154, 156, 157, 255, 128, 145, 147, 171, - 172, 183, 159, 170, 171, 175, 176, 185, - 186, 255, 189, 128, 131, 133, 140, 143, - 144, 147, 168, 170, 176, 178, 179, 181, - 185, 188, 191, 144, 151, 128, 132, 135, - 136, 139, 141, 157, 161, 162, 163, 166, - 172, 176, 180, 128, 175, 176, 255, 134, - 132, 135, 136, 143, 144, 153, 154, 255, - 128, 174, 175, 181, 184, 255, 129, 151, - 152, 155, 158, 255, 132, 129, 143, 144, - 153, 154, 255, 128, 170, 171, 183, 157, - 171, 176, 185, 160, 168, 169, 171, 172, - 173, 174, 188, 189, 190, 161, 167, 144, - 173, 176, 180, 128, 175, 176, 182, 133, - 143, 145, 190, 191, 255, 143, 146, 147, - 159, 128, 176, 177, 178, 128, 129, 128, - 136, 144, 153, 157, 158, 160, 163, 133, - 134, 137, 144, 145, 146, 147, 148, 149, - 154, 155, 156, 157, 158, 159, 168, 169, - 170, 150, 153, 160, 163, 184, 185, 186, - 161, 162, 133, 143, 144, 150, 151, 255, - 132, 133, 134, 135, 136, 166, 191, 173, - 0, 127, 176, 255, 131, 137, 191, 145, - 189, 135, 129, 130, 132, 133, 156, 128, - 133, 144, 154, 176, 139, 159, 150, 157, - 159, 164, 167, 168, 170, 173, 143, 145, - 176, 255, 139, 255, 166, 176, 171, 179, - 160, 161, 163, 164, 165, 167, 169, 171, - 173, 174, 175, 176, 177, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 166, 170, 172, 178, 150, 153, - 155, 163, 165, 167, 169, 173, 153, 155, - 163, 255, 189, 132, 185, 144, 152, 161, - 164, 255, 188, 129, 131, 190, 255, 133, - 134, 137, 138, 142, 150, 152, 161, 164, - 255, 131, 134, 137, 138, 142, 144, 146, - 175, 178, 180, 182, 255, 134, 138, 142, - 161, 164, 255, 188, 129, 131, 190, 191, - 128, 132, 135, 136, 139, 141, 150, 151, - 162, 163, 130, 190, 191, 151, 128, 130, - 134, 136, 138, 141, 128, 131, 190, 255, - 133, 137, 142, 148, 151, 161, 164, 255, - 128, 132, 134, 136, 138, 141, 149, 150, - 162, 163, 129, 131, 190, 255, 133, 137, - 142, 150, 152, 161, 164, 255, 130, 131, - 138, 150, 143, 148, 152, 159, 178, 179, - 177, 180, 186, 135, 142, 177, 180, 185, - 187, 188, 136, 141, 181, 183, 185, 152, - 153, 190, 191, 177, 191, 128, 132, 134, - 135, 141, 151, 153, 188, 134, 128, 129, - 130, 141, 156, 157, 158, 159, 160, 162, - 164, 168, 169, 170, 172, 173, 174, 175, - 176, 179, 183, 171, 190, 150, 153, 158, - 160, 162, 164, 167, 173, 177, 180, 143, - 130, 141, 154, 157, 157, 159, 146, 148, - 178, 180, 146, 147, 178, 179, 180, 255, - 148, 156, 158, 255, 139, 142, 169, 160, - 171, 176, 187, 151, 155, 191, 149, 158, - 160, 188, 176, 190, 128, 132, 180, 255, - 133, 170, 180, 255, 128, 130, 161, 173, - 166, 179, 164, 183, 173, 144, 146, 148, - 168, 178, 180, 184, 185, 128, 181, 188, - 191, 128, 129, 131, 179, 181, 183, 140, - 143, 170, 174, 160, 164, 166, 175, 144, - 176, 175, 177, 191, 160, 191, 128, 130, - 170, 175, 153, 154, 153, 154, 155, 160, - 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 175, 175, 178, 180, 189, 158, - 159, 176, 177, 130, 134, 139, 163, 167, - 128, 129, 180, 255, 133, 159, 178, 255, - 166, 173, 135, 147, 128, 131, 179, 255, - 129, 164, 166, 255, 169, 182, 131, 140, - 141, 187, 189, 176, 178, 180, 183, 184, - 190, 191, 129, 171, 175, 181, 182, 163, - 170, 172, 173, 172, 184, 187, 190, 191, - 158, 128, 143, 160, 175, 185, 187, 144, - 145, 150, 155, 157, 158, 159, 135, 139, - 141, 168, 171, 189, 160, 182, 186, 191, - 129, 131, 133, 134, 140, 143, 184, 186, - 165, 166, 128, 129, 130, 132, 133, 134, - 135, 136, 139, 140, 141, 146, 147, 150, - 151, 152, 153, 154, 156, 128, 130, 184, - 255, 135, 190, 131, 175, 187, 188, 190, - 255, 128, 130, 167, 180, 179, 128, 130, - 179, 255, 129, 137, 141, 255, 172, 183, - 159, 170, 188, 128, 131, 190, 191, 151, - 128, 132, 135, 136, 139, 141, 162, 163, - 166, 172, 176, 180, 176, 255, 132, 255, - 175, 181, 184, 255, 129, 155, 158, 255, - 129, 255, 171, 183, 157, 171, 171, 172, - 189, 190, 176, 180, 176, 182, 145, 190, - 143, 146, 178, 157, 158, 160, 163, 133, - 134, 137, 168, 169, 170, 165, 169, 173, - 255, 131, 132, 140, 169, 174, 255, 130, - 132, 128, 182, 187, 255, 173, 180, 182, - 255, 132, 155, 159, 161, 175, 163, 144, - 150, 135, 160, 128, 129, 132, 135, 133, - 134, 129, 160, 255, 192, 255, 128, 128, - 129, 255, 155, 156, 151, 255, 156, 157, - 160, 181, 255, 158, 159, 186, 187, 255, - 162, 255, 160, 168, 161, 167, 158, 255, - 10, 13, 95, 194, 195, 198, 199, 203, - 204, 205, 206, 207, 210, 212, 213, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 233, 234, 237, - 239, 240, 243, 11, 12, 48, 57, 65, - 90, 97, 122, 196, 218, 229, 232, 235, - 236, 194, 204, 205, 210, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 239, 240, 243, 10, 39, - 44, 46, 59, 95, 194, 195, 198, 199, - 203, 204, 205, 206, 207, 210, 212, 213, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 237, 239, - 240, 243, 48, 57, 65, 90, 97, 122, - 196, 218, 235, 236, 39, 44, 46, 59, - 95, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 196, 218, 235, - 236, 39, 46, 58, 95, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 196, 218, 235, 236, 39, 44, 46, - 59, 95, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 196, 218, - 235, 236, 95, 194, 195, 198, 199, 203, - 204, 205, 206, 207, 210, 212, 213, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 237, 239, 240, - 243, 48, 57, 65, 90, 97, 122, 196, - 218, 235, 236, 34, 39, 46, 58, 95, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 196, 218, 235, 236, - 95, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 196, 218, 235, - 236, 95, 194, 204, 205, 210, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 239, 240, 243, 95, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 196, 218, 235, 236, - 39, 46, 58, 95, 194, 195, 198, 199, - 203, 204, 205, 206, 207, 210, 212, 213, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 237, 239, - 240, 243, 48, 57, 65, 90, 97, 122, - 196, 218, 235, 236, 95, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 196, 218, 235, 236, 95, 194, 195, - 198, 199, 203, 204, 205, 206, 207, 210, - 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 237, 239, 240, 243, 48, 57, 65, 90, - 97, 122, 196, 218, 235, 236, 133, 170, - 173, 181, 186, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 194, 204, 205, 210, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 239, 240, 243, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 128, 150, 152, 182, 184, 255, - 39, 46, 58, 95, 173, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 196, 218, 235, 236, 39, 46, 58, - 95, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 0, - 47, 48, 57, 59, 64, 65, 90, 91, - 96, 97, 122, 123, 127, 196, 218, 235, - 236, 170, 173, 181, 183, 186, 194, 204, - 205, 210, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 239, 240, 243, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 39, 46, 58, 95, 194, 195, 198, 199, - 203, 204, 205, 206, 207, 210, 212, 213, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 237, 239, - 240, 243, 48, 57, 65, 90, 97, 122, - 176, 193, 196, 218, 228, 233, 235, 236, - 238, 255, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 65, 90, 97, 122, 196, 218, 235, 236, - 39, 44, 46, 59, 95, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 196, 218, 235, 236, 95, 194, 195, - 198, 199, 203, 204, 205, 206, 207, 210, - 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 237, 239, 240, 243, 48, 57, 65, 90, - 97, 122, 196, 218, 235, 236, 39, 46, - 58, 95, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 131, 137, - 196, 218, 235, 236, 39, 46, 58, 95, - 191, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 145, 189, 196, - 218, 235, 236, 39, 46, 58, 95, 135, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 129, 130, 132, 133, - 196, 218, 235, 236, 39, 46, 58, 95, - 156, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 128, 133, 144, - 154, 196, 218, 235, 236, 39, 46, 58, - 95, 176, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 139, 159, - 196, 218, 235, 236, 39, 46, 58, 95, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 150, 157, 159, 164, - 167, 168, 170, 173, 196, 218, 235, 236, - 39, 46, 58, 95, 143, 145, 194, 195, - 198, 199, 203, 204, 205, 206, 207, 210, - 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 237, 239, 240, 243, 48, 57, 65, 90, - 97, 122, 176, 193, 196, 218, 228, 233, - 235, 236, 238, 255, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 192, 255, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 128, 255, 39, 46, 58, 95, 194, 195, - 198, 199, 203, 204, 205, 206, 207, 210, - 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 237, 239, 240, 243, 0, 47, 48, 57, - 59, 64, 65, 90, 91, 96, 97, 122, - 123, 138, 196, 218, 235, 236, 39, 46, - 58, 95, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 166, 176, - 196, 218, 235, 236, 39, 46, 58, 95, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 171, 179, 196, 218, - 235, 236, 39, 46, 58, 95, 160, 161, - 163, 164, 165, 167, 169, 171, 173, 174, - 175, 176, 177, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 166, 170, 172, 178, - 196, 218, 235, 236, 39, 46, 58, 95, - 128, 129, 130, 141, 156, 157, 158, 159, - 160, 162, 164, 168, 169, 170, 172, 173, - 174, 175, 176, 179, 183, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 196, 218, 235, 236, 39, 46, 58, - 95, 128, 129, 131, 179, 181, 183, 194, - 195, 198, 199, 203, 204, 205, 206, 207, - 210, 212, 213, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 237, 239, 240, 243, 48, 57, 65, - 90, 97, 122, 196, 218, 235, 236, 39, - 46, 58, 95, 128, 130, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 196, 218, 235, 236, 39, 46, 58, - 95, 153, 154, 155, 160, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 175, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 196, 218, 235, 236, - 39, 46, 58, 95, 172, 184, 187, 190, - 191, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 196, 218, 235, - 236, 39, 46, 58, 95, 144, 145, 150, - 155, 157, 158, 194, 195, 198, 199, 203, - 204, 205, 206, 207, 210, 212, 213, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 237, 239, 240, - 243, 48, 57, 65, 90, 97, 122, 196, - 218, 235, 236, 39, 46, 58, 95, 160, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 196, 218, 235, 236, - 151, 173, 194, 204, 205, 210, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 239, 240, 243, 130, - 133, 146, 159, 165, 171, 175, 255, 181, - 190, 194, 204, 205, 210, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 239, 240, 243, 184, 185, - 192, 255, 135, 140, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 134, 138, 142, 161, 163, 255, 182, - 194, 204, 205, 210, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 239, 240, 243, 130, 194, 204, - 205, 210, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 239, 240, 243, 176, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 194, 204, 205, 210, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 239, 240, 243, 151, 152, - 154, 160, 190, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 136, 144, 192, 255, 135, 179, 180, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 129, 130, 132, 133, - 144, 170, 176, 178, 156, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 128, 133, 144, 154, 160, 191, - 171, 194, 204, 205, 210, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 239, 240, 243, 128, 159, - 160, 169, 174, 255, 148, 158, 169, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 176, 185, 189, 190, - 192, 255, 194, 204, 205, 210, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 239, 240, 243, 143, - 255, 194, 204, 205, 210, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 239, 240, 243, 139, 140, - 194, 204, 205, 210, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 239, 240, 243, 178, 255, 186, - 194, 204, 205, 210, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 239, 240, 243, 128, 137, 138, - 181, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, - 191, 194, 204, 205, 210, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 239, 240, 243, 128, 129, - 130, 131, 137, 138, 139, 140, 141, 142, - 143, 144, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 167, - 168, 169, 170, 172, 173, 174, 175, 176, - 177, 179, 181, 182, 183, 188, 189, 190, - 191, 194, 204, 205, 210, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 239, 240, 243, 132, 152, - 180, 184, 185, 187, 128, 129, 130, 131, - 132, 133, 134, 146, 147, 176, 177, 178, - 179, 180, 181, 182, 183, 184, 194, 204, - 205, 210, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 239, 240, 243, 128, 130, 132, 133, 134, - 194, 204, 205, 210, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 239, 240, 243, 128, 146, 147, - 148, 152, 153, 154, 155, 156, 158, 159, - 160, 161, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, - 176, 194, 204, 205, 210, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 239, 240, 243, 129, 255, - 39, 46, 58, 95, 194, 195, 198, 199, - 203, 204, 205, 206, 207, 210, 212, 213, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 237, 239, - 240, 243, 48, 57, 65, 90, 97, 122, - 150, 153, 155, 163, 165, 167, 169, 173, - 196, 218, 235, 236, 39, 46, 58, 95, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 153, 155, 196, 218, - 235, 236, 39, 46, 58, 95, 194, 195, - 198, 199, 203, 204, 205, 206, 207, 210, - 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 237, 239, 240, 243, 48, 57, 65, 90, - 97, 122, 163, 193, 196, 218, 228, 233, - 235, 236, 238, 255, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 39, 46, 58, 95, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 171, 190, 196, 218, 235, 236, 39, - 46, 58, 95, 194, 195, 198, 199, 203, - 204, 205, 206, 207, 210, 212, 213, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 237, 239, 240, - 243, 48, 57, 65, 90, 97, 122, 150, - 153, 158, 160, 162, 164, 167, 173, 177, - 180, 196, 218, 235, 236, 39, 46, 58, - 95, 143, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 130, 141, - 154, 157, 196, 218, 235, 236, 39, 46, - 58, 95, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 157, 159, - 196, 218, 235, 236, 39, 46, 58, 95, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 146, 148, 178, 180, - 196, 218, 235, 236, 39, 46, 58, 95, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 146, 147, 178, 179, - 196, 218, 235, 236, 39, 46, 58, 95, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 180, 193, 196, 218, - 228, 233, 235, 236, 238, 255, 158, 159, - 194, 204, 205, 210, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 239, 240, 243, 160, 255, 172, - 173, 174, 175, 180, 181, 182, 183, 184, - 185, 187, 188, 189, 190, 191, 194, 204, - 205, 210, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 239, 240, 243, 176, 186, 144, 145, 146, - 147, 148, 150, 155, 157, 158, 159, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 160, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 39, 46, 58, 95, 194, 195, - 198, 199, 203, 204, 205, 206, 207, 210, - 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 237, 239, 240, 243, 48, 57, 65, 90, - 97, 122, 148, 156, 158, 193, 196, 218, - 228, 233, 235, 236, 238, 255, 39, 46, - 58, 95, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 139, 142, - 196, 218, 235, 236, 39, 46, 58, 95, - 169, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 196, 218, 235, - 236, 39, 46, 58, 95, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 160, 171, 176, 187, 196, 218, 235, - 236, 39, 46, 58, 95, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 151, 155, 196, 218, 235, 236, 39, - 46, 58, 95, 191, 194, 195, 198, 199, - 203, 204, 205, 206, 207, 210, 212, 213, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 237, 239, - 240, 243, 48, 57, 65, 90, 97, 122, - 149, 158, 160, 188, 196, 218, 235, 236, - 39, 46, 58, 95, 194, 195, 198, 199, - 203, 204, 205, 206, 207, 210, 212, 213, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 237, 239, - 240, 243, 48, 57, 65, 90, 97, 122, - 176, 190, 196, 218, 235, 236, 39, 46, - 58, 95, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 128, 132, - 180, 193, 196, 218, 228, 233, 235, 236, - 238, 255, 39, 46, 58, 95, 194, 195, - 198, 199, 203, 204, 205, 206, 207, 210, - 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 237, 239, 240, 243, 48, 57, 65, 90, - 97, 122, 133, 170, 180, 193, 196, 218, - 228, 233, 235, 236, 238, 255, 39, 46, - 58, 95, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 128, 130, - 161, 173, 196, 218, 235, 236, 39, 46, - 58, 95, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 166, 179, - 196, 218, 235, 236, 39, 46, 58, 95, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 164, 183, 196, 218, - 235, 236, 39, 46, 58, 95, 173, 194, - 195, 198, 199, 203, 204, 205, 206, 207, - 210, 212, 213, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 237, 239, 240, 243, 48, 57, 65, - 90, 97, 122, 144, 146, 148, 168, 178, - 180, 184, 185, 196, 218, 235, 236, 39, - 46, 58, 95, 194, 195, 198, 199, 203, - 204, 205, 206, 207, 210, 212, 213, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 237, 239, 240, - 243, 48, 57, 65, 90, 97, 122, 128, - 181, 188, 191, 196, 218, 235, 236, 39, - 46, 58, 95, 194, 195, 198, 199, 203, - 204, 205, 206, 207, 210, 212, 213, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 237, 239, 240, - 243, 48, 57, 65, 90, 97, 122, 140, - 143, 170, 174, 196, 218, 235, 236, 39, - 46, 58, 95, 194, 195, 198, 199, 203, - 204, 205, 206, 207, 210, 212, 213, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 237, 239, 240, - 243, 48, 57, 65, 90, 97, 122, 160, - 164, 166, 175, 196, 218, 235, 236, 39, - 46, 58, 95, 194, 195, 198, 199, 203, - 204, 205, 206, 207, 210, 212, 213, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 237, 239, 240, - 243, 48, 57, 65, 90, 97, 122, 144, - 176, 196, 218, 235, 236, 39, 46, 58, - 95, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 175, 177, 196, - 218, 235, 236, 39, 46, 58, 95, 191, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 196, 218, 235, 236, - 39, 46, 58, 95, 194, 195, 198, 199, - 203, 204, 205, 206, 207, 210, 212, 213, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 237, 239, - 240, 243, 48, 57, 65, 90, 97, 122, - 160, 191, 196, 218, 235, 236, 39, 46, - 58, 95, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 170, 175, - 196, 218, 235, 236, 39, 46, 58, 95, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 153, 154, 196, 218, - 235, 236, 39, 46, 58, 95, 194, 195, - 198, 199, 203, 204, 205, 206, 207, 210, - 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 237, 239, 240, 243, 48, 57, 65, 90, - 97, 122, 175, 178, 180, 189, 196, 218, - 235, 236, 39, 46, 58, 95, 194, 195, - 198, 199, 203, 204, 205, 206, 207, 210, - 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 237, 239, 240, 243, 48, 57, 65, 90, - 97, 122, 158, 159, 196, 218, 235, 236, - 39, 46, 58, 95, 194, 195, 198, 199, - 203, 204, 205, 206, 207, 210, 212, 213, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 237, 239, - 240, 243, 48, 57, 65, 90, 97, 122, - 176, 177, 196, 218, 235, 236, 39, 46, - 58, 95, 130, 134, 139, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 163, 167, 196, 218, 235, 236, 39, - 46, 58, 95, 194, 195, 198, 199, 203, - 204, 205, 206, 207, 210, 212, 213, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 237, 239, 240, - 243, 48, 57, 65, 90, 97, 122, 128, - 129, 180, 193, 196, 218, 228, 233, 235, - 236, 238, 255, 39, 46, 58, 95, 194, - 195, 198, 199, 203, 204, 205, 206, 207, - 210, 212, 213, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 237, 239, 240, 243, 48, 57, 65, - 90, 97, 122, 133, 159, 178, 193, 196, - 218, 228, 233, 235, 236, 238, 255, 39, - 46, 58, 95, 194, 195, 198, 199, 203, - 204, 205, 206, 207, 210, 212, 213, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 237, 239, 240, - 243, 48, 57, 65, 90, 97, 122, 166, - 173, 196, 218, 235, 236, 39, 46, 58, - 95, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 135, 147, 196, - 218, 235, 236, 39, 46, 58, 95, 194, - 195, 198, 199, 203, 204, 205, 206, 207, - 210, 212, 213, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 237, 239, 240, 243, 48, 57, 65, - 90, 97, 122, 128, 131, 179, 193, 196, - 218, 228, 233, 235, 236, 238, 255, 39, - 46, 58, 95, 165, 194, 195, 198, 199, - 203, 204, 205, 206, 207, 210, 212, 213, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 237, 239, - 240, 243, 0, 47, 48, 57, 59, 64, - 65, 90, 91, 96, 97, 122, 123, 128, - 196, 218, 235, 236, 39, 46, 58, 95, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 169, 182, 196, 218, - 235, 236, 39, 46, 58, 95, 131, 194, - 195, 198, 199, 203, 204, 205, 206, 207, - 210, 212, 213, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 237, 239, 240, 243, 48, 57, 65, - 90, 97, 122, 140, 141, 187, 189, 196, - 218, 235, 236, 39, 46, 58, 95, 176, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 178, 180, 183, 184, - 190, 191, 196, 218, 235, 236, 39, 46, - 58, 95, 129, 194, 195, 198, 199, 203, - 204, 205, 206, 207, 210, 212, 213, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 237, 239, 240, - 243, 48, 57, 65, 90, 97, 122, 171, - 175, 181, 182, 196, 218, 235, 236, 39, - 46, 58, 95, 194, 195, 198, 199, 203, - 204, 205, 206, 207, 210, 212, 213, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 237, 239, 240, - 243, 48, 57, 65, 90, 97, 122, 163, - 170, 172, 173, 196, 218, 235, 236, 39, - 46, 58, 95, 158, 194, 195, 198, 199, - 203, 204, 205, 206, 207, 210, 212, 213, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 237, 239, - 240, 243, 48, 57, 65, 90, 97, 122, - 196, 218, 235, 236, 39, 46, 58, 95, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 128, 143, 160, 175, - 196, 218, 235, 236, 39, 46, 58, 95, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 185, 187, 196, 218, - 235, 236, 39, 46, 58, 95, 135, 139, - 141, 168, 171, 194, 195, 198, 199, 203, - 204, 205, 206, 207, 210, 212, 213, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 237, 239, 240, - 243, 48, 57, 65, 90, 97, 122, 196, - 218, 235, 236, 39, 46, 58, 95, 128, - 129, 130, 132, 133, 134, 135, 136, 139, - 140, 141, 146, 147, 150, 151, 152, 153, - 154, 156, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 196, 218, - 235, 236, 39, 46, 58, 95, 171, 172, - 189, 190, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 196, 218, - 235, 236, 39, 46, 58, 95, 178, 194, - 195, 198, 199, 203, 204, 205, 206, 207, - 210, 212, 213, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 237, 239, 240, 243, 48, 57, 65, - 90, 97, 122, 196, 218, 235, 236, 39, - 46, 58, 95, 133, 134, 137, 168, 169, - 170, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 196, 218, 235, - 236, 39, 46, 58, 95, 163, 194, 195, - 198, 199, 203, 204, 205, 206, 207, 210, - 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 237, 239, 240, 243, 48, 57, 65, 90, - 97, 122, 196, 218, 235, 236, 39, 46, - 58, 95, 128, 129, 132, 135, 194, 195, - 198, 199, 203, 204, 205, 206, 207, 210, - 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 237, 239, 240, 243, 48, 57, 65, 90, - 97, 122, 133, 134, 196, 218, 235, 236, - 39, 46, 58, 95, 189, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 132, 185, 196, 218, 235, 236, 39, - 46, 58, 95, 144, 194, 195, 198, 199, - 203, 204, 205, 206, 207, 210, 212, 213, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 237, 239, - 240, 243, 48, 57, 65, 90, 97, 122, - 152, 161, 164, 193, 196, 218, 228, 233, - 235, 236, 238, 255, 39, 46, 58, 95, - 188, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 129, 131, 190, - 193, 196, 218, 228, 233, 235, 236, 238, - 255, 39, 46, 58, 95, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 133, 134, 137, 138, 142, 150, 152, - 161, 164, 193, 196, 218, 228, 233, 235, - 236, 238, 255, 39, 46, 58, 95, 145, - 181, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 0, - 47, 48, 57, 59, 64, 65, 90, 91, - 96, 97, 122, 123, 130, 135, 136, 139, - 141, 176, 177, 196, 218, 235, 236, 39, - 46, 58, 95, 134, 138, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 142, 161, 164, 193, 196, 218, 228, - 233, 235, 236, 238, 255, 39, 46, 58, - 95, 188, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 129, 131, - 190, 191, 196, 218, 235, 236, 39, 46, - 58, 95, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 128, 132, - 135, 136, 139, 141, 150, 151, 162, 163, - 196, 218, 235, 236, 39, 46, 58, 95, - 130, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 190, 191, 196, - 218, 235, 236, 39, 46, 58, 95, 151, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 128, 130, 134, 136, - 138, 141, 196, 218, 235, 236, 39, 46, - 58, 95, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 128, 131, - 190, 193, 196, 218, 228, 233, 235, 236, - 238, 255, 39, 46, 58, 95, 133, 137, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 142, 148, 151, 161, - 164, 193, 196, 218, 228, 233, 235, 236, - 238, 255, 39, 46, 58, 95, 194, 195, - 198, 199, 203, 204, 205, 206, 207, 210, - 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 237, 239, 240, 243, 48, 57, 65, 90, - 97, 122, 128, 132, 134, 136, 138, 141, - 149, 150, 162, 163, 196, 218, 235, 236, - 39, 46, 58, 95, 194, 195, 198, 199, - 203, 204, 205, 206, 207, 210, 212, 213, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 237, 239, - 240, 243, 48, 57, 65, 90, 97, 122, - 129, 131, 190, 193, 196, 218, 228, 233, - 235, 236, 238, 255, 39, 46, 58, 95, - 133, 137, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 142, 150, - 152, 161, 164, 193, 196, 218, 228, 233, - 235, 236, 238, 255, 39, 46, 58, 95, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 130, 131, 196, 218, - 235, 236, 39, 46, 58, 95, 138, 150, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 143, 148, 152, 159, - 178, 179, 196, 218, 235, 236, 39, 46, - 58, 95, 177, 194, 195, 198, 199, 203, - 204, 205, 206, 207, 210, 212, 213, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 237, 239, 240, - 243, 48, 57, 65, 90, 97, 122, 180, - 186, 196, 218, 235, 236, 39, 46, 58, - 95, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 135, 142, 196, - 218, 235, 236, 39, 46, 58, 95, 177, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 180, 185, 187, 188, - 196, 218, 235, 236, 39, 46, 58, 95, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 136, 141, 196, 218, - 235, 236, 39, 46, 58, 95, 181, 183, - 185, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 152, 153, 190, - 191, 196, 218, 235, 236, 39, 46, 58, - 95, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 177, 191, 196, - 218, 235, 236, 39, 46, 58, 95, 194, - 195, 198, 199, 203, 204, 205, 206, 207, - 210, 212, 213, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 237, 239, 240, 243, 48, 57, 65, - 90, 97, 122, 128, 132, 134, 135, 141, - 151, 153, 188, 196, 218, 235, 236, 39, - 46, 58, 95, 134, 194, 195, 198, 199, - 203, 204, 205, 206, 207, 210, 212, 213, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 237, 239, - 240, 243, 48, 57, 65, 90, 97, 122, - 196, 218, 235, 236, 173, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 130, 133, 146, 159, 165, 171, - 175, 255, 194, 204, 205, 210, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 239, 240, 243, 128, - 255, 173, 194, 204, 205, 210, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 239, 240, 243, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 128, 255, 173, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 176, 255, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 131, 137, 191, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 145, 189, 135, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 129, 130, 132, 133, 156, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 128, 133, 144, 154, 176, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 139, 159, 194, 204, - 205, 210, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 239, 240, 243, 150, 157, 159, 164, 167, - 168, 170, 173, 143, 145, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 176, 255, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 176, 255, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 131, 137, 191, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 145, 189, 135, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 129, 130, 132, 133, 156, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 128, 133, 144, 154, 176, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 139, 159, 194, 204, - 205, 210, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 239, 240, 243, 150, 157, 159, 164, 167, - 168, 170, 173, 143, 145, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 176, 255, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 139, 255, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 166, 176, 194, 204, 205, 210, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 239, 240, 243, 171, - 179, 160, 161, 163, 164, 165, 167, 169, - 171, 173, 174, 175, 176, 177, 179, 180, - 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 166, 170, 172, 178, 128, 129, 130, 141, - 156, 157, 158, 159, 160, 162, 164, 168, - 169, 170, 172, 173, 174, 175, 176, 179, - 183, 194, 204, 205, 210, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 239, 240, 243, 128, 129, - 131, 179, 181, 183, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 128, 130, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 153, 154, 155, 160, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 175, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 172, 184, 187, 190, - 191, 194, 204, 205, 210, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 239, 240, 243, 144, 145, - 150, 155, 157, 158, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 160, 194, 204, 205, 210, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 239, 240, 243, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 139, 255, 194, 204, - 205, 210, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 239, 240, 243, 166, 176, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 171, 179, 160, 161, 163, 164, - 165, 167, 169, 171, 173, 174, 175, 176, - 177, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 194, 204, - 205, 210, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 239, 240, 243, 166, 170, 172, 178, 128, - 129, 130, 141, 156, 157, 158, 159, 160, - 162, 164, 168, 169, 170, 172, 173, 174, - 175, 176, 179, 183, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 128, 129, 131, 179, 181, 183, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 128, 130, 194, 204, - 205, 210, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 239, 240, 243, 153, 154, 155, 160, 162, - 163, 164, 165, 166, 167, 168, 169, 170, - 171, 175, 194, 204, 205, 210, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 239, 240, 243, 172, - 184, 187, 190, 191, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 144, 145, 150, 155, 157, 158, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 160, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 181, 190, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 176, 183, 184, 185, 186, 191, 192, - 255, 134, 140, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 136, 138, 142, 161, 163, 255, 130, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 131, 137, 190, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 136, 144, 145, 191, - 192, 255, 135, 179, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 129, 130, 132, 133, 144, 170, 176, - 178, 156, 194, 204, 205, 210, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 239, 240, 243, 128, - 133, 144, 154, 160, 191, 171, 176, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 128, 138, 139, 159, - 160, 169, 174, 255, 148, 158, 169, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 150, 164, 167, 173, - 176, 185, 189, 190, 192, 255, 144, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 143, 145, 146, 175, - 176, 255, 194, 204, 205, 210, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 239, 240, 243, 139, - 140, 141, 255, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 166, 176, 178, 255, 186, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 128, 137, 138, 170, 171, 179, - 180, 181, 160, 161, 162, 163, 164, 165, - 166, 167, 168, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 178, 179, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 194, 204, 205, 210, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 239, 240, 243, 128, - 129, 130, 131, 132, 135, 137, 138, 139, - 140, 141, 142, 143, 144, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, - 164, 165, 167, 168, 169, 170, 172, 173, - 174, 175, 176, 177, 179, 181, 182, 183, - 188, 189, 190, 191, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 133, 134, 136, 152, 180, 184, 185, - 187, 39, 46, 58, 95, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 196, 218, 235, 236, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 235, 236, 128, 129, 130, - 131, 132, 133, 134, 146, 147, 176, 177, - 178, 179, 180, 181, 182, 183, 184, 186, - 187, 188, 191, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 189, 190, 194, 204, 205, 210, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 239, 240, 243, 128, - 129, 130, 131, 132, 133, 134, 135, 136, - 137, 139, 140, 141, 144, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 145, 255, 39, 46, 58, 95, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 196, 218, 235, 236, - 194, 204, 205, 210, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 235, 236, - 95, 194, 204, 205, 210, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 239, 240, 243, 194, 204, - 205, 210, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 239, 240, 243, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 194, 204, 205, 210, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 239, 240, 243, 150, 153, 155, - 163, 165, 167, 169, 173, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 153, 155, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 163, 255, 173, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 194, 204, 205, 210, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 239, 240, 243, 128, 255, - 173, 194, 204, 205, 210, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 239, 240, 243, 194, 204, - 205, 210, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 239, 240, 243, 128, 255, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 176, 255, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 131, 137, 191, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 145, 189, 135, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 129, 130, 132, 133, 156, 194, 204, - 205, 210, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 239, 240, 243, 128, 133, 144, 154, 176, - 194, 204, 205, 210, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 239, 240, 243, 139, 159, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 150, 157, 159, 164, - 167, 168, 170, 173, 143, 145, 194, 204, - 205, 210, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 239, 240, 243, 176, 255, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 176, 255, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 131, 137, 191, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 145, 189, 135, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 129, 130, 132, 133, 156, 194, 204, - 205, 210, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 239, 240, 243, 128, 133, 144, 154, 176, - 194, 204, 205, 210, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 239, 240, 243, 139, 159, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 150, 157, 159, 164, - 167, 168, 170, 173, 143, 145, 194, 204, - 205, 210, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 239, 240, 243, 176, 255, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 139, 255, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 166, 176, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 171, 179, 160, 161, 163, 164, 165, 167, - 169, 171, 173, 174, 175, 176, 177, 179, - 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 166, 170, 172, 178, 128, 129, 130, - 141, 156, 157, 158, 159, 160, 162, 164, - 168, 169, 170, 172, 173, 174, 175, 176, - 179, 183, 194, 204, 205, 210, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 239, 240, 243, 128, - 129, 131, 179, 181, 183, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 128, 130, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 153, 154, 155, 160, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 175, - 194, 204, 205, 210, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 239, 240, 243, 172, 184, 187, - 190, 191, 194, 204, 205, 210, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 239, 240, 243, 144, - 145, 150, 155, 157, 158, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 160, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 194, 204, 205, 210, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 239, 240, 243, 139, 255, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 166, 176, 194, 204, - 205, 210, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 239, 240, 243, 171, 179, 160, 161, 163, - 164, 165, 167, 169, 171, 173, 174, 175, - 176, 177, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 166, 170, 172, 178, - 128, 129, 130, 141, 156, 157, 158, 159, - 160, 162, 164, 168, 169, 170, 172, 173, - 174, 175, 176, 179, 183, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 128, 129, 131, 179, 181, 183, - 194, 204, 205, 210, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 239, 240, 243, 128, 130, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 153, 154, 155, 160, - 162, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 175, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 172, 184, 187, 190, 191, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 144, 145, 150, 155, 157, 158, - 194, 204, 205, 210, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 239, 240, 243, 160, 194, 204, - 205, 210, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 239, 240, 243, 189, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 132, 185, 144, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 152, 161, 164, 255, 188, 194, 204, - 205, 210, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 239, 240, 243, 129, 131, 190, 255, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 133, 134, 137, 138, - 142, 150, 152, 161, 164, 255, 194, 204, - 205, 210, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 239, 240, 243, 131, 134, 137, 138, 142, - 144, 146, 175, 178, 180, 182, 255, 134, - 138, 194, 204, 205, 210, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 239, 240, 243, 142, 161, - 164, 255, 188, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 129, 131, 190, 191, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 128, 132, 135, 136, 139, 141, 150, - 151, 162, 163, 130, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 190, 191, 151, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 128, 130, 134, 136, 138, 141, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 128, 131, 190, 255, - 133, 137, 194, 204, 205, 210, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 239, 240, 243, 142, - 148, 151, 161, 164, 255, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 128, 132, 134, 136, 138, 141, - 149, 150, 162, 163, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 129, 131, 190, 255, 133, 137, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 142, 150, 152, 161, - 164, 255, 194, 204, 205, 210, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 239, 240, 243, 130, - 131, 138, 150, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 143, 148, 152, 159, 178, 179, 177, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 180, 186, 194, 204, - 205, 210, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 239, 240, 243, 135, 142, 177, 194, 204, - 205, 210, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 239, 240, 243, 180, 185, 187, 188, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 136, 141, 181, 183, - 185, 194, 204, 205, 210, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 239, 240, 243, 152, 153, - 190, 191, 194, 204, 205, 210, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 239, 240, 243, 177, - 191, 194, 204, 205, 210, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 239, 240, 243, 128, 132, - 134, 135, 141, 151, 153, 188, 134, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 171, 190, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 150, 153, 158, 160, 162, 164, 167, 173, - 177, 180, 143, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 130, 141, 154, 157, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 157, 159, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 146, 148, 178, 180, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 146, 147, 178, 179, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 180, 255, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 148, 156, 158, 255, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 139, 142, 169, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 194, 204, 205, 210, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 239, 240, 243, 160, - 171, 176, 187, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 151, 155, 191, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 149, 158, 160, 188, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 176, 190, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 128, 132, 180, 255, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 133, 170, 180, 255, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 128, 130, 161, 173, 194, 204, - 205, 210, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 239, 240, 243, 166, 179, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 164, 183, 173, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 144, 146, 148, 168, 178, 180, - 184, 185, 194, 204, 205, 210, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 239, 240, 243, 128, - 181, 188, 191, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 140, 143, 170, 174, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 160, 164, 166, 175, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 144, 176, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 175, 177, 191, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 194, 204, 205, 210, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 239, 240, 243, 160, 191, - 194, 204, 205, 210, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 239, 240, 243, 170, 175, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 153, 154, 194, 204, - 205, 210, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 239, 240, 243, 175, 178, 180, 189, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 158, 159, 194, 204, - 205, 210, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 239, 240, 243, 176, 177, 130, 134, 139, - 194, 204, 205, 210, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 239, 240, 243, 163, 167, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 128, 129, 180, 255, - 194, 204, 205, 210, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 239, 240, 243, 133, 159, 178, - 255, 194, 204, 205, 210, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 239, 240, 243, 166, 173, - 194, 204, 205, 210, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 239, 240, 243, 135, 147, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 128, 131, 179, 255, - 194, 204, 205, 210, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 239, 240, 243, 129, 164, 166, - 255, 194, 204, 205, 210, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 239, 240, 243, 169, 182, - 131, 194, 204, 205, 210, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 239, 240, 243, 140, 141, - 187, 189, 176, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 178, 180, 183, 184, 190, 191, 129, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 171, 175, 181, 182, - 194, 204, 205, 210, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 239, 240, 243, 163, 170, 172, - 173, 158, 194, 204, 205, 210, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 239, 240, 243, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 128, 143, 160, 175, - 194, 204, 205, 210, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 239, 240, 243, 185, 187, 135, - 139, 141, 168, 171, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 128, 129, 130, 132, 133, 134, 135, - 136, 139, 140, 141, 146, 147, 150, 151, - 152, 153, 154, 156, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 171, 172, 189, 190, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 178, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 133, 134, 137, 168, 169, 170, 194, 204, - 205, 210, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 239, 240, 243, 163, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 128, 129, 132, 135, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 133, 134, 182, 183, 184, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 191, 194, 204, 205, 210, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 239, 240, 243, 192, - 255, 128, 146, 147, 148, 152, 153, 154, - 155, 156, 158, 159, 160, 161, 162, 163, - 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 129, 157, 177, 255, 39, 46, - 58, 95, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 196, 218, - 235, 236, 39, 46, 58, 95, 194, 195, - 198, 199, 203, 204, 205, 206, 207, 210, - 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 237, 239, 240, 243, 48, 57, 65, 90, - 97, 122, 150, 153, 155, 163, 165, 167, - 169, 173, 196, 218, 235, 236, 39, 46, - 58, 95, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 153, 155, - 196, 218, 235, 236, 39, 46, 58, 95, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 163, 193, 196, 218, - 228, 233, 235, 236, 238, 255, 170, 173, - 181, 183, 186, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 194, 204, 205, 210, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 239, 240, 243, 128, 255, 39, - 46, 58, 95, 173, 194, 195, 198, 199, - 203, 204, 205, 206, 207, 210, 212, 213, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 237, 239, - 240, 243, 48, 57, 65, 90, 97, 122, - 196, 218, 235, 236, 39, 46, 58, 95, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 0, 47, - 48, 57, 59, 64, 65, 90, 91, 96, - 97, 122, 123, 127, 196, 218, 235, 236, - 181, 190, 194, 204, 205, 210, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 239, 240, 243, 176, - 183, 184, 185, 186, 191, 192, 255, 130, - 194, 204, 205, 210, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 239, 240, 243, 131, 137, 190, - 194, 204, 205, 210, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 239, 240, 243, 136, 144, 145, - 191, 192, 255, 135, 179, 180, 194, 204, - 205, 210, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 239, 240, 243, 129, 130, 132, 133, 144, - 170, 176, 178, 156, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 128, 133, 144, 154, 160, 191, 171, - 176, 194, 204, 205, 210, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 239, 240, 243, 128, 138, - 139, 159, 160, 169, 174, 255, 148, 158, - 169, 194, 204, 205, 210, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 239, 240, 243, 150, 164, - 167, 173, 176, 185, 189, 190, 192, 255, - 144, 194, 204, 205, 210, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 239, 240, 243, 143, 145, - 146, 175, 176, 255, 39, 46, 58, 95, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 176, 193, 196, 218, - 228, 233, 235, 236, 238, 255, 39, 46, - 58, 95, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 131, 137, - 196, 218, 235, 236, 39, 46, 58, 95, - 191, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 145, 189, 196, - 218, 235, 236, 39, 46, 58, 95, 135, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 129, 130, 132, 133, - 196, 218, 235, 236, 39, 46, 58, 95, - 156, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 128, 133, 144, - 154, 196, 218, 235, 236, 39, 46, 58, - 95, 176, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 139, 159, - 196, 218, 235, 236, 39, 46, 58, 95, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 150, 157, 159, 164, - 167, 168, 170, 173, 196, 218, 235, 236, - 39, 46, 58, 95, 143, 145, 194, 195, - 198, 199, 203, 204, 205, 206, 207, 210, - 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 237, 239, 240, 243, 48, 57, 65, 90, - 97, 122, 176, 193, 196, 218, 228, 233, - 235, 236, 238, 255, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 139, 140, 141, 255, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 166, 176, 178, 255, 186, 194, - 204, 205, 210, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 239, 240, 243, 128, 137, 138, 170, - 171, 179, 180, 181, 160, 161, 162, 163, - 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 194, 204, 205, 210, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 239, 240, - 243, 128, 129, 130, 131, 132, 135, 137, - 138, 139, 140, 141, 142, 143, 144, 153, - 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 167, 168, 169, 170, - 172, 173, 174, 175, 176, 177, 179, 181, - 182, 183, 188, 189, 190, 191, 194, 204, - 205, 210, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 239, 240, 243, 133, 134, 136, 152, 180, - 184, 185, 187, 128, 129, 130, 131, 132, - 133, 134, 146, 147, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 194, 204, 205, - 210, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 239, - 240, 243, 128, 130, 132, 133, 134, 136, - 137, 194, 204, 205, 210, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 239, 240, 243, 128, 146, - 147, 148, 152, 153, 154, 155, 156, 158, - 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 194, 204, 205, 210, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 239, 240, 243, 129, - 157, 177, 255, 39, 46, 58, 95, 194, - 195, 198, 199, 203, 204, 205, 206, 207, - 210, 212, 213, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 237, 239, 240, 243, 48, 57, 65, - 90, 97, 122, 171, 190, 196, 218, 235, - 236, 39, 46, 58, 95, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 150, 153, 158, 160, 162, 164, 167, - 173, 177, 180, 196, 218, 235, 236, 39, - 46, 58, 95, 143, 194, 195, 198, 199, - 203, 204, 205, 206, 207, 210, 212, 213, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 237, 239, - 240, 243, 48, 57, 65, 90, 97, 122, - 130, 141, 154, 157, 196, 218, 235, 236, - 39, 46, 58, 95, 194, 195, 198, 199, - 203, 204, 205, 206, 207, 210, 212, 213, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 237, 239, - 240, 243, 48, 57, 65, 90, 97, 122, - 157, 159, 196, 218, 235, 236, 39, 46, - 58, 95, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 146, 148, - 178, 180, 196, 218, 235, 236, 39, 46, - 58, 95, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 146, 147, - 178, 179, 196, 218, 235, 236, 39, 46, - 58, 95, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 180, 193, - 196, 218, 228, 233, 235, 236, 238, 255, - 194, 204, 205, 210, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 239, 240, 243, 39, 46, 58, - 95, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 140, 143, 170, - 174, 196, 218, 235, 236, 39, 46, 58, - 95, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 160, 164, 166, - 175, 196, 218, 235, 236, 39, 46, 58, - 95, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 144, 176, 196, - 218, 235, 236, 39, 46, 58, 95, 194, - 195, 198, 199, 203, 204, 205, 206, 207, - 210, 212, 213, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 237, 239, 240, 243, 48, 57, 65, - 90, 97, 122, 175, 177, 196, 218, 235, - 236, 39, 46, 58, 95, 191, 194, 195, - 198, 199, 203, 204, 205, 206, 207, 210, - 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 237, 239, 240, 243, 48, 57, 65, 90, - 97, 122, 196, 218, 235, 236, 39, 46, - 58, 95, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 160, 191, - 196, 218, 235, 236, 39, 46, 58, 95, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 170, 175, 196, 218, - 235, 236, 39, 46, 58, 95, 194, 195, - 198, 199, 203, 204, 205, 206, 207, 210, - 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 237, 239, 240, 243, 48, 57, 65, 90, - 97, 122, 153, 154, 196, 218, 235, 236, - 39, 46, 58, 95, 194, 195, 198, 199, - 203, 204, 205, 206, 207, 210, 212, 213, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 237, 239, - 240, 243, 48, 57, 65, 90, 97, 122, - 175, 178, 180, 189, 196, 218, 235, 236, - 39, 46, 58, 95, 194, 195, 198, 199, - 203, 204, 205, 206, 207, 210, 212, 213, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 237, 239, - 240, 243, 48, 57, 65, 90, 97, 122, - 158, 159, 196, 218, 235, 236, 39, 46, - 58, 95, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 176, 177, - 196, 218, 235, 236, 39, 46, 58, 95, - 130, 134, 139, 194, 195, 198, 199, 203, - 204, 205, 206, 207, 210, 212, 213, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 237, 239, 240, - 243, 48, 57, 65, 90, 97, 122, 163, - 167, 196, 218, 235, 236, 39, 46, 58, - 95, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 128, 129, 180, - 193, 196, 218, 228, 233, 235, 236, 238, - 255, 158, 159, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 160, 255, 172, 173, 174, 175, 180, 181, - 182, 183, 184, 185, 187, 188, 189, 190, - 191, 194, 204, 205, 210, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 239, 240, 243, 176, 186, - 144, 145, 146, 147, 148, 150, 155, 157, - 158, 159, 194, 204, 205, 210, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 239, 240, 243, 160, - 194, 204, 205, 210, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 239, 240, 243, 39, 46, 58, - 95, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 133, 159, 178, - 193, 196, 218, 228, 233, 235, 236, 238, - 255, 39, 46, 58, 95, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 166, 173, 196, 218, 235, 236, 39, - 46, 58, 95, 194, 195, 198, 199, 203, - 204, 205, 206, 207, 210, 212, 213, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 237, 239, 240, - 243, 48, 57, 65, 90, 97, 122, 135, - 147, 196, 218, 235, 236, 39, 46, 58, - 95, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 128, 131, 179, - 193, 196, 218, 228, 233, 235, 236, 238, - 255, 39, 46, 58, 95, 165, 194, 195, - 198, 199, 203, 204, 205, 206, 207, 210, - 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 237, 239, 240, 243, 0, 47, 48, 57, - 59, 64, 65, 90, 91, 96, 97, 122, - 123, 128, 196, 218, 235, 236, 39, 46, - 58, 95, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 169, 182, - 196, 218, 235, 236, 39, 46, 58, 95, - 131, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 140, 141, 187, - 189, 196, 218, 235, 236, 39, 46, 58, - 95, 176, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 178, 180, - 183, 184, 190, 191, 196, 218, 235, 236, - 39, 46, 58, 95, 129, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 171, 175, 181, 182, 196, 218, 235, - 236, 39, 46, 58, 95, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 163, 170, 172, 173, 196, 218, 235, - 236, 39, 46, 58, 95, 158, 194, 195, - 198, 199, 203, 204, 205, 206, 207, 210, - 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 237, 239, 240, 243, 48, 57, 65, 90, - 97, 122, 196, 218, 235, 236, 39, 46, - 58, 95, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 128, 143, - 160, 175, 196, 218, 235, 236, 39, 46, - 58, 95, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 185, 187, - 196, 218, 235, 236, 39, 46, 58, 95, - 135, 139, 141, 168, 171, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 196, 218, 235, 236, 39, 46, 58, - 95, 128, 129, 130, 132, 133, 134, 135, - 136, 139, 140, 141, 146, 147, 150, 151, - 152, 153, 154, 156, 194, 195, 198, 199, - 203, 204, 205, 206, 207, 210, 212, 213, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 237, 239, - 240, 243, 48, 57, 65, 90, 97, 122, - 196, 218, 235, 236, 39, 46, 58, 95, - 171, 172, 189, 190, 194, 195, 198, 199, - 203, 204, 205, 206, 207, 210, 212, 213, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 237, 239, - 240, 243, 48, 57, 65, 90, 97, 122, - 196, 218, 235, 236, 39, 46, 58, 95, - 178, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 196, 218, 235, - 236, 39, 46, 58, 95, 133, 134, 137, - 168, 169, 170, 194, 195, 198, 199, 203, - 204, 205, 206, 207, 210, 212, 213, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 237, 239, 240, - 243, 48, 57, 65, 90, 97, 122, 196, - 218, 235, 236, 39, 46, 58, 95, 163, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 196, 218, 235, 236, - 39, 46, 58, 95, 128, 129, 132, 135, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 133, 134, 196, 218, - 235, 236, 39, 46, 58, 95, 194, 195, - 198, 199, 203, 204, 205, 206, 207, 210, - 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 237, 239, 240, 243, 48, 57, 65, 90, - 97, 122, 148, 156, 158, 193, 196, 218, - 228, 233, 235, 236, 238, 255, 39, 46, - 58, 95, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 139, 142, - 196, 218, 235, 236, 39, 46, 58, 95, - 169, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 196, 218, 235, - 236, 39, 46, 58, 95, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 160, 171, 176, 187, 196, 218, 235, - 236, 39, 46, 58, 95, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 151, 155, 196, 218, 235, 236, 39, - 46, 58, 95, 191, 194, 195, 198, 199, - 203, 204, 205, 206, 207, 210, 212, 213, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 237, 239, - 240, 243, 48, 57, 65, 90, 97, 122, - 149, 158, 160, 188, 196, 218, 235, 236, - 39, 46, 58, 95, 194, 195, 198, 199, - 203, 204, 205, 206, 207, 210, 212, 213, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 237, 239, - 240, 243, 48, 57, 65, 90, 97, 122, - 176, 190, 196, 218, 235, 236, 39, 46, - 58, 95, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 128, 132, - 180, 193, 196, 218, 228, 233, 235, 236, - 238, 255, 39, 46, 58, 95, 194, 195, - 198, 199, 203, 204, 205, 206, 207, 210, - 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 237, 239, 240, 243, 48, 57, 65, 90, - 97, 122, 133, 170, 180, 193, 196, 218, - 228, 233, 235, 236, 238, 255, 39, 46, - 58, 95, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 128, 130, - 161, 173, 196, 218, 235, 236, 39, 46, - 58, 95, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 166, 179, - 196, 218, 235, 236, 39, 46, 58, 95, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 164, 183, 196, 218, - 235, 236, 39, 46, 58, 95, 173, 194, - 195, 198, 199, 203, 204, 205, 206, 207, - 210, 212, 213, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 237, 239, 240, 243, 48, 57, 65, - 90, 97, 122, 144, 146, 148, 168, 178, - 180, 184, 185, 196, 218, 235, 236, 39, - 46, 58, 95, 194, 195, 198, 199, 203, - 204, 205, 206, 207, 210, 212, 213, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 237, 239, 240, - 243, 48, 57, 65, 90, 97, 122, 128, - 181, 188, 191, 196, 218, 235, 236, 39, - 46, 58, 95, 194, 195, 198, 199, 203, - 204, 205, 206, 207, 210, 212, 213, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 237, 239, 240, - 243, 0, 47, 48, 57, 59, 64, 65, - 90, 91, 96, 97, 122, 123, 138, 196, - 218, 235, 236, 39, 46, 58, 95, 194, - 195, 198, 199, 203, 204, 205, 206, 207, - 210, 212, 213, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 237, 239, 240, 243, 48, 57, 65, - 90, 97, 122, 166, 176, 196, 218, 235, - 236, 39, 46, 58, 95, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 171, 179, 196, 218, 235, 236, 39, - 46, 58, 95, 160, 161, 163, 164, 165, - 167, 169, 171, 173, 174, 175, 176, 177, - 179, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 166, 170, 172, 178, 196, 218, 235, - 236, 39, 46, 58, 95, 128, 129, 130, - 141, 156, 157, 158, 159, 160, 162, 164, - 168, 169, 170, 172, 173, 174, 175, 176, - 179, 183, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 196, 218, - 235, 236, 39, 46, 58, 95, 128, 129, - 131, 179, 181, 183, 194, 195, 198, 199, - 203, 204, 205, 206, 207, 210, 212, 213, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 237, 239, - 240, 243, 48, 57, 65, 90, 97, 122, - 196, 218, 235, 236, 39, 46, 58, 95, - 128, 130, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 196, 218, - 235, 236, 39, 46, 58, 95, 153, 154, - 155, 160, 162, 163, 164, 165, 166, 167, - 168, 169, 170, 171, 175, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 196, 218, 235, 236, 39, 46, 58, - 95, 172, 184, 187, 190, 191, 194, 195, - 198, 199, 203, 204, 205, 206, 207, 210, - 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 237, 239, 240, 243, 48, 57, 65, 90, - 97, 122, 196, 218, 235, 236, 39, 46, - 58, 95, 144, 145, 150, 155, 157, 158, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 196, 218, 235, 236, - 39, 46, 58, 95, 160, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 196, 218, 235, 236, 39, 46, 58, - 95, 189, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 132, 185, - 196, 218, 235, 236, 39, 46, 58, 95, - 144, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 152, 161, 164, - 193, 196, 218, 228, 233, 235, 236, 238, - 255, 39, 46, 58, 95, 188, 194, 195, - 198, 199, 203, 204, 205, 206, 207, 210, - 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 237, 239, 240, 243, 48, 57, 65, 90, - 97, 122, 129, 131, 190, 193, 196, 218, - 228, 233, 235, 236, 238, 255, 39, 46, - 58, 95, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 133, 134, - 137, 138, 142, 150, 152, 161, 164, 193, - 196, 218, 228, 233, 235, 236, 238, 255, - 39, 46, 58, 95, 145, 181, 194, 195, - 198, 199, 203, 204, 205, 206, 207, 210, - 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 237, 239, 240, 243, 0, 47, 48, 57, - 59, 64, 65, 90, 91, 96, 97, 122, - 123, 130, 135, 136, 139, 141, 176, 177, - 196, 218, 235, 236, 39, 46, 58, 95, - 134, 138, 194, 195, 198, 199, 203, 204, - 205, 206, 207, 210, 212, 213, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 237, 239, 240, 243, - 48, 57, 65, 90, 97, 122, 142, 161, - 164, 193, 196, 218, 228, 233, 235, 236, - 238, 255, 39, 46, 58, 95, 188, 194, - 195, 198, 199, 203, 204, 205, 206, 207, - 210, 212, 213, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 237, 239, 240, 243, 48, 57, 65, - 90, 97, 122, 129, 131, 190, 191, 196, - 218, 235, 236, 39, 46, 58, 95, 194, - 195, 198, 199, 203, 204, 205, 206, 207, - 210, 212, 213, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 237, 239, 240, 243, 48, 57, 65, - 90, 97, 122, 128, 132, 135, 136, 139, - 141, 150, 151, 162, 163, 196, 218, 235, - 236, 39, 46, 58, 95, 130, 194, 195, - 198, 199, 203, 204, 205, 206, 207, 210, - 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 237, 239, 240, 243, 48, 57, 65, 90, - 97, 122, 190, 191, 196, 218, 235, 236, - 39, 46, 58, 95, 151, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 128, 130, 134, 136, 138, 141, 196, - 218, 235, 236, 39, 46, 58, 95, 194, - 195, 198, 199, 203, 204, 205, 206, 207, - 210, 212, 213, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 237, 239, 240, 243, 48, 57, 65, - 90, 97, 122, 128, 131, 190, 193, 196, - 218, 228, 233, 235, 236, 238, 255, 39, - 46, 58, 95, 133, 137, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 142, 148, 151, 161, 164, 193, 196, - 218, 228, 233, 235, 236, 238, 255, 39, - 46, 58, 95, 194, 195, 198, 199, 203, - 204, 205, 206, 207, 210, 212, 213, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 237, 239, 240, - 243, 48, 57, 65, 90, 97, 122, 128, - 132, 134, 136, 138, 141, 149, 150, 162, - 163, 196, 218, 235, 236, 39, 46, 58, - 95, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 129, 131, 190, - 193, 196, 218, 228, 233, 235, 236, 238, - 255, 39, 46, 58, 95, 133, 137, 194, - 195, 198, 199, 203, 204, 205, 206, 207, - 210, 212, 213, 214, 215, 216, 217, 219, - 220, 221, 222, 223, 224, 225, 226, 227, - 234, 237, 239, 240, 243, 48, 57, 65, - 90, 97, 122, 142, 150, 152, 161, 164, - 193, 196, 218, 228, 233, 235, 236, 238, - 255, 39, 46, 58, 95, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 130, 131, 196, 218, 235, 236, 39, - 46, 58, 95, 138, 150, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 143, 148, 152, 159, 178, 179, 196, - 218, 235, 236, 39, 46, 58, 95, 177, - 194, 195, 198, 199, 203, 204, 205, 206, - 207, 210, 212, 213, 214, 215, 216, 217, - 219, 220, 221, 222, 223, 224, 225, 226, - 227, 234, 237, 239, 240, 243, 48, 57, - 65, 90, 97, 122, 180, 186, 196, 218, - 235, 236, 39, 46, 58, 95, 194, 195, - 198, 199, 203, 204, 205, 206, 207, 210, - 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 237, 239, 240, 243, 48, 57, 65, 90, - 97, 122, 135, 142, 196, 218, 235, 236, - 39, 46, 58, 95, 177, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 180, 185, 187, 188, 196, 218, 235, - 236, 39, 46, 58, 95, 194, 195, 198, - 199, 203, 204, 205, 206, 207, 210, 212, - 213, 214, 215, 216, 217, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 234, 237, - 239, 240, 243, 48, 57, 65, 90, 97, - 122, 136, 141, 196, 218, 235, 236, 39, - 46, 58, 95, 181, 183, 185, 194, 195, - 198, 199, 203, 204, 205, 206, 207, 210, - 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 237, 239, 240, 243, 48, 57, 65, 90, - 97, 122, 152, 153, 190, 191, 196, 218, - 235, 236, 39, 46, 58, 95, 194, 195, - 198, 199, 203, 204, 205, 206, 207, 210, - 212, 213, 214, 215, 216, 217, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 234, - 237, 239, 240, 243, 48, 57, 65, 90, - 97, 122, 177, 191, 196, 218, 235, 236, - 39, 46, 58, 95, 194, 195, 198, 199, - 203, 204, 205, 206, 207, 210, 212, 213, - 214, 215, 216, 217, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 234, 237, 239, - 240, 243, 48, 57, 65, 90, 97, 122, - 128, 132, 134, 135, 141, 151, 153, 188, - 196, 218, 235, 236, 39, 46, 58, 95, - 134, 194, 195, 198, 199, 203, 204, 205, - 206, 207, 210, 212, 213, 214, 215, 216, - 217, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 234, 237, 239, 240, 243, 48, - 57, 65, 90, 97, 122, 196, 218, 235, - 236, 164, 169, 171, 172, 173, 174, 175, - 180, 181, 182, 183, 184, 185, 187, 188, - 189, 190, 191, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 165, 170, 176, 186, 144, 145, 146, 147, - 148, 150, 155, 157, 158, 159, 160, 170, - 171, 172, 175, 194, 204, 205, 210, 214, - 215, 216, 217, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 234, 239, 240, 243, - 161, 169, 194, 204, 205, 210, 214, 215, - 216, 217, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 234, 239, 240, 243, + 173, 0, 127, 176, 255, 131, 137, 191, + 145, 189, 135, 129, 130, 132, 133, 156, + 128, 133, 144, 154, 176, 139, 159, 150, + 157, 159, 164, 167, 168, 170, 173, 143, + 145, 176, 255, 139, 255, 166, 176, 171, + 179, 160, 161, 163, 164, 165, 167, 169, + 171, 173, 174, 175, 176, 177, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 166, 170, 172, 178, 150, + 153, 155, 163, 165, 167, 169, 173, 153, + 155, 163, 255, 189, 132, 185, 144, 152, + 161, 164, 255, 188, 129, 131, 190, 255, + 133, 134, 137, 138, 142, 150, 152, 161, + 164, 255, 131, 134, 137, 138, 142, 144, + 146, 175, 178, 180, 182, 255, 134, 138, + 142, 161, 164, 255, 188, 129, 131, 190, + 191, 128, 132, 135, 136, 139, 141, 150, + 151, 162, 163, 130, 190, 191, 151, 128, + 130, 134, 136, 138, 141, 128, 131, 190, + 255, 133, 137, 142, 148, 151, 161, 164, + 255, 128, 132, 134, 136, 138, 141, 149, + 150, 162, 163, 129, 131, 190, 255, 133, + 137, 142, 150, 152, 161, 164, 255, 130, + 131, 138, 150, 143, 148, 152, 159, 178, + 179, 177, 180, 186, 135, 142, 177, 180, + 185, 187, 188, 136, 141, 181, 183, 185, + 152, 153, 190, 191, 177, 191, 128, 132, + 134, 135, 141, 151, 153, 188, 134, 128, + 129, 130, 141, 156, 157, 158, 159, 160, + 162, 164, 168, 169, 170, 172, 173, 174, + 175, 176, 179, 183, 171, 190, 150, 153, + 158, 160, 162, 164, 167, 173, 177, 180, + 143, 130, 141, 154, 157, 157, 159, 146, + 148, 178, 180, 146, 147, 178, 179, 180, + 255, 148, 156, 158, 255, 139, 142, 169, + 160, 171, 176, 187, 151, 155, 191, 149, + 158, 160, 188, 176, 190, 128, 132, 180, + 255, 133, 170, 180, 255, 128, 130, 161, + 173, 166, 179, 164, 183, 173, 144, 146, + 148, 168, 178, 180, 184, 185, 128, 181, + 188, 191, 128, 129, 131, 179, 181, 183, + 140, 143, 170, 174, 160, 164, 166, 175, + 144, 176, 175, 177, 191, 160, 191, 128, + 130, 170, 175, 153, 154, 153, 154, 155, + 160, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 175, 175, 178, 180, 189, + 158, 159, 176, 177, 130, 134, 139, 163, + 167, 128, 129, 180, 255, 133, 159, 178, + 255, 166, 173, 135, 147, 128, 131, 179, + 255, 129, 164, 166, 255, 169, 182, 131, + 140, 141, 187, 189, 176, 178, 180, 183, + 184, 190, 191, 129, 171, 175, 181, 182, + 163, 170, 172, 173, 172, 184, 187, 190, + 191, 158, 128, 143, 160, 175, 185, 187, + 144, 145, 150, 155, 157, 158, 135, 139, + 141, 168, 171, 189, 160, 182, 186, 191, + 129, 131, 133, 134, 140, 143, 184, 186, + 165, 166, 128, 129, 130, 132, 133, 134, + 135, 136, 139, 140, 141, 146, 147, 150, + 151, 152, 153, 154, 156, 128, 130, 184, + 255, 135, 190, 131, 175, 187, 188, 190, + 255, 128, 130, 167, 180, 179, 128, 130, + 179, 255, 129, 137, 141, 255, 172, 183, + 159, 170, 188, 128, 131, 190, 191, 151, + 128, 132, 135, 136, 139, 141, 162, 163, + 166, 172, 176, 180, 176, 255, 132, 255, + 175, 181, 184, 255, 129, 155, 158, 255, + 129, 255, 171, 183, 157, 171, 171, 172, + 189, 190, 176, 180, 176, 182, 145, 190, + 143, 146, 178, 157, 158, 160, 163, 133, + 134, 137, 168, 169, 170, 165, 169, 173, + 255, 131, 132, 140, 169, 174, 255, 130, + 132, 128, 182, 187, 255, 173, 180, 182, + 255, 132, 155, 159, 161, 175, 163, 144, + 150, 160, 128, 129, 132, 135, 133, 134, + 129, 160, 255, 192, 255, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 48, 57, 194, 195, 198, 199, + 203, 204, 205, 206, 207, 210, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 237, 239, + 240, 243, 65, 90, 97, 122, 196, 218, + 235, 236, 170, 173, 181, 186, 128, 150, + 152, 182, 184, 255, 192, 255, 128, 255, + 173, 130, 133, 146, 159, 165, 171, 175, + 255, 0, 127, 181, 190, 176, 183, 184, + 185, 186, 191, 192, 255, 134, 140, 136, + 138, 142, 161, 163, 255, 182, 130, 131, + 137, 176, 151, 152, 154, 160, 190, 136, + 144, 145, 191, 192, 255, 135, 129, 130, + 132, 133, 144, 170, 176, 179, 156, 128, + 133, 144, 154, 160, 191, 176, 128, 138, + 139, 159, 174, 255, 148, 158, 169, 150, + 164, 167, 173, 176, 185, 189, 190, 192, + 255, 144, 143, 145, 146, 175, 176, 255, + 139, 140, 141, 255, 166, 176, 178, 255, + 186, 138, 170, 171, 179, 180, 181, 160, + 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 154, + 164, 168, 128, 149, 150, 173, 128, 152, + 153, 155, 160, 180, 163, 255, 189, 132, + 185, 144, 152, 161, 164, 176, 177, 255, + 132, 169, 177, 188, 129, 131, 141, 142, + 145, 146, 179, 181, 186, 187, 190, 255, + 142, 158, 133, 134, 137, 138, 143, 150, + 152, 155, 156, 161, 164, 175, 176, 177, + 178, 255, 188, 129, 131, 133, 138, 143, + 144, 147, 168, 170, 176, 178, 179, 181, + 182, 184, 185, 190, 255, 157, 131, 134, + 137, 138, 142, 144, 146, 152, 153, 158, + 159, 175, 178, 180, 182, 255, 189, 129, + 131, 133, 141, 143, 145, 147, 168, 170, + 176, 178, 179, 181, 185, 188, 255, 134, + 138, 144, 185, 142, 159, 160, 161, 164, + 255, 189, 129, 131, 133, 140, 143, 144, + 147, 168, 170, 176, 178, 179, 181, 185, + 188, 191, 177, 128, 132, 135, 136, 139, + 141, 150, 151, 156, 157, 159, 161, 162, + 163, 130, 131, 156, 133, 138, 142, 144, + 146, 149, 153, 154, 158, 159, 163, 164, + 168, 170, 174, 185, 190, 191, 144, 151, + 128, 130, 134, 136, 138, 141, 189, 128, + 131, 133, 140, 142, 144, 146, 168, 170, + 185, 190, 255, 133, 137, 151, 142, 148, + 152, 154, 155, 159, 160, 161, 164, 255, + 189, 129, 131, 133, 140, 142, 144, 146, + 168, 170, 179, 181, 185, 188, 191, 158, + 128, 132, 134, 136, 138, 141, 149, 150, + 160, 161, 162, 163, 177, 178, 189, 129, + 131, 133, 140, 142, 144, 146, 186, 190, + 255, 133, 137, 142, 143, 150, 152, 158, + 159, 161, 164, 185, 186, 191, 192, 255, + 189, 130, 131, 133, 150, 154, 177, 179, + 187, 138, 150, 128, 134, 143, 148, 152, + 159, 178, 179, 177, 180, 186, 135, 142, + 177, 180, 185, 187, 188, 136, 141, 128, + 181, 183, 185, 152, 153, 190, 191, 128, + 135, 137, 172, 177, 191, 128, 132, 134, + 135, 136, 140, 141, 151, 153, 188, 134, + 128, 129, 130, 131, 137, 138, 139, 140, + 141, 142, 143, 144, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, + 168, 169, 170, 172, 173, 174, 175, 176, + 177, 179, 181, 182, 183, 188, 189, 190, + 191, 132, 152, 180, 184, 185, 187, 171, + 190, 150, 153, 158, 160, 162, 164, 167, + 173, 177, 180, 143, 130, 141, 154, 157, + 160, 255, 134, 187, 136, 140, 142, 143, + 137, 151, 153, 142, 143, 158, 159, 137, + 177, 142, 143, 182, 183, 191, 255, 128, + 130, 133, 136, 150, 152, 255, 145, 150, + 151, 155, 156, 157, 159, 160, 255, 128, + 143, 160, 255, 182, 183, 190, 255, 129, + 255, 173, 174, 192, 255, 129, 154, 160, + 255, 171, 173, 185, 255, 128, 140, 142, + 145, 146, 148, 160, 177, 178, 180, 128, + 145, 146, 147, 160, 172, 174, 176, 178, + 179, 180, 255, 148, 156, 158, 255, 139, + 142, 160, 255, 184, 255, 169, 128, 170, + 176, 255, 182, 255, 128, 158, 160, 171, + 176, 187, 128, 150, 151, 155, 191, 149, + 158, 160, 188, 176, 190, 128, 132, 133, + 179, 180, 255, 133, 139, 140, 170, 180, + 255, 128, 130, 131, 160, 161, 173, 174, + 175, 186, 255, 166, 179, 180, 255, 128, + 163, 164, 183, 141, 143, 154, 189, 173, + 144, 146, 148, 168, 169, 177, 178, 180, + 181, 182, 184, 185, 128, 181, 188, 191, + 150, 151, 158, 159, 152, 154, 156, 158, + 134, 135, 142, 143, 190, 255, 190, 128, + 180, 182, 188, 130, 132, 134, 140, 144, + 147, 150, 155, 160, 172, 178, 180, 182, + 188, 128, 129, 130, 131, 132, 133, 134, + 146, 147, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 140, 143, 170, 174, 177, + 191, 160, 164, 166, 175, 144, 156, 144, + 176, 130, 135, 149, 164, 166, 168, 138, + 147, 153, 157, 170, 173, 175, 185, 188, + 191, 142, 133, 137, 160, 255, 137, 255, + 182, 255, 170, 255, 128, 174, 176, 255, + 159, 165, 170, 175, 177, 180, 255, 167, + 173, 128, 165, 176, 255, 191, 168, 174, + 176, 255, 128, 150, 160, 166, 168, 174, + 176, 182, 184, 190, 128, 134, 136, 142, + 144, 150, 152, 158, 160, 191, 175, 128, + 130, 132, 133, 134, 133, 170, 175, 187, + 188, 153, 154, 133, 173, 177, 255, 143, + 159, 187, 255, 128, 146, 147, 148, 152, + 153, 154, 155, 156, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 129, + 255, 141, 255, 144, 189, 141, 143, 160, + 169, 172, 255, 191, 128, 174, 175, 178, + 180, 189, 128, 157, 158, 159, 160, 255, + 176, 177, 178, 255, 151, 159, 162, 255, + 137, 138, 174, 175, 184, 255, 183, 255, + 130, 134, 139, 163, 167, 168, 255, 128, + 179, 128, 129, 130, 179, 180, 255, 187, + 189, 133, 159, 178, 183, 184, 255, 138, + 165, 166, 173, 176, 255, 135, 147, 148, + 159, 189, 255, 128, 131, 132, 178, 179, + 255, 143, 129, 164, 166, 255, 128, 168, + 169, 182, 131, 128, 139, 140, 141, 187, + 189, 176, 178, 180, 183, 184, 190, 191, + 129, 160, 170, 171, 175, 178, 180, 181, + 182, 129, 134, 137, 142, 145, 150, 160, + 166, 168, 174, 176, 255, 155, 166, 175, + 128, 162, 163, 170, 172, 173, 158, 159, + 160, 255, 164, 175, 135, 138, 188, 255, + 172, 173, 174, 175, 180, 181, 182, 183, + 184, 185, 187, 188, 189, 190, 191, 176, + 186, 158, 190, 128, 134, 147, 151, 157, + 168, 170, 182, 184, 188, 128, 129, 131, + 132, 134, 255, 178, 255, 147, 255, 190, + 255, 144, 255, 144, 145, 136, 175, 188, + 255, 128, 143, 160, 175, 176, 180, 182, + 255, 191, 189, 255, 161, 186, 129, 154, + 158, 159, 160, 190, 130, 135, 138, 143, + 146, 151, 154, 156, 185, 187, 144, 145, + 146, 147, 148, 150, 155, 157, 158, 159, + 128, 129, 130, 131, 133, 135, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 148, + 149, 152, 156, 157, 160, 161, 162, 163, + 164, 166, 168, 169, 170, 171, 172, 173, + 174, 176, 177, 153, 155, 178, 179, 128, + 139, 141, 166, 168, 186, 188, 189, 191, + 255, 142, 143, 158, 255, 187, 255, 128, + 180, 189, 128, 156, 160, 255, 160, 145, + 255, 128, 159, 176, 255, 139, 143, 182, + 186, 187, 255, 128, 157, 160, 255, 144, + 132, 135, 150, 255, 158, 255, 128, 167, + 176, 255, 164, 255, 183, 255, 128, 149, + 160, 167, 136, 188, 128, 133, 138, 181, + 183, 184, 191, 255, 150, 159, 183, 255, + 128, 158, 160, 178, 180, 181, 128, 149, + 160, 185, 128, 183, 190, 191, 128, 191, + 129, 131, 133, 134, 140, 143, 144, 147, + 149, 151, 153, 179, 184, 186, 160, 188, + 128, 156, 128, 135, 137, 164, 165, 166, + 128, 181, 128, 149, 160, 178, 128, 145, + 128, 178, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 138, 139, 140, 141, 146, + 147, 150, 151, 152, 153, 154, 156, 162, + 163, 171, 128, 130, 131, 183, 184, 255, + 135, 190, 131, 175, 187, 188, 190, 255, + 144, 168, 128, 130, 131, 166, 167, 180, + 179, 182, 144, 178, 128, 130, 131, 178, + 179, 255, 154, 156, 129, 132, 133, 137, + 141, 255, 128, 145, 147, 171, 172, 183, + 136, 128, 134, 138, 141, 143, 157, 159, + 168, 176, 255, 159, 170, 171, 255, 189, + 128, 131, 133, 140, 143, 144, 147, 168, + 170, 176, 178, 179, 181, 185, 188, 191, + 144, 151, 128, 132, 135, 136, 139, 141, + 157, 161, 162, 163, 166, 172, 176, 180, + 128, 175, 176, 255, 134, 132, 135, 136, + 255, 128, 174, 175, 181, 184, 255, 129, + 151, 152, 155, 158, 255, 132, 129, 255, + 128, 170, 171, 183, 157, 171, 160, 255, + 160, 190, 192, 255, 128, 184, 128, 142, + 145, 149, 129, 141, 144, 146, 147, 148, + 154, 255, 175, 255, 132, 255, 128, 144, + 129, 143, 144, 153, 145, 152, 135, 255, + 160, 168, 169, 171, 172, 173, 174, 188, + 189, 190, 161, 167, 185, 255, 144, 173, + 176, 180, 128, 175, 176, 182, 128, 131, + 163, 183, 189, 255, 144, 255, 133, 143, + 145, 190, 191, 255, 143, 146, 147, 159, + 176, 177, 178, 171, 175, 189, 255, 128, + 136, 144, 153, 157, 158, 160, 163, 133, + 134, 137, 144, 145, 146, 147, 148, 149, + 154, 155, 156, 157, 158, 159, 168, 169, + 170, 150, 153, 165, 169, 173, 255, 131, + 132, 140, 169, 174, 255, 130, 132, 149, + 157, 173, 186, 188, 160, 161, 163, 164, + 167, 168, 132, 134, 149, 157, 186, 139, + 140, 191, 255, 134, 128, 132, 138, 144, + 146, 255, 166, 167, 129, 155, 187, 149, + 181, 143, 175, 137, 169, 131, 140, 255, + 128, 182, 187, 255, 173, 180, 182, 255, + 132, 155, 159, 161, 175, 160, 163, 184, + 185, 186, 161, 162, 133, 143, 144, 150, + 151, 255, 164, 167, 185, 187, 128, 131, + 133, 159, 161, 162, 169, 178, 180, 183, + 130, 135, 137, 139, 148, 151, 153, 155, + 157, 159, 164, 190, 141, 143, 145, 146, + 161, 162, 167, 170, 172, 178, 180, 183, + 185, 188, 128, 137, 139, 155, 161, 163, + 165, 169, 171, 187, 132, 133, 134, 176, + 255, 138, 143, 170, 175, 138, 255, 160, + 128, 129, 132, 135, 133, 134, 129, 160, + 255, 192, 255, 176, 255, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 48, 57, 173, 128, 255, 176, + 255, 131, 137, 191, 145, 189, 135, 129, + 130, 132, 133, 156, 128, 133, 144, 154, + 171, 176, 139, 159, 160, 169, 150, 157, + 159, 164, 167, 168, 170, 173, 176, 185, + 143, 145, 176, 255, 139, 255, 166, 176, + 128, 137, 171, 179, 160, 161, 163, 164, + 165, 167, 169, 171, 173, 174, 175, 176, + 177, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 166, 170, + 172, 178, 150, 153, 155, 163, 165, 167, + 169, 173, 153, 155, 163, 255, 189, 132, + 185, 144, 152, 161, 164, 165, 166, 175, + 176, 255, 188, 129, 131, 190, 255, 133, + 134, 137, 138, 142, 150, 152, 161, 164, + 165, 166, 175, 176, 255, 131, 134, 137, + 138, 142, 144, 146, 165, 166, 175, 178, + 180, 182, 255, 134, 138, 142, 161, 164, + 165, 166, 175, 176, 255, 188, 129, 131, + 190, 191, 128, 132, 135, 136, 139, 141, + 150, 151, 162, 163, 166, 175, 130, 190, + 191, 151, 128, 130, 134, 136, 138, 141, + 166, 175, 128, 131, 190, 255, 133, 137, + 142, 148, 151, 161, 164, 165, 166, 175, + 176, 255, 128, 132, 134, 136, 138, 141, + 149, 150, 162, 163, 166, 175, 129, 131, + 190, 255, 133, 137, 142, 150, 152, 161, + 164, 165, 166, 175, 176, 255, 130, 131, + 138, 150, 143, 148, 152, 159, 166, 175, + 178, 179, 177, 180, 186, 135, 142, 144, + 153, 177, 180, 185, 187, 188, 136, 141, + 144, 153, 181, 183, 185, 152, 153, 160, + 169, 190, 191, 177, 191, 128, 132, 134, + 135, 141, 151, 153, 188, 134, 128, 129, + 130, 141, 156, 157, 158, 159, 160, 162, + 164, 165, 167, 168, 169, 170, 172, 173, + 174, 175, 176, 177, 179, 183, 171, 190, + 128, 137, 150, 153, 158, 160, 162, 164, + 167, 173, 177, 180, 143, 130, 141, 144, + 153, 154, 157, 157, 159, 146, 148, 178, + 180, 146, 147, 178, 179, 180, 255, 148, + 156, 158, 159, 160, 169, 170, 255, 139, + 142, 144, 153, 169, 160, 171, 176, 187, + 134, 143, 144, 153, 151, 155, 191, 149, + 158, 160, 188, 128, 137, 144, 153, 176, + 190, 128, 132, 180, 255, 133, 143, 144, + 153, 154, 170, 180, 255, 128, 130, 161, + 173, 176, 185, 166, 179, 164, 183, 128, + 137, 144, 153, 173, 144, 146, 148, 168, + 178, 180, 184, 185, 128, 181, 188, 191, + 128, 129, 131, 179, 181, 183, 140, 143, + 170, 174, 160, 164, 166, 175, 144, 176, + 175, 177, 191, 160, 191, 128, 130, 170, + 175, 153, 154, 152, 153, 154, 155, 160, + 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 175, 160, 169, 175, 178, 180, + 189, 158, 159, 176, 177, 130, 134, 139, + 163, 167, 128, 129, 180, 255, 133, 143, + 144, 153, 154, 159, 178, 255, 128, 137, + 166, 173, 135, 147, 128, 131, 179, 255, + 129, 143, 144, 153, 154, 164, 166, 175, + 176, 185, 186, 255, 169, 182, 131, 140, + 141, 144, 153, 187, 189, 176, 178, 180, + 183, 184, 190, 191, 129, 171, 175, 181, + 182, 163, 170, 172, 173, 176, 185, 172, + 184, 187, 190, 191, 158, 128, 143, 160, + 175, 185, 187, 144, 145, 150, 155, 157, + 158, 135, 139, 141, 146, 168, 171, 189, + 160, 182, 186, 191, 129, 131, 133, 134, + 140, 143, 184, 186, 165, 166, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 139, + 140, 141, 146, 147, 150, 151, 152, 153, + 154, 155, 156, 163, 128, 130, 184, 255, + 135, 165, 166, 175, 176, 190, 131, 175, + 187, 188, 190, 255, 176, 185, 128, 130, + 167, 180, 182, 191, 179, 128, 130, 179, + 255, 129, 137, 141, 143, 144, 153, 154, + 255, 172, 183, 159, 170, 176, 185, 188, + 128, 131, 190, 191, 151, 128, 132, 135, + 136, 139, 141, 162, 163, 166, 172, 176, + 180, 176, 255, 132, 143, 144, 153, 154, + 255, 175, 181, 184, 255, 129, 155, 158, + 255, 129, 143, 144, 153, 154, 255, 171, + 183, 128, 137, 157, 171, 176, 185, 169, + 171, 172, 173, 189, 190, 176, 180, 176, + 182, 145, 190, 143, 146, 178, 157, 158, + 160, 163, 133, 134, 137, 159, 168, 169, + 170, 165, 169, 173, 255, 131, 132, 140, + 169, 174, 255, 130, 132, 142, 191, 128, + 182, 187, 255, 173, 180, 182, 255, 132, + 155, 159, 161, 175, 163, 144, 150, 160, + 128, 129, 132, 135, 133, 134, 129, 160, + 255, 192, 255, 170, 173, 181, 186, 128, + 255, 181, 190, 176, 183, 184, 185, 186, + 191, 192, 255, 130, 131, 137, 190, 136, + 144, 145, 191, 192, 255, 135, 179, 129, + 130, 132, 133, 144, 170, 176, 178, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 173, 128, 255, 176, + 255, 131, 137, 191, 145, 189, 135, 129, + 130, 132, 133, 144, 170, 176, 178, 170, + 173, 181, 186, 0, 127, 181, 190, 176, + 183, 184, 185, 186, 191, 192, 255, 130, + 131, 137, 190, 136, 144, 145, 191, 192, + 255, 135, 179, 129, 130, 132, 133, 144, + 170, 176, 178, 156, 128, 133, 144, 154, + 160, 191, 171, 176, 128, 138, 139, 159, + 160, 169, 174, 255, 148, 158, 169, 150, + 164, 167, 173, 176, 185, 189, 190, 192, + 255, 144, 143, 145, 146, 175, 176, 255, + 139, 140, 141, 255, 166, 176, 178, 255, + 186, 128, 137, 138, 170, 171, 179, 180, + 181, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, + 191, 154, 164, 168, 128, 149, 150, 173, + 128, 152, 153, 155, 163, 255, 189, 132, + 185, 144, 176, 152, 161, 164, 165, 166, + 175, 177, 255, 132, 169, 177, 188, 129, + 131, 141, 142, 145, 146, 179, 181, 186, + 187, 190, 255, 142, 158, 133, 134, 137, + 138, 143, 150, 152, 155, 156, 161, 164, + 165, 166, 175, 176, 177, 178, 255, 188, + 129, 131, 133, 138, 143, 144, 147, 168, + 170, 176, 178, 179, 181, 182, 184, 185, + 190, 255, 157, 131, 134, 137, 138, 142, + 144, 146, 152, 153, 158, 159, 165, 166, + 175, 178, 180, 182, 255, 189, 129, 131, + 133, 141, 143, 145, 147, 168, 170, 176, + 178, 179, 181, 185, 188, 255, 134, 138, + 144, 185, 142, 159, 160, 161, 164, 165, + 166, 175, 176, 255, 189, 129, 131, 133, + 140, 143, 144, 147, 168, 170, 176, 178, + 179, 181, 185, 188, 191, 177, 128, 132, + 135, 136, 139, 141, 150, 151, 156, 157, + 159, 161, 162, 163, 166, 175, 130, 131, + 156, 133, 138, 142, 144, 146, 149, 153, + 154, 158, 159, 163, 164, 168, 170, 174, + 185, 190, 191, 144, 151, 128, 130, 134, + 136, 138, 141, 166, 175, 189, 128, 131, + 133, 140, 142, 144, 146, 168, 170, 185, + 190, 255, 133, 137, 151, 142, 148, 152, + 154, 155, 159, 160, 161, 164, 165, 166, + 175, 176, 255, 189, 129, 131, 133, 140, + 142, 144, 146, 168, 170, 179, 181, 185, + 188, 191, 158, 128, 132, 134, 136, 138, + 141, 149, 150, 160, 161, 162, 163, 166, + 175, 177, 178, 189, 129, 131, 133, 140, + 142, 144, 146, 186, 190, 255, 133, 137, + 142, 143, 150, 152, 158, 159, 161, 164, + 165, 166, 175, 176, 185, 186, 191, 192, + 255, 189, 130, 131, 133, 150, 154, 177, + 179, 187, 138, 150, 128, 134, 143, 148, + 152, 159, 166, 175, 178, 179, 177, 180, + 186, 135, 142, 144, 153, 177, 180, 185, + 187, 188, 136, 141, 144, 153, 128, 181, + 183, 185, 152, 153, 160, 169, 190, 191, + 128, 135, 137, 172, 177, 191, 128, 132, + 134, 135, 136, 140, 141, 151, 153, 188, + 134, 128, 129, 130, 131, 137, 138, 139, + 140, 141, 142, 143, 144, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 167, 168, 169, 170, 172, 173, + 174, 175, 176, 177, 179, 181, 182, 183, + 188, 189, 190, 191, 132, 152, 180, 184, + 185, 187, 171, 190, 128, 137, 150, 153, + 158, 160, 162, 164, 167, 173, 177, 180, + 143, 130, 141, 144, 153, 154, 157, 160, + 255, 155, 156, 157, 159, 160, 255, 128, + 140, 142, 145, 146, 148, 160, 177, 178, + 180, 128, 145, 146, 147, 160, 172, 174, + 176, 178, 179, 180, 255, 148, 156, 158, + 159, 160, 169, 170, 255, 139, 142, 144, + 153, 160, 255, 169, 128, 170, 176, 255, + 128, 158, 160, 171, 176, 187, 128, 150, + 151, 155, 191, 149, 158, 160, 188, 128, + 137, 144, 153, 176, 190, 128, 132, 133, + 179, 180, 255, 133, 139, 140, 143, 144, + 153, 154, 170, 180, 255, 128, 130, 131, + 160, 161, 173, 174, 175, 176, 185, 186, + 255, 166, 179, 180, 255, 128, 163, 164, + 183, 128, 137, 141, 143, 144, 153, 154, + 189, 173, 144, 146, 148, 168, 169, 177, + 178, 180, 181, 182, 184, 185, 128, 181, + 188, 191, 128, 129, 130, 131, 132, 133, + 134, 146, 147, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 140, 143, 170, 174, + 191, 255, 165, 177, 191, 129, 147, 149, + 159, 160, 175, 176, 255, 144, 176, 165, + 170, 175, 177, 180, 255, 191, 168, 174, + 176, 255, 128, 134, 136, 142, 144, 150, + 152, 158, 160, 191, 128, 130, 132, 133, + 134, 133, 170, 175, 187, 188, 153, 154, + 128, 146, 147, 148, 152, 153, 154, 155, + 156, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 129, 255, 141, 143, + 160, 169, 172, 255, 191, 128, 174, 175, + 178, 180, 189, 128, 157, 158, 159, 160, + 255, 176, 177, 178, 255, 130, 134, 139, + 163, 167, 168, 255, 128, 129, 130, 179, + 180, 255, 187, 189, 133, 143, 144, 153, + 154, 159, 178, 183, 184, 255, 128, 137, + 138, 165, 166, 173, 176, 255, 135, 147, + 148, 159, 189, 255, 128, 131, 132, 178, + 179, 255, 143, 129, 142, 144, 153, 154, + 164, 166, 175, 176, 185, 186, 255, 128, + 168, 169, 182, 131, 128, 139, 140, 141, + 144, 153, 187, 189, 176, 178, 180, 183, + 184, 190, 191, 129, 160, 170, 171, 175, + 178, 180, 181, 182, 128, 162, 163, 170, + 172, 173, 176, 185, 172, 173, 174, 175, + 180, 181, 182, 183, 184, 185, 187, 188, + 189, 190, 191, 176, 186, 158, 190, 128, + 134, 147, 151, 157, 168, 170, 182, 184, + 188, 128, 129, 131, 132, 134, 143, 144, + 255, 128, 143, 160, 175, 179, 180, 141, + 143, 176, 180, 182, 255, 191, 189, 255, + 191, 161, 186, 158, 159, 160, 190, 130, + 135, 138, 143, 146, 151, 154, 156, 185, + 187, 144, 145, 146, 147, 148, 150, 155, + 157, 158, 159, 128, 129, 130, 131, 133, + 135, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 148, 149, 152, 156, 157, 160, + 161, 162, 163, 164, 166, 168, 169, 170, + 171, 172, 173, 174, 176, 177, 153, 155, + 178, 179, 189, 160, 145, 255, 139, 143, + 182, 186, 187, 255, 158, 159, 160, 169, + 170, 255, 128, 191, 129, 131, 133, 134, + 140, 143, 144, 147, 149, 151, 153, 179, + 184, 186, 128, 135, 137, 164, 165, 166, + 128, 129, 130, 131, 132, 133, 134, 135, + 136, 138, 139, 140, 141, 146, 147, 150, + 151, 152, 153, 154, 155, 156, 162, 163, + 171, 128, 130, 131, 183, 184, 255, 135, + 165, 166, 175, 176, 190, 131, 175, 187, + 188, 190, 255, 144, 168, 176, 185, 128, + 130, 131, 166, 167, 180, 182, 191, 179, + 182, 144, 178, 128, 130, 131, 178, 179, + 255, 155, 129, 132, 133, 137, 141, 143, + 144, 153, 154, 156, 157, 255, 128, 145, + 147, 171, 172, 183, 159, 170, 171, 175, + 176, 185, 186, 255, 189, 128, 131, 133, + 140, 143, 144, 147, 168, 170, 176, 178, + 179, 181, 185, 188, 191, 144, 151, 128, + 132, 135, 136, 139, 141, 157, 161, 162, + 163, 166, 172, 176, 180, 128, 175, 176, + 255, 134, 132, 135, 136, 143, 144, 153, + 154, 255, 128, 174, 175, 181, 184, 255, + 129, 151, 152, 155, 158, 255, 132, 129, + 143, 144, 153, 154, 255, 128, 170, 171, + 183, 157, 171, 176, 185, 160, 169, 170, + 190, 192, 255, 160, 168, 169, 171, 172, + 173, 174, 188, 189, 190, 161, 167, 128, + 158, 160, 169, 144, 173, 176, 180, 128, + 175, 176, 182, 128, 131, 144, 153, 163, + 183, 189, 255, 133, 143, 145, 190, 191, + 255, 143, 146, 147, 159, 176, 177, 178, + 128, 136, 144, 153, 157, 158, 160, 163, + 133, 134, 137, 144, 145, 146, 147, 148, + 149, 154, 155, 156, 157, 158, 159, 168, + 169, 170, 150, 153, 165, 169, 173, 255, + 131, 132, 140, 169, 174, 255, 130, 132, + 131, 140, 141, 142, 191, 192, 255, 128, + 182, 187, 255, 173, 180, 182, 255, 132, + 155, 159, 161, 175, 160, 163, 184, 185, + 186, 161, 162, 133, 143, 144, 150, 151, + 255, 160, 128, 129, 132, 135, 133, 134, + 129, 160, 255, 192, 255, 176, 255, 156, + 128, 133, 144, 154, 176, 139, 159, 150, + 157, 159, 164, 167, 168, 170, 173, 143, + 145, 176, 255, 139, 255, 166, 176, 171, + 179, 160, 161, 163, 164, 165, 167, 169, + 171, 173, 174, 175, 176, 177, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 166, 170, 172, 178, 150, + 153, 155, 163, 165, 167, 169, 173, 153, + 155, 163, 255, 189, 132, 185, 144, 152, + 161, 164, 255, 188, 129, 131, 190, 255, + 133, 134, 137, 138, 142, 150, 152, 161, + 164, 255, 131, 134, 137, 138, 142, 144, + 146, 175, 178, 180, 182, 255, 134, 138, + 142, 161, 164, 255, 188, 129, 131, 190, + 191, 128, 132, 135, 136, 139, 141, 150, + 151, 162, 163, 130, 190, 191, 151, 128, + 130, 134, 136, 138, 141, 128, 131, 190, + 255, 133, 137, 142, 148, 151, 161, 164, + 255, 128, 132, 134, 136, 138, 141, 149, + 150, 162, 163, 129, 131, 190, 255, 133, + 137, 142, 150, 152, 161, 164, 255, 130, + 131, 138, 150, 143, 148, 152, 159, 178, + 179, 177, 180, 186, 135, 142, 177, 180, + 185, 187, 188, 136, 141, 181, 183, 185, + 152, 153, 190, 191, 177, 191, 128, 132, + 134, 135, 141, 151, 153, 188, 134, 128, + 129, 130, 141, 156, 157, 158, 159, 160, + 162, 164, 168, 169, 170, 172, 173, 174, + 175, 176, 179, 183, 171, 190, 150, 153, + 158, 160, 162, 164, 167, 173, 177, 180, + 143, 130, 141, 154, 157, 157, 159, 146, + 148, 178, 180, 146, 147, 178, 179, 180, + 255, 148, 156, 158, 255, 139, 142, 169, + 160, 171, 176, 187, 151, 155, 191, 149, + 158, 160, 188, 176, 190, 128, 132, 180, + 255, 133, 170, 180, 255, 128, 130, 161, + 173, 166, 179, 164, 183, 173, 144, 146, + 148, 168, 178, 180, 184, 185, 128, 181, + 188, 191, 128, 129, 131, 179, 181, 183, + 140, 143, 170, 174, 160, 164, 166, 175, + 144, 176, 175, 177, 191, 160, 191, 128, + 130, 170, 175, 153, 154, 153, 154, 155, + 160, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 175, 175, 178, 180, 189, + 158, 159, 176, 177, 130, 134, 139, 163, + 167, 128, 129, 180, 255, 133, 159, 178, + 255, 166, 173, 135, 147, 128, 131, 179, + 255, 129, 164, 166, 255, 169, 182, 131, + 140, 141, 187, 189, 176, 178, 180, 183, + 184, 190, 191, 129, 171, 175, 181, 182, + 163, 170, 172, 173, 172, 173, 184, 187, + 190, 191, 158, 190, 157, 168, 170, 182, + 184, 188, 128, 129, 131, 132, 134, 143, + 128, 143, 160, 175, 185, 187, 144, 145, + 150, 155, 157, 158, 135, 139, 141, 168, + 171, 189, 160, 182, 186, 191, 129, 131, + 133, 134, 140, 143, 184, 186, 165, 166, + 128, 129, 130, 132, 133, 134, 135, 136, + 139, 140, 141, 146, 147, 150, 151, 152, + 153, 154, 156, 128, 130, 184, 255, 135, + 190, 131, 175, 187, 188, 190, 255, 128, + 130, 167, 180, 179, 128, 130, 179, 255, + 129, 137, 141, 255, 172, 183, 159, 170, + 188, 128, 131, 190, 191, 151, 128, 132, + 135, 136, 139, 141, 162, 163, 166, 172, + 176, 180, 176, 255, 132, 255, 175, 181, + 184, 255, 129, 155, 158, 255, 129, 255, + 171, 183, 157, 171, 171, 172, 189, 190, + 176, 180, 176, 182, 145, 190, 143, 146, + 178, 157, 158, 160, 163, 133, 134, 137, + 168, 169, 170, 165, 169, 173, 255, 131, + 132, 140, 169, 174, 255, 130, 132, 128, + 182, 187, 255, 173, 180, 182, 255, 132, + 155, 159, 161, 175, 163, 144, 150, 160, + 128, 129, 132, 135, 133, 134, 129, 160, + 255, 192, 255, 170, 173, 181, 183, 186, + 151, 173, 130, 133, 146, 159, 165, 171, + 175, 255, 128, 255, 181, 190, 176, 183, + 184, 185, 186, 191, 192, 255, 135, 140, + 134, 138, 142, 161, 163, 255, 130, 131, + 137, 190, 136, 144, 145, 191, 192, 255, + 135, 179, 180, 129, 130, 132, 133, 144, + 170, 176, 178, 156, 128, 133, 144, 154, + 160, 191, 171, 176, 128, 138, 139, 159, + 160, 169, 174, 255, 148, 158, 169, 150, + 164, 167, 173, 176, 185, 189, 190, 192, + 255, 144, 143, 145, 146, 175, 176, 255, + 139, 140, 141, 255, 166, 176, 178, 255, + 186, 128, 137, 138, 170, 171, 179, 180, + 181, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, + 191, 154, 164, 168, 128, 149, 150, 173, + 128, 152, 153, 155, 163, 255, 189, 132, + 185, 144, 176, 152, 161, 164, 165, 166, + 175, 177, 255, 132, 169, 177, 188, 129, + 131, 141, 142, 145, 146, 179, 181, 186, + 187, 190, 255, 142, 158, 133, 134, 137, + 138, 143, 150, 152, 155, 156, 161, 164, + 165, 166, 175, 176, 177, 178, 255, 188, + 129, 131, 133, 138, 143, 144, 147, 168, + 170, 176, 178, 179, 181, 182, 184, 185, + 190, 255, 157, 131, 134, 137, 138, 142, + 144, 146, 152, 153, 158, 159, 165, 166, + 175, 178, 180, 182, 255, 189, 129, 131, + 133, 141, 143, 145, 147, 168, 170, 176, + 178, 179, 181, 185, 188, 255, 134, 138, + 144, 185, 142, 159, 160, 161, 164, 165, + 166, 175, 176, 255, 189, 129, 131, 133, + 140, 143, 144, 147, 168, 170, 176, 178, + 179, 181, 185, 188, 191, 177, 128, 132, + 135, 136, 139, 141, 150, 151, 156, 157, + 159, 161, 162, 163, 166, 175, 130, 131, + 156, 133, 138, 142, 144, 146, 149, 153, + 154, 158, 159, 163, 164, 168, 170, 174, + 185, 190, 191, 144, 151, 128, 130, 134, + 136, 138, 141, 166, 175, 189, 128, 131, + 133, 140, 142, 144, 146, 168, 170, 185, + 190, 255, 133, 137, 151, 142, 148, 152, + 154, 155, 159, 160, 161, 164, 165, 166, + 175, 176, 255, 189, 129, 131, 133, 140, + 142, 144, 146, 168, 170, 179, 181, 185, + 188, 191, 158, 128, 132, 134, 136, 138, + 141, 149, 150, 160, 161, 162, 163, 166, + 175, 177, 178, 189, 129, 131, 133, 140, + 142, 144, 146, 186, 190, 255, 133, 137, + 142, 143, 150, 152, 158, 159, 161, 164, + 165, 166, 175, 176, 185, 186, 191, 192, + 255, 189, 130, 131, 133, 150, 154, 177, + 179, 187, 138, 150, 128, 134, 143, 148, + 152, 159, 166, 175, 178, 179, 177, 180, + 186, 135, 142, 144, 153, 177, 180, 185, + 187, 188, 136, 141, 144, 153, 128, 181, + 183, 185, 152, 153, 160, 169, 190, 191, + 128, 135, 137, 172, 177, 191, 128, 132, + 134, 135, 136, 140, 141, 151, 153, 188, + 134, 128, 129, 130, 131, 137, 138, 139, + 140, 141, 142, 143, 144, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 167, 168, 169, 170, 172, 173, + 174, 175, 176, 177, 179, 181, 182, 183, + 188, 189, 190, 191, 132, 152, 180, 184, + 185, 187, 171, 190, 128, 137, 150, 153, + 158, 160, 162, 164, 167, 173, 177, 180, + 143, 130, 141, 144, 153, 154, 157, 160, + 255, 155, 156, 157, 159, 160, 255, 128, + 140, 142, 145, 146, 148, 160, 177, 178, + 180, 128, 145, 146, 147, 160, 172, 174, + 176, 178, 179, 180, 255, 148, 156, 158, + 159, 160, 169, 170, 255, 139, 142, 144, + 153, 160, 255, 169, 128, 170, 176, 255, + 128, 158, 160, 171, 176, 187, 128, 150, + 151, 155, 191, 149, 158, 160, 188, 128, + 137, 144, 153, 176, 190, 128, 132, 133, + 179, 180, 255, 133, 139, 140, 143, 144, + 153, 154, 170, 180, 255, 128, 130, 131, + 160, 161, 173, 174, 175, 176, 185, 186, + 255, 166, 179, 180, 255, 128, 163, 164, + 183, 173, 144, 146, 148, 168, 169, 177, + 178, 180, 181, 182, 184, 185, 128, 181, + 188, 191, 128, 129, 130, 131, 132, 133, + 134, 146, 147, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 164, 167, 140, 143, + 152, 153, 170, 174, 191, 255, 165, 177, + 191, 129, 147, 149, 159, 160, 175, 176, + 255, 144, 176, 165, 170, 175, 177, 180, + 255, 191, 168, 174, 176, 255, 128, 134, + 136, 142, 144, 150, 152, 158, 160, 191, + 128, 130, 132, 133, 134, 133, 170, 175, + 187, 188, 153, 154, 128, 146, 147, 148, + 152, 153, 154, 155, 156, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, + 129, 255, 191, 128, 174, 175, 178, 180, + 189, 128, 157, 158, 159, 160, 255, 176, + 177, 178, 255, 130, 134, 139, 163, 167, + 168, 255, 128, 129, 130, 179, 180, 255, + 187, 189, 133, 143, 144, 153, 154, 159, + 178, 183, 184, 255, 128, 137, 138, 165, + 166, 173, 176, 255, 135, 147, 148, 159, + 189, 255, 128, 131, 132, 178, 179, 255, + 143, 129, 142, 144, 153, 154, 164, 166, + 175, 176, 185, 186, 255, 128, 168, 169, + 182, 131, 128, 139, 140, 141, 144, 153, + 187, 189, 176, 178, 180, 183, 184, 190, + 191, 129, 160, 170, 171, 175, 178, 180, + 181, 182, 128, 162, 163, 170, 172, 173, + 176, 185, 172, 173, 174, 175, 180, 181, + 182, 183, 184, 185, 187, 188, 189, 190, + 191, 176, 186, 190, 128, 134, 147, 151, + 157, 168, 170, 182, 184, 188, 147, 128, + 143, 160, 175, 179, 180, 146, 149, 141, + 143, 176, 180, 182, 255, 191, 189, 255, + 135, 142, 154, 191, 161, 186, 158, 159, + 160, 190, 130, 135, 138, 143, 146, 151, + 154, 156, 185, 187, 144, 145, 146, 147, + 148, 150, 155, 157, 158, 159, 128, 129, + 130, 131, 133, 135, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 148, 149, 152, + 156, 157, 160, 161, 162, 163, 164, 166, + 168, 169, 170, 171, 172, 173, 174, 176, + 177, 153, 155, 178, 179, 189, 160, 145, + 255, 139, 143, 182, 186, 187, 255, 128, + 191, 129, 131, 133, 134, 140, 143, 144, + 147, 149, 151, 153, 179, 184, 186, 128, + 135, 137, 164, 165, 166, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 138, 139, + 140, 141, 146, 147, 150, 151, 152, 153, + 154, 155, 156, 162, 163, 171, 128, 130, + 131, 183, 184, 255, 135, 165, 166, 175, + 176, 190, 131, 175, 187, 188, 190, 255, + 128, 130, 131, 166, 167, 180, 182, 191, + 179, 182, 144, 178, 128, 130, 131, 178, + 179, 255, 155, 129, 132, 133, 137, 141, + 143, 144, 153, 154, 156, 157, 255, 128, + 145, 147, 171, 172, 183, 159, 170, 171, + 175, 176, 185, 186, 255, 189, 128, 131, + 133, 140, 143, 144, 147, 168, 170, 176, + 178, 179, 181, 185, 188, 191, 144, 151, + 128, 132, 135, 136, 139, 141, 157, 161, + 162, 163, 166, 172, 176, 180, 128, 175, + 176, 255, 134, 132, 135, 136, 143, 144, + 153, 154, 255, 128, 174, 175, 181, 184, + 255, 129, 151, 152, 155, 158, 255, 132, + 129, 143, 144, 153, 154, 255, 128, 170, + 171, 183, 157, 171, 176, 185, 160, 168, + 169, 171, 172, 173, 174, 188, 189, 190, + 161, 167, 144, 173, 176, 180, 128, 175, + 176, 182, 133, 143, 145, 190, 191, 255, + 143, 146, 147, 159, 176, 177, 178, 128, + 136, 144, 153, 157, 158, 160, 163, 133, + 134, 137, 144, 145, 146, 147, 148, 149, + 154, 155, 156, 157, 158, 159, 168, 169, + 170, 150, 153, 165, 169, 173, 255, 131, + 132, 140, 169, 174, 255, 130, 132, 128, + 182, 187, 255, 173, 180, 182, 255, 132, + 155, 159, 161, 175, 160, 163, 184, 185, + 186, 161, 162, 133, 143, 144, 150, 151, + 255, 160, 128, 129, 132, 135, 133, 134, + 129, 160, 255, 192, 255, 176, 255, 156, + 128, 133, 144, 154, 160, 191, 171, 176, + 128, 138, 139, 159, 160, 169, 174, 255, + 148, 158, 169, 150, 164, 167, 173, 176, + 185, 189, 190, 192, 255, 144, 143, 145, + 146, 175, 176, 255, 139, 140, 141, 255, + 166, 176, 178, 255, 186, 128, 137, 138, + 170, 171, 179, 180, 181, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 154, 164, 168, + 128, 149, 150, 173, 128, 152, 153, 155, + 163, 255, 189, 132, 185, 144, 176, 152, + 161, 164, 165, 166, 175, 177, 255, 132, + 169, 177, 188, 129, 131, 141, 142, 145, + 146, 179, 181, 186, 187, 190, 255, 142, + 158, 133, 134, 137, 138, 143, 150, 152, + 155, 156, 161, 164, 165, 166, 175, 176, + 177, 178, 255, 188, 129, 131, 133, 138, + 143, 144, 147, 168, 170, 176, 178, 179, + 181, 182, 184, 185, 190, 255, 157, 131, + 134, 137, 138, 142, 144, 146, 152, 153, + 158, 159, 165, 166, 175, 178, 180, 182, + 255, 189, 129, 131, 133, 141, 143, 145, + 147, 168, 170, 176, 178, 179, 181, 185, + 188, 255, 134, 138, 144, 185, 142, 159, + 160, 161, 164, 165, 166, 175, 176, 255, + 189, 129, 131, 133, 140, 143, 144, 147, + 168, 170, 176, 178, 179, 181, 185, 188, + 191, 177, 128, 132, 135, 136, 139, 141, + 150, 151, 156, 157, 159, 161, 162, 163, + 166, 175, 130, 131, 156, 133, 138, 142, + 144, 146, 149, 153, 154, 158, 159, 163, + 164, 168, 170, 174, 185, 190, 191, 144, + 151, 128, 130, 134, 136, 138, 141, 166, + 175, 189, 128, 131, 133, 140, 142, 144, + 146, 168, 170, 185, 190, 255, 133, 137, + 151, 142, 148, 152, 154, 155, 159, 160, + 161, 164, 165, 166, 175, 176, 255, 189, + 129, 131, 133, 140, 142, 144, 146, 168, + 170, 179, 181, 185, 188, 191, 158, 128, + 132, 134, 136, 138, 141, 149, 150, 160, + 161, 162, 163, 166, 175, 177, 178, 189, + 129, 131, 133, 140, 142, 144, 146, 186, + 190, 255, 133, 137, 142, 143, 150, 152, + 158, 159, 161, 164, 165, 166, 175, 176, + 185, 186, 191, 192, 255, 189, 130, 131, + 133, 150, 154, 177, 179, 187, 138, 150, + 128, 134, 143, 148, 152, 159, 166, 175, + 178, 179, 177, 180, 186, 135, 142, 144, + 153, 177, 180, 185, 187, 188, 136, 141, + 144, 153, 128, 181, 183, 185, 152, 153, + 160, 169, 190, 191, 128, 135, 137, 172, + 177, 191, 128, 132, 134, 135, 136, 140, + 141, 151, 153, 188, 134, 128, 129, 130, + 131, 137, 138, 139, 140, 141, 142, 143, + 144, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 167, 168, + 169, 170, 172, 173, 174, 175, 176, 177, + 179, 181, 182, 183, 188, 189, 190, 191, + 132, 152, 180, 184, 185, 187, 171, 190, + 128, 137, 150, 153, 158, 160, 162, 164, + 167, 173, 177, 180, 143, 130, 141, 144, + 153, 154, 157, 160, 255, 155, 156, 157, + 159, 160, 255, 128, 140, 142, 145, 146, + 148, 160, 177, 178, 180, 128, 145, 146, + 147, 160, 172, 174, 176, 178, 179, 180, + 255, 148, 156, 158, 159, 160, 169, 170, + 255, 139, 142, 144, 153, 160, 255, 169, + 128, 170, 176, 255, 128, 158, 160, 171, + 176, 187, 128, 150, 151, 155, 191, 149, + 158, 160, 188, 128, 137, 144, 153, 176, + 190, 128, 132, 133, 179, 180, 255, 133, + 139, 140, 143, 144, 153, 154, 170, 180, + 255, 128, 130, 131, 160, 161, 173, 174, + 175, 176, 185, 186, 255, 166, 179, 180, + 255, 128, 163, 164, 183, 173, 144, 146, + 148, 168, 169, 177, 178, 180, 181, 182, + 184, 185, 128, 181, 188, 191, 128, 129, + 130, 131, 132, 133, 134, 146, 147, 176, + 177, 178, 179, 180, 181, 182, 183, 184, + 140, 143, 170, 174, 191, 255, 165, 177, + 191, 129, 147, 149, 159, 176, 255, 144, + 176, 165, 170, 175, 177, 180, 255, 191, + 168, 174, 176, 255, 128, 134, 136, 142, + 144, 150, 152, 158, 160, 191, 128, 130, + 131, 132, 133, 134, 135, 139, 140, 141, + 133, 170, 175, 177, 181, 187, 188, 173, + 128, 255, 176, 255, 131, 137, 191, 145, + 189, 135, 129, 130, 132, 133, 156, 128, + 133, 144, 154, 176, 139, 159, 150, 157, + 159, 164, 167, 168, 170, 173, 143, 145, + 176, 255, 139, 255, 166, 176, 171, 179, + 160, 161, 163, 164, 165, 167, 169, 171, + 173, 174, 175, 176, 177, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 166, 170, 172, 178, 150, 153, + 155, 163, 165, 167, 169, 173, 153, 155, + 163, 255, 189, 132, 185, 144, 152, 161, + 164, 255, 188, 129, 131, 190, 255, 133, + 134, 137, 138, 142, 150, 152, 161, 164, + 255, 131, 134, 137, 138, 142, 144, 146, + 175, 178, 180, 182, 255, 134, 138, 142, + 161, 164, 255, 188, 129, 131, 190, 191, + 128, 132, 135, 136, 139, 141, 150, 151, + 162, 163, 130, 190, 191, 151, 128, 130, + 134, 136, 138, 141, 128, 131, 190, 255, + 133, 137, 142, 148, 151, 161, 164, 255, + 128, 132, 134, 136, 138, 141, 149, 150, + 162, 163, 129, 131, 190, 255, 133, 137, + 142, 150, 152, 161, 164, 255, 130, 131, + 138, 150, 143, 148, 152, 159, 178, 179, + 177, 180, 186, 135, 142, 177, 180, 185, + 187, 188, 136, 141, 181, 183, 185, 152, + 153, 190, 191, 177, 191, 128, 132, 134, + 135, 141, 151, 153, 188, 134, 128, 129, + 130, 141, 156, 157, 158, 159, 160, 162, + 164, 168, 169, 170, 172, 173, 174, 175, + 176, 179, 183, 171, 190, 150, 153, 158, + 160, 162, 164, 167, 173, 177, 180, 143, + 130, 141, 154, 157, 157, 159, 146, 148, + 178, 180, 146, 147, 178, 179, 180, 255, + 148, 156, 158, 255, 139, 142, 169, 160, + 171, 176, 187, 151, 155, 191, 149, 158, + 160, 188, 176, 190, 128, 132, 180, 255, + 133, 170, 180, 255, 128, 130, 161, 173, + 166, 179, 164, 183, 173, 144, 146, 148, + 168, 178, 180, 184, 185, 128, 181, 188, + 191, 128, 129, 131, 179, 181, 183, 140, + 143, 170, 174, 191, 255, 165, 129, 147, + 149, 159, 160, 175, 176, 255, 144, 176, + 175, 177, 191, 160, 191, 128, 130, 131, + 135, 139, 140, 141, 170, 175, 177, 181, + 153, 156, 160, 255, 187, 192, 255, 176, + 191, 144, 190, 152, 255, 153, 154, 155, + 160, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 175, 175, 178, 180, 189, + 158, 159, 176, 177, 130, 134, 139, 163, + 167, 128, 129, 180, 255, 133, 159, 178, + 255, 166, 173, 135, 147, 128, 131, 179, + 255, 129, 164, 166, 255, 169, 182, 131, + 140, 141, 187, 189, 176, 178, 180, 183, + 184, 190, 191, 129, 171, 175, 181, 182, + 163, 170, 172, 173, 172, 184, 185, 187, + 188, 189, 190, 191, 158, 128, 143, 160, + 175, 179, 180, 141, 143, 191, 166, 255, + 160, 255, 185, 187, 144, 145, 150, 155, + 157, 158, 135, 139, 141, 168, 171, 189, + 160, 182, 186, 191, 129, 131, 133, 134, + 140, 143, 184, 186, 165, 166, 128, 129, + 130, 132, 133, 134, 135, 136, 139, 140, + 141, 146, 147, 150, 151, 152, 153, 154, + 156, 128, 130, 184, 255, 135, 190, 131, + 175, 187, 188, 190, 255, 128, 130, 167, + 180, 179, 128, 130, 179, 255, 129, 137, + 141, 255, 172, 183, 159, 170, 188, 128, + 131, 190, 191, 151, 128, 132, 135, 136, + 139, 141, 162, 163, 166, 172, 176, 180, + 176, 255, 132, 255, 175, 181, 184, 255, + 129, 155, 158, 255, 129, 255, 171, 183, + 157, 171, 171, 172, 189, 190, 176, 180, + 176, 182, 145, 190, 143, 146, 128, 178, + 128, 157, 158, 160, 163, 133, 134, 137, + 168, 169, 170, 165, 169, 173, 255, 131, + 132, 140, 169, 174, 255, 130, 132, 128, + 182, 187, 255, 173, 180, 182, 255, 132, + 155, 159, 161, 175, 163, 144, 150, 160, + 128, 129, 132, 135, 133, 134, 129, 160, + 255, 192, 255, 153, 154, 155, 156, 160, + 255, 128, 146, 147, 148, 152, 153, 154, + 155, 156, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 129, 255, 191, + 128, 174, 175, 178, 180, 189, 128, 157, + 158, 159, 160, 255, 176, 177, 178, 255, + 130, 134, 139, 163, 167, 168, 255, 128, + 129, 130, 179, 180, 255, 187, 189, 133, + 143, 144, 153, 154, 159, 178, 183, 184, + 255, 128, 137, 138, 165, 166, 173, 176, + 255, 135, 147, 148, 159, 189, 255, 128, + 131, 132, 178, 179, 255, 143, 129, 142, + 144, 153, 154, 164, 166, 175, 176, 185, + 186, 255, 128, 168, 169, 182, 131, 128, + 139, 140, 141, 144, 153, 187, 189, 176, + 178, 180, 183, 184, 190, 191, 129, 160, + 170, 171, 175, 178, 180, 181, 182, 128, + 162, 163, 170, 172, 173, 176, 185, 172, + 173, 174, 175, 180, 181, 182, 183, 184, + 185, 187, 188, 189, 190, 191, 176, 186, + 158, 190, 128, 134, 147, 151, 157, 168, + 170, 182, 184, 188, 128, 143, 160, 175, + 179, 180, 191, 189, 255, 129, 154, 166, + 255, 158, 159, 160, 190, 191, 255, 130, + 135, 138, 143, 146, 151, 154, 156, 185, + 187, 144, 145, 146, 147, 148, 150, 155, + 157, 158, 159, 128, 129, 130, 131, 133, + 135, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 148, 149, 152, 156, 157, 160, + 161, 162, 163, 164, 166, 168, 169, 170, + 171, 172, 173, 174, 176, 177, 153, 155, + 178, 179, 189, 160, 145, 255, 139, 143, + 182, 186, 187, 255, 128, 191, 129, 131, + 133, 134, 140, 143, 144, 147, 149, 151, + 153, 179, 184, 186, 128, 135, 137, 164, + 165, 166, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 138, 139, 140, 141, 146, + 147, 150, 151, 152, 153, 154, 155, 156, + 162, 163, 171, 128, 130, 131, 183, 184, + 255, 135, 165, 166, 175, 176, 190, 131, + 175, 187, 188, 190, 255, 128, 130, 131, + 166, 167, 180, 182, 191, 179, 182, 144, + 178, 128, 130, 131, 178, 179, 255, 155, + 129, 132, 133, 137, 141, 143, 144, 153, + 154, 156, 157, 255, 128, 145, 147, 171, + 172, 183, 159, 170, 171, 175, 176, 185, + 186, 255, 189, 128, 131, 133, 140, 143, + 144, 147, 168, 170, 176, 178, 179, 181, + 185, 188, 191, 144, 151, 128, 132, 135, + 136, 139, 141, 157, 161, 162, 163, 166, + 172, 176, 180, 128, 175, 176, 255, 134, + 132, 135, 136, 143, 144, 153, 154, 255, + 128, 174, 175, 181, 184, 255, 129, 151, + 152, 155, 158, 255, 132, 129, 143, 144, + 153, 154, 255, 128, 170, 171, 183, 157, + 171, 176, 185, 160, 168, 169, 171, 172, + 173, 174, 188, 189, 190, 161, 167, 144, + 173, 176, 180, 128, 175, 176, 182, 133, + 143, 145, 190, 191, 255, 143, 146, 147, + 159, 128, 176, 177, 178, 128, 136, 144, + 153, 157, 158, 160, 163, 133, 134, 137, + 144, 145, 146, 147, 148, 149, 154, 155, + 156, 157, 158, 159, 168, 169, 170, 150, + 153, 165, 169, 173, 255, 131, 132, 140, + 169, 174, 255, 130, 132, 128, 182, 187, + 255, 173, 180, 182, 255, 132, 155, 159, + 161, 175, 160, 163, 184, 185, 186, 161, + 162, 133, 143, 144, 150, 151, 255, 160, + 128, 129, 132, 135, 133, 134, 129, 160, + 255, 192, 255, 176, 255, 170, 173, 181, + 186, 0, 127, 181, 190, 176, 183, 184, + 185, 186, 191, 192, 255, 130, 131, 137, + 137, 190, 136, 144, 145, 191, 192, 255, + 135, 179, 129, 130, 132, 133, 144, 170, + 176, 178, 156, 128, 133, 140, 141, 144, + 154, 160, 191, 171, 172, 176, 128, 138, + 139, 169, 174, 255, 148, 158, 169, 150, + 164, 167, 173, 176, 185, 189, 190, 192, + 255, 144, 143, 145, 146, 175, 176, 255, + 139, 140, 141, 255, 166, 176, 178, 255, + 184, 186, 128, 137, 138, 170, 171, 179, + 180, 181, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 154, 164, 168, 128, 149, 150, + 173, 128, 152, 153, 155, 163, 255, 189, + 132, 185, 144, 176, 152, 161, 164, 165, + 177, 255, 132, 169, 177, 188, 129, 131, + 141, 142, 145, 146, 179, 181, 186, 187, + 190, 255, 142, 158, 133, 134, 137, 138, + 143, 150, 152, 155, 156, 161, 164, 165, + 176, 177, 178, 255, 188, 129, 131, 133, + 138, 143, 144, 147, 168, 170, 176, 178, + 179, 181, 182, 184, 185, 190, 255, 157, + 131, 134, 137, 138, 142, 144, 146, 152, + 153, 158, 159, 165, 178, 180, 182, 255, + 189, 129, 131, 133, 141, 143, 145, 147, + 168, 170, 176, 178, 179, 181, 185, 188, + 255, 134, 138, 144, 185, 142, 159, 160, + 161, 164, 165, 176, 255, 189, 129, 131, + 133, 140, 143, 144, 147, 168, 170, 176, + 178, 179, 181, 185, 188, 191, 177, 128, + 132, 135, 136, 139, 141, 150, 151, 156, + 157, 159, 161, 162, 163, 166, 175, 130, + 131, 156, 133, 138, 142, 144, 146, 149, + 153, 154, 158, 159, 163, 164, 168, 170, + 174, 185, 190, 191, 144, 151, 128, 130, + 134, 136, 138, 141, 166, 175, 189, 128, + 131, 133, 140, 142, 144, 146, 168, 170, + 185, 190, 255, 133, 137, 151, 142, 148, + 152, 154, 155, 159, 160, 161, 164, 165, + 176, 255, 189, 129, 131, 133, 140, 142, + 144, 146, 168, 170, 179, 181, 185, 188, + 191, 158, 128, 132, 134, 136, 138, 141, + 149, 150, 160, 161, 162, 163, 166, 175, + 177, 178, 189, 129, 131, 133, 140, 142, + 144, 146, 186, 190, 255, 133, 137, 142, + 143, 150, 152, 158, 159, 161, 164, 165, + 176, 185, 186, 191, 192, 255, 189, 130, + 131, 133, 150, 154, 177, 179, 187, 138, + 150, 128, 134, 143, 148, 152, 159, 166, + 175, 178, 179, 177, 180, 186, 135, 142, + 144, 153, 177, 180, 185, 187, 188, 136, + 141, 144, 153, 128, 181, 183, 185, 152, + 153, 160, 169, 190, 191, 128, 135, 137, + 172, 177, 191, 128, 132, 134, 135, 136, + 140, 141, 151, 153, 188, 134, 128, 129, + 130, 131, 137, 138, 139, 140, 141, 142, + 143, 144, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 167, + 168, 169, 170, 172, 173, 174, 175, 176, + 177, 179, 181, 182, 183, 188, 189, 190, + 191, 132, 152, 180, 184, 185, 187, 171, + 190, 128, 137, 150, 153, 158, 160, 162, + 164, 167, 173, 177, 180, 130, 141, 143, + 157, 160, 255, 155, 156, 157, 159, 160, + 255, 128, 140, 142, 145, 146, 148, 160, + 177, 178, 180, 128, 145, 146, 147, 160, + 172, 174, 176, 178, 179, 180, 255, 148, + 156, 158, 159, 170, 255, 139, 142, 144, + 153, 160, 255, 169, 128, 170, 176, 255, + 128, 158, 160, 171, 176, 187, 128, 150, + 151, 155, 191, 149, 158, 160, 188, 128, + 137, 144, 153, 176, 190, 128, 132, 133, + 179, 180, 255, 133, 139, 140, 143, 154, + 170, 180, 255, 128, 130, 131, 160, 161, + 173, 174, 175, 176, 185, 186, 255, 166, + 179, 180, 255, 128, 163, 164, 183, 173, + 144, 146, 148, 168, 169, 177, 178, 180, + 181, 182, 184, 185, 128, 181, 188, 191, + 128, 129, 130, 131, 132, 133, 134, 146, + 147, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 164, 140, 143, 152, 153, 170, + 174, 191, 255, 132, 165, 177, 191, 129, + 147, 149, 159, 160, 175, 176, 255, 144, + 176, 165, 170, 175, 177, 180, 255, 191, + 168, 174, 176, 255, 128, 134, 136, 142, + 144, 150, 152, 158, 160, 191, 128, 130, + 132, 133, 134, 133, 170, 175, 187, 188, + 153, 154, 128, 146, 147, 148, 152, 153, + 154, 155, 156, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 129, 255, + 191, 128, 174, 175, 178, 180, 189, 128, + 157, 158, 159, 160, 255, 176, 177, 178, + 255, 130, 134, 139, 163, 167, 168, 255, + 128, 129, 130, 179, 180, 255, 187, 189, + 133, 143, 154, 159, 178, 183, 184, 255, + 128, 137, 138, 165, 166, 173, 176, 255, + 135, 147, 148, 159, 189, 255, 128, 131, + 132, 178, 179, 255, 143, 129, 142, 154, + 164, 166, 175, 186, 255, 128, 168, 169, + 182, 131, 128, 139, 140, 141, 144, 153, + 187, 189, 176, 178, 180, 183, 184, 190, + 191, 129, 160, 170, 171, 175, 178, 180, + 181, 182, 128, 162, 163, 170, 172, 173, + 176, 185, 172, 173, 174, 175, 180, 181, + 182, 183, 184, 185, 187, 188, 189, 190, + 191, 176, 186, 158, 190, 128, 134, 147, + 151, 157, 168, 170, 182, 184, 188, 144, + 148, 128, 143, 160, 175, 179, 180, 144, + 146, 148, 141, 143, 176, 180, 182, 255, + 191, 189, 255, 135, 140, 142, 155, 191, + 161, 186, 158, 159, 160, 190, 130, 135, + 138, 143, 146, 151, 154, 156, 185, 187, + 144, 145, 146, 147, 148, 150, 155, 157, + 158, 159, 128, 129, 130, 131, 133, 135, + 138, 139, 140, 141, 142, 143, 144, 145, + 146, 148, 149, 152, 156, 157, 160, 161, + 162, 163, 164, 166, 168, 169, 170, 171, + 172, 173, 174, 176, 177, 153, 155, 178, + 179, 189, 160, 145, 255, 139, 143, 182, + 186, 187, 255, 128, 191, 129, 131, 133, + 134, 140, 143, 144, 147, 149, 151, 153, + 179, 184, 186, 128, 135, 137, 164, 165, + 166, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 138, 139, 140, 141, 146, 147, + 150, 151, 152, 153, 154, 155, 156, 162, + 163, 171, 128, 130, 131, 183, 184, 255, + 135, 165, 176, 190, 131, 175, 187, 188, + 190, 255, 128, 130, 131, 166, 167, 180, + 182, 191, 179, 182, 144, 178, 128, 130, + 131, 178, 179, 255, 155, 129, 132, 133, + 137, 141, 143, 154, 156, 157, 255, 128, + 145, 147, 171, 172, 183, 159, 170, 171, + 175, 176, 185, 186, 255, 189, 128, 131, + 133, 140, 143, 144, 147, 168, 170, 176, + 178, 179, 181, 185, 188, 191, 144, 151, + 128, 132, 135, 136, 139, 141, 157, 161, + 162, 163, 166, 172, 176, 180, 128, 175, + 176, 255, 134, 132, 135, 136, 143, 154, + 255, 128, 174, 175, 181, 184, 255, 129, + 151, 152, 155, 158, 255, 132, 129, 143, + 154, 255, 128, 170, 171, 183, 157, 171, + 176, 185, 160, 168, 169, 171, 172, 173, + 174, 188, 189, 190, 161, 167, 144, 173, + 176, 180, 128, 175, 176, 182, 133, 143, + 145, 190, 191, 255, 143, 146, 147, 159, + 176, 177, 178, 128, 136, 144, 153, 157, + 158, 160, 163, 133, 134, 137, 144, 145, + 146, 147, 148, 149, 154, 155, 156, 157, + 158, 159, 168, 169, 170, 150, 153, 165, + 169, 173, 255, 131, 132, 140, 169, 174, + 255, 130, 132, 128, 182, 187, 255, 173, + 180, 182, 255, 132, 155, 159, 161, 175, + 160, 163, 184, 185, 186, 161, 162, 133, + 143, 144, 150, 151, 255, 160, 128, 129, + 132, 135, 133, 134, 129, 160, 255, 192, + 255, 176, 255, 170, 173, 181, 183, 186, + 181, 190, 184, 185, 192, 255, 130, 190, + 136, 144, 192, 255, 135, 179, 180, 129, + 130, 132, 133, 144, 170, 176, 178, 156, + 128, 133, 144, 154, 160, 191, 171, 128, + 159, 160, 169, 174, 255, 148, 158, 169, + 176, 185, 189, 190, 192, 255, 143, 255, + 139, 140, 186, 128, 137, 138, 181, 160, + 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 128, + 173, 128, 155, 163, 255, 176, 164, 165, + 166, 175, 132, 169, 177, 141, 142, 145, + 146, 179, 181, 186, 187, 158, 133, 134, + 137, 138, 143, 150, 152, 155, 164, 165, + 166, 175, 178, 255, 188, 129, 131, 133, + 138, 143, 144, 147, 168, 170, 176, 178, + 179, 181, 182, 184, 185, 190, 255, 157, + 131, 134, 137, 138, 142, 144, 146, 152, + 159, 165, 166, 175, 182, 255, 129, 131, + 133, 141, 143, 145, 147, 168, 170, 176, + 178, 179, 181, 185, 188, 255, 134, 138, + 142, 143, 145, 159, 164, 165, 166, 175, + 176, 184, 186, 255, 129, 131, 133, 140, + 143, 144, 147, 168, 170, 176, 178, 179, + 181, 185, 188, 191, 177, 128, 132, 135, + 136, 139, 141, 150, 151, 156, 157, 159, + 163, 166, 175, 156, 130, 131, 133, 138, + 142, 144, 146, 149, 153, 154, 158, 159, + 163, 164, 168, 170, 174, 185, 190, 191, + 144, 151, 128, 130, 134, 136, 138, 141, + 166, 175, 128, 131, 133, 140, 142, 144, + 146, 168, 170, 185, 189, 255, 133, 137, + 151, 142, 148, 155, 159, 164, 165, 166, + 175, 176, 255, 129, 131, 133, 140, 142, + 144, 146, 168, 170, 179, 181, 185, 188, + 191, 158, 128, 132, 134, 136, 138, 141, + 149, 150, 160, 163, 166, 175, 177, 178, + 129, 131, 133, 140, 142, 144, 146, 186, + 189, 255, 133, 137, 143, 150, 152, 158, + 164, 165, 166, 175, 176, 185, 192, 255, + 189, 130, 131, 133, 150, 154, 177, 179, + 187, 138, 150, 128, 134, 143, 148, 152, + 159, 166, 175, 178, 179, 177, 180, 186, + 135, 142, 144, 153, 177, 180, 185, 187, + 188, 136, 141, 144, 153, 128, 181, 183, + 185, 152, 153, 160, 169, 190, 191, 128, + 135, 137, 172, 177, 191, 128, 132, 134, + 151, 153, 188, 134, 128, 129, 130, 131, + 137, 138, 139, 140, 141, 142, 143, 144, + 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 167, 168, 169, + 170, 172, 173, 174, 175, 176, 177, 179, + 181, 182, 183, 188, 189, 190, 191, 132, + 152, 180, 184, 185, 187, 171, 190, 128, + 137, 150, 153, 158, 160, 162, 164, 167, + 173, 177, 180, 143, 130, 141, 144, 153, + 154, 157, 160, 255, 155, 156, 160, 255, + 128, 140, 142, 148, 160, 180, 128, 147, + 160, 172, 174, 176, 178, 179, 180, 255, + 148, 156, 158, 159, 160, 169, 170, 255, + 139, 142, 144, 153, 160, 255, 128, 170, + 176, 255, 128, 158, 160, 171, 176, 187, + 191, 149, 158, 160, 188, 128, 137, 144, + 153, 176, 190, 140, 143, 144, 153, 154, + 170, 180, 255, 128, 175, 176, 185, 186, + 255, 180, 255, 128, 183, 144, 146, 148, + 182, 184, 185, 128, 181, 188, 191, 128, + 129, 130, 131, 132, 133, 134, 146, 147, + 176, 177, 178, 179, 180, 181, 182, 183, + 184, 164, 167, 140, 143, 152, 153, 170, + 174, 191, 255, 165, 176, 191, 129, 147, + 149, 159, 160, 177, 178, 255, 144, 176, + 165, 170, 180, 255, 168, 174, 176, 190, + 192, 255, 128, 134, 136, 142, 144, 150, + 152, 158, 160, 191, 128, 130, 132, 133, + 134, 133, 170, 175, 187, 188, 153, 154, + 128, 146, 147, 148, 152, 153, 154, 155, + 156, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 129, 255, 191, 128, + 178, 180, 189, 168, 255, 188, 133, 143, + 144, 153, 154, 159, 184, 186, 190, 255, + 128, 137, 138, 173, 176, 255, 148, 159, + 189, 255, 129, 142, 144, 153, 154, 164, + 166, 175, 176, 185, 186, 255, 128, 182, + 128, 141, 144, 153, 187, 189, 176, 178, + 180, 183, 184, 190, 191, 129, 160, 175, + 178, 182, 128, 170, 172, 173, 176, 185, + 172, 173, 174, 175, 180, 181, 182, 183, + 184, 185, 187, 188, 189, 190, 191, 176, + 186, 158, 190, 128, 134, 147, 151, 157, + 168, 170, 182, 184, 188, 147, 128, 143, + 160, 175, 179, 180, 189, 190, 192, 255, + 158, 190, 130, 135, 138, 143, 146, 151, + 154, 156, 185, 187, 144, 145, 146, 147, + 148, 150, 155, 157, 158, 159, 128, 129, + 130, 131, 133, 135, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 148, 149, 152, + 156, 157, 160, 161, 162, 163, 164, 166, + 168, 169, 170, 171, 172, 173, 174, 176, + 177, 153, 155, 178, 179, 189, 145, 159, + 161, 255, 139, 143, 187, 255, 191, 128, + 131, 133, 134, 140, 147, 149, 151, 153, + 179, 184, 186, 128, 135, 137, 166, 129, + 130, 131, 132, 133, 135, 136, 138, 139, + 140, 141, 146, 147, 150, 151, 152, 153, + 154, 155, 156, 162, 163, 171, 128, 134, + 135, 165, 166, 175, 176, 190, 187, 188, + 190, 255, 128, 180, 182, 191, 182, 144, + 179, 155, 133, 137, 141, 143, 144, 153, + 157, 255, 128, 145, 147, 183, 171, 175, + 176, 185, 186, 255, 128, 131, 133, 140, + 143, 144, 147, 168, 170, 176, 178, 179, + 181, 185, 188, 191, 144, 151, 128, 132, + 135, 136, 139, 141, 157, 163, 166, 172, + 176, 180, 134, 136, 143, 144, 153, 154, + 255, 128, 181, 184, 255, 129, 151, 158, + 255, 129, 131, 133, 143, 144, 153, 154, + 255, 157, 171, 176, 185, 160, 168, 169, + 171, 172, 173, 174, 188, 189, 190, 161, + 167, 144, 173, 176, 180, 133, 143, 191, + 255, 143, 159, 176, 177, 178, 128, 136, + 144, 153, 157, 158, 160, 163, 133, 134, + 137, 144, 145, 146, 147, 148, 149, 154, + 155, 156, 157, 158, 159, 168, 169, 170, + 150, 153, 165, 169, 173, 255, 131, 132, + 140, 169, 174, 255, 130, 132, 128, 182, + 187, 255, 173, 180, 182, 255, 132, 155, + 159, 161, 175, 160, 163, 184, 185, 186, + 161, 162, 133, 143, 151, 255, 160, 128, + 129, 132, 135, 133, 134, 129, 160, 255, + 176, 255, 170, 173, 181, 186, 128, 255, + 181, 190, 176, 183, 184, 185, 186, 191, + 192, 255, 130, 131, 137, 190, 136, 144, + 145, 191, 192, 255, 135, 179, 129, 130, + 132, 133, 144, 170, 176, 178, 156, 128, + 133, 144, 154, 160, 191, 171, 176, 128, + 138, 139, 159, 160, 169, 174, 255, 148, + 158, 169, 150, 164, 167, 173, 176, 185, + 189, 190, 192, 255, 144, 143, 145, 146, + 175, 176, 255, 139, 140, 141, 255, 166, + 176, 178, 255, 186, 128, 137, 138, 170, + 171, 179, 180, 181, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 154, 164, 168, 128, + 149, 150, 173, 128, 152, 153, 155, 163, + 255, 189, 132, 185, 144, 176, 152, 161, + 164, 165, 166, 175, 177, 255, 132, 169, + 177, 188, 129, 131, 141, 142, 145, 146, + 179, 181, 186, 187, 190, 255, 142, 158, + 133, 134, 137, 138, 143, 150, 152, 155, + 156, 161, 164, 165, 166, 175, 176, 177, + 178, 255, 188, 129, 131, 133, 138, 143, + 144, 147, 168, 170, 176, 178, 179, 181, + 182, 184, 185, 190, 255, 157, 131, 134, + 137, 138, 142, 144, 146, 152, 153, 158, + 159, 165, 166, 175, 178, 180, 182, 255, + 189, 129, 131, 133, 141, 143, 145, 147, + 168, 170, 176, 178, 179, 181, 185, 188, + 255, 134, 138, 144, 185, 142, 159, 160, + 161, 164, 165, 166, 175, 176, 255, 189, + 129, 131, 133, 140, 143, 144, 147, 168, + 170, 176, 178, 179, 181, 185, 188, 191, + 177, 128, 132, 135, 136, 139, 141, 150, + 151, 156, 157, 159, 161, 162, 163, 166, + 175, 130, 131, 156, 133, 138, 142, 144, + 146, 149, 153, 154, 158, 159, 163, 164, + 168, 170, 174, 185, 190, 191, 144, 151, + 128, 130, 134, 136, 138, 141, 166, 175, + 189, 128, 131, 133, 140, 142, 144, 146, + 168, 170, 185, 190, 255, 133, 137, 151, + 142, 148, 152, 154, 155, 159, 160, 161, + 164, 165, 166, 175, 176, 255, 189, 129, + 131, 133, 140, 142, 144, 146, 168, 170, + 179, 181, 185, 188, 191, 158, 128, 132, + 134, 136, 138, 141, 149, 150, 160, 161, + 162, 163, 166, 175, 177, 178, 189, 129, + 131, 133, 140, 142, 144, 146, 186, 190, + 255, 133, 137, 142, 143, 150, 152, 158, + 159, 161, 164, 165, 166, 175, 176, 185, + 186, 191, 192, 255, 189, 130, 131, 133, + 150, 154, 177, 179, 187, 138, 150, 128, + 134, 143, 148, 152, 159, 166, 175, 178, + 179, 177, 180, 186, 135, 142, 144, 153, + 177, 180, 185, 187, 188, 136, 141, 144, + 153, 128, 181, 183, 185, 152, 153, 160, + 169, 190, 191, 128, 135, 137, 172, 177, + 191, 128, 132, 134, 135, 136, 140, 141, + 151, 153, 188, 134, 128, 129, 130, 131, + 137, 138, 139, 140, 141, 142, 143, 144, + 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 167, 168, 169, + 170, 172, 173, 174, 175, 176, 177, 179, + 181, 182, 183, 188, 189, 190, 191, 132, + 152, 180, 184, 185, 187, 171, 190, 128, + 137, 150, 153, 158, 160, 162, 164, 167, + 173, 177, 180, 143, 130, 141, 144, 153, + 154, 157, 160, 255, 155, 156, 157, 159, + 160, 255, 128, 140, 142, 145, 146, 148, + 160, 177, 178, 180, 128, 145, 146, 147, + 160, 172, 174, 176, 178, 179, 180, 255, + 148, 156, 158, 159, 160, 169, 170, 255, + 139, 142, 144, 153, 160, 255, 169, 128, + 170, 176, 255, 128, 158, 160, 171, 176, + 187, 134, 143, 144, 153, 128, 150, 151, + 155, 191, 149, 158, 160, 188, 128, 137, + 144, 153, 176, 190, 128, 132, 133, 179, + 180, 255, 133, 139, 140, 143, 144, 153, + 154, 170, 180, 255, 128, 130, 131, 160, + 161, 173, 174, 175, 176, 185, 186, 255, + 166, 179, 180, 255, 128, 163, 164, 183, + 128, 137, 141, 143, 144, 153, 154, 189, + 173, 144, 146, 148, 168, 169, 177, 178, + 180, 181, 182, 184, 185, 128, 181, 188, + 191, 128, 129, 130, 131, 132, 133, 134, + 146, 147, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 140, 143, 170, 174, 191, + 255, 165, 177, 191, 129, 147, 149, 159, + 176, 255, 144, 176, 165, 170, 175, 177, + 180, 255, 191, 168, 174, 176, 255, 128, + 134, 136, 142, 144, 150, 152, 158, 160, + 191, 128, 130, 131, 132, 133, 134, 135, + 139, 140, 141, 133, 170, 175, 177, 181, + 187, 188, 153, 154, 155, 156, 160, 255, + 128, 146, 147, 148, 152, 153, 154, 155, + 156, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 129, 255, 141, 143, + 160, 169, 172, 255, 191, 128, 174, 175, + 178, 180, 189, 128, 157, 158, 159, 160, + 255, 176, 177, 178, 255, 130, 134, 139, + 163, 167, 168, 255, 128, 129, 130, 179, + 180, 255, 187, 189, 133, 143, 144, 153, + 154, 159, 178, 183, 184, 255, 128, 137, + 138, 165, 166, 173, 176, 255, 135, 147, + 148, 159, 189, 255, 128, 131, 132, 178, + 179, 255, 143, 129, 142, 144, 153, 154, + 164, 166, 175, 176, 185, 186, 255, 128, + 168, 169, 182, 131, 128, 139, 140, 141, + 144, 153, 187, 189, 176, 178, 180, 183, + 184, 190, 191, 129, 160, 170, 171, 175, + 178, 180, 181, 182, 128, 162, 163, 170, + 172, 173, 176, 185, 172, 173, 174, 175, + 180, 181, 182, 183, 184, 185, 187, 188, + 189, 190, 191, 176, 186, 158, 190, 128, + 134, 147, 151, 157, 168, 170, 182, 184, + 188, 128, 143, 160, 175, 179, 180, 141, + 143, 176, 180, 182, 255, 191, 189, 255, + 191, 161, 186, 158, 159, 160, 190, 191, + 255, 130, 135, 138, 143, 146, 151, 154, + 156, 185, 187, 144, 145, 146, 147, 148, + 150, 155, 157, 158, 159, 128, 129, 130, + 131, 133, 135, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 148, 149, 152, 156, + 157, 160, 161, 162, 163, 164, 166, 168, + 169, 170, 171, 172, 173, 174, 176, 177, + 153, 155, 178, 179, 189, 160, 145, 255, + 139, 143, 182, 186, 187, 255, 158, 159, + 160, 169, 170, 255, 128, 191, 129, 131, + 133, 134, 140, 143, 144, 147, 149, 151, + 153, 179, 184, 186, 128, 135, 137, 164, + 165, 166, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 138, 139, 140, 141, 146, + 147, 150, 151, 152, 153, 154, 155, 156, + 162, 163, 171, 128, 130, 131, 183, 184, + 255, 135, 165, 166, 175, 176, 190, 131, + 175, 187, 188, 190, 255, 144, 168, 176, + 185, 128, 130, 131, 166, 167, 180, 182, + 191, 179, 182, 144, 178, 128, 130, 131, + 178, 179, 255, 155, 129, 132, 133, 137, + 141, 143, 144, 153, 154, 156, 157, 255, + 128, 145, 147, 171, 172, 183, 159, 170, + 171, 175, 176, 185, 186, 255, 189, 128, + 131, 133, 140, 143, 144, 147, 168, 170, + 176, 178, 179, 181, 185, 188, 191, 144, + 151, 128, 132, 135, 136, 139, 141, 157, + 161, 162, 163, 166, 172, 176, 180, 128, + 175, 176, 255, 134, 132, 135, 136, 143, + 144, 153, 154, 255, 128, 174, 175, 181, + 184, 255, 129, 151, 152, 155, 158, 255, + 132, 129, 143, 144, 153, 154, 255, 128, + 170, 171, 183, 128, 137, 157, 171, 176, + 185, 160, 169, 170, 190, 192, 255, 160, + 168, 169, 171, 172, 173, 174, 188, 189, + 190, 161, 167, 128, 158, 160, 169, 144, + 173, 176, 180, 128, 175, 176, 182, 128, + 131, 144, 153, 163, 183, 189, 255, 133, + 143, 145, 190, 191, 255, 143, 146, 147, + 159, 128, 176, 177, 178, 128, 136, 144, + 153, 157, 158, 160, 163, 133, 134, 137, + 144, 145, 146, 147, 148, 149, 154, 155, + 156, 157, 158, 159, 168, 169, 170, 150, + 153, 165, 169, 173, 255, 131, 132, 140, + 169, 174, 255, 130, 132, 131, 140, 141, + 142, 191, 192, 255, 128, 182, 187, 255, + 173, 180, 182, 255, 132, 155, 159, 161, + 175, 160, 163, 184, 185, 186, 161, 162, + 133, 143, 144, 150, 151, 255, 160, 128, + 129, 132, 135, 133, 134, 129, 160, 255, + 192, 255, 176, 255, 170, 173, 181, 186, + 128, 255, 181, 190, 176, 183, 184, 185, + 186, 191, 192, 255, 130, 131, 137, 137, + 190, 136, 144, 145, 191, 192, 255, 135, + 179, 129, 130, 132, 133, 144, 170, 176, + 178, 156, 128, 133, 140, 141, 144, 154, + 160, 191, 171, 172, 176, 128, 138, 139, + 169, 174, 255, 148, 158, 169, 150, 164, + 167, 173, 176, 185, 189, 190, 192, 255, + 144, 143, 145, 146, 175, 176, 255, 139, + 140, 141, 255, 166, 176, 178, 255, 184, + 186, 128, 137, 138, 170, 171, 179, 180, + 181, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, + 191, 154, 164, 168, 128, 149, 150, 173, + 128, 152, 153, 155, 163, 255, 189, 132, + 185, 144, 176, 152, 161, 164, 165, 177, + 255, 132, 169, 177, 188, 129, 131, 141, + 142, 145, 146, 179, 181, 186, 187, 190, + 255, 142, 158, 133, 134, 137, 138, 143, + 150, 152, 155, 156, 161, 164, 165, 176, + 177, 178, 255, 188, 129, 131, 133, 138, + 143, 144, 147, 168, 170, 176, 178, 179, + 181, 182, 184, 185, 190, 255, 157, 131, + 134, 137, 138, 142, 144, 146, 152, 153, + 158, 159, 165, 178, 180, 182, 255, 189, + 129, 131, 133, 141, 143, 145, 147, 168, + 170, 176, 178, 179, 181, 185, 188, 255, + 134, 138, 144, 185, 142, 159, 160, 161, + 164, 165, 176, 255, 189, 129, 131, 133, + 140, 143, 144, 147, 168, 170, 176, 178, + 179, 181, 185, 188, 191, 177, 128, 132, + 135, 136, 139, 141, 150, 151, 156, 157, + 159, 161, 162, 163, 166, 175, 130, 131, + 156, 133, 138, 142, 144, 146, 149, 153, + 154, 158, 159, 163, 164, 168, 170, 174, + 185, 190, 191, 144, 151, 128, 130, 134, + 136, 138, 141, 166, 175, 189, 128, 131, + 133, 140, 142, 144, 146, 168, 170, 185, + 190, 255, 133, 137, 151, 142, 148, 152, + 154, 155, 159, 160, 161, 164, 165, 176, + 255, 189, 129, 131, 133, 140, 142, 144, + 146, 168, 170, 179, 181, 185, 188, 191, + 158, 128, 132, 134, 136, 138, 141, 149, + 150, 160, 161, 162, 163, 166, 175, 177, + 178, 189, 129, 131, 133, 140, 142, 144, + 146, 186, 190, 255, 133, 137, 142, 143, + 150, 152, 158, 159, 161, 164, 165, 176, + 185, 186, 191, 192, 255, 189, 130, 131, + 133, 150, 154, 177, 179, 187, 138, 150, + 128, 134, 143, 148, 152, 159, 166, 175, + 178, 179, 177, 180, 186, 135, 142, 144, + 153, 177, 180, 185, 187, 188, 136, 141, + 144, 153, 128, 181, 183, 185, 152, 153, + 160, 169, 190, 191, 128, 135, 137, 172, + 177, 191, 128, 132, 134, 135, 136, 140, + 141, 151, 153, 188, 134, 128, 129, 130, + 131, 137, 138, 139, 140, 141, 142, 143, + 144, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 167, 168, + 169, 170, 172, 173, 174, 175, 176, 177, + 179, 181, 182, 183, 188, 189, 190, 191, + 132, 152, 180, 184, 185, 187, 171, 190, + 128, 137, 150, 153, 158, 160, 162, 164, + 167, 173, 177, 180, 130, 141, 143, 157, + 160, 255, 155, 156, 157, 159, 160, 255, + 128, 140, 142, 145, 146, 148, 160, 177, + 178, 180, 128, 145, 146, 147, 160, 172, + 174, 176, 178, 179, 180, 255, 148, 156, + 158, 159, 170, 255, 139, 142, 144, 153, + 160, 255, 169, 128, 170, 176, 255, 128, + 158, 160, 171, 176, 187, 128, 150, 151, + 155, 191, 149, 158, 160, 188, 128, 137, + 144, 153, 176, 190, 128, 132, 133, 179, + 180, 255, 133, 139, 140, 143, 154, 170, + 180, 255, 128, 130, 131, 160, 161, 173, + 174, 175, 176, 185, 186, 255, 166, 179, + 180, 255, 128, 163, 164, 183, 173, 144, + 146, 148, 168, 169, 177, 178, 180, 181, + 182, 184, 185, 128, 181, 188, 191, 128, + 129, 130, 131, 132, 133, 134, 146, 147, + 176, 177, 178, 179, 180, 181, 182, 183, + 184, 164, 140, 143, 152, 153, 170, 174, + 191, 255, 132, 165, 177, 191, 129, 147, + 149, 159, 160, 175, 176, 255, 144, 176, + 165, 170, 175, 177, 180, 255, 191, 168, + 174, 176, 255, 128, 134, 136, 142, 144, + 150, 152, 158, 160, 191, 128, 130, 132, + 133, 134, 133, 170, 175, 187, 188, 153, + 154, 128, 146, 147, 148, 152, 153, 154, + 155, 156, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 129, 255, 191, + 128, 174, 175, 178, 180, 189, 128, 157, + 158, 159, 160, 255, 176, 177, 178, 255, + 130, 134, 139, 163, 167, 168, 255, 128, + 129, 130, 179, 180, 255, 187, 189, 133, + 143, 154, 159, 178, 183, 184, 255, 128, + 137, 138, 165, 166, 173, 176, 255, 135, + 147, 148, 159, 189, 255, 128, 131, 132, + 178, 179, 255, 143, 129, 142, 154, 164, + 166, 175, 186, 255, 128, 168, 169, 182, + 131, 128, 139, 140, 141, 144, 153, 187, + 189, 176, 178, 180, 183, 184, 190, 191, + 129, 160, 170, 171, 175, 178, 180, 181, + 182, 128, 162, 163, 170, 172, 173, 176, + 185, 172, 173, 174, 175, 180, 181, 182, + 183, 184, 185, 187, 188, 189, 190, 191, + 176, 186, 158, 190, 128, 134, 147, 151, + 157, 168, 170, 182, 184, 188, 144, 148, + 128, 143, 160, 175, 179, 180, 144, 146, + 148, 141, 143, 176, 180, 182, 255, 191, + 189, 255, 135, 140, 142, 155, 191, 161, + 186, 158, 159, 160, 190, 130, 135, 138, + 143, 146, 151, 154, 156, 185, 187, 144, + 145, 146, 147, 148, 150, 155, 157, 158, + 159, 128, 129, 130, 131, 133, 135, 138, + 139, 140, 141, 142, 143, 144, 145, 146, + 148, 149, 152, 156, 157, 160, 161, 162, + 163, 164, 166, 168, 169, 170, 171, 172, + 173, 174, 176, 177, 153, 155, 178, 179, + 189, 160, 145, 255, 139, 143, 182, 186, + 187, 255, 128, 191, 129, 131, 133, 134, + 140, 143, 144, 147, 149, 151, 153, 179, + 184, 186, 128, 135, 137, 164, 165, 166, + 128, 129, 130, 131, 132, 133, 134, 135, + 136, 138, 139, 140, 141, 146, 147, 150, + 151, 152, 153, 154, 155, 156, 162, 163, + 171, 128, 130, 131, 183, 184, 255, 135, + 165, 176, 190, 131, 175, 187, 188, 190, + 255, 128, 130, 131, 166, 167, 180, 182, + 191, 179, 182, 144, 178, 128, 130, 131, + 178, 179, 255, 155, 129, 132, 133, 137, + 141, 143, 154, 156, 157, 255, 128, 145, + 147, 171, 172, 183, 159, 170, 171, 175, + 176, 185, 186, 255, 189, 128, 131, 133, + 140, 143, 144, 147, 168, 170, 176, 178, + 179, 181, 185, 188, 191, 144, 151, 128, + 132, 135, 136, 139, 141, 157, 161, 162, + 163, 166, 172, 176, 180, 128, 175, 176, + 255, 134, 132, 135, 136, 143, 154, 255, + 128, 174, 175, 181, 184, 255, 129, 151, + 152, 155, 158, 255, 132, 129, 143, 154, + 255, 128, 170, 171, 183, 157, 171, 176, + 185, 160, 168, 169, 171, 172, 173, 174, + 188, 189, 190, 161, 167, 144, 173, 176, + 180, 128, 175, 176, 182, 133, 143, 145, + 190, 191, 255, 143, 146, 147, 159, 176, + 177, 178, 128, 136, 144, 153, 157, 158, + 160, 163, 133, 134, 137, 144, 145, 146, + 147, 148, 149, 154, 155, 156, 157, 158, + 159, 168, 169, 170, 150, 153, 165, 169, + 173, 255, 131, 132, 140, 169, 174, 255, + 130, 132, 128, 182, 187, 255, 173, 180, + 182, 255, 132, 155, 159, 161, 175, 160, + 163, 184, 185, 186, 161, 162, 133, 143, + 144, 150, 151, 255, 160, 128, 129, 132, + 135, 133, 134, 129, 160, 255, 192, 255, + 176, 255, 173, 128, 255, 176, 255, 131, + 137, 191, 145, 189, 135, 129, 130, 132, + 133, 156, 128, 133, 144, 154, 171, 176, + 139, 159, 160, 169, 150, 157, 159, 164, + 167, 168, 170, 173, 176, 185, 143, 145, + 176, 255, 139, 255, 166, 176, 128, 137, + 171, 179, 160, 161, 163, 164, 165, 167, + 169, 171, 173, 174, 175, 176, 177, 179, + 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 166, 170, 172, 178, + 150, 153, 155, 163, 165, 167, 169, 173, + 153, 155, 163, 255, 189, 132, 185, 144, + 152, 161, 164, 165, 166, 175, 176, 255, + 188, 129, 131, 190, 255, 133, 134, 137, + 138, 142, 150, 152, 161, 164, 165, 166, + 175, 176, 255, 131, 134, 137, 138, 142, + 144, 146, 165, 166, 175, 178, 180, 182, + 255, 134, 138, 142, 161, 164, 165, 166, + 175, 176, 255, 188, 129, 131, 190, 191, + 128, 132, 135, 136, 139, 141, 150, 151, + 162, 163, 166, 175, 130, 190, 191, 151, + 128, 130, 134, 136, 138, 141, 166, 175, + 128, 131, 190, 255, 133, 137, 142, 148, + 151, 161, 164, 165, 166, 175, 176, 255, + 128, 132, 134, 136, 138, 141, 149, 150, + 162, 163, 166, 175, 129, 131, 190, 255, + 133, 137, 142, 150, 152, 161, 164, 165, + 166, 175, 176, 255, 130, 131, 138, 150, + 143, 148, 152, 159, 166, 175, 178, 179, + 177, 180, 186, 135, 142, 144, 153, 177, + 180, 185, 187, 188, 136, 141, 144, 153, + 181, 183, 185, 152, 153, 160, 169, 190, + 191, 177, 191, 128, 132, 134, 135, 141, + 151, 153, 188, 134, 128, 129, 130, 141, + 156, 157, 158, 159, 160, 162, 164, 165, + 167, 168, 169, 170, 172, 173, 174, 175, + 176, 177, 179, 183, 171, 190, 128, 137, + 150, 153, 158, 160, 162, 164, 167, 173, + 177, 180, 143, 130, 141, 144, 153, 154, + 157, 157, 159, 146, 148, 178, 180, 146, + 147, 178, 179, 180, 255, 148, 156, 158, + 159, 160, 169, 170, 255, 139, 142, 144, + 153, 169, 160, 171, 176, 187, 151, 155, + 191, 149, 158, 160, 188, 128, 137, 144, + 153, 176, 190, 128, 132, 180, 255, 133, + 143, 144, 153, 154, 170, 180, 255, 128, + 130, 161, 173, 176, 185, 166, 179, 164, + 183, 128, 137, 144, 153, 173, 144, 146, + 148, 168, 178, 180, 184, 185, 128, 181, + 188, 191, 128, 129, 131, 179, 181, 183, + 140, 143, 170, 174, 160, 164, 166, 175, + 144, 176, 175, 177, 191, 160, 191, 128, + 130, 170, 175, 153, 154, 152, 153, 154, + 155, 160, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 175, 160, 169, 175, + 178, 180, 189, 158, 159, 176, 177, 130, + 134, 139, 163, 167, 128, 129, 180, 255, + 133, 143, 144, 153, 154, 159, 178, 255, + 128, 137, 166, 173, 135, 147, 128, 131, + 179, 255, 129, 143, 144, 153, 154, 164, + 166, 175, 176, 185, 186, 255, 169, 182, + 131, 140, 141, 144, 153, 187, 189, 176, + 178, 180, 183, 184, 190, 191, 129, 171, + 175, 181, 182, 163, 170, 172, 173, 176, + 185, 172, 184, 187, 190, 191, 158, 128, + 143, 160, 175, 185, 187, 144, 145, 150, + 155, 157, 158, 135, 139, 141, 146, 168, + 171, 189, 160, 182, 186, 191, 129, 131, + 133, 134, 140, 143, 184, 186, 165, 166, + 128, 129, 130, 131, 132, 133, 134, 135, + 136, 139, 140, 141, 146, 147, 150, 151, + 152, 153, 154, 155, 156, 163, 128, 130, + 184, 255, 135, 165, 166, 175, 176, 190, + 131, 175, 187, 188, 190, 255, 176, 185, + 128, 130, 167, 180, 182, 191, 179, 128, + 130, 179, 255, 129, 137, 141, 143, 144, + 153, 154, 255, 172, 183, 159, 170, 176, + 185, 188, 128, 131, 190, 191, 151, 128, + 132, 135, 136, 139, 141, 162, 163, 166, + 172, 176, 180, 176, 255, 132, 143, 144, + 153, 154, 255, 175, 181, 184, 255, 129, + 155, 158, 255, 129, 143, 144, 153, 154, + 255, 171, 183, 157, 171, 176, 185, 169, + 171, 172, 173, 189, 190, 176, 180, 176, + 182, 145, 190, 143, 146, 178, 157, 158, + 160, 163, 133, 134, 137, 159, 168, 169, + 170, 165, 169, 173, 255, 131, 132, 140, + 169, 174, 255, 130, 132, 142, 191, 128, + 182, 187, 255, 173, 180, 182, 255, 132, + 155, 159, 161, 175, 163, 144, 150, 160, + 128, 129, 132, 135, 133, 134, 129, 160, + 255, 192, 255, 170, 173, 181, 186, 128, + 255, 181, 190, 176, 183, 184, 185, 186, + 191, 192, 255, 130, 131, 137, 137, 190, + 136, 144, 145, 191, 192, 255, 135, 179, + 129, 130, 132, 133, 144, 170, 176, 178, + 156, 128, 133, 140, 141, 144, 154, 160, + 191, 171, 172, 176, 128, 138, 139, 159, + 160, 169, 174, 255, 148, 158, 169, 150, + 164, 167, 173, 176, 185, 189, 190, 192, + 255, 144, 143, 145, 146, 175, 176, 255, + 139, 140, 141, 255, 166, 176, 178, 255, + 184, 186, 128, 137, 138, 170, 171, 179, + 180, 181, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 154, 164, 168, 128, 149, 150, + 173, 128, 152, 153, 155, 163, 255, 189, + 132, 185, 144, 176, 152, 161, 164, 165, + 166, 175, 177, 255, 132, 169, 177, 188, + 129, 131, 141, 142, 145, 146, 179, 181, + 186, 187, 190, 255, 142, 158, 133, 134, + 137, 138, 143, 150, 152, 155, 156, 161, + 164, 165, 166, 175, 176, 177, 178, 255, + 188, 129, 131, 133, 138, 143, 144, 147, + 168, 170, 176, 178, 179, 181, 182, 184, + 185, 190, 255, 157, 131, 134, 137, 138, + 142, 144, 146, 152, 153, 158, 159, 165, + 166, 175, 178, 180, 182, 255, 189, 129, + 131, 133, 141, 143, 145, 147, 168, 170, + 176, 178, 179, 181, 185, 188, 255, 134, + 138, 144, 185, 142, 159, 160, 161, 164, + 165, 166, 175, 176, 255, 189, 129, 131, + 133, 140, 143, 144, 147, 168, 170, 176, + 178, 179, 181, 185, 188, 191, 177, 128, + 132, 135, 136, 139, 141, 150, 151, 156, + 157, 159, 161, 162, 163, 166, 175, 130, + 131, 156, 133, 138, 142, 144, 146, 149, + 153, 154, 158, 159, 163, 164, 168, 170, + 174, 185, 190, 191, 144, 151, 128, 130, + 134, 136, 138, 141, 166, 175, 189, 128, + 131, 133, 140, 142, 144, 146, 168, 170, + 185, 190, 255, 133, 137, 151, 142, 148, + 152, 154, 155, 159, 160, 161, 164, 165, + 166, 175, 176, 255, 189, 129, 131, 133, + 140, 142, 144, 146, 168, 170, 179, 181, + 185, 188, 191, 158, 128, 132, 134, 136, + 138, 141, 149, 150, 160, 161, 162, 163, + 166, 175, 177, 178, 189, 129, 131, 133, + 140, 142, 144, 146, 186, 190, 255, 133, + 137, 142, 143, 150, 152, 158, 159, 161, + 164, 165, 166, 175, 176, 185, 186, 191, + 192, 255, 189, 130, 131, 133, 150, 154, + 177, 179, 187, 138, 150, 128, 134, 143, + 148, 152, 159, 166, 175, 178, 179, 177, + 180, 186, 135, 142, 144, 153, 177, 180, + 185, 187, 188, 136, 141, 144, 153, 128, + 181, 183, 185, 152, 153, 160, 169, 190, + 191, 128, 135, 137, 172, 177, 191, 128, + 132, 134, 135, 136, 140, 141, 151, 153, + 188, 134, 128, 129, 130, 131, 137, 138, + 139, 140, 141, 142, 143, 144, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 167, 168, 169, 170, 172, + 173, 174, 175, 176, 177, 179, 181, 182, + 183, 188, 189, 190, 191, 132, 152, 180, + 184, 185, 187, 171, 190, 128, 137, 150, + 153, 158, 160, 162, 164, 167, 173, 177, + 180, 143, 130, 141, 144, 153, 154, 157, + 160, 255, 155, 156, 157, 159, 160, 255, + 128, 140, 142, 145, 146, 148, 160, 177, + 178, 180, 128, 145, 146, 147, 160, 172, + 174, 176, 178, 179, 180, 255, 148, 156, + 158, 159, 160, 169, 170, 255, 139, 142, + 144, 153, 160, 255, 169, 128, 170, 176, + 255, 128, 158, 160, 171, 176, 187, 128, + 150, 151, 155, 191, 149, 158, 160, 188, + 128, 137, 144, 153, 176, 190, 128, 132, + 133, 179, 180, 255, 133, 139, 140, 143, + 144, 153, 154, 170, 180, 255, 128, 130, + 131, 160, 161, 173, 174, 175, 176, 185, + 186, 255, 166, 179, 180, 255, 128, 163, + 164, 183, 173, 144, 146, 148, 168, 169, + 177, 178, 180, 181, 182, 184, 185, 128, + 181, 188, 191, 128, 129, 130, 131, 132, + 133, 134, 146, 147, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 164, 140, 143, + 152, 153, 170, 174, 191, 255, 132, 165, + 177, 191, 129, 147, 149, 159, 160, 175, + 176, 255, 144, 176, 165, 170, 175, 177, + 180, 255, 191, 168, 174, 176, 255, 128, + 134, 136, 142, 144, 150, 152, 158, 160, + 191, 128, 130, 132, 133, 134, 133, 170, + 175, 187, 188, 153, 154, 128, 146, 147, + 148, 152, 153, 154, 155, 156, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, + 176, 129, 255, 191, 128, 174, 175, 178, + 180, 189, 128, 157, 158, 159, 160, 255, + 176, 177, 178, 255, 130, 134, 139, 163, + 167, 168, 255, 128, 129, 130, 179, 180, + 255, 187, 189, 133, 143, 144, 153, 154, + 159, 178, 183, 184, 255, 128, 137, 138, + 165, 166, 173, 176, 255, 135, 147, 148, + 159, 189, 255, 128, 131, 132, 178, 179, + 255, 143, 129, 142, 144, 153, 154, 164, + 166, 175, 176, 185, 186, 255, 128, 168, + 169, 182, 131, 128, 139, 140, 141, 144, + 153, 187, 189, 176, 178, 180, 183, 184, + 190, 191, 129, 160, 170, 171, 175, 178, + 180, 181, 182, 128, 162, 163, 170, 172, + 173, 176, 185, 172, 173, 174, 175, 180, + 181, 182, 183, 184, 185, 187, 188, 189, + 190, 191, 176, 186, 158, 190, 128, 134, + 147, 151, 157, 168, 170, 182, 184, 188, + 144, 148, 128, 143, 160, 175, 179, 180, + 191, 189, 255, 158, 159, 160, 190, 130, + 135, 138, 143, 146, 151, 154, 156, 185, + 187, 144, 145, 146, 147, 148, 150, 155, + 157, 158, 159, 128, 129, 130, 131, 133, + 135, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 148, 149, 152, 156, 157, 160, + 161, 162, 163, 164, 166, 168, 169, 170, + 171, 172, 173, 174, 176, 177, 153, 155, + 178, 179, 189, 160, 145, 255, 139, 143, + 182, 186, 187, 255, 128, 191, 129, 131, + 133, 134, 140, 143, 144, 147, 149, 151, + 153, 179, 184, 186, 128, 135, 137, 164, + 165, 166, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 138, 139, 140, 141, 146, + 147, 150, 151, 152, 153, 154, 155, 156, + 162, 163, 171, 128, 130, 131, 183, 184, + 255, 135, 165, 166, 175, 176, 190, 131, + 175, 187, 188, 190, 255, 128, 130, 131, + 166, 167, 180, 182, 191, 179, 182, 144, + 178, 128, 130, 131, 178, 179, 255, 155, + 129, 132, 133, 137, 141, 143, 144, 153, + 154, 156, 157, 255, 128, 145, 147, 171, + 172, 183, 159, 170, 171, 175, 176, 185, + 186, 255, 189, 128, 131, 133, 140, 143, + 144, 147, 168, 170, 176, 178, 179, 181, + 185, 188, 191, 144, 151, 128, 132, 135, + 136, 139, 141, 157, 161, 162, 163, 166, + 172, 176, 180, 128, 175, 176, 255, 134, + 132, 135, 136, 143, 144, 153, 154, 255, + 128, 174, 175, 181, 184, 255, 129, 151, + 152, 155, 158, 255, 132, 129, 143, 144, + 153, 154, 255, 128, 170, 171, 183, 157, + 171, 176, 185, 160, 168, 169, 171, 172, + 173, 174, 188, 189, 190, 161, 167, 144, + 173, 176, 180, 128, 175, 176, 182, 133, + 143, 145, 190, 191, 255, 143, 146, 147, + 159, 176, 177, 178, 128, 136, 144, 153, + 157, 158, 160, 163, 133, 134, 137, 144, + 145, 146, 147, 148, 149, 154, 155, 156, + 157, 158, 159, 168, 169, 170, 150, 153, + 165, 169, 173, 255, 131, 132, 140, 169, + 174, 255, 130, 132, 128, 182, 187, 255, + 173, 180, 182, 255, 132, 155, 159, 161, + 175, 160, 163, 184, 185, 186, 161, 162, + 133, 143, 144, 150, 151, 255, 160, 128, + 129, 132, 135, 133, 134, 129, 160, 255, + 192, 255, 176, 255, 170, 173, 181, 183, + 186, 128, 255, 181, 190, 176, 183, 184, + 185, 186, 191, 192, 255, 130, 131, 137, + 190, 136, 144, 145, 191, 192, 255, 135, + 179, 180, 129, 130, 132, 133, 144, 170, + 176, 178, 156, 128, 133, 144, 154, 160, + 191, 171, 176, 128, 138, 139, 159, 160, + 169, 174, 255, 148, 158, 169, 150, 164, + 167, 173, 176, 185, 189, 190, 192, 255, + 144, 143, 145, 146, 175, 176, 255, 139, + 140, 141, 255, 166, 176, 178, 255, 186, + 128, 137, 138, 170, 171, 179, 180, 181, + 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, + 154, 164, 168, 128, 149, 150, 173, 128, + 152, 153, 155, 163, 255, 189, 132, 185, + 144, 176, 152, 161, 164, 165, 166, 175, + 177, 255, 132, 169, 177, 188, 129, 131, + 141, 142, 145, 146, 179, 181, 186, 187, + 190, 255, 142, 158, 133, 134, 137, 138, + 143, 150, 152, 155, 156, 161, 164, 165, + 166, 175, 176, 177, 178, 255, 188, 129, + 131, 133, 138, 143, 144, 147, 168, 170, + 176, 178, 179, 181, 182, 184, 185, 190, + 255, 157, 131, 134, 137, 138, 142, 144, + 146, 152, 153, 158, 159, 165, 166, 175, + 178, 180, 182, 255, 189, 129, 131, 133, + 141, 143, 145, 147, 168, 170, 176, 178, + 179, 181, 185, 188, 255, 134, 138, 144, + 185, 142, 159, 160, 161, 164, 165, 166, + 175, 176, 255, 189, 129, 131, 133, 140, + 143, 144, 147, 168, 170, 176, 178, 179, + 181, 185, 188, 191, 177, 128, 132, 135, + 136, 139, 141, 150, 151, 156, 157, 159, + 161, 162, 163, 166, 175, 130, 131, 156, + 133, 138, 142, 144, 146, 149, 153, 154, + 158, 159, 163, 164, 168, 170, 174, 185, + 190, 191, 144, 151, 128, 130, 134, 136, + 138, 141, 166, 175, 189, 128, 131, 133, + 140, 142, 144, 146, 168, 170, 185, 190, + 255, 133, 137, 151, 142, 148, 152, 154, + 155, 159, 160, 161, 164, 165, 166, 175, + 176, 255, 189, 129, 131, 133, 140, 142, + 144, 146, 168, 170, 179, 181, 185, 188, + 191, 158, 128, 132, 134, 136, 138, 141, + 149, 150, 160, 161, 162, 163, 166, 175, + 177, 178, 189, 129, 131, 133, 140, 142, + 144, 146, 186, 190, 255, 133, 137, 142, + 143, 150, 152, 158, 159, 161, 164, 165, + 166, 175, 176, 185, 186, 191, 192, 255, + 189, 130, 131, 133, 150, 154, 177, 179, + 187, 138, 150, 128, 134, 143, 148, 152, + 159, 166, 175, 178, 179, 177, 180, 186, + 135, 142, 144, 153, 177, 180, 185, 187, + 188, 136, 141, 144, 153, 128, 181, 183, + 185, 152, 153, 160, 169, 190, 191, 128, + 135, 137, 172, 177, 191, 128, 132, 134, + 135, 136, 140, 141, 151, 153, 188, 134, + 128, 129, 130, 131, 137, 138, 139, 140, + 141, 142, 143, 144, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, + 165, 167, 168, 169, 170, 172, 173, 174, + 175, 176, 177, 179, 181, 182, 183, 188, + 189, 190, 191, 132, 152, 180, 184, 185, + 187, 171, 190, 128, 137, 150, 153, 158, + 160, 162, 164, 167, 173, 177, 180, 143, + 130, 141, 144, 153, 154, 157, 160, 255, + 155, 156, 157, 159, 160, 255, 128, 140, + 142, 145, 146, 148, 160, 177, 178, 180, + 128, 145, 146, 147, 160, 172, 174, 176, + 178, 179, 180, 255, 148, 156, 158, 159, + 160, 169, 170, 255, 139, 142, 144, 153, + 160, 255, 169, 128, 170, 176, 255, 128, + 158, 160, 171, 176, 187, 128, 150, 151, + 155, 191, 149, 158, 160, 188, 128, 137, + 144, 153, 176, 190, 128, 132, 133, 179, + 180, 255, 133, 139, 140, 143, 144, 153, + 154, 170, 180, 255, 128, 130, 131, 160, + 161, 173, 174, 175, 176, 185, 186, 255, + 166, 179, 180, 255, 128, 163, 164, 183, + 173, 144, 146, 148, 168, 169, 177, 178, + 180, 181, 182, 184, 185, 128, 181, 188, + 191, 128, 129, 130, 131, 132, 133, 134, + 146, 147, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 164, 167, 140, 143, 152, + 153, 170, 174, 191, 255, 165, 177, 191, + 129, 147, 149, 159, 160, 175, 176, 255, + 144, 176, 165, 170, 175, 177, 180, 255, + 191, 168, 174, 176, 255, 128, 134, 136, + 142, 144, 150, 152, 158, 160, 191, 128, + 130, 132, 133, 134, 133, 170, 175, 187, + 188, 153, 154, 128, 146, 147, 148, 152, + 153, 154, 155, 156, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 129, + 255, 191, 128, 174, 175, 178, 180, 189, + 128, 157, 158, 159, 160, 255, 176, 177, + 178, 255, 130, 134, 139, 163, 167, 168, + 255, 128, 129, 130, 179, 180, 255, 187, + 189, 133, 143, 144, 153, 154, 159, 178, + 183, 184, 255, 128, 137, 138, 165, 166, + 173, 176, 255, 135, 147, 148, 159, 189, + 255, 128, 131, 132, 178, 179, 255, 143, + 129, 142, 144, 153, 154, 164, 166, 175, + 176, 185, 186, 255, 128, 168, 169, 182, + 131, 128, 139, 140, 141, 144, 153, 187, + 189, 176, 178, 180, 183, 184, 190, 191, + 129, 160, 170, 171, 175, 178, 180, 181, + 182, 128, 162, 163, 170, 172, 173, 176, + 185, 172, 173, 174, 175, 180, 181, 182, + 183, 184, 185, 187, 188, 189, 190, 191, + 176, 186, 158, 190, 128, 134, 147, 151, + 157, 168, 170, 182, 184, 188, 147, 128, + 143, 160, 175, 179, 180, 191, 189, 255, + 158, 159, 160, 190, 130, 135, 138, 143, + 146, 151, 154, 156, 185, 187, 144, 145, + 146, 147, 148, 150, 155, 157, 158, 159, + 128, 129, 130, 131, 133, 135, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 148, + 149, 152, 156, 157, 160, 161, 162, 163, + 164, 166, 168, 169, 170, 171, 172, 173, + 174, 176, 177, 153, 155, 178, 179, 189, + 160, 145, 255, 139, 143, 182, 186, 187, + 255, 128, 191, 129, 131, 133, 134, 140, + 143, 144, 147, 149, 151, 153, 179, 184, + 186, 128, 135, 137, 164, 165, 166, 128, + 129, 130, 131, 132, 133, 134, 135, 136, + 138, 139, 140, 141, 146, 147, 150, 151, + 152, 153, 154, 155, 156, 162, 163, 171, + 128, 130, 131, 183, 184, 255, 135, 165, + 166, 175, 176, 190, 131, 175, 187, 188, + 190, 255, 128, 130, 131, 166, 167, 180, + 182, 191, 179, 182, 144, 178, 128, 130, + 131, 178, 179, 255, 155, 129, 132, 133, + 137, 141, 143, 144, 153, 154, 156, 157, + 255, 128, 145, 147, 171, 172, 183, 159, + 170, 171, 175, 176, 185, 186, 255, 189, + 128, 131, 133, 140, 143, 144, 147, 168, + 170, 176, 178, 179, 181, 185, 188, 191, + 144, 151, 128, 132, 135, 136, 139, 141, + 157, 161, 162, 163, 166, 172, 176, 180, + 128, 175, 176, 255, 134, 132, 135, 136, + 143, 144, 153, 154, 255, 128, 174, 175, + 181, 184, 255, 129, 151, 152, 155, 158, + 255, 132, 129, 143, 144, 153, 154, 255, + 128, 170, 171, 183, 157, 171, 176, 185, + 160, 168, 169, 171, 172, 173, 174, 188, + 189, 190, 161, 167, 144, 173, 176, 180, + 128, 175, 176, 182, 133, 143, 145, 190, + 191, 255, 143, 146, 147, 159, 176, 177, + 178, 128, 136, 144, 153, 157, 158, 160, + 163, 133, 134, 137, 144, 145, 146, 147, + 148, 149, 154, 155, 156, 157, 158, 159, + 168, 169, 170, 150, 153, 165, 169, 173, + 255, 131, 132, 140, 169, 174, 255, 130, + 132, 128, 182, 187, 255, 173, 180, 182, + 255, 132, 155, 159, 161, 175, 160, 163, + 184, 185, 186, 161, 162, 133, 143, 144, + 150, 151, 255, 160, 128, 129, 132, 135, + 133, 134, 129, 160, 255, 192, 255, 176, + 255, 170, 173, 181, 186, 128, 255, 181, + 190, 176, 183, 184, 185, 186, 191, 192, + 255, 130, 131, 137, 190, 136, 144, 145, + 191, 192, 255, 135, 179, 129, 130, 132, + 133, 144, 170, 176, 178, 156, 128, 133, + 144, 154, 160, 191, 171, 176, 128, 138, + 139, 159, 160, 169, 174, 255, 148, 158, + 169, 150, 164, 167, 173, 176, 185, 189, + 190, 192, 255, 144, 143, 145, 146, 175, + 176, 255, 139, 140, 141, 255, 166, 176, + 178, 255, 186, 128, 137, 138, 170, 171, + 179, 180, 181, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 154, 164, 168, 128, 149, + 150, 173, 128, 152, 153, 155, 163, 255, + 189, 132, 185, 144, 176, 152, 161, 164, + 165, 166, 175, 177, 255, 132, 169, 177, + 188, 129, 131, 141, 142, 145, 146, 179, + 181, 186, 187, 190, 255, 142, 158, 133, + 134, 137, 138, 143, 150, 152, 155, 156, + 161, 164, 165, 166, 175, 176, 177, 178, + 255, 188, 129, 131, 133, 138, 143, 144, + 147, 168, 170, 176, 178, 179, 181, 182, + 184, 185, 190, 255, 157, 131, 134, 137, + 138, 142, 144, 146, 152, 153, 158, 159, + 165, 166, 175, 178, 180, 182, 255, 189, + 129, 131, 133, 141, 143, 145, 147, 168, + 170, 176, 178, 179, 181, 185, 188, 255, + 134, 138, 144, 185, 142, 159, 160, 161, + 164, 165, 166, 175, 176, 255, 189, 129, + 131, 133, 140, 143, 144, 147, 168, 170, + 176, 178, 179, 181, 185, 188, 191, 177, + 128, 132, 135, 136, 139, 141, 150, 151, + 156, 157, 159, 161, 162, 163, 166, 175, + 130, 131, 156, 133, 138, 142, 144, 146, + 149, 153, 154, 158, 159, 163, 164, 168, + 170, 174, 185, 190, 191, 144, 151, 128, + 130, 134, 136, 138, 141, 166, 175, 189, + 128, 131, 133, 140, 142, 144, 146, 168, + 170, 185, 190, 255, 133, 137, 151, 142, + 148, 152, 154, 155, 159, 160, 161, 164, + 165, 166, 175, 176, 255, 189, 129, 131, + 133, 140, 142, 144, 146, 168, 170, 179, + 181, 185, 188, 191, 158, 128, 132, 134, + 136, 138, 141, 149, 150, 160, 161, 162, + 163, 166, 175, 177, 178, 189, 129, 131, + 133, 140, 142, 144, 146, 186, 190, 255, + 133, 137, 142, 143, 150, 152, 158, 159, + 161, 164, 165, 166, 175, 176, 185, 186, + 191, 192, 255, 189, 130, 131, 133, 150, + 154, 177, 179, 187, 138, 150, 128, 134, + 143, 148, 152, 159, 166, 175, 178, 179, + 177, 180, 186, 135, 142, 144, 153, 177, + 180, 185, 187, 188, 136, 141, 144, 153, + 128, 181, 183, 185, 152, 153, 160, 169, + 190, 191, 128, 135, 137, 172, 177, 191, + 128, 132, 134, 135, 136, 140, 141, 151, + 153, 188, 134, 128, 129, 130, 131, 137, + 138, 139, 140, 141, 142, 143, 144, 153, + 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 167, 168, 169, 170, + 172, 173, 174, 175, 176, 177, 179, 181, + 182, 183, 188, 189, 190, 191, 132, 152, + 180, 184, 185, 187, 171, 190, 128, 137, + 150, 153, 158, 160, 162, 164, 167, 173, + 177, 180, 143, 130, 141, 144, 153, 154, + 157, 160, 255, 155, 156, 157, 159, 160, + 255, 128, 140, 142, 145, 146, 148, 160, + 177, 178, 180, 128, 145, 146, 147, 160, + 172, 174, 176, 178, 179, 180, 255, 148, + 156, 158, 159, 160, 169, 170, 255, 139, + 142, 144, 153, 160, 255, 169, 128, 170, + 176, 255, 128, 158, 160, 171, 176, 187, + 128, 150, 151, 155, 191, 149, 158, 160, + 188, 128, 137, 144, 153, 176, 190, 128, + 132, 133, 179, 180, 255, 133, 139, 140, + 143, 144, 153, 154, 170, 180, 255, 128, + 130, 131, 160, 161, 173, 174, 175, 176, + 185, 186, 255, 166, 179, 180, 255, 128, + 163, 164, 183, 173, 144, 146, 148, 168, + 169, 177, 178, 180, 181, 182, 184, 185, + 128, 181, 188, 191, 128, 129, 130, 131, + 132, 133, 134, 146, 147, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 140, 143, + 170, 174, 191, 255, 165, 177, 191, 129, + 147, 149, 159, 176, 255, 144, 176, 165, + 170, 175, 177, 180, 255, 191, 168, 174, + 176, 255, 128, 134, 136, 142, 144, 150, + 152, 158, 160, 191, 128, 130, 131, 132, + 133, 134, 135, 139, 140, 141, 133, 170, + 175, 177, 181, 187, 188, 153, 154, 155, + 156, 160, 255, 128, 146, 147, 148, 152, + 153, 154, 155, 156, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 129, + 255, 191, 128, 174, 175, 178, 180, 189, + 128, 157, 158, 159, 160, 255, 176, 177, + 178, 255, 130, 134, 139, 163, 167, 168, + 255, 128, 129, 130, 179, 180, 255, 187, + 189, 133, 143, 144, 153, 154, 159, 178, + 183, 184, 255, 128, 137, 138, 165, 166, + 173, 176, 255, 135, 147, 148, 159, 189, + 255, 128, 131, 132, 178, 179, 255, 143, + 129, 142, 144, 153, 154, 164, 166, 175, + 176, 185, 186, 255, 128, 168, 169, 182, + 131, 128, 139, 140, 141, 144, 153, 187, + 189, 176, 178, 180, 183, 184, 190, 191, + 129, 160, 170, 171, 175, 178, 180, 181, + 182, 128, 162, 163, 170, 172, 173, 176, + 185, 172, 173, 174, 175, 180, 181, 182, + 183, 184, 185, 187, 188, 189, 190, 191, + 176, 186, 158, 190, 128, 134, 147, 151, + 157, 168, 170, 182, 184, 188, 128, 143, + 160, 175, 179, 180, 141, 143, 176, 180, + 182, 255, 191, 189, 255, 191, 161, 186, + 158, 159, 160, 190, 191, 255, 130, 135, + 138, 143, 146, 151, 154, 156, 185, 187, + 144, 145, 146, 147, 148, 150, 155, 157, + 158, 159, 128, 129, 130, 131, 133, 135, + 138, 139, 140, 141, 142, 143, 144, 145, + 146, 148, 149, 152, 156, 157, 160, 161, + 162, 163, 164, 166, 168, 169, 170, 171, + 172, 173, 174, 176, 177, 153, 155, 178, + 179, 189, 160, 145, 255, 139, 143, 182, + 186, 187, 255, 128, 191, 129, 131, 133, + 134, 140, 143, 144, 147, 149, 151, 153, + 179, 184, 186, 128, 135, 137, 164, 165, + 166, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 138, 139, 140, 141, 146, 147, + 150, 151, 152, 153, 154, 155, 156, 162, + 163, 171, 128, 130, 131, 183, 184, 255, + 135, 165, 166, 175, 176, 190, 131, 175, + 187, 188, 190, 255, 128, 130, 131, 166, + 167, 180, 182, 191, 179, 182, 144, 178, + 128, 130, 131, 178, 179, 255, 155, 129, + 132, 133, 137, 141, 143, 144, 153, 154, + 156, 157, 255, 128, 145, 147, 171, 172, + 183, 159, 170, 171, 175, 176, 185, 186, + 255, 189, 128, 131, 133, 140, 143, 144, + 147, 168, 170, 176, 178, 179, 181, 185, + 188, 191, 144, 151, 128, 132, 135, 136, + 139, 141, 157, 161, 162, 163, 166, 172, + 176, 180, 128, 175, 176, 255, 134, 132, + 135, 136, 143, 144, 153, 154, 255, 128, + 174, 175, 181, 184, 255, 129, 151, 152, + 155, 158, 255, 132, 129, 143, 144, 153, + 154, 255, 128, 170, 171, 183, 157, 171, + 176, 185, 160, 168, 169, 171, 172, 173, + 174, 188, 189, 190, 161, 167, 144, 173, + 176, 180, 128, 175, 176, 182, 133, 143, + 145, 190, 191, 255, 143, 146, 147, 159, + 128, 176, 177, 178, 128, 136, 144, 153, + 157, 158, 160, 163, 133, 134, 137, 144, + 145, 146, 147, 148, 149, 154, 155, 156, + 157, 158, 159, 168, 169, 170, 150, 153, + 165, 169, 173, 255, 131, 132, 140, 169, + 174, 255, 130, 132, 128, 182, 187, 255, + 173, 180, 182, 255, 132, 155, 159, 161, + 175, 160, 163, 184, 185, 186, 161, 162, + 133, 143, 144, 150, 151, 255, 160, 128, + 129, 132, 135, 133, 134, 129, 160, 255, + 192, 255, 176, 255, 170, 173, 181, 186, + 0, 127, 181, 190, 176, 183, 184, 185, + 186, 191, 192, 255, 130, 131, 137, 190, + 136, 144, 145, 191, 192, 255, 135, 179, + 129, 130, 132, 133, 144, 170, 176, 178, + 156, 128, 133, 144, 154, 160, 191, 171, + 176, 128, 138, 139, 159, 160, 169, 174, + 255, 148, 158, 169, 150, 164, 167, 173, + 176, 185, 189, 190, 192, 255, 144, 143, + 145, 146, 175, 176, 255, 139, 140, 141, + 255, 166, 176, 178, 255, 186, 128, 137, + 138, 170, 171, 179, 180, 181, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 154, 164, + 168, 128, 149, 150, 173, 128, 152, 153, + 155, 163, 255, 189, 132, 185, 144, 176, + 152, 161, 164, 165, 166, 175, 177, 255, + 132, 169, 177, 188, 129, 131, 141, 142, + 145, 146, 179, 181, 186, 187, 190, 255, + 142, 158, 133, 134, 137, 138, 143, 150, + 152, 155, 156, 161, 164, 165, 166, 175, + 176, 177, 178, 255, 188, 129, 131, 133, + 138, 143, 144, 147, 168, 170, 176, 178, + 179, 181, 182, 184, 185, 190, 255, 157, + 131, 134, 137, 138, 142, 144, 146, 152, + 153, 158, 159, 165, 166, 175, 178, 180, + 182, 255, 189, 129, 131, 133, 141, 143, + 145, 147, 168, 170, 176, 178, 179, 181, + 185, 188, 255, 134, 138, 144, 185, 142, + 159, 160, 161, 164, 165, 166, 175, 176, + 255, 189, 129, 131, 133, 140, 143, 144, + 147, 168, 170, 176, 178, 179, 181, 185, + 188, 191, 177, 128, 132, 135, 136, 139, + 141, 150, 151, 156, 157, 159, 161, 162, + 163, 166, 175, 130, 131, 156, 133, 138, + 142, 144, 146, 149, 153, 154, 158, 159, + 163, 164, 168, 170, 174, 185, 190, 191, + 144, 151, 128, 130, 134, 136, 138, 141, + 166, 175, 189, 128, 131, 133, 140, 142, + 144, 146, 168, 170, 185, 190, 255, 133, + 137, 151, 142, 148, 152, 154, 155, 159, + 160, 161, 164, 165, 166, 175, 176, 255, + 189, 129, 131, 133, 140, 142, 144, 146, + 168, 170, 179, 181, 185, 188, 191, 158, + 128, 132, 134, 136, 138, 141, 149, 150, + 160, 161, 162, 163, 166, 175, 177, 178, + 189, 129, 131, 133, 140, 142, 144, 146, + 186, 190, 255, 133, 137, 142, 143, 150, + 152, 158, 159, 161, 164, 165, 166, 175, + 176, 185, 186, 191, 192, 255, 189, 130, + 131, 133, 150, 154, 177, 179, 187, 138, + 150, 128, 134, 143, 148, 152, 159, 166, + 175, 178, 179, 177, 180, 186, 135, 142, + 144, 153, 177, 180, 185, 187, 188, 136, + 141, 144, 153, 128, 181, 183, 185, 152, + 153, 160, 169, 190, 191, 128, 135, 137, + 172, 177, 191, 128, 132, 134, 135, 136, + 140, 141, 151, 153, 188, 134, 128, 129, + 130, 131, 137, 138, 139, 140, 141, 142, + 143, 144, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 167, + 168, 169, 170, 172, 173, 174, 175, 176, + 177, 179, 181, 182, 183, 188, 189, 190, + 191, 132, 152, 180, 184, 185, 187, 171, + 190, 128, 137, 150, 153, 158, 160, 162, + 164, 167, 173, 177, 180, 143, 130, 141, + 144, 153, 154, 157, 160, 255, 155, 156, + 157, 159, 160, 255, 128, 140, 142, 145, + 146, 148, 160, 177, 178, 180, 128, 145, + 146, 147, 160, 172, 174, 176, 178, 179, + 180, 255, 148, 156, 158, 159, 160, 169, + 170, 255, 139, 142, 144, 153, 160, 255, + 169, 128, 170, 176, 255, 128, 158, 160, + 171, 176, 187, 128, 150, 151, 155, 191, + 149, 158, 160, 188, 128, 137, 144, 153, + 176, 190, 128, 132, 133, 179, 180, 255, + 133, 139, 140, 143, 144, 153, 154, 170, + 180, 255, 128, 130, 131, 160, 161, 173, + 174, 175, 176, 185, 186, 255, 166, 179, + 180, 255, 128, 163, 164, 183, 173, 144, + 146, 148, 168, 169, 177, 178, 180, 181, + 182, 184, 185, 128, 181, 188, 191, 128, + 129, 130, 131, 132, 133, 134, 146, 147, + 176, 177, 178, 179, 180, 181, 182, 183, + 184, 140, 143, 170, 174, 191, 255, 165, + 177, 191, 129, 147, 149, 159, 160, 175, + 176, 255, 144, 176, 165, 170, 175, 177, + 180, 255, 191, 168, 174, 176, 255, 128, + 134, 136, 142, 144, 150, 152, 158, 160, + 191, 128, 130, 131, 132, 133, 134, 135, + 139, 140, 141, 133, 170, 175, 177, 181, + 187, 188, 153, 154, 155, 156, 160, 255, + 128, 146, 147, 148, 152, 153, 154, 155, + 156, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 129, 255, 191, 128, + 174, 175, 178, 180, 189, 128, 157, 158, + 159, 160, 255, 176, 177, 178, 255, 130, + 134, 139, 163, 167, 168, 255, 128, 129, + 130, 179, 180, 255, 187, 189, 133, 143, + 144, 153, 154, 159, 178, 183, 184, 255, + 128, 137, 138, 165, 166, 173, 176, 255, + 135, 147, 148, 159, 189, 255, 128, 131, + 132, 178, 179, 255, 143, 129, 142, 144, + 153, 154, 164, 166, 175, 176, 185, 186, + 255, 128, 168, 169, 182, 131, 128, 139, + 140, 141, 144, 153, 187, 189, 176, 178, + 180, 183, 184, 190, 191, 129, 160, 170, + 171, 175, 178, 180, 181, 182, 128, 162, + 163, 170, 172, 173, 176, 185, 172, 173, + 174, 175, 180, 181, 182, 183, 184, 185, + 187, 188, 189, 190, 191, 176, 186, 158, + 190, 128, 134, 147, 151, 157, 168, 170, + 182, 184, 188, 128, 143, 160, 175, 179, + 180, 191, 189, 255, 158, 159, 160, 190, + 191, 255, 130, 135, 138, 143, 146, 151, + 154, 156, 185, 187, 144, 145, 146, 147, + 148, 150, 155, 157, 158, 159, 128, 129, + 130, 131, 133, 135, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 148, 149, 152, + 156, 157, 160, 161, 162, 163, 164, 166, + 168, 169, 170, 171, 172, 173, 174, 176, + 177, 153, 155, 178, 179, 189, 160, 145, + 255, 139, 143, 182, 186, 187, 255, 128, + 191, 129, 131, 133, 134, 140, 143, 144, + 147, 149, 151, 153, 179, 184, 186, 128, + 135, 137, 164, 165, 166, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 138, 139, + 140, 141, 146, 147, 150, 151, 152, 153, + 154, 155, 156, 162, 163, 171, 128, 130, + 131, 183, 184, 255, 135, 165, 166, 175, + 176, 190, 131, 175, 187, 188, 190, 255, + 128, 130, 131, 166, 167, 180, 182, 191, + 179, 182, 144, 178, 128, 130, 131, 178, + 179, 255, 155, 129, 132, 133, 137, 141, + 143, 144, 153, 154, 156, 157, 255, 128, + 145, 147, 171, 172, 183, 159, 170, 171, + 175, 176, 185, 186, 255, 189, 128, 131, + 133, 140, 143, 144, 147, 168, 170, 176, + 178, 179, 181, 185, 188, 191, 144, 151, + 128, 132, 135, 136, 139, 141, 157, 161, + 162, 163, 166, 172, 176, 180, 128, 175, + 176, 255, 134, 132, 135, 136, 143, 144, + 153, 154, 255, 128, 174, 175, 181, 184, + 255, 129, 151, 152, 155, 158, 255, 132, + 129, 143, 144, 153, 154, 255, 128, 170, + 171, 183, 157, 171, 176, 185, 160, 168, + 169, 171, 172, 173, 174, 188, 189, 190, + 161, 167, 144, 173, 176, 180, 128, 175, + 176, 182, 133, 143, 145, 190, 191, 255, + 143, 146, 147, 159, 128, 176, 177, 178, + 128, 136, 144, 153, 157, 158, 160, 163, + 133, 134, 137, 144, 145, 146, 147, 148, + 149, 154, 155, 156, 157, 158, 159, 168, + 169, 170, 150, 153, 165, 169, 173, 255, + 131, 132, 140, 169, 174, 255, 130, 132, + 128, 182, 187, 255, 173, 180, 182, 255, + 132, 155, 159, 161, 175, 160, 163, 184, + 185, 186, 161, 162, 133, 143, 144, 150, + 151, 255, 160, 128, 129, 132, 135, 133, + 134, 129, 160, 255, 192, 255, 176, 255, + 173, 0, 127, 176, 255, 131, 137, 191, + 145, 189, 135, 129, 130, 132, 133, 156, + 128, 133, 144, 154, 176, 139, 159, 150, + 157, 159, 164, 167, 168, 170, 173, 143, + 145, 176, 255, 139, 255, 166, 176, 171, + 179, 160, 161, 163, 164, 165, 167, 169, + 171, 173, 174, 175, 176, 177, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 166, 170, 172, 178, 150, + 153, 155, 163, 165, 167, 169, 173, 153, + 155, 163, 255, 189, 132, 185, 144, 152, + 161, 164, 255, 188, 129, 131, 190, 255, + 133, 134, 137, 138, 142, 150, 152, 161, + 164, 255, 131, 134, 137, 138, 142, 144, + 146, 175, 178, 180, 182, 255, 134, 138, + 142, 161, 164, 255, 188, 129, 131, 190, + 191, 128, 132, 135, 136, 139, 141, 150, + 151, 162, 163, 130, 190, 191, 151, 128, + 130, 134, 136, 138, 141, 128, 131, 190, + 255, 133, 137, 142, 148, 151, 161, 164, + 255, 128, 132, 134, 136, 138, 141, 149, + 150, 162, 163, 129, 131, 190, 255, 133, + 137, 142, 150, 152, 161, 164, 255, 130, + 131, 138, 150, 143, 148, 152, 159, 178, + 179, 177, 180, 186, 135, 142, 177, 180, + 185, 187, 188, 136, 141, 181, 183, 185, + 152, 153, 190, 191, 177, 191, 128, 132, + 134, 135, 141, 151, 153, 188, 134, 128, + 129, 130, 141, 156, 157, 158, 159, 160, + 162, 164, 168, 169, 170, 172, 173, 174, + 175, 176, 179, 183, 171, 190, 150, 153, + 158, 160, 162, 164, 167, 173, 177, 180, + 143, 130, 141, 154, 157, 157, 159, 146, + 148, 178, 180, 146, 147, 178, 179, 180, + 255, 148, 156, 158, 255, 139, 142, 169, + 160, 171, 176, 187, 151, 155, 191, 149, + 158, 160, 188, 176, 190, 128, 132, 180, + 255, 133, 170, 180, 255, 128, 130, 161, + 173, 166, 179, 164, 183, 173, 144, 146, + 148, 168, 178, 180, 184, 185, 128, 181, + 188, 191, 128, 129, 131, 179, 181, 183, + 140, 143, 170, 174, 160, 164, 166, 175, + 144, 176, 175, 177, 191, 160, 191, 128, + 130, 170, 175, 153, 154, 153, 154, 155, + 160, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 175, 175, 178, 180, 189, + 158, 159, 176, 177, 130, 134, 139, 163, + 167, 128, 129, 180, 255, 133, 159, 178, + 255, 166, 173, 135, 147, 128, 131, 179, + 255, 129, 164, 166, 255, 169, 182, 131, + 140, 141, 187, 189, 176, 178, 180, 183, + 184, 190, 191, 129, 171, 175, 181, 182, + 163, 170, 172, 173, 172, 184, 187, 190, + 191, 158, 128, 143, 160, 175, 185, 187, + 144, 145, 150, 155, 157, 158, 135, 139, + 141, 168, 171, 189, 160, 182, 186, 191, + 129, 131, 133, 134, 140, 143, 184, 186, + 165, 166, 128, 129, 130, 132, 133, 134, + 135, 136, 139, 140, 141, 146, 147, 150, + 151, 152, 153, 154, 156, 128, 130, 184, + 255, 135, 190, 131, 175, 187, 188, 190, + 255, 128, 130, 167, 180, 179, 128, 130, + 179, 255, 129, 137, 141, 255, 172, 183, + 159, 170, 188, 128, 131, 190, 191, 151, + 128, 132, 135, 136, 139, 141, 162, 163, + 166, 172, 176, 180, 176, 255, 132, 255, + 175, 181, 184, 255, 129, 155, 158, 255, + 129, 255, 171, 183, 157, 171, 171, 172, + 189, 190, 176, 180, 176, 182, 145, 190, + 143, 146, 178, 157, 158, 160, 163, 133, + 134, 137, 168, 169, 170, 165, 169, 173, + 255, 131, 132, 140, 169, 174, 255, 130, + 132, 128, 182, 187, 255, 173, 180, 182, + 255, 132, 155, 159, 161, 175, 163, 144, + 150, 160, 128, 129, 132, 135, 133, 134, + 129, 160, 255, 192, 255, 170, 173, 181, + 186, 0, 127, 181, 190, 176, 183, 184, + 185, 186, 191, 192, 255, 130, 131, 137, + 190, 136, 144, 145, 191, 192, 255, 135, + 129, 130, 132, 133, 144, 170, 176, 179, + 156, 128, 133, 144, 154, 160, 191, 176, + 128, 138, 139, 159, 174, 255, 148, 158, + 169, 150, 164, 167, 173, 176, 185, 189, + 190, 192, 255, 144, 143, 145, 146, 175, + 176, 255, 139, 140, 141, 255, 166, 176, + 178, 255, 186, 138, 170, 171, 179, 180, + 181, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, + 191, 154, 164, 168, 128, 149, 150, 173, + 128, 152, 153, 155, 163, 255, 189, 132, + 185, 144, 152, 161, 164, 176, 177, 255, + 132, 169, 177, 188, 129, 131, 141, 142, + 145, 146, 179, 181, 186, 187, 190, 255, + 142, 158, 133, 134, 137, 138, 143, 150, + 152, 155, 156, 161, 164, 175, 176, 177, + 178, 255, 188, 129, 131, 133, 138, 143, + 144, 147, 168, 170, 176, 178, 179, 181, + 182, 184, 185, 190, 255, 157, 131, 134, + 137, 138, 142, 144, 146, 152, 153, 158, + 159, 175, 178, 180, 182, 255, 189, 129, + 131, 133, 141, 143, 145, 147, 168, 170, + 176, 178, 179, 181, 185, 188, 255, 134, + 138, 144, 185, 142, 159, 160, 161, 164, + 255, 189, 129, 131, 133, 140, 143, 144, + 147, 168, 170, 176, 178, 179, 181, 185, + 188, 191, 177, 128, 132, 135, 136, 139, + 141, 150, 151, 156, 157, 159, 161, 162, + 163, 130, 131, 156, 133, 138, 142, 144, + 146, 149, 153, 154, 158, 159, 163, 164, + 168, 170, 174, 185, 190, 191, 144, 151, + 128, 130, 134, 136, 138, 141, 189, 128, + 131, 133, 140, 142, 144, 146, 168, 170, + 185, 190, 255, 133, 137, 151, 142, 148, + 152, 154, 155, 159, 160, 161, 164, 255, + 189, 129, 131, 133, 140, 142, 144, 146, + 168, 170, 179, 181, 185, 188, 191, 158, + 128, 132, 134, 136, 138, 141, 149, 150, + 160, 161, 162, 163, 177, 178, 189, 129, + 131, 133, 140, 142, 144, 146, 186, 190, + 255, 133, 137, 142, 143, 150, 152, 158, + 159, 161, 164, 185, 186, 191, 192, 255, + 189, 130, 131, 133, 150, 154, 177, 179, + 187, 138, 150, 128, 134, 143, 148, 152, + 159, 178, 179, 177, 180, 186, 135, 142, + 177, 180, 185, 187, 188, 136, 141, 128, + 181, 183, 185, 152, 153, 190, 191, 128, + 135, 137, 172, 177, 191, 128, 132, 134, + 135, 136, 140, 141, 151, 153, 188, 134, + 128, 129, 130, 131, 137, 138, 139, 140, + 141, 142, 143, 144, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, + 168, 169, 170, 172, 173, 174, 175, 176, + 177, 179, 181, 182, 183, 188, 189, 190, + 191, 132, 152, 180, 184, 185, 187, 171, + 190, 150, 153, 158, 160, 162, 164, 167, + 173, 177, 180, 143, 130, 141, 154, 157, + 160, 255, 155, 156, 157, 159, 160, 255, + 128, 140, 142, 145, 146, 148, 160, 177, + 178, 180, 128, 145, 146, 147, 160, 172, + 174, 176, 178, 179, 180, 255, 148, 156, + 158, 255, 139, 142, 160, 255, 169, 128, + 170, 176, 255, 128, 158, 160, 171, 176, + 187, 128, 150, 151, 155, 191, 149, 158, + 160, 188, 176, 190, 128, 132, 133, 179, + 180, 255, 133, 139, 140, 170, 180, 255, + 128, 130, 131, 160, 161, 173, 174, 175, + 186, 255, 166, 179, 180, 255, 128, 163, + 164, 183, 173, 144, 146, 148, 168, 169, + 177, 178, 180, 181, 182, 184, 185, 128, + 181, 188, 191, 128, 129, 130, 131, 132, + 133, 134, 146, 147, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 140, 143, 170, + 174, 177, 191, 160, 164, 166, 175, 144, + 176, 165, 170, 175, 177, 180, 255, 191, + 168, 174, 176, 255, 128, 134, 136, 142, + 144, 150, 152, 158, 160, 191, 128, 130, + 132, 133, 134, 133, 170, 175, 187, 188, + 153, 154, 128, 146, 147, 148, 152, 153, + 154, 155, 156, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 129, 255, + 191, 128, 174, 175, 178, 180, 189, 128, + 157, 158, 159, 160, 255, 176, 177, 178, + 255, 130, 134, 139, 163, 167, 168, 255, + 128, 129, 130, 179, 180, 255, 187, 189, + 133, 159, 178, 183, 184, 255, 138, 165, + 166, 173, 176, 255, 135, 147, 148, 159, + 189, 255, 128, 131, 132, 178, 179, 255, + 143, 129, 164, 166, 255, 128, 168, 169, + 182, 131, 128, 139, 140, 141, 187, 189, + 176, 178, 180, 183, 184, 190, 191, 129, + 160, 170, 171, 175, 178, 180, 181, 182, + 128, 162, 163, 170, 172, 173, 172, 173, + 174, 175, 180, 181, 182, 183, 184, 185, + 187, 188, 189, 190, 191, 176, 186, 158, + 190, 128, 134, 147, 151, 157, 168, 170, + 182, 184, 188, 128, 143, 160, 175, 191, + 189, 255, 158, 159, 160, 190, 130, 135, + 138, 143, 146, 151, 154, 156, 185, 187, + 144, 145, 146, 147, 148, 150, 155, 157, + 158, 159, 128, 129, 130, 131, 133, 135, + 138, 139, 140, 141, 142, 143, 144, 145, + 146, 148, 149, 152, 156, 157, 160, 161, + 162, 163, 164, 166, 168, 169, 170, 171, + 172, 173, 174, 176, 177, 153, 155, 178, + 179, 189, 160, 145, 255, 139, 143, 182, + 186, 187, 255, 128, 191, 129, 131, 133, + 134, 140, 143, 144, 147, 149, 151, 153, + 179, 184, 186, 128, 135, 137, 164, 165, + 166, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 138, 139, 140, 141, 146, 147, + 150, 151, 152, 153, 154, 156, 162, 163, + 171, 128, 130, 131, 183, 184, 255, 135, + 190, 131, 175, 187, 188, 190, 255, 128, + 130, 131, 166, 167, 180, 179, 182, 144, + 178, 128, 130, 131, 178, 179, 255, 154, + 156, 129, 132, 133, 137, 141, 255, 128, + 145, 147, 171, 172, 183, 159, 170, 171, + 255, 189, 128, 131, 133, 140, 143, 144, + 147, 168, 170, 176, 178, 179, 181, 185, + 188, 191, 144, 151, 128, 132, 135, 136, + 139, 141, 157, 161, 162, 163, 166, 172, + 176, 180, 128, 175, 176, 255, 134, 132, + 135, 136, 255, 128, 174, 175, 181, 184, + 255, 129, 151, 152, 155, 158, 255, 132, + 129, 255, 128, 170, 171, 183, 157, 171, + 160, 168, 169, 171, 172, 173, 174, 188, + 189, 190, 161, 167, 144, 173, 176, 180, + 128, 175, 176, 182, 133, 143, 145, 190, + 191, 255, 143, 146, 147, 159, 176, 177, + 178, 128, 136, 144, 153, 157, 158, 160, + 163, 133, 134, 137, 144, 145, 146, 147, + 148, 149, 154, 155, 156, 157, 158, 159, + 168, 169, 170, 150, 153, 165, 169, 173, + 255, 131, 132, 140, 169, 174, 255, 130, + 132, 128, 182, 187, 255, 173, 180, 182, + 255, 132, 155, 159, 161, 175, 160, 163, + 184, 185, 186, 161, 162, 133, 143, 144, + 150, 151, 255, 160, 128, 129, 132, 135, + 133, 134, 129, 160, 255, 192, 255, 176, + 255, 170, 173, 181, 186, 0, 127, 181, + 190, 176, 183, 184, 185, 186, 191, 192, + 255, 130, 131, 137, 137, 190, 136, 144, + 145, 191, 192, 255, 135, 179, 129, 130, + 132, 133, 144, 170, 176, 178, 156, 128, + 133, 140, 141, 144, 154, 160, 191, 171, + 172, 176, 128, 138, 139, 159, 160, 169, + 174, 255, 148, 158, 169, 150, 164, 167, + 173, 176, 185, 189, 190, 192, 255, 144, + 143, 145, 146, 175, 176, 255, 139, 140, + 141, 255, 166, 176, 178, 255, 184, 186, + 128, 137, 138, 170, 171, 179, 180, 181, + 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, + 154, 164, 168, 128, 149, 150, 173, 128, + 152, 153, 155, 163, 255, 189, 132, 185, + 144, 176, 152, 161, 164, 165, 166, 175, + 177, 255, 132, 169, 177, 188, 129, 131, + 141, 142, 145, 146, 179, 181, 186, 187, + 190, 255, 142, 158, 133, 134, 137, 138, + 143, 150, 152, 155, 156, 161, 164, 165, + 166, 175, 176, 177, 178, 255, 188, 129, + 131, 133, 138, 143, 144, 147, 168, 170, + 176, 178, 179, 181, 182, 184, 185, 190, + 255, 157, 131, 134, 137, 138, 142, 144, + 146, 152, 153, 158, 159, 165, 166, 175, + 178, 180, 182, 255, 189, 129, 131, 133, + 141, 143, 145, 147, 168, 170, 176, 178, + 179, 181, 185, 188, 255, 134, 138, 144, + 185, 142, 159, 160, 161, 164, 165, 166, + 175, 176, 255, 189, 129, 131, 133, 140, + 143, 144, 147, 168, 170, 176, 178, 179, + 181, 185, 188, 191, 177, 128, 132, 135, + 136, 139, 141, 150, 151, 156, 157, 159, + 161, 162, 163, 166, 175, 130, 131, 156, + 133, 138, 142, 144, 146, 149, 153, 154, + 158, 159, 163, 164, 168, 170, 174, 185, + 190, 191, 144, 151, 128, 130, 134, 136, + 138, 141, 166, 175, 189, 128, 131, 133, + 140, 142, 144, 146, 168, 170, 185, 190, + 255, 133, 137, 151, 142, 148, 152, 154, + 155, 159, 160, 161, 164, 165, 166, 175, + 176, 255, 189, 129, 131, 133, 140, 142, + 144, 146, 168, 170, 179, 181, 185, 188, + 191, 158, 128, 132, 134, 136, 138, 141, + 149, 150, 160, 161, 162, 163, 166, 175, + 177, 178, 189, 129, 131, 133, 140, 142, + 144, 146, 186, 190, 255, 133, 137, 142, + 143, 150, 152, 158, 159, 161, 164, 165, + 166, 175, 176, 185, 186, 191, 192, 255, + 189, 130, 131, 133, 150, 154, 177, 179, + 187, 138, 150, 128, 134, 143, 148, 152, + 159, 166, 175, 178, 179, 177, 180, 186, + 135, 142, 144, 153, 177, 180, 185, 187, + 188, 136, 141, 144, 153, 128, 181, 183, + 185, 152, 153, 160, 169, 190, 191, 128, + 135, 137, 172, 177, 191, 128, 132, 134, + 135, 136, 140, 141, 151, 153, 188, 134, + 128, 129, 130, 131, 137, 138, 139, 140, + 141, 142, 143, 144, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, + 165, 167, 168, 169, 170, 172, 173, 174, + 175, 176, 177, 179, 181, 182, 183, 188, + 189, 190, 191, 132, 152, 180, 184, 185, + 187, 171, 190, 128, 137, 150, 153, 158, + 160, 162, 164, 167, 173, 177, 180, 143, + 130, 141, 144, 153, 154, 157, 160, 255, + 155, 156, 157, 159, 160, 255, 128, 140, + 142, 145, 146, 148, 160, 177, 178, 180, + 128, 145, 146, 147, 160, 172, 174, 176, + 178, 179, 180, 255, 148, 156, 158, 159, + 160, 169, 170, 255, 139, 142, 144, 153, + 160, 255, 169, 128, 170, 176, 255, 128, + 158, 160, 171, 176, 187, 128, 150, 151, + 155, 191, 149, 158, 160, 188, 128, 137, + 144, 153, 176, 190, 128, 132, 133, 179, + 180, 255, 133, 139, 140, 143, 144, 153, + 154, 170, 180, 255, 128, 130, 131, 160, + 161, 173, 174, 175, 176, 185, 186, 255, + 166, 179, 180, 255, 128, 163, 164, 183, + 173, 144, 146, 148, 168, 169, 177, 178, + 180, 181, 182, 184, 185, 128, 181, 188, + 191, 128, 129, 130, 131, 132, 133, 134, + 146, 147, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 164, 140, 143, 152, 153, + 170, 174, 191, 255, 132, 165, 177, 191, + 129, 147, 149, 159, 160, 175, 176, 255, + 144, 176, 165, 170, 175, 177, 180, 255, + 191, 168, 174, 176, 255, 128, 134, 136, + 142, 144, 150, 152, 158, 160, 191, 128, + 130, 132, 133, 134, 133, 170, 175, 187, + 188, 153, 154, 128, 146, 147, 148, 152, + 153, 154, 155, 156, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 129, + 255, 191, 128, 174, 175, 178, 180, 189, + 128, 157, 158, 159, 160, 255, 176, 177, + 178, 255, 130, 134, 139, 163, 167, 168, + 255, 128, 129, 130, 179, 180, 255, 187, + 189, 133, 143, 144, 153, 154, 159, 178, + 183, 184, 255, 128, 137, 138, 165, 166, + 173, 176, 255, 135, 147, 148, 159, 189, + 255, 128, 131, 132, 178, 179, 255, 143, + 129, 142, 144, 153, 154, 164, 166, 175, + 176, 185, 186, 255, 128, 168, 169, 182, + 131, 128, 139, 140, 141, 144, 153, 187, + 189, 176, 178, 180, 183, 184, 190, 191, + 129, 160, 170, 171, 175, 178, 180, 181, + 182, 128, 162, 163, 170, 172, 173, 176, + 185, 172, 173, 174, 175, 180, 181, 182, + 183, 184, 185, 187, 188, 189, 190, 191, + 176, 186, 158, 190, 128, 134, 147, 151, + 157, 168, 170, 182, 184, 188, 144, 148, + 128, 143, 160, 175, 179, 180, 191, 189, + 255, 158, 159, 160, 190, 130, 135, 138, + 143, 146, 151, 154, 156, 185, 187, 144, + 145, 146, 147, 148, 150, 155, 157, 158, + 159, 128, 129, 130, 131, 133, 135, 138, + 139, 140, 141, 142, 143, 144, 145, 146, + 148, 149, 152, 156, 157, 160, 161, 162, + 163, 164, 166, 168, 169, 170, 171, 172, + 173, 174, 176, 177, 153, 155, 178, 179, + 189, 160, 145, 255, 139, 143, 182, 186, + 187, 255, 128, 191, 129, 131, 133, 134, + 140, 143, 144, 147, 149, 151, 153, 179, + 184, 186, 128, 135, 137, 164, 165, 166, + 128, 129, 130, 131, 132, 133, 134, 135, + 136, 138, 139, 140, 141, 146, 147, 150, + 151, 152, 153, 154, 155, 156, 162, 163, + 171, 128, 130, 131, 183, 184, 255, 135, + 165, 166, 175, 176, 190, 131, 175, 187, + 188, 190, 255, 128, 130, 131, 166, 167, + 180, 182, 191, 179, 182, 144, 178, 128, + 130, 131, 178, 179, 255, 155, 129, 132, + 133, 137, 141, 143, 144, 153, 154, 156, + 157, 255, 128, 145, 147, 171, 172, 183, + 159, 170, 171, 175, 176, 185, 186, 255, + 189, 128, 131, 133, 140, 143, 144, 147, + 168, 170, 176, 178, 179, 181, 185, 188, + 191, 144, 151, 128, 132, 135, 136, 139, + 141, 157, 161, 162, 163, 166, 172, 176, + 180, 128, 175, 176, 255, 134, 132, 135, + 136, 143, 144, 153, 154, 255, 128, 174, + 175, 181, 184, 255, 129, 151, 152, 155, + 158, 255, 132, 129, 143, 144, 153, 154, + 255, 128, 170, 171, 183, 157, 171, 176, + 185, 160, 168, 169, 171, 172, 173, 174, + 188, 189, 190, 161, 167, 144, 173, 176, + 180, 128, 175, 176, 182, 133, 143, 145, + 190, 191, 255, 143, 146, 147, 159, 176, + 177, 178, 128, 136, 144, 153, 157, 158, + 160, 163, 133, 134, 137, 144, 145, 146, + 147, 148, 149, 154, 155, 156, 157, 158, + 159, 168, 169, 170, 150, 153, 165, 169, + 173, 255, 131, 132, 140, 169, 174, 255, + 130, 132, 128, 182, 187, 255, 173, 180, + 182, 255, 132, 155, 159, 161, 175, 160, + 163, 184, 185, 186, 161, 162, 133, 143, + 144, 150, 151, 255, 160, 128, 129, 132, + 135, 133, 134, 129, 160, 255, 192, 255, + 176, 255, 170, 173, 181, 186, 0, 127, + 181, 190, 176, 183, 184, 185, 186, 191, + 192, 255, 130, 131, 137, 190, 136, 144, + 145, 191, 192, 255, 135, 179, 129, 130, + 132, 133, 144, 170, 176, 178, 156, 128, + 133, 144, 154, 160, 191, 171, 176, 128, + 138, 139, 159, 160, 169, 174, 255, 148, + 158, 169, 150, 164, 167, 173, 176, 185, + 189, 190, 192, 255, 144, 143, 145, 146, + 175, 176, 255, 139, 140, 141, 255, 166, + 176, 178, 255, 186, 128, 137, 138, 170, + 171, 179, 180, 181, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 154, 164, 168, 128, + 149, 150, 173, 128, 152, 153, 155, 163, + 255, 189, 132, 185, 144, 176, 152, 161, + 164, 165, 166, 175, 177, 255, 132, 169, + 177, 188, 129, 131, 141, 142, 145, 146, + 179, 181, 186, 187, 190, 255, 142, 158, + 133, 134, 137, 138, 143, 150, 152, 155, + 156, 161, 164, 165, 166, 175, 176, 177, + 178, 255, 188, 129, 131, 133, 138, 143, + 144, 147, 168, 170, 176, 178, 179, 181, + 182, 184, 185, 190, 255, 157, 131, 134, + 137, 138, 142, 144, 146, 152, 153, 158, + 159, 165, 166, 175, 178, 180, 182, 255, + 189, 129, 131, 133, 141, 143, 145, 147, + 168, 170, 176, 178, 179, 181, 185, 188, + 255, 134, 138, 144, 185, 142, 159, 160, + 161, 164, 165, 166, 175, 176, 255, 189, + 129, 131, 133, 140, 143, 144, 147, 168, + 170, 176, 178, 179, 181, 185, 188, 191, + 177, 128, 132, 135, 136, 139, 141, 150, + 151, 156, 157, 159, 161, 162, 163, 166, + 175, 130, 131, 156, 133, 138, 142, 144, + 146, 149, 153, 154, 158, 159, 163, 164, + 168, 170, 174, 185, 190, 191, 144, 151, + 128, 130, 134, 136, 138, 141, 166, 175, + 189, 128, 131, 133, 140, 142, 144, 146, + 168, 170, 185, 190, 255, 133, 137, 151, + 142, 148, 152, 154, 155, 159, 160, 161, + 164, 165, 166, 175, 176, 255, 189, 129, + 131, 133, 140, 142, 144, 146, 168, 170, + 179, 181, 185, 188, 191, 158, 128, 132, + 134, 136, 138, 141, 149, 150, 160, 161, + 162, 163, 166, 175, 177, 178, 189, 129, + 131, 133, 140, 142, 144, 146, 186, 190, + 255, 133, 137, 142, 143, 150, 152, 158, + 159, 161, 164, 165, 166, 175, 176, 185, + 186, 191, 192, 255, 189, 130, 131, 133, + 150, 154, 177, 179, 187, 138, 150, 128, + 134, 143, 148, 152, 159, 166, 175, 178, + 179, 177, 180, 186, 135, 142, 144, 153, + 177, 180, 185, 187, 188, 136, 141, 144, + 153, 128, 181, 183, 185, 152, 153, 160, + 169, 190, 191, 128, 135, 137, 172, 177, + 191, 128, 132, 134, 135, 136, 140, 141, + 151, 153, 188, 134, 128, 129, 130, 131, + 137, 138, 139, 140, 141, 142, 143, 144, + 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 167, 168, 169, + 170, 172, 173, 174, 175, 176, 177, 179, + 181, 182, 183, 188, 189, 190, 191, 132, + 152, 180, 184, 185, 187, 171, 190, 128, + 137, 150, 153, 158, 160, 162, 164, 167, + 173, 177, 180, 143, 130, 141, 144, 153, + 154, 157, 160, 255, 155, 156, 157, 159, + 160, 255, 128, 140, 142, 145, 146, 148, + 160, 177, 178, 180, 128, 145, 146, 147, + 160, 172, 174, 176, 178, 179, 180, 255, + 148, 156, 158, 159, 160, 169, 170, 255, + 139, 142, 144, 153, 160, 255, 169, 128, + 170, 176, 255, 128, 158, 160, 171, 176, + 187, 128, 150, 151, 155, 191, 149, 158, + 160, 188, 128, 137, 144, 153, 176, 190, + 128, 132, 133, 179, 180, 255, 133, 139, + 140, 143, 144, 153, 154, 170, 180, 255, + 128, 130, 131, 160, 161, 173, 174, 175, + 176, 185, 186, 255, 166, 179, 180, 255, + 128, 163, 164, 183, 173, 144, 146, 148, + 168, 169, 177, 178, 180, 181, 182, 184, + 185, 128, 181, 188, 191, 128, 129, 130, + 131, 132, 133, 134, 146, 147, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 140, + 143, 170, 174, 191, 255, 165, 177, 191, + 129, 147, 149, 159, 160, 175, 176, 255, + 144, 176, 165, 170, 175, 177, 180, 255, + 191, 168, 174, 176, 255, 128, 134, 136, + 142, 144, 150, 152, 158, 160, 191, 128, + 130, 131, 132, 133, 134, 135, 139, 140, + 141, 133, 170, 175, 177, 181, 187, 188, + 153, 154, 155, 156, 160, 255, 128, 146, + 147, 148, 152, 153, 154, 155, 156, 158, + 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 129, 255, 191, 128, 174, 175, + 178, 180, 189, 128, 157, 158, 159, 160, + 255, 176, 177, 178, 255, 130, 134, 139, + 163, 167, 168, 255, 128, 129, 130, 179, + 180, 255, 187, 189, 133, 143, 144, 153, + 154, 159, 178, 183, 184, 255, 128, 137, + 138, 165, 166, 173, 176, 255, 135, 147, + 148, 159, 189, 255, 128, 131, 132, 178, + 179, 255, 143, 129, 142, 144, 153, 154, + 164, 166, 175, 176, 185, 186, 255, 128, + 168, 169, 182, 131, 128, 139, 140, 141, + 144, 153, 187, 189, 176, 178, 180, 183, + 184, 190, 191, 129, 160, 170, 171, 175, + 178, 180, 181, 182, 128, 162, 163, 170, + 172, 173, 176, 185, 172, 173, 174, 175, + 180, 181, 182, 183, 184, 185, 187, 188, + 189, 190, 191, 176, 186, 158, 190, 128, + 134, 147, 151, 157, 168, 170, 182, 184, + 188, 128, 143, 160, 175, 179, 180, 191, + 189, 255, 158, 159, 160, 190, 191, 255, + 130, 135, 138, 143, 146, 151, 154, 156, + 185, 187, 144, 145, 146, 147, 148, 150, + 155, 157, 158, 159, 128, 129, 130, 131, + 133, 135, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 148, 149, 152, 156, 157, + 160, 161, 162, 163, 164, 166, 168, 169, + 170, 171, 172, 173, 174, 176, 177, 153, + 155, 178, 179, 189, 160, 145, 255, 139, + 143, 182, 186, 187, 255, 128, 191, 129, + 131, 133, 134, 140, 143, 144, 147, 149, + 151, 153, 179, 184, 186, 128, 135, 137, + 164, 165, 166, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 138, 139, 140, 141, + 146, 147, 150, 151, 152, 153, 154, 155, + 156, 162, 163, 171, 128, 130, 131, 183, + 184, 255, 135, 165, 166, 175, 176, 190, + 131, 175, 187, 188, 190, 255, 128, 130, + 131, 166, 167, 180, 182, 191, 179, 182, + 144, 178, 128, 130, 131, 178, 179, 255, + 155, 129, 132, 133, 137, 141, 143, 144, + 153, 154, 156, 157, 255, 128, 145, 147, + 171, 172, 183, 159, 170, 171, 175, 176, + 185, 186, 255, 189, 128, 131, 133, 140, + 143, 144, 147, 168, 170, 176, 178, 179, + 181, 185, 188, 191, 144, 151, 128, 132, + 135, 136, 139, 141, 157, 161, 162, 163, + 166, 172, 176, 180, 128, 175, 176, 255, + 134, 132, 135, 136, 143, 144, 153, 154, + 255, 128, 174, 175, 181, 184, 255, 129, + 151, 152, 155, 158, 255, 132, 129, 143, + 144, 153, 154, 255, 128, 170, 171, 183, + 157, 171, 176, 185, 160, 168, 169, 171, + 172, 173, 174, 188, 189, 190, 161, 167, + 144, 173, 176, 180, 128, 175, 176, 182, + 133, 143, 145, 190, 191, 255, 143, 146, + 147, 159, 128, 176, 177, 178, 128, 136, + 144, 153, 157, 158, 160, 163, 133, 134, + 137, 144, 145, 146, 147, 148, 149, 154, + 155, 156, 157, 158, 159, 168, 169, 170, + 150, 153, 165, 169, 173, 255, 131, 132, + 140, 169, 174, 255, 130, 132, 128, 182, + 187, 255, 173, 180, 182, 255, 132, 155, + 159, 161, 175, 160, 163, 184, 185, 186, + 161, 162, 133, 143, 144, 150, 151, 255, + 160, 128, 129, 132, 135, 133, 134, 129, + 160, 255, 192, 255, 176, 255, 173, 0, + 127, 176, 255, 131, 137, 191, 145, 189, + 135, 129, 130, 132, 133, 156, 128, 133, + 144, 154, 176, 139, 159, 150, 157, 159, + 164, 167, 168, 170, 173, 143, 145, 176, + 255, 139, 255, 166, 176, 171, 179, 160, + 161, 163, 164, 165, 167, 169, 171, 173, + 174, 175, 176, 177, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, + 191, 166, 170, 172, 178, 128, 129, 130, + 141, 156, 157, 158, 159, 160, 162, 164, + 168, 169, 170, 172, 173, 174, 175, 176, + 179, 183, 128, 129, 131, 179, 181, 183, + 128, 130, 153, 154, 155, 160, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, + 175, 172, 184, 187, 190, 191, 144, 145, + 150, 155, 157, 158, 160, 154, 164, 168, + 128, 149, 150, 173, 128, 152, 153, 155, + 189, 132, 185, 144, 176, 152, 161, 164, + 165, 166, 175, 177, 255, 132, 169, 177, + 188, 129, 131, 141, 142, 145, 146, 179, + 181, 186, 187, 190, 255, 142, 158, 133, + 134, 137, 138, 143, 150, 152, 155, 156, + 161, 164, 165, 166, 175, 176, 177, 178, + 255, 188, 129, 131, 133, 138, 143, 144, + 147, 168, 170, 176, 178, 179, 181, 182, + 184, 185, 190, 255, 157, 131, 134, 137, + 138, 142, 144, 146, 152, 153, 158, 159, + 165, 166, 175, 178, 180, 182, 255, 189, + 129, 131, 133, 141, 143, 145, 147, 168, + 170, 176, 178, 179, 181, 185, 188, 255, + 134, 138, 144, 185, 142, 159, 160, 161, + 164, 165, 166, 175, 176, 255, 189, 129, + 131, 133, 140, 143, 144, 147, 168, 170, + 176, 178, 179, 181, 185, 188, 191, 177, + 128, 132, 135, 136, 139, 141, 150, 151, + 156, 157, 159, 161, 162, 163, 166, 175, + 130, 131, 156, 133, 138, 142, 144, 146, + 149, 153, 154, 158, 159, 163, 164, 168, + 170, 174, 185, 190, 191, 144, 151, 128, + 130, 134, 136, 138, 141, 166, 175, 189, + 128, 131, 133, 140, 142, 144, 146, 168, + 170, 185, 190, 255, 133, 137, 151, 142, + 148, 152, 154, 155, 159, 160, 161, 164, + 165, 166, 175, 176, 255, 189, 129, 131, + 133, 140, 142, 144, 146, 168, 170, 179, + 181, 185, 188, 191, 158, 128, 132, 134, + 136, 138, 141, 149, 150, 160, 161, 162, + 163, 166, 175, 177, 178, 189, 129, 131, + 133, 140, 142, 144, 146, 186, 190, 255, + 133, 137, 142, 143, 150, 152, 158, 159, + 161, 164, 165, 166, 175, 176, 185, 186, + 191, 192, 255, 189, 130, 131, 133, 150, + 154, 177, 179, 187, 138, 150, 128, 134, + 143, 148, 152, 159, 166, 175, 178, 179, + 135, 142, 144, 153, 136, 141, 144, 153, + 128, 181, 183, 185, 152, 153, 160, 169, + 190, 191, 128, 135, 137, 172, 177, 191, + 128, 132, 134, 135, 136, 140, 141, 151, + 153, 188, 128, 137, 150, 153, 158, 160, + 162, 164, 167, 173, 177, 180, 143, 130, + 141, 144, 153, 154, 157, 160, 255, 0, + 127, 170, 173, 181, 183, 186, 0, 127, + 181, 190, 176, 183, 184, 185, 186, 191, + 192, 255, 130, 131, 137, 190, 136, 144, + 145, 191, 192, 255, 135, 179, 180, 129, + 130, 132, 133, 144, 170, 176, 178, 156, + 128, 133, 144, 154, 160, 191, 171, 176, + 128, 138, 139, 159, 160, 169, 174, 255, + 148, 158, 169, 150, 164, 167, 173, 176, + 185, 189, 190, 192, 255, 144, 143, 145, + 146, 175, 176, 255, 139, 140, 141, 255, + 166, 176, 178, 255, 186, 128, 137, 138, + 170, 171, 179, 180, 181, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 154, 164, 168, + 128, 149, 150, 173, 128, 152, 153, 155, + 163, 255, 189, 132, 185, 144, 176, 152, + 161, 164, 165, 166, 175, 177, 255, 132, + 169, 177, 188, 129, 131, 141, 142, 145, + 146, 179, 181, 186, 187, 190, 255, 142, + 158, 133, 134, 137, 138, 143, 150, 152, + 155, 156, 161, 164, 165, 166, 175, 176, + 177, 178, 255, 188, 129, 131, 133, 138, + 143, 144, 147, 168, 170, 176, 178, 179, + 181, 182, 184, 185, 190, 255, 157, 131, + 134, 137, 138, 142, 144, 146, 152, 153, + 158, 159, 165, 166, 175, 178, 180, 182, + 255, 189, 129, 131, 133, 141, 143, 145, + 147, 168, 170, 176, 178, 179, 181, 185, + 188, 255, 134, 138, 144, 185, 142, 159, + 160, 161, 164, 165, 166, 175, 176, 255, + 189, 129, 131, 133, 140, 143, 144, 147, + 168, 170, 176, 178, 179, 181, 185, 188, + 191, 177, 128, 132, 135, 136, 139, 141, + 150, 151, 156, 157, 159, 161, 162, 163, + 166, 175, 130, 131, 156, 133, 138, 142, + 144, 146, 149, 153, 154, 158, 159, 163, + 164, 168, 170, 174, 185, 190, 191, 144, + 151, 128, 130, 134, 136, 138, 141, 166, + 175, 189, 128, 131, 133, 140, 142, 144, + 146, 168, 170, 185, 190, 255, 133, 137, + 151, 142, 148, 152, 154, 155, 159, 160, + 161, 164, 165, 166, 175, 176, 255, 189, + 129, 131, 133, 140, 142, 144, 146, 168, + 170, 179, 181, 185, 188, 191, 158, 128, + 132, 134, 136, 138, 141, 149, 150, 160, + 161, 162, 163, 166, 175, 177, 178, 189, + 129, 131, 133, 140, 142, 144, 146, 186, + 190, 255, 133, 137, 142, 143, 150, 152, + 158, 159, 161, 164, 165, 166, 175, 176, + 185, 186, 191, 192, 255, 189, 130, 131, + 133, 150, 154, 177, 179, 187, 138, 150, + 128, 134, 143, 148, 152, 159, 166, 175, + 178, 179, 177, 180, 186, 135, 142, 144, + 153, 177, 180, 185, 187, 188, 136, 141, + 144, 153, 128, 181, 183, 185, 152, 153, + 160, 169, 190, 191, 128, 135, 137, 172, + 177, 191, 128, 132, 134, 135, 136, 140, + 141, 151, 153, 188, 134, 128, 129, 130, + 131, 132, 135, 137, 138, 139, 140, 141, + 142, 143, 144, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, + 167, 168, 169, 170, 172, 173, 174, 175, + 176, 177, 179, 181, 182, 183, 188, 189, + 190, 191, 133, 134, 136, 152, 180, 184, + 185, 187, 171, 190, 128, 137, 150, 153, + 158, 160, 162, 164, 167, 173, 177, 180, + 143, 130, 141, 144, 153, 154, 157, 160, + 255, 192, 255, 155, 156, 157, 159, 160, + 255, 128, 140, 142, 145, 146, 148, 160, + 177, 178, 180, 128, 145, 146, 147, 160, + 172, 174, 176, 178, 179, 180, 255, 148, + 156, 158, 159, 160, 169, 170, 255, 139, + 142, 144, 153, 160, 255, 169, 128, 170, + 176, 255, 128, 158, 160, 171, 176, 187, + 128, 150, 151, 155, 191, 149, 158, 160, + 188, 128, 137, 144, 153, 176, 190, 128, + 132, 133, 179, 180, 255, 133, 139, 140, + 143, 144, 153, 154, 170, 180, 255, 128, + 130, 131, 160, 161, 173, 174, 175, 176, + 185, 186, 255, 166, 179, 180, 255, 128, + 163, 164, 183, 173, 144, 146, 148, 168, + 169, 177, 178, 180, 181, 182, 184, 185, + 128, 181, 188, 191, 128, 129, 130, 131, + 132, 133, 134, 146, 147, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 164, 167, + 140, 143, 152, 153, 170, 174, 191, 255, + 165, 177, 191, 129, 147, 149, 159, 160, + 175, 176, 255, 144, 176, 165, 170, 175, + 177, 180, 255, 191, 168, 174, 176, 255, + 128, 134, 136, 142, 144, 150, 152, 158, + 160, 191, 128, 130, 132, 133, 134, 136, + 137, 133, 170, 175, 187, 188, 153, 154, + 133, 173, 177, 255, 143, 159, 160, 186, + 187, 255, 128, 158, 173, 0, 127, 176, + 255, 131, 137, 191, 145, 189, 135, 129, + 130, 132, 133, 156, 128, 133, 144, 154, + 176, 139, 159, 150, 157, 159, 164, 167, + 168, 170, 173, 143, 145, 176, 255, 139, + 255, 166, 176, 171, 179, 160, 161, 163, + 164, 165, 167, 169, 171, 173, 174, 175, + 176, 177, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 166, + 170, 172, 178, 150, 153, 155, 163, 165, + 167, 169, 173, 153, 155, 163, 255, 189, + 132, 185, 144, 152, 161, 164, 255, 188, + 129, 131, 190, 255, 133, 134, 137, 138, + 142, 150, 152, 161, 164, 255, 131, 134, + 137, 138, 142, 144, 146, 175, 178, 180, + 182, 255, 134, 138, 142, 161, 164, 255, + 188, 129, 131, 190, 191, 128, 132, 135, + 136, 139, 141, 150, 151, 162, 163, 130, + 190, 191, 151, 128, 130, 134, 136, 138, + 141, 128, 131, 190, 255, 133, 137, 142, + 148, 151, 161, 164, 255, 128, 132, 134, + 136, 138, 141, 149, 150, 162, 163, 129, + 131, 190, 255, 133, 137, 142, 150, 152, + 161, 164, 255, 130, 131, 138, 150, 143, + 148, 152, 159, 178, 179, 177, 180, 186, + 135, 142, 177, 180, 185, 187, 188, 136, + 141, 181, 183, 185, 152, 153, 190, 191, + 177, 191, 128, 132, 134, 135, 141, 151, + 153, 188, 134, 128, 129, 130, 132, 135, + 141, 156, 157, 158, 159, 160, 162, 164, + 168, 169, 170, 172, 173, 174, 175, 176, + 179, 183, 133, 134, 171, 190, 150, 153, + 158, 160, 162, 164, 167, 173, 177, 180, + 143, 130, 141, 154, 157, 192, 255, 157, + 159, 146, 148, 178, 180, 146, 147, 178, + 179, 180, 255, 148, 156, 158, 255, 139, + 142, 169, 160, 171, 176, 187, 151, 155, + 191, 149, 158, 160, 188, 176, 190, 128, + 132, 180, 255, 133, 170, 180, 255, 128, + 130, 161, 173, 166, 179, 164, 183, 173, + 144, 146, 148, 168, 178, 180, 184, 185, + 128, 181, 188, 191, 128, 129, 131, 179, + 181, 183, 140, 143, 170, 174, 160, 164, + 166, 175, 144, 176, 175, 177, 191, 160, + 191, 128, 130, 132, 133, 134, 136, 137, + 170, 175, 153, 154, 177, 255, 143, 255, + 160, 190, 153, 154, 155, 160, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, + 175, 176, 177, 255, 175, 178, 180, 189, + 158, 159, 176, 177, 130, 134, 139, 163, + 167, 128, 129, 180, 255, 133, 159, 178, + 255, 166, 173, 135, 147, 160, 188, 128, + 131, 179, 255, 129, 164, 166, 255, 169, + 182, 131, 140, 141, 187, 189, 176, 178, + 180, 183, 184, 190, 191, 129, 171, 175, + 181, 182, 163, 170, 172, 173, 158, 159, + 160, 255, 164, 175, 135, 138, 188, 255, + 172, 184, 187, 190, 191, 158, 128, 143, + 160, 175, 158, 190, 130, 135, 138, 143, + 146, 151, 154, 156, 185, 187, 144, 145, + 150, 155, 157, 158, 135, 139, 141, 168, + 171, 189, 160, 182, 186, 191, 129, 131, + 133, 134, 140, 143, 184, 186, 165, 166, + 128, 129, 130, 132, 133, 134, 135, 136, + 139, 140, 141, 146, 147, 150, 151, 152, + 153, 154, 156, 128, 130, 184, 255, 135, + 190, 131, 175, 187, 188, 190, 255, 128, + 130, 167, 180, 179, 128, 130, 179, 255, + 129, 137, 141, 255, 172, 183, 159, 170, + 188, 128, 131, 190, 191, 151, 128, 132, + 135, 136, 139, 141, 162, 163, 166, 172, + 176, 180, 176, 255, 132, 255, 175, 181, + 184, 255, 129, 155, 158, 255, 129, 255, + 171, 183, 157, 171, 171, 172, 189, 190, + 176, 180, 176, 182, 145, 190, 143, 146, + 178, 157, 158, 160, 163, 133, 134, 137, + 168, 169, 170, 165, 169, 173, 255, 131, + 132, 140, 169, 174, 255, 130, 132, 128, + 182, 187, 255, 173, 180, 182, 255, 132, + 155, 159, 161, 175, 163, 144, 150, 160, + 128, 129, 132, 135, 133, 134, 129, 160, + 255, 128, 146, 147, 148, 152, 153, 154, + 155, 156, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 129, 157, 177, + 255, 191, 128, 174, 175, 178, 180, 189, + 128, 157, 158, 159, 160, 255, 176, 177, + 178, 255, 130, 134, 139, 163, 167, 168, + 255, 128, 129, 130, 179, 180, 255, 187, + 189, 133, 143, 144, 153, 154, 159, 178, + 183, 184, 255, 128, 137, 138, 165, 166, + 173, 176, 255, 135, 147, 148, 159, 160, + 188, 189, 255, 128, 131, 132, 178, 179, + 255, 143, 129, 142, 144, 153, 154, 164, + 166, 175, 176, 185, 186, 255, 128, 168, + 169, 182, 131, 128, 139, 140, 141, 144, + 153, 187, 189, 176, 178, 180, 183, 184, + 190, 191, 129, 160, 170, 171, 175, 178, + 180, 181, 182, 128, 162, 163, 170, 172, + 173, 176, 185, 158, 159, 160, 255, 164, + 175, 135, 138, 188, 255, 172, 173, 174, + 175, 180, 181, 182, 183, 184, 185, 187, + 188, 189, 190, 191, 176, 186, 158, 190, + 128, 134, 147, 151, 157, 168, 170, 182, + 184, 188, 147, 128, 143, 160, 175, 179, + 180, 191, 189, 255, 158, 190, 130, 135, + 138, 143, 146, 151, 154, 156, 185, 187, + 144, 145, 146, 147, 148, 150, 155, 157, + 158, 159, 128, 129, 130, 131, 133, 135, + 138, 139, 140, 141, 142, 143, 144, 145, + 146, 148, 149, 152, 156, 157, 160, 161, + 162, 163, 164, 166, 168, 169, 170, 171, + 172, 173, 174, 176, 177, 153, 155, 178, + 179, 189, 160, 145, 255, 139, 143, 182, + 186, 187, 255, 128, 191, 129, 131, 133, + 134, 140, 143, 144, 147, 149, 151, 153, + 179, 184, 186, 128, 135, 137, 164, 165, + 166, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 138, 139, 140, 141, 146, 147, + 150, 151, 152, 153, 154, 155, 156, 162, + 163, 171, 128, 130, 131, 183, 184, 255, + 135, 165, 166, 175, 176, 190, 131, 175, + 187, 188, 190, 255, 128, 130, 131, 166, + 167, 180, 182, 191, 179, 182, 144, 178, + 128, 130, 131, 178, 179, 255, 155, 129, + 132, 133, 137, 141, 143, 144, 153, 154, + 156, 157, 255, 128, 145, 147, 171, 172, + 183, 159, 170, 171, 175, 176, 185, 186, + 255, 189, 128, 131, 133, 140, 143, 144, + 147, 168, 170, 176, 178, 179, 181, 185, + 188, 191, 144, 151, 128, 132, 135, 136, + 139, 141, 157, 161, 162, 163, 166, 172, + 176, 180, 128, 175, 176, 255, 134, 132, + 135, 136, 143, 144, 153, 154, 255, 128, + 174, 175, 181, 184, 255, 129, 151, 152, + 155, 158, 255, 132, 129, 143, 144, 153, + 154, 255, 128, 170, 171, 183, 157, 171, + 176, 185, 160, 168, 169, 171, 172, 173, + 174, 188, 189, 190, 161, 167, 144, 173, + 176, 180, 128, 175, 176, 182, 133, 143, + 145, 190, 191, 255, 143, 146, 147, 159, + 176, 177, 178, 128, 136, 144, 153, 157, + 158, 160, 163, 133, 134, 137, 144, 145, + 146, 147, 148, 149, 154, 155, 156, 157, + 158, 159, 168, 169, 170, 150, 153, 165, + 169, 173, 255, 131, 132, 140, 169, 174, + 255, 130, 132, 128, 182, 187, 255, 173, + 180, 182, 255, 132, 155, 159, 161, 175, + 160, 163, 184, 185, 186, 161, 162, 133, + 143, 144, 150, 151, 255, 160, 128, 129, + 132, 135, 133, 134, 129, 160, 255, 192, + 255, 176, 255, 155, 156, 157, 159, 160, + 255, 128, 140, 142, 145, 146, 148, 160, + 177, 178, 180, 128, 145, 146, 147, 160, + 172, 174, 176, 178, 179, 148, 156, 158, + 159, 160, 169, 170, 255, 139, 142, 144, + 153, 160, 255, 169, 128, 170, 176, 255, + 128, 158, 160, 171, 176, 187, 128, 150, + 151, 155, 128, 137, 144, 153, 176, 190, + 128, 132, 133, 179, 180, 255, 133, 139, + 140, 143, 144, 153, 154, 170, 180, 255, + 128, 130, 131, 160, 161, 173, 174, 175, + 176, 185, 186, 255, 166, 179, 180, 255, + 128, 163, 164, 183, 173, 144, 146, 148, + 168, 169, 177, 178, 180, 181, 182, 184, + 185, 140, 143, 168, 169, 170, 174, 191, + 255, 165, 177, 191, 129, 147, 149, 159, + 160, 175, 176, 255, 165, 170, 175, 177, + 180, 255, 191, 168, 174, 176, 255, 128, + 134, 136, 142, 144, 150, 152, 158, 160, + 191, 128, 153, 155, 255, 173, 0, 127, + 176, 255, 131, 137, 191, 145, 189, 135, + 129, 130, 132, 133, 156, 128, 133, 144, + 154, 176, 139, 159, 150, 157, 159, 164, + 167, 168, 170, 173, 143, 145, 176, 255, + 139, 255, 166, 176, 171, 179, 160, 161, + 163, 164, 165, 167, 169, 171, 173, 174, + 175, 176, 177, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, + 166, 170, 172, 178, 150, 153, 155, 163, + 165, 167, 169, 173, 153, 155, 163, 255, + 189, 132, 185, 144, 152, 161, 164, 255, + 188, 129, 131, 190, 255, 133, 134, 137, + 138, 142, 150, 152, 161, 164, 255, 131, + 134, 137, 138, 142, 144, 146, 175, 178, + 180, 182, 255, 134, 138, 142, 161, 164, + 255, 188, 129, 131, 190, 191, 128, 132, + 135, 136, 139, 141, 150, 151, 162, 163, + 130, 190, 191, 151, 128, 130, 134, 136, + 138, 141, 128, 131, 190, 255, 133, 137, + 142, 148, 151, 161, 164, 255, 128, 132, + 134, 136, 138, 141, 149, 150, 162, 163, + 129, 131, 190, 255, 133, 137, 142, 150, + 152, 161, 164, 255, 130, 131, 138, 150, + 143, 148, 152, 159, 178, 179, 177, 180, + 186, 135, 142, 177, 180, 185, 187, 188, + 136, 141, 181, 183, 185, 152, 153, 190, + 191, 177, 191, 128, 132, 134, 135, 141, + 151, 153, 188, 134, 128, 129, 130, 141, + 156, 157, 158, 159, 160, 162, 164, 168, + 169, 170, 172, 173, 174, 175, 176, 179, + 183, 171, 190, 150, 153, 158, 160, 162, + 164, 167, 173, 177, 180, 143, 130, 141, + 154, 157, 157, 159, 146, 148, 178, 180, + 146, 147, 178, 179, 180, 255, 148, 156, + 158, 255, 139, 142, 169, 160, 171, 176, + 187, 151, 155, 191, 149, 158, 160, 188, + 176, 190, 128, 132, 180, 255, 133, 170, + 180, 255, 128, 130, 161, 173, 166, 179, + 164, 183, 173, 144, 146, 148, 168, 178, + 180, 184, 185, 128, 181, 188, 191, 128, + 129, 131, 179, 181, 183, 140, 143, 170, + 174, 160, 164, 166, 175, 144, 176, 175, + 177, 191, 160, 191, 128, 130, 170, 175, + 153, 154, 153, 154, 155, 160, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, + 175, 175, 178, 180, 189, 158, 159, 176, + 177, 130, 134, 139, 163, 167, 128, 129, + 180, 255, 133, 159, 178, 255, 166, 173, + 135, 147, 128, 131, 179, 255, 129, 164, + 166, 255, 169, 182, 131, 140, 141, 187, + 189, 176, 178, 180, 183, 184, 190, 191, + 129, 171, 175, 181, 182, 163, 170, 172, + 173, 172, 184, 187, 190, 191, 158, 128, + 143, 160, 175, 185, 187, 144, 145, 150, + 155, 157, 158, 135, 139, 141, 168, 171, + 189, 160, 182, 186, 191, 129, 131, 133, + 134, 140, 143, 184, 186, 165, 166, 128, + 129, 130, 132, 133, 134, 135, 136, 139, + 140, 141, 146, 147, 150, 151, 152, 153, + 154, 156, 128, 130, 184, 255, 135, 190, + 131, 175, 187, 188, 190, 255, 128, 130, + 167, 180, 179, 128, 130, 179, 255, 129, + 137, 141, 255, 172, 183, 159, 170, 188, + 128, 131, 190, 191, 151, 128, 132, 135, + 136, 139, 141, 162, 163, 166, 172, 176, + 180, 176, 255, 132, 255, 175, 181, 184, + 255, 129, 155, 158, 255, 129, 255, 171, + 183, 157, 171, 171, 172, 189, 190, 176, + 180, 176, 182, 145, 190, 143, 146, 178, + 157, 158, 160, 163, 133, 134, 137, 168, + 169, 170, 165, 169, 173, 255, 131, 132, + 140, 169, 174, 255, 130, 132, 128, 182, + 187, 255, 173, 180, 182, 255, 132, 155, + 159, 161, 175, 163, 144, 150, 160, 128, + 129, 132, 135, 133, 134, 129, 160, 255, + 192, 255, 180, 255, 150, 255, 133, 135, + 187, 188, 161, 169, 170, 173, 174, 175, + 177, 181, 184, 186, 170, 173, 181, 183, + 186, 0, 127, 181, 190, 176, 183, 184, + 185, 186, 191, 192, 255, 130, 131, 137, + 190, 136, 144, 145, 191, 192, 255, 135, + 179, 180, 129, 130, 132, 133, 144, 170, + 176, 178, 156, 128, 133, 144, 154, 160, + 191, 171, 176, 128, 138, 139, 159, 160, + 169, 174, 255, 148, 158, 169, 150, 164, + 167, 173, 176, 185, 189, 190, 192, 255, + 144, 143, 145, 146, 175, 176, 255, 139, + 140, 141, 255, 166, 176, 178, 255, 186, + 128, 137, 138, 170, 171, 179, 180, 181, + 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, + 154, 164, 168, 128, 149, 150, 173, 128, + 152, 153, 155, 163, 255, 189, 132, 185, + 144, 176, 152, 161, 164, 165, 166, 175, + 177, 255, 132, 169, 177, 188, 129, 131, + 141, 142, 145, 146, 179, 181, 186, 187, + 190, 255, 142, 158, 133, 134, 137, 138, + 143, 150, 152, 155, 156, 161, 164, 165, + 166, 175, 176, 177, 178, 255, 188, 129, + 131, 133, 138, 143, 144, 147, 168, 170, + 176, 178, 179, 181, 182, 184, 185, 190, + 255, 157, 131, 134, 137, 138, 142, 144, + 146, 152, 153, 158, 159, 165, 166, 175, + 178, 180, 182, 255, 189, 129, 131, 133, + 141, 143, 145, 147, 168, 170, 176, 178, + 179, 181, 185, 188, 255, 134, 138, 144, + 185, 142, 159, 160, 161, 164, 165, 166, + 175, 176, 255, 189, 129, 131, 133, 140, + 143, 144, 147, 168, 170, 176, 178, 179, + 181, 185, 188, 191, 177, 128, 132, 135, + 136, 139, 141, 150, 151, 156, 157, 159, + 161, 162, 163, 166, 175, 130, 131, 156, + 133, 138, 142, 144, 146, 149, 153, 154, + 158, 159, 163, 164, 168, 170, 174, 185, + 190, 191, 144, 151, 128, 130, 134, 136, + 138, 141, 166, 175, 189, 128, 131, 133, + 140, 142, 144, 146, 168, 170, 185, 190, + 255, 133, 137, 151, 142, 148, 152, 154, + 155, 159, 160, 161, 164, 165, 166, 175, + 176, 255, 189, 129, 131, 133, 140, 142, + 144, 146, 168, 170, 179, 181, 185, 188, + 191, 158, 128, 132, 134, 136, 138, 141, + 149, 150, 160, 161, 162, 163, 166, 175, + 177, 178, 189, 129, 131, 133, 140, 142, + 144, 146, 186, 190, 255, 133, 137, 142, + 143, 150, 152, 158, 159, 161, 164, 165, + 166, 175, 176, 185, 186, 191, 192, 255, + 189, 130, 131, 133, 150, 154, 177, 179, + 187, 138, 150, 128, 134, 143, 148, 152, + 159, 166, 175, 178, 179, 177, 180, 186, + 135, 142, 144, 153, 177, 180, 185, 187, + 188, 136, 141, 144, 153, 128, 181, 183, + 185, 152, 153, 160, 169, 190, 191, 128, + 135, 137, 172, 177, 191, 128, 132, 134, + 135, 136, 140, 141, 151, 153, 188, 134, + 128, 129, 130, 131, 137, 138, 139, 140, + 141, 142, 143, 144, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, + 165, 167, 168, 169, 170, 172, 173, 174, + 175, 176, 177, 179, 181, 182, 183, 188, + 189, 190, 191, 132, 152, 180, 184, 185, + 187, 171, 190, 128, 137, 150, 153, 158, + 160, 162, 164, 167, 173, 177, 180, 143, + 130, 141, 144, 153, 154, 157, 160, 255, + 155, 156, 157, 159, 160, 255, 128, 140, + 142, 145, 146, 148, 160, 177, 178, 180, + 128, 145, 146, 147, 160, 172, 174, 176, + 178, 179, 180, 255, 148, 156, 158, 159, + 160, 169, 170, 255, 139, 142, 144, 153, + 160, 255, 169, 128, 170, 176, 255, 128, + 158, 160, 171, 176, 187, 128, 150, 151, + 155, 191, 149, 158, 160, 188, 128, 137, + 144, 153, 176, 190, 128, 132, 133, 179, + 180, 255, 133, 139, 140, 143, 144, 153, + 154, 170, 180, 255, 128, 130, 131, 160, + 161, 173, 174, 175, 176, 185, 186, 255, + 166, 179, 180, 255, 128, 163, 164, 183, + 173, 144, 146, 148, 168, 169, 177, 178, + 180, 181, 182, 184, 185, 128, 181, 188, + 191, 128, 129, 130, 131, 132, 133, 134, + 146, 147, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 164, 167, 140, 143, 152, + 153, 170, 174, 191, 255, 165, 177, 191, + 129, 147, 149, 159, 160, 175, 176, 255, + 144, 176, 165, 170, 175, 177, 180, 255, + 191, 168, 174, 176, 255, 128, 134, 136, + 142, 144, 150, 152, 158, 160, 191, 128, + 130, 132, 133, 134, 133, 170, 175, 187, + 188, 153, 154, 128, 146, 147, 148, 152, + 153, 154, 155, 156, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 129, + 255, 191, 128, 174, 175, 178, 180, 189, + 128, 157, 158, 159, 160, 255, 176, 177, + 178, 255, 130, 134, 139, 163, 167, 168, + 255, 128, 129, 130, 179, 180, 255, 187, + 189, 133, 143, 144, 153, 154, 159, 178, + 183, 184, 255, 128, 137, 138, 165, 166, + 173, 176, 255, 135, 147, 148, 159, 189, + 255, 128, 131, 132, 178, 179, 255, 143, + 129, 142, 144, 153, 154, 164, 166, 175, + 176, 185, 186, 255, 128, 168, 169, 182, + 131, 128, 139, 140, 141, 144, 153, 187, + 189, 176, 178, 180, 183, 184, 190, 191, + 129, 160, 170, 171, 175, 178, 180, 181, + 182, 128, 162, 163, 170, 172, 173, 176, + 185, 172, 173, 174, 175, 180, 181, 182, + 183, 184, 185, 187, 188, 189, 190, 191, + 176, 186, 158, 190, 128, 134, 147, 151, + 157, 168, 170, 182, 184, 188, 147, 128, + 143, 160, 175, 179, 180, 191, 189, 255, + 158, 159, 160, 190, 130, 135, 138, 143, + 146, 151, 154, 156, 185, 187, 144, 145, + 146, 147, 148, 150, 155, 157, 158, 159, + 128, 129, 130, 131, 133, 135, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 148, + 149, 152, 156, 157, 160, 161, 162, 163, + 164, 166, 168, 169, 170, 171, 172, 173, + 174, 176, 177, 153, 155, 178, 179, 189, + 160, 145, 255, 139, 143, 182, 186, 187, + 255, 128, 191, 129, 131, 133, 134, 140, + 143, 144, 147, 149, 151, 153, 179, 184, + 186, 128, 135, 137, 164, 165, 166, 128, + 129, 130, 131, 132, 133, 134, 135, 136, + 138, 139, 140, 141, 146, 147, 150, 151, + 152, 153, 154, 155, 156, 162, 163, 171, + 128, 130, 131, 183, 184, 255, 135, 165, + 166, 175, 176, 190, 131, 175, 187, 188, + 190, 255, 128, 130, 131, 166, 167, 180, + 182, 191, 179, 182, 144, 178, 128, 130, + 131, 178, 179, 255, 155, 129, 132, 133, + 137, 141, 143, 144, 153, 154, 156, 157, + 255, 128, 145, 147, 171, 172, 183, 159, + 170, 171, 175, 176, 185, 186, 255, 189, + 128, 131, 133, 140, 143, 144, 147, 168, + 170, 176, 178, 179, 181, 185, 188, 191, + 144, 151, 128, 132, 135, 136, 139, 141, + 157, 161, 162, 163, 166, 172, 176, 180, + 128, 175, 176, 255, 134, 132, 135, 136, + 143, 144, 153, 154, 255, 128, 174, 175, + 181, 184, 255, 129, 151, 152, 155, 158, + 255, 132, 129, 143, 144, 153, 154, 255, + 128, 170, 171, 183, 157, 171, 176, 185, + 160, 168, 169, 171, 172, 173, 174, 188, + 189, 190, 161, 167, 144, 173, 176, 180, + 128, 175, 176, 182, 133, 143, 145, 190, + 191, 255, 143, 146, 147, 159, 176, 177, + 178, 128, 136, 144, 153, 157, 158, 160, + 163, 133, 134, 137, 144, 145, 146, 147, + 148, 149, 154, 155, 156, 157, 158, 159, + 168, 169, 170, 150, 153, 165, 169, 173, + 255, 131, 132, 140, 169, 174, 255, 130, + 132, 128, 182, 187, 255, 173, 180, 182, + 255, 132, 155, 159, 161, 175, 160, 163, + 184, 185, 186, 161, 162, 133, 143, 144, + 150, 151, 255, 160, 128, 129, 132, 135, + 133, 134, 129, 160, 255, 192, 255, 176, + 255, 173, 0, 127, 176, 255, 131, 137, + 191, 145, 189, 135, 129, 130, 132, 133, + 156, 128, 133, 144, 154, 176, 139, 159, + 150, 157, 159, 164, 167, 168, 170, 173, + 143, 145, 176, 255, 139, 255, 166, 176, + 171, 179, 160, 161, 163, 164, 165, 167, + 169, 171, 173, 174, 175, 176, 177, 179, + 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 166, 170, 172, 178, + 150, 153, 155, 163, 165, 167, 169, 173, + 153, 155, 163, 255, 189, 132, 185, 144, + 152, 161, 164, 255, 188, 129, 131, 190, + 255, 133, 134, 137, 138, 142, 150, 152, + 161, 164, 255, 131, 134, 137, 138, 142, + 144, 146, 175, 178, 180, 182, 255, 134, + 138, 142, 161, 164, 255, 188, 129, 131, + 190, 191, 128, 132, 135, 136, 139, 141, + 150, 151, 162, 163, 130, 190, 191, 151, + 128, 130, 134, 136, 138, 141, 128, 131, + 190, 255, 133, 137, 142, 148, 151, 161, + 164, 255, 128, 132, 134, 136, 138, 141, + 149, 150, 162, 163, 129, 131, 190, 255, + 133, 137, 142, 150, 152, 161, 164, 255, + 130, 131, 138, 150, 143, 148, 152, 159, + 178, 179, 177, 180, 186, 135, 142, 177, + 180, 185, 187, 188, 136, 141, 181, 183, + 185, 152, 153, 190, 191, 177, 191, 128, + 132, 134, 135, 141, 151, 153, 188, 134, + 128, 129, 130, 132, 135, 141, 156, 157, + 158, 159, 160, 162, 164, 168, 169, 170, + 172, 173, 174, 175, 176, 179, 183, 133, + 134, 171, 190, 150, 153, 158, 160, 162, + 164, 167, 173, 177, 180, 143, 130, 141, + 154, 157, 157, 159, 146, 148, 178, 180, + 146, 147, 178, 179, 180, 255, 148, 156, + 158, 255, 139, 142, 169, 160, 171, 176, + 187, 151, 155, 191, 149, 158, 160, 188, + 176, 190, 128, 132, 180, 255, 133, 170, + 180, 255, 128, 130, 161, 173, 166, 179, + 164, 183, 173, 144, 146, 148, 168, 178, + 180, 184, 185, 128, 181, 188, 191, 128, + 129, 131, 179, 181, 183, 140, 143, 170, + 174, 160, 164, 166, 175, 144, 176, 175, + 177, 191, 160, 191, 128, 130, 132, 133, + 134, 136, 137, 170, 175, 153, 154, 153, + 154, 155, 160, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 175, 176, 177, + 255, 175, 178, 180, 189, 158, 159, 176, + 177, 130, 134, 139, 163, 167, 128, 129, + 180, 255, 133, 159, 178, 255, 166, 173, + 135, 147, 160, 188, 128, 131, 179, 255, + 129, 164, 166, 255, 169, 182, 131, 140, + 141, 187, 189, 176, 178, 180, 183, 184, + 190, 191, 129, 171, 175, 181, 182, 163, + 170, 172, 173, 172, 184, 187, 190, 191, + 158, 128, 143, 160, 175, 158, 159, 160, + 190, 130, 135, 138, 143, 146, 151, 154, + 156, 185, 187, 144, 145, 150, 155, 157, + 158, 135, 139, 141, 168, 171, 189, 160, + 182, 186, 191, 129, 131, 133, 134, 140, + 143, 184, 186, 165, 166, 128, 129, 130, + 132, 133, 134, 135, 136, 139, 140, 141, + 146, 147, 150, 151, 152, 153, 154, 156, + 128, 130, 184, 255, 135, 190, 131, 175, + 187, 188, 190, 255, 128, 130, 167, 180, + 179, 128, 130, 179, 255, 129, 137, 141, + 255, 172, 183, 159, 170, 188, 128, 131, + 190, 191, 151, 128, 132, 135, 136, 139, + 141, 162, 163, 166, 172, 176, 180, 176, + 255, 132, 255, 175, 181, 184, 255, 129, + 155, 158, 255, 129, 255, 171, 183, 157, + 171, 171, 172, 189, 190, 176, 180, 176, + 182, 145, 190, 143, 146, 178, 157, 158, + 160, 163, 133, 134, 137, 168, 169, 170, + 165, 169, 173, 255, 131, 132, 140, 169, + 174, 255, 130, 132, 128, 182, 187, 255, + 173, 180, 182, 255, 132, 155, 159, 161, + 175, 163, 144, 150, 160, 128, 129, 132, + 135, 133, 134, 129, 160, 255, 192, 255, + 173, 0, 127, 176, 255, 131, 137, 191, + 145, 189, 135, 129, 130, 132, 133, 156, + 128, 133, 144, 154, 176, 139, 159, 150, + 157, 159, 164, 167, 168, 170, 173, 143, + 145, 176, 255, 139, 255, 166, 176, 171, + 179, 160, 161, 163, 164, 165, 167, 169, + 171, 173, 174, 175, 176, 177, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 166, 170, 172, 178, 150, + 153, 155, 163, 165, 167, 169, 173, 153, + 155, 163, 255, 189, 132, 185, 144, 152, + 161, 164, 255, 188, 129, 131, 190, 255, + 133, 134, 137, 138, 142, 150, 152, 161, + 164, 255, 131, 134, 137, 138, 142, 144, + 146, 175, 178, 180, 182, 255, 134, 138, + 142, 161, 164, 255, 188, 129, 131, 190, + 191, 128, 132, 135, 136, 139, 141, 150, + 151, 162, 163, 130, 190, 191, 151, 128, + 130, 134, 136, 138, 141, 128, 131, 190, + 255, 133, 137, 142, 148, 151, 161, 164, + 255, 128, 132, 134, 136, 138, 141, 149, + 150, 162, 163, 129, 131, 190, 255, 133, + 137, 142, 150, 152, 161, 164, 255, 130, + 131, 138, 150, 143, 148, 152, 159, 178, + 179, 177, 180, 186, 135, 142, 177, 180, + 185, 187, 188, 136, 141, 181, 183, 185, + 152, 153, 190, 191, 177, 191, 128, 132, + 134, 135, 141, 151, 153, 188, 134, 128, + 129, 130, 141, 156, 157, 158, 159, 160, + 162, 164, 168, 169, 170, 172, 173, 174, + 175, 176, 179, 183, 171, 190, 150, 153, + 158, 160, 162, 164, 167, 173, 177, 180, + 143, 130, 141, 154, 157, 157, 159, 146, + 148, 178, 180, 146, 147, 178, 179, 180, + 255, 148, 156, 158, 255, 139, 142, 169, + 160, 171, 176, 187, 151, 155, 191, 149, + 158, 160, 188, 176, 190, 128, 132, 180, + 255, 133, 170, 180, 255, 128, 130, 161, + 173, 166, 179, 164, 183, 173, 144, 146, + 148, 168, 178, 180, 184, 185, 128, 181, + 188, 191, 128, 129, 131, 179, 181, 183, + 140, 143, 170, 174, 191, 255, 165, 129, + 147, 149, 159, 160, 175, 176, 255, 144, + 176, 175, 177, 191, 160, 191, 128, 130, + 131, 135, 139, 140, 141, 170, 175, 177, + 181, 153, 156, 160, 255, 187, 192, 255, + 176, 191, 144, 190, 152, 255, 153, 154, + 155, 160, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 175, 175, 178, 180, + 189, 158, 159, 176, 177, 130, 134, 139, + 163, 167, 128, 129, 180, 255, 133, 159, + 178, 255, 166, 173, 135, 147, 128, 131, + 179, 255, 129, 164, 166, 255, 169, 182, + 131, 140, 141, 187, 189, 176, 178, 180, + 183, 184, 190, 191, 129, 171, 175, 181, + 182, 163, 170, 172, 173, 172, 184, 185, + 187, 188, 189, 190, 191, 158, 128, 143, + 160, 175, 179, 180, 166, 255, 160, 255, + 185, 187, 144, 145, 150, 155, 157, 158, + 135, 139, 141, 168, 171, 189, 160, 182, + 186, 191, 129, 131, 133, 134, 140, 143, + 184, 186, 165, 166, 128, 129, 130, 132, + 133, 134, 135, 136, 139, 140, 141, 146, + 147, 150, 151, 152, 153, 154, 156, 128, + 130, 184, 255, 135, 190, 131, 175, 187, + 188, 190, 255, 128, 130, 167, 180, 179, + 128, 130, 179, 255, 129, 137, 141, 255, + 172, 183, 159, 170, 188, 128, 131, 190, + 191, 151, 128, 132, 135, 136, 139, 141, + 162, 163, 166, 172, 176, 180, 176, 255, + 132, 255, 175, 181, 184, 255, 129, 155, + 158, 255, 129, 255, 171, 183, 157, 171, + 171, 172, 189, 190, 176, 180, 176, 182, + 145, 190, 143, 146, 128, 178, 128, 157, + 158, 160, 163, 133, 134, 137, 168, 169, + 170, 165, 169, 173, 255, 131, 132, 140, + 169, 174, 255, 130, 132, 128, 182, 187, + 255, 173, 180, 182, 255, 132, 155, 159, + 161, 175, 163, 144, 150, 160, 128, 129, + 132, 135, 133, 134, 129, 160, 255, 192, + 255, 129, 255, 173, 128, 255, 176, 255, + 131, 137, 191, 145, 189, 135, 129, 130, + 132, 133, 156, 128, 133, 144, 154, 176, + 139, 159, 150, 157, 159, 164, 167, 168, + 170, 173, 143, 145, 176, 255, 139, 255, + 166, 176, 171, 179, 160, 161, 163, 164, + 165, 167, 169, 171, 173, 174, 175, 176, + 177, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 166, 170, + 172, 178, 150, 153, 155, 163, 165, 167, + 169, 173, 153, 155, 163, 255, 189, 132, + 185, 144, 152, 161, 164, 255, 188, 129, + 131, 190, 255, 133, 134, 137, 138, 142, + 150, 152, 161, 164, 255, 131, 134, 137, + 138, 142, 144, 146, 175, 178, 180, 182, + 255, 134, 138, 142, 161, 164, 255, 188, + 129, 131, 190, 191, 128, 132, 135, 136, + 139, 141, 150, 151, 162, 163, 130, 190, + 191, 151, 128, 130, 134, 136, 138, 141, + 128, 131, 190, 255, 133, 137, 142, 148, + 151, 161, 164, 255, 128, 132, 134, 136, + 138, 141, 149, 150, 162, 163, 129, 131, + 190, 255, 133, 137, 142, 150, 152, 161, + 164, 255, 130, 131, 138, 150, 143, 148, + 152, 159, 178, 179, 177, 180, 186, 135, + 142, 177, 180, 185, 187, 188, 136, 141, + 181, 183, 185, 152, 153, 190, 191, 177, + 191, 128, 132, 134, 135, 141, 151, 153, + 188, 134, 128, 129, 130, 141, 156, 157, + 158, 159, 160, 162, 164, 168, 169, 170, + 172, 173, 174, 175, 176, 179, 183, 171, + 190, 150, 153, 158, 160, 162, 164, 167, + 173, 177, 180, 143, 130, 141, 154, 157, + 157, 159, 146, 148, 178, 180, 146, 147, + 178, 179, 180, 255, 148, 156, 158, 255, + 139, 142, 169, 160, 171, 176, 187, 151, + 155, 191, 149, 158, 160, 188, 176, 190, + 128, 132, 180, 255, 133, 170, 180, 255, + 128, 130, 161, 173, 166, 179, 164, 183, + 173, 144, 146, 148, 168, 178, 180, 184, + 185, 128, 181, 188, 191, 128, 129, 131, + 179, 181, 183, 140, 143, 170, 174, 160, + 164, 166, 175, 144, 176, 175, 177, 191, + 160, 191, 128, 130, 170, 175, 153, 154, + 153, 154, 155, 160, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 175, 175, + 178, 180, 189, 158, 159, 176, 177, 130, + 134, 139, 163, 167, 128, 129, 180, 255, + 133, 159, 178, 255, 166, 173, 135, 147, + 128, 131, 179, 255, 129, 164, 166, 255, + 169, 182, 131, 140, 141, 187, 189, 176, + 178, 180, 183, 184, 190, 191, 129, 171, + 175, 181, 182, 163, 170, 172, 173, 172, + 184, 187, 190, 191, 158, 128, 143, 160, + 175, 185, 187, 144, 145, 150, 155, 157, + 158, 135, 139, 141, 168, 171, 189, 160, + 182, 186, 191, 129, 131, 133, 134, 140, + 143, 184, 186, 165, 166, 128, 129, 130, + 132, 133, 134, 135, 136, 139, 140, 141, + 146, 147, 150, 151, 152, 153, 154, 156, + 128, 130, 184, 255, 135, 190, 131, 175, + 187, 188, 190, 255, 128, 130, 167, 180, + 179, 128, 130, 179, 255, 129, 137, 141, + 255, 172, 183, 159, 170, 188, 128, 131, + 190, 191, 151, 128, 132, 135, 136, 139, + 141, 162, 163, 166, 172, 176, 180, 176, + 255, 132, 255, 175, 181, 184, 255, 129, + 155, 158, 255, 129, 255, 171, 183, 157, + 171, 171, 172, 189, 190, 176, 180, 176, + 182, 145, 190, 143, 146, 178, 157, 158, + 160, 163, 133, 134, 137, 168, 169, 170, + 165, 169, 173, 255, 131, 132, 140, 169, + 174, 255, 130, 132, 128, 182, 187, 255, + 173, 180, 182, 255, 132, 155, 159, 161, + 175, 163, 144, 150, 160, 128, 129, 132, + 135, 133, 134, 129, 160, 255, 192, 255, + 151, 152, 153, 154, 155, 156, 160, 255, + 173, 173, 128, 255, 176, 255, 131, 137, + 191, 145, 189, 135, 129, 130, 132, 133, + 156, 128, 133, 144, 154, 176, 139, 159, + 150, 157, 159, 164, 167, 168, 170, 173, + 143, 145, 176, 255, 139, 255, 166, 176, + 171, 179, 160, 161, 163, 164, 165, 167, + 169, 171, 173, 174, 175, 176, 177, 179, + 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 166, 170, 172, 178, + 150, 153, 155, 163, 165, 167, 169, 173, + 153, 155, 163, 255, 189, 132, 185, 144, + 152, 161, 164, 255, 188, 129, 131, 190, + 255, 133, 134, 137, 138, 142, 150, 152, + 161, 164, 255, 131, 134, 137, 138, 142, + 144, 146, 175, 178, 180, 182, 255, 134, + 138, 142, 161, 164, 255, 188, 129, 131, + 190, 191, 128, 132, 135, 136, 139, 141, + 150, 151, 162, 163, 130, 190, 191, 151, + 128, 130, 134, 136, 138, 141, 128, 131, + 190, 255, 133, 137, 142, 148, 151, 161, + 164, 255, 128, 132, 134, 136, 138, 141, + 149, 150, 162, 163, 129, 131, 190, 255, + 133, 137, 142, 150, 152, 161, 164, 255, + 130, 131, 138, 150, 143, 148, 152, 159, + 178, 179, 177, 180, 186, 135, 142, 177, + 180, 185, 187, 188, 136, 141, 181, 183, + 185, 152, 153, 190, 191, 177, 191, 128, + 132, 134, 135, 141, 151, 153, 188, 134, + 128, 129, 130, 141, 156, 157, 158, 159, + 160, 162, 164, 168, 169, 170, 172, 173, + 174, 175, 176, 179, 183, 171, 190, 150, + 153, 158, 160, 162, 164, 167, 173, 177, + 180, 143, 130, 141, 154, 157, 157, 159, + 146, 148, 178, 180, 146, 147, 178, 179, + 180, 255, 148, 156, 158, 255, 139, 142, + 169, 160, 171, 176, 187, 151, 155, 191, + 149, 158, 160, 188, 176, 190, 128, 132, + 180, 255, 133, 170, 180, 255, 128, 130, + 161, 173, 166, 179, 164, 183, 173, 144, + 146, 148, 168, 178, 180, 184, 185, 128, + 181, 188, 191, 128, 129, 131, 179, 181, + 183, 140, 143, 170, 174, 160, 164, 166, + 175, 144, 176, 175, 177, 191, 160, 191, + 128, 130, 170, 175, 153, 154, 153, 154, + 155, 160, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 175, 175, 178, 180, + 189, 158, 159, 176, 177, 130, 134, 139, + 163, 167, 128, 129, 180, 255, 133, 159, + 178, 255, 166, 173, 135, 147, 128, 131, + 179, 255, 129, 164, 166, 255, 169, 182, + 131, 140, 141, 187, 189, 176, 178, 180, + 183, 184, 190, 191, 129, 171, 175, 181, + 182, 163, 170, 172, 173, 172, 184, 187, + 190, 191, 158, 128, 143, 160, 175, 185, + 187, 144, 145, 150, 155, 157, 158, 135, + 139, 141, 168, 171, 189, 160, 182, 186, + 191, 129, 131, 133, 134, 140, 143, 184, + 186, 165, 166, 128, 129, 130, 132, 133, + 134, 135, 136, 139, 140, 141, 146, 147, + 150, 151, 152, 153, 154, 156, 128, 130, + 184, 255, 135, 190, 131, 175, 187, 188, + 190, 255, 128, 130, 167, 180, 179, 128, + 130, 179, 255, 129, 137, 141, 255, 172, + 183, 159, 170, 188, 128, 131, 190, 191, + 151, 128, 132, 135, 136, 139, 141, 162, + 163, 166, 172, 176, 180, 176, 255, 132, + 255, 175, 181, 184, 255, 129, 155, 158, + 255, 129, 255, 171, 183, 157, 171, 171, + 172, 189, 190, 176, 180, 176, 182, 145, + 190, 143, 146, 178, 157, 158, 160, 163, + 133, 134, 137, 168, 169, 170, 165, 169, + 173, 255, 131, 132, 140, 169, 174, 255, + 130, 132, 128, 182, 187, 255, 173, 180, + 182, 255, 132, 155, 159, 161, 175, 163, + 144, 150, 160, 128, 129, 132, 135, 133, + 134, 129, 160, 255, 192, 255, 128, 255, + 176, 255, 131, 137, 191, 145, 189, 135, + 129, 130, 132, 133, 156, 128, 133, 144, + 154, 176, 139, 159, 150, 157, 159, 164, + 167, 168, 170, 173, 143, 145, 176, 255, + 139, 255, 166, 176, 171, 179, 160, 161, + 163, 164, 165, 167, 169, 171, 173, 174, + 175, 176, 177, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, + 166, 170, 172, 178, 128, 129, 130, 141, + 156, 157, 158, 159, 160, 162, 164, 168, + 169, 170, 172, 173, 174, 175, 176, 179, + 183, 128, 129, 131, 179, 181, 183, 128, + 130, 153, 154, 155, 160, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 175, + 172, 184, 187, 190, 191, 144, 145, 150, + 155, 157, 158, 160, 182, 255, 191, 128, + 174, 175, 178, 180, 189, 128, 157, 158, + 159, 160, 255, 176, 177, 178, 255, 130, + 134, 139, 163, 167, 168, 255, 128, 129, + 130, 179, 180, 255, 187, 189, 133, 143, + 144, 153, 154, 159, 178, 183, 184, 255, + 128, 137, 138, 165, 166, 173, 176, 255, + 135, 147, 148, 159, 160, 188, 189, 255, + 128, 131, 132, 178, 179, 255, 143, 129, + 142, 144, 153, 154, 164, 166, 175, 176, + 185, 186, 255, 128, 168, 169, 182, 131, + 128, 139, 140, 141, 144, 153, 187, 189, + 129, 160, 170, 171, 175, 178, 180, 181, + 182, 128, 162, 163, 170, 172, 173, 176, + 185, 173, 170, 173, 181, 183, 186, 128, + 255, 181, 190, 176, 183, 184, 185, 186, + 191, 192, 255, 130, 131, 137, 190, 136, + 144, 145, 191, 192, 255, 135, 179, 180, + 129, 130, 132, 133, 144, 170, 176, 178, + 156, 128, 133, 144, 154, 160, 191, 171, + 176, 128, 138, 139, 159, 160, 169, 174, + 255, 148, 158, 169, 150, 164, 167, 173, + 176, 185, 189, 190, 192, 255, 144, 143, + 145, 146, 175, 176, 255, 139, 140, 141, + 255, 166, 176, 178, 255, 186, 128, 137, + 138, 170, 171, 179, 180, 181, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 154, 164, + 168, 128, 149, 150, 173, 128, 152, 153, + 155, 163, 255, 189, 132, 185, 144, 176, + 152, 161, 164, 165, 166, 175, 177, 255, + 132, 169, 177, 188, 129, 131, 141, 142, + 145, 146, 179, 181, 186, 187, 190, 255, + 142, 158, 133, 134, 137, 138, 143, 150, + 152, 155, 156, 161, 164, 165, 166, 175, + 176, 177, 178, 255, 188, 129, 131, 133, + 138, 143, 144, 147, 168, 170, 176, 178, + 179, 181, 182, 184, 185, 190, 255, 157, + 131, 134, 137, 138, 142, 144, 146, 152, + 153, 158, 159, 165, 166, 175, 178, 180, + 182, 255, 189, 129, 131, 133, 141, 143, + 145, 147, 168, 170, 176, 178, 179, 181, + 185, 188, 255, 134, 138, 144, 185, 142, + 159, 160, 161, 164, 165, 166, 175, 176, + 255, 189, 129, 131, 133, 140, 143, 144, + 147, 168, 170, 176, 178, 179, 181, 185, + 188, 191, 177, 128, 132, 135, 136, 139, + 141, 150, 151, 156, 157, 159, 161, 162, + 163, 166, 175, 130, 131, 156, 133, 138, + 142, 144, 146, 149, 153, 154, 158, 159, + 163, 164, 168, 170, 174, 185, 190, 191, + 144, 151, 128, 130, 134, 136, 138, 141, + 166, 175, 189, 128, 131, 133, 140, 142, + 144, 146, 168, 170, 185, 190, 255, 133, + 137, 151, 142, 148, 152, 154, 155, 159, + 160, 161, 164, 165, 166, 175, 176, 255, + 189, 129, 131, 133, 140, 142, 144, 146, + 168, 170, 179, 181, 185, 188, 191, 158, + 128, 132, 134, 136, 138, 141, 149, 150, + 160, 161, 162, 163, 166, 175, 177, 178, + 189, 129, 131, 133, 140, 142, 144, 146, + 186, 190, 255, 133, 137, 142, 143, 150, + 152, 158, 159, 161, 164, 165, 166, 175, + 176, 185, 186, 191, 192, 255, 189, 130, + 131, 133, 150, 154, 177, 179, 187, 138, + 150, 128, 134, 143, 148, 152, 159, 166, + 175, 178, 179, 177, 180, 186, 135, 142, + 144, 153, 177, 180, 185, 187, 188, 136, + 141, 144, 153, 128, 181, 183, 185, 152, + 153, 160, 169, 190, 191, 128, 135, 137, + 172, 177, 191, 128, 132, 134, 135, 136, + 140, 141, 151, 153, 188, 134, 128, 129, + 130, 131, 132, 135, 137, 138, 139, 140, + 141, 142, 143, 144, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, + 165, 167, 168, 169, 170, 172, 173, 174, + 175, 176, 177, 179, 181, 182, 183, 188, + 189, 190, 191, 133, 134, 136, 152, 180, + 184, 185, 187, 171, 190, 128, 137, 150, + 153, 158, 160, 162, 164, 167, 173, 177, + 180, 143, 130, 141, 144, 153, 154, 157, + 160, 255, 155, 156, 157, 159, 160, 255, + 128, 140, 142, 145, 146, 148, 160, 177, + 178, 180, 128, 145, 146, 147, 160, 172, + 174, 176, 178, 179, 180, 255, 148, 156, + 158, 159, 160, 169, 170, 255, 139, 142, + 144, 153, 160, 255, 169, 128, 170, 176, + 255, 128, 158, 160, 171, 176, 187, 128, + 150, 151, 155, 191, 149, 158, 160, 188, + 128, 137, 144, 153, 176, 190, 128, 132, + 133, 179, 180, 255, 133, 139, 140, 143, + 144, 153, 154, 170, 180, 255, 128, 130, + 131, 160, 161, 173, 174, 175, 176, 185, + 186, 255, 166, 179, 180, 255, 128, 163, + 164, 183, 173, 144, 146, 148, 168, 169, + 177, 178, 180, 181, 182, 184, 185, 128, + 181, 188, 191, 128, 129, 130, 131, 132, + 133, 134, 146, 147, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 164, 167, 140, + 143, 152, 153, 170, 174, 191, 255, 165, + 177, 191, 129, 147, 149, 159, 160, 175, + 176, 255, 144, 176, 165, 170, 175, 177, + 180, 255, 191, 168, 174, 176, 255, 128, + 134, 136, 142, 144, 150, 152, 158, 160, + 191, 128, 130, 132, 133, 134, 136, 137, + 133, 170, 175, 187, 188, 153, 154, 128, + 146, 147, 148, 152, 153, 154, 155, 156, + 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 129, 157, 177, 255, 191, + 128, 174, 175, 178, 180, 189, 128, 157, + 158, 159, 160, 255, 176, 177, 178, 255, + 130, 134, 139, 163, 167, 168, 255, 128, + 129, 130, 179, 180, 255, 187, 189, 133, + 143, 144, 153, 154, 159, 178, 183, 184, + 255, 128, 137, 138, 165, 166, 173, 176, + 255, 135, 147, 148, 159, 160, 188, 189, + 255, 128, 131, 132, 178, 179, 255, 143, + 129, 142, 144, 153, 154, 164, 166, 175, + 176, 185, 186, 255, 128, 168, 169, 182, + 131, 128, 139, 140, 141, 144, 153, 187, + 189, 176, 178, 180, 183, 184, 190, 191, + 129, 160, 170, 171, 175, 178, 180, 181, + 182, 128, 162, 163, 170, 172, 173, 176, + 185, 172, 173, 174, 175, 180, 181, 182, + 183, 184, 185, 187, 188, 189, 190, 191, + 176, 186, 158, 190, 128, 134, 147, 151, + 157, 168, 170, 182, 184, 188, 147, 128, + 143, 160, 175, 179, 180, 191, 189, 255, + 158, 159, 160, 190, 130, 135, 138, 143, + 146, 151, 154, 156, 185, 187, 144, 145, + 146, 147, 148, 150, 155, 157, 158, 159, + 128, 129, 130, 131, 133, 135, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 148, + 149, 152, 156, 157, 160, 161, 162, 163, + 164, 166, 168, 169, 170, 171, 172, 173, + 174, 176, 177, 153, 155, 178, 179, 189, + 160, 145, 255, 139, 143, 182, 186, 187, + 255, 128, 191, 129, 131, 133, 134, 140, + 143, 144, 147, 149, 151, 153, 179, 184, + 186, 128, 135, 137, 164, 165, 166, 128, + 129, 130, 131, 132, 133, 134, 135, 136, + 138, 139, 140, 141, 146, 147, 150, 151, + 152, 153, 154, 155, 156, 162, 163, 171, + 128, 130, 131, 183, 184, 255, 135, 165, + 166, 175, 176, 190, 131, 175, 187, 188, + 190, 255, 128, 130, 131, 166, 167, 180, + 182, 191, 179, 182, 144, 178, 128, 130, + 131, 178, 179, 255, 155, 129, 132, 133, + 137, 141, 143, 144, 153, 154, 156, 157, + 255, 128, 145, 147, 171, 172, 183, 159, + 170, 171, 175, 176, 185, 186, 255, 189, + 128, 131, 133, 140, 143, 144, 147, 168, + 170, 176, 178, 179, 181, 185, 188, 191, + 144, 151, 128, 132, 135, 136, 139, 141, + 157, 161, 162, 163, 166, 172, 176, 180, + 128, 175, 176, 255, 134, 132, 135, 136, + 143, 144, 153, 154, 255, 128, 174, 175, + 181, 184, 255, 129, 151, 152, 155, 158, + 255, 132, 129, 143, 144, 153, 154, 255, + 128, 170, 171, 183, 157, 171, 176, 185, + 160, 168, 169, 171, 172, 173, 174, 188, + 189, 190, 161, 167, 144, 173, 176, 180, + 128, 175, 176, 182, 133, 143, 145, 190, + 191, 255, 143, 146, 147, 159, 176, 177, + 178, 128, 136, 144, 153, 157, 158, 160, + 163, 133, 134, 137, 144, 145, 146, 147, + 148, 149, 154, 155, 156, 157, 158, 159, + 168, 169, 170, 150, 153, 165, 169, 173, + 255, 131, 132, 140, 169, 174, 255, 130, + 132, 128, 182, 187, 255, 173, 180, 182, + 255, 132, 155, 159, 161, 175, 160, 163, + 184, 185, 186, 161, 162, 133, 143, 144, + 150, 151, 255, 160, 128, 129, 132, 135, + 133, 134, 129, 160, 255, 192, 255, 176, + 255, 128, 255, 176, 255, 131, 137, 191, + 145, 189, 135, 129, 130, 132, 133, 156, + 128, 133, 144, 154, 176, 139, 159, 150, + 157, 159, 164, 167, 168, 170, 173, 143, + 145, 176, 255, 139, 255, 166, 176, 171, + 179, 160, 161, 163, 164, 165, 167, 169, + 171, 173, 174, 175, 176, 177, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 166, 170, 172, 178, 128, + 129, 130, 141, 156, 157, 158, 159, 160, + 162, 164, 168, 169, 170, 172, 173, 174, + 175, 176, 179, 183, 128, 129, 131, 179, + 181, 183, 128, 130, 153, 154, 155, 160, + 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 175, 172, 184, 187, 190, 191, + 144, 145, 150, 155, 157, 158, 160, 174, + 175, 154, 255, 158, 190, 128, 134, 147, + 151, 157, 168, 170, 182, 184, 188, 128, + 143, 160, 175, 179, 180, 191, 189, 255, + 129, 154, 166, 255, 158, 159, 160, 190, + 191, 255, 130, 135, 138, 143, 146, 151, + 154, 156, 185, 187, 128, 129, 130, 131, + 133, 135, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 148, 149, 152, 156, 157, + 160, 161, 162, 163, 164, 166, 168, 169, + 170, 171, 172, 173, 174, 176, 177, 153, + 155, 178, 179, 160, 145, 255, 139, 143, + 182, 186, 187, 255, 128, 191, 129, 131, + 133, 134, 140, 143, 144, 147, 149, 151, + 153, 179, 184, 186, 128, 135, 137, 164, + 165, 166, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 138, 139, 140, 141, 146, + 147, 150, 151, 152, 153, 154, 155, 156, + 162, 163, 171, 128, 130, 131, 183, 184, + 255, 135, 165, 166, 175, 176, 190, 131, + 175, 187, 188, 190, 255, 128, 130, 131, + 166, 167, 180, 182, 191, 179, 182, 144, + 178, 128, 130, 131, 178, 179, 255, 155, + 129, 132, 133, 137, 141, 143, 144, 153, + 154, 156, 157, 255, 128, 145, 147, 171, + 172, 183, 159, 170, 171, 175, 176, 185, + 186, 255, 189, 128, 131, 133, 140, 143, + 144, 147, 168, 170, 176, 178, 179, 181, + 185, 188, 191, 144, 151, 128, 132, 135, + 136, 139, 141, 157, 161, 162, 163, 166, + 172, 176, 180, 128, 175, 176, 255, 134, + 132, 135, 136, 143, 144, 153, 154, 255, + 128, 174, 175, 181, 184, 255, 129, 151, + 152, 155, 158, 255, 132, 129, 143, 144, + 153, 154, 255, 128, 170, 171, 183, 157, + 171, 176, 185, 160, 168, 169, 171, 172, + 173, 174, 188, 189, 190, 161, 167, 144, + 173, 176, 180, 128, 175, 176, 182, 133, + 143, 145, 190, 191, 255, 143, 146, 147, + 159, 128, 176, 177, 178, 128, 129, 128, + 136, 144, 153, 157, 158, 160, 163, 133, + 134, 137, 144, 145, 146, 147, 148, 149, + 154, 155, 156, 157, 158, 159, 168, 169, + 170, 150, 153, 160, 163, 184, 185, 186, + 161, 162, 133, 143, 144, 150, 151, 255, + 132, 133, 134, 135, 136, 166, 191, 173, + 0, 127, 176, 255, 131, 137, 191, 145, + 189, 135, 129, 130, 132, 133, 156, 128, + 133, 144, 154, 176, 139, 159, 150, 157, + 159, 164, 167, 168, 170, 173, 143, 145, + 176, 255, 139, 255, 166, 176, 171, 179, + 160, 161, 163, 164, 165, 167, 169, 171, + 173, 174, 175, 176, 177, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 166, 170, 172, 178, 150, 153, + 155, 163, 165, 167, 169, 173, 153, 155, + 163, 255, 189, 132, 185, 144, 152, 161, + 164, 255, 188, 129, 131, 190, 255, 133, + 134, 137, 138, 142, 150, 152, 161, 164, + 255, 131, 134, 137, 138, 142, 144, 146, + 175, 178, 180, 182, 255, 134, 138, 142, + 161, 164, 255, 188, 129, 131, 190, 191, + 128, 132, 135, 136, 139, 141, 150, 151, + 162, 163, 130, 190, 191, 151, 128, 130, + 134, 136, 138, 141, 128, 131, 190, 255, + 133, 137, 142, 148, 151, 161, 164, 255, + 128, 132, 134, 136, 138, 141, 149, 150, + 162, 163, 129, 131, 190, 255, 133, 137, + 142, 150, 152, 161, 164, 255, 130, 131, + 138, 150, 143, 148, 152, 159, 178, 179, + 177, 180, 186, 135, 142, 177, 180, 185, + 187, 188, 136, 141, 181, 183, 185, 152, + 153, 190, 191, 177, 191, 128, 132, 134, + 135, 141, 151, 153, 188, 134, 128, 129, + 130, 141, 156, 157, 158, 159, 160, 162, + 164, 168, 169, 170, 172, 173, 174, 175, + 176, 179, 183, 171, 190, 150, 153, 158, + 160, 162, 164, 167, 173, 177, 180, 143, + 130, 141, 154, 157, 157, 159, 146, 148, + 178, 180, 146, 147, 178, 179, 180, 255, + 148, 156, 158, 255, 139, 142, 169, 160, + 171, 176, 187, 151, 155, 191, 149, 158, + 160, 188, 176, 190, 128, 132, 180, 255, + 133, 170, 180, 255, 128, 130, 161, 173, + 166, 179, 164, 183, 173, 144, 146, 148, + 168, 178, 180, 184, 185, 128, 181, 188, + 191, 128, 129, 131, 179, 181, 183, 140, + 143, 170, 174, 160, 164, 166, 175, 144, + 176, 175, 177, 191, 160, 191, 128, 130, + 170, 175, 153, 154, 153, 154, 155, 160, + 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 175, 175, 178, 180, 189, 158, + 159, 176, 177, 130, 134, 139, 163, 167, + 128, 129, 180, 255, 133, 159, 178, 255, + 166, 173, 135, 147, 128, 131, 179, 255, + 129, 164, 166, 255, 169, 182, 131, 140, + 141, 187, 189, 176, 178, 180, 183, 184, + 190, 191, 129, 171, 175, 181, 182, 163, + 170, 172, 173, 172, 184, 187, 190, 191, + 158, 128, 143, 160, 175, 185, 187, 144, + 145, 150, 155, 157, 158, 159, 135, 139, + 141, 168, 171, 189, 160, 182, 186, 191, + 129, 131, 133, 134, 140, 143, 184, 186, + 165, 166, 128, 129, 130, 132, 133, 134, + 135, 136, 139, 140, 141, 146, 147, 150, + 151, 152, 153, 154, 156, 128, 130, 184, + 255, 135, 190, 131, 175, 187, 188, 190, + 255, 128, 130, 167, 180, 179, 128, 130, + 179, 255, 129, 137, 141, 255, 172, 183, + 159, 170, 188, 128, 131, 190, 191, 151, + 128, 132, 135, 136, 139, 141, 162, 163, + 166, 172, 176, 180, 176, 255, 132, 255, + 175, 181, 184, 255, 129, 155, 158, 255, + 129, 255, 171, 183, 157, 171, 171, 172, + 189, 190, 176, 180, 176, 182, 145, 190, + 143, 146, 178, 157, 158, 160, 163, 133, + 134, 137, 168, 169, 170, 165, 169, 173, + 255, 131, 132, 140, 169, 174, 255, 130, + 132, 128, 182, 187, 255, 173, 180, 182, + 255, 132, 155, 159, 161, 175, 163, 144, + 150, 135, 160, 128, 129, 132, 135, 133, + 134, 129, 160, 255, 192, 255, 128, 128, + 129, 255, 155, 156, 151, 255, 156, 157, + 160, 181, 255, 158, 159, 186, 187, 255, + 162, 255, 160, 168, 161, 167, 158, 255, + 10, 13, 95, 194, 195, 198, 199, 203, + 204, 205, 206, 207, 210, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 233, 234, 237, + 239, 240, 243, 11, 12, 48, 57, 65, + 90, 97, 122, 196, 218, 229, 232, 235, + 236, 194, 204, 205, 210, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 239, 240, 243, 10, 39, + 44, 46, 59, 95, 194, 195, 198, 199, + 203, 204, 205, 206, 207, 210, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 237, 239, + 240, 243, 48, 57, 65, 90, 97, 122, + 196, 218, 235, 236, 39, 44, 46, 59, + 95, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 196, 218, 235, + 236, 39, 46, 58, 95, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 196, 218, 235, 236, 39, 44, 46, + 59, 95, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 196, 218, + 235, 236, 95, 194, 195, 198, 199, 203, + 204, 205, 206, 207, 210, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 237, 239, 240, + 243, 48, 57, 65, 90, 97, 122, 196, + 218, 235, 236, 34, 39, 46, 58, 95, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 196, 218, 235, 236, + 95, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 196, 218, 235, + 236, 95, 194, 204, 205, 210, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 239, 240, 243, 95, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 196, 218, 235, 236, + 39, 46, 58, 95, 194, 195, 198, 199, + 203, 204, 205, 206, 207, 210, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 237, 239, + 240, 243, 48, 57, 65, 90, 97, 122, + 196, 218, 235, 236, 95, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 196, 218, 235, 236, 95, 194, 195, + 198, 199, 203, 204, 205, 206, 207, 210, + 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 237, 239, 240, 243, 48, 57, 65, 90, + 97, 122, 196, 218, 235, 236, 133, 170, + 173, 181, 186, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 194, 204, 205, 210, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 239, 240, 243, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 128, 150, 152, 182, 184, 255, + 39, 46, 58, 95, 173, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 196, 218, 235, 236, 39, 46, 58, + 95, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 0, + 47, 48, 57, 59, 64, 65, 90, 91, + 96, 97, 122, 123, 127, 196, 218, 235, + 236, 170, 173, 181, 183, 186, 194, 204, + 205, 210, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 239, 240, 243, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 39, 46, 58, 95, 194, 195, 198, 199, + 203, 204, 205, 206, 207, 210, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 237, 239, + 240, 243, 48, 57, 65, 90, 97, 122, + 176, 193, 196, 218, 228, 233, 235, 236, + 238, 255, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 65, 90, 97, 122, 196, 218, 235, 236, + 39, 44, 46, 59, 95, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 196, 218, 235, 236, 95, 194, 195, + 198, 199, 203, 204, 205, 206, 207, 210, + 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 237, 239, 240, 243, 48, 57, 65, 90, + 97, 122, 196, 218, 235, 236, 39, 46, + 58, 95, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 131, 137, + 196, 218, 235, 236, 39, 46, 58, 95, + 191, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 145, 189, 196, + 218, 235, 236, 39, 46, 58, 95, 135, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 129, 130, 132, 133, + 196, 218, 235, 236, 39, 46, 58, 95, + 156, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 128, 133, 144, + 154, 196, 218, 235, 236, 39, 46, 58, + 95, 176, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 139, 159, + 196, 218, 235, 236, 39, 46, 58, 95, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 150, 157, 159, 164, + 167, 168, 170, 173, 196, 218, 235, 236, + 39, 46, 58, 95, 143, 145, 194, 195, + 198, 199, 203, 204, 205, 206, 207, 210, + 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 237, 239, 240, 243, 48, 57, 65, 90, + 97, 122, 176, 193, 196, 218, 228, 233, + 235, 236, 238, 255, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 192, 255, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 128, 255, 39, 46, 58, 95, 194, 195, + 198, 199, 203, 204, 205, 206, 207, 210, + 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 237, 239, 240, 243, 0, 47, 48, 57, + 59, 64, 65, 90, 91, 96, 97, 122, + 123, 138, 196, 218, 235, 236, 39, 46, + 58, 95, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 166, 176, + 196, 218, 235, 236, 39, 46, 58, 95, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 171, 179, 196, 218, + 235, 236, 39, 46, 58, 95, 160, 161, + 163, 164, 165, 167, 169, 171, 173, 174, + 175, 176, 177, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 166, 170, 172, 178, + 196, 218, 235, 236, 39, 46, 58, 95, + 128, 129, 130, 141, 156, 157, 158, 159, + 160, 162, 164, 168, 169, 170, 172, 173, + 174, 175, 176, 179, 183, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 196, 218, 235, 236, 39, 46, 58, + 95, 128, 129, 131, 179, 181, 183, 194, + 195, 198, 199, 203, 204, 205, 206, 207, + 210, 212, 213, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 237, 239, 240, 243, 48, 57, 65, + 90, 97, 122, 196, 218, 235, 236, 39, + 46, 58, 95, 128, 130, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 196, 218, 235, 236, 39, 46, 58, + 95, 153, 154, 155, 160, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 175, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 196, 218, 235, 236, + 39, 46, 58, 95, 172, 184, 187, 190, + 191, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 196, 218, 235, + 236, 39, 46, 58, 95, 144, 145, 150, + 155, 157, 158, 194, 195, 198, 199, 203, + 204, 205, 206, 207, 210, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 237, 239, 240, + 243, 48, 57, 65, 90, 97, 122, 196, + 218, 235, 236, 39, 46, 58, 95, 160, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 196, 218, 235, 236, + 151, 173, 194, 204, 205, 210, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 239, 240, 243, 130, + 133, 146, 159, 165, 171, 175, 255, 181, + 190, 194, 204, 205, 210, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 239, 240, 243, 184, 185, + 192, 255, 135, 140, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 134, 138, 142, 161, 163, 255, 182, + 194, 204, 205, 210, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 239, 240, 243, 130, 194, 204, + 205, 210, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 239, 240, 243, 176, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 194, 204, 205, 210, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 239, 240, 243, 151, 152, + 154, 160, 190, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 136, 144, 192, 255, 135, 179, 180, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 129, 130, 132, 133, + 144, 170, 176, 178, 156, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 128, 133, 144, 154, 160, 191, + 171, 194, 204, 205, 210, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 239, 240, 243, 128, 159, + 160, 169, 174, 255, 148, 158, 169, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 176, 185, 189, 190, + 192, 255, 194, 204, 205, 210, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 239, 240, 243, 143, + 255, 194, 204, 205, 210, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 239, 240, 243, 139, 140, + 194, 204, 205, 210, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 239, 240, 243, 178, 255, 186, + 194, 204, 205, 210, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 239, 240, 243, 128, 137, 138, + 181, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, + 191, 194, 204, 205, 210, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 239, 240, 243, 128, 129, + 130, 131, 137, 138, 139, 140, 141, 142, + 143, 144, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 167, + 168, 169, 170, 172, 173, 174, 175, 176, + 177, 179, 181, 182, 183, 188, 189, 190, + 191, 194, 204, 205, 210, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 239, 240, 243, 132, 152, + 180, 184, 185, 187, 128, 129, 130, 131, + 132, 133, 134, 146, 147, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 194, 204, + 205, 210, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 239, 240, 243, 128, 130, 132, 133, 134, + 194, 204, 205, 210, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 239, 240, 243, 128, 146, 147, + 148, 152, 153, 154, 155, 156, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, + 176, 194, 204, 205, 210, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 239, 240, 243, 129, 255, + 39, 46, 58, 95, 194, 195, 198, 199, + 203, 204, 205, 206, 207, 210, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 237, 239, + 240, 243, 48, 57, 65, 90, 97, 122, + 150, 153, 155, 163, 165, 167, 169, 173, + 196, 218, 235, 236, 39, 46, 58, 95, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 153, 155, 196, 218, + 235, 236, 39, 46, 58, 95, 194, 195, + 198, 199, 203, 204, 205, 206, 207, 210, + 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 237, 239, 240, 243, 48, 57, 65, 90, + 97, 122, 163, 193, 196, 218, 228, 233, + 235, 236, 238, 255, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 39, 46, 58, 95, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 171, 190, 196, 218, 235, 236, 39, + 46, 58, 95, 194, 195, 198, 199, 203, + 204, 205, 206, 207, 210, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 237, 239, 240, + 243, 48, 57, 65, 90, 97, 122, 150, + 153, 158, 160, 162, 164, 167, 173, 177, + 180, 196, 218, 235, 236, 39, 46, 58, + 95, 143, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 130, 141, + 154, 157, 196, 218, 235, 236, 39, 46, + 58, 95, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 157, 159, + 196, 218, 235, 236, 39, 46, 58, 95, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 146, 148, 178, 180, + 196, 218, 235, 236, 39, 46, 58, 95, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 146, 147, 178, 179, + 196, 218, 235, 236, 39, 46, 58, 95, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 180, 193, 196, 218, + 228, 233, 235, 236, 238, 255, 158, 159, + 194, 204, 205, 210, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 239, 240, 243, 160, 255, 172, + 173, 174, 175, 180, 181, 182, 183, 184, + 185, 187, 188, 189, 190, 191, 194, 204, + 205, 210, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 239, 240, 243, 176, 186, 144, 145, 146, + 147, 148, 150, 155, 157, 158, 159, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 160, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 39, 46, 58, 95, 194, 195, + 198, 199, 203, 204, 205, 206, 207, 210, + 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 237, 239, 240, 243, 48, 57, 65, 90, + 97, 122, 148, 156, 158, 193, 196, 218, + 228, 233, 235, 236, 238, 255, 39, 46, + 58, 95, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 139, 142, + 196, 218, 235, 236, 39, 46, 58, 95, + 169, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 196, 218, 235, + 236, 39, 46, 58, 95, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 160, 171, 176, 187, 196, 218, 235, + 236, 39, 46, 58, 95, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 151, 155, 196, 218, 235, 236, 39, + 46, 58, 95, 191, 194, 195, 198, 199, + 203, 204, 205, 206, 207, 210, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 237, 239, + 240, 243, 48, 57, 65, 90, 97, 122, + 149, 158, 160, 188, 196, 218, 235, 236, + 39, 46, 58, 95, 194, 195, 198, 199, + 203, 204, 205, 206, 207, 210, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 237, 239, + 240, 243, 48, 57, 65, 90, 97, 122, + 176, 190, 196, 218, 235, 236, 39, 46, + 58, 95, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 128, 132, + 180, 193, 196, 218, 228, 233, 235, 236, + 238, 255, 39, 46, 58, 95, 194, 195, + 198, 199, 203, 204, 205, 206, 207, 210, + 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 237, 239, 240, 243, 48, 57, 65, 90, + 97, 122, 133, 170, 180, 193, 196, 218, + 228, 233, 235, 236, 238, 255, 39, 46, + 58, 95, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 128, 130, + 161, 173, 196, 218, 235, 236, 39, 46, + 58, 95, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 166, 179, + 196, 218, 235, 236, 39, 46, 58, 95, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 164, 183, 196, 218, + 235, 236, 39, 46, 58, 95, 173, 194, + 195, 198, 199, 203, 204, 205, 206, 207, + 210, 212, 213, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 237, 239, 240, 243, 48, 57, 65, + 90, 97, 122, 144, 146, 148, 168, 178, + 180, 184, 185, 196, 218, 235, 236, 39, + 46, 58, 95, 194, 195, 198, 199, 203, + 204, 205, 206, 207, 210, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 237, 239, 240, + 243, 48, 57, 65, 90, 97, 122, 128, + 181, 188, 191, 196, 218, 235, 236, 39, + 46, 58, 95, 194, 195, 198, 199, 203, + 204, 205, 206, 207, 210, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 237, 239, 240, + 243, 48, 57, 65, 90, 97, 122, 140, + 143, 170, 174, 196, 218, 235, 236, 39, + 46, 58, 95, 194, 195, 198, 199, 203, + 204, 205, 206, 207, 210, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 237, 239, 240, + 243, 48, 57, 65, 90, 97, 122, 160, + 164, 166, 175, 196, 218, 235, 236, 39, + 46, 58, 95, 194, 195, 198, 199, 203, + 204, 205, 206, 207, 210, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 237, 239, 240, + 243, 48, 57, 65, 90, 97, 122, 144, + 176, 196, 218, 235, 236, 39, 46, 58, + 95, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 175, 177, 196, + 218, 235, 236, 39, 46, 58, 95, 191, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 196, 218, 235, 236, + 39, 46, 58, 95, 194, 195, 198, 199, + 203, 204, 205, 206, 207, 210, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 237, 239, + 240, 243, 48, 57, 65, 90, 97, 122, + 160, 191, 196, 218, 235, 236, 39, 46, + 58, 95, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 170, 175, + 196, 218, 235, 236, 39, 46, 58, 95, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 153, 154, 196, 218, + 235, 236, 39, 46, 58, 95, 194, 195, + 198, 199, 203, 204, 205, 206, 207, 210, + 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 237, 239, 240, 243, 48, 57, 65, 90, + 97, 122, 175, 178, 180, 189, 196, 218, + 235, 236, 39, 46, 58, 95, 194, 195, + 198, 199, 203, 204, 205, 206, 207, 210, + 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 237, 239, 240, 243, 48, 57, 65, 90, + 97, 122, 158, 159, 196, 218, 235, 236, + 39, 46, 58, 95, 194, 195, 198, 199, + 203, 204, 205, 206, 207, 210, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 237, 239, + 240, 243, 48, 57, 65, 90, 97, 122, + 176, 177, 196, 218, 235, 236, 39, 46, + 58, 95, 130, 134, 139, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 163, 167, 196, 218, 235, 236, 39, + 46, 58, 95, 194, 195, 198, 199, 203, + 204, 205, 206, 207, 210, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 237, 239, 240, + 243, 48, 57, 65, 90, 97, 122, 128, + 129, 180, 193, 196, 218, 228, 233, 235, + 236, 238, 255, 39, 46, 58, 95, 194, + 195, 198, 199, 203, 204, 205, 206, 207, + 210, 212, 213, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 237, 239, 240, 243, 48, 57, 65, + 90, 97, 122, 133, 159, 178, 193, 196, + 218, 228, 233, 235, 236, 238, 255, 39, + 46, 58, 95, 194, 195, 198, 199, 203, + 204, 205, 206, 207, 210, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 237, 239, 240, + 243, 48, 57, 65, 90, 97, 122, 166, + 173, 196, 218, 235, 236, 39, 46, 58, + 95, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 135, 147, 196, + 218, 235, 236, 39, 46, 58, 95, 194, + 195, 198, 199, 203, 204, 205, 206, 207, + 210, 212, 213, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 237, 239, 240, 243, 48, 57, 65, + 90, 97, 122, 128, 131, 179, 193, 196, + 218, 228, 233, 235, 236, 238, 255, 39, + 46, 58, 95, 165, 194, 195, 198, 199, + 203, 204, 205, 206, 207, 210, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 237, 239, + 240, 243, 0, 47, 48, 57, 59, 64, + 65, 90, 91, 96, 97, 122, 123, 128, + 196, 218, 235, 236, 39, 46, 58, 95, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 169, 182, 196, 218, + 235, 236, 39, 46, 58, 95, 131, 194, + 195, 198, 199, 203, 204, 205, 206, 207, + 210, 212, 213, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 237, 239, 240, 243, 48, 57, 65, + 90, 97, 122, 140, 141, 187, 189, 196, + 218, 235, 236, 39, 46, 58, 95, 176, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 178, 180, 183, 184, + 190, 191, 196, 218, 235, 236, 39, 46, + 58, 95, 129, 194, 195, 198, 199, 203, + 204, 205, 206, 207, 210, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 237, 239, 240, + 243, 48, 57, 65, 90, 97, 122, 171, + 175, 181, 182, 196, 218, 235, 236, 39, + 46, 58, 95, 194, 195, 198, 199, 203, + 204, 205, 206, 207, 210, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 237, 239, 240, + 243, 48, 57, 65, 90, 97, 122, 163, + 170, 172, 173, 196, 218, 235, 236, 39, + 46, 58, 95, 158, 194, 195, 198, 199, + 203, 204, 205, 206, 207, 210, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 237, 239, + 240, 243, 48, 57, 65, 90, 97, 122, + 196, 218, 235, 236, 39, 46, 58, 95, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 128, 143, 160, 175, + 196, 218, 235, 236, 39, 46, 58, 95, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 185, 187, 196, 218, + 235, 236, 39, 46, 58, 95, 135, 139, + 141, 168, 171, 194, 195, 198, 199, 203, + 204, 205, 206, 207, 210, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 237, 239, 240, + 243, 48, 57, 65, 90, 97, 122, 196, + 218, 235, 236, 39, 46, 58, 95, 128, + 129, 130, 132, 133, 134, 135, 136, 139, + 140, 141, 146, 147, 150, 151, 152, 153, + 154, 156, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 196, 218, + 235, 236, 39, 46, 58, 95, 171, 172, + 189, 190, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 196, 218, + 235, 236, 39, 46, 58, 95, 178, 194, + 195, 198, 199, 203, 204, 205, 206, 207, + 210, 212, 213, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 237, 239, 240, 243, 48, 57, 65, + 90, 97, 122, 196, 218, 235, 236, 39, + 46, 58, 95, 133, 134, 137, 168, 169, + 170, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 196, 218, 235, + 236, 39, 46, 58, 95, 163, 194, 195, + 198, 199, 203, 204, 205, 206, 207, 210, + 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 237, 239, 240, 243, 48, 57, 65, 90, + 97, 122, 196, 218, 235, 236, 39, 46, + 58, 95, 128, 129, 132, 135, 194, 195, + 198, 199, 203, 204, 205, 206, 207, 210, + 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 237, 239, 240, 243, 48, 57, 65, 90, + 97, 122, 133, 134, 196, 218, 235, 236, + 39, 46, 58, 95, 189, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 132, 185, 196, 218, 235, 236, 39, + 46, 58, 95, 144, 194, 195, 198, 199, + 203, 204, 205, 206, 207, 210, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 237, 239, + 240, 243, 48, 57, 65, 90, 97, 122, + 152, 161, 164, 193, 196, 218, 228, 233, + 235, 236, 238, 255, 39, 46, 58, 95, + 188, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 129, 131, 190, + 193, 196, 218, 228, 233, 235, 236, 238, + 255, 39, 46, 58, 95, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 133, 134, 137, 138, 142, 150, 152, + 161, 164, 193, 196, 218, 228, 233, 235, + 236, 238, 255, 39, 46, 58, 95, 145, + 181, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 0, + 47, 48, 57, 59, 64, 65, 90, 91, + 96, 97, 122, 123, 130, 135, 136, 139, + 141, 176, 177, 196, 218, 235, 236, 39, + 46, 58, 95, 134, 138, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 142, 161, 164, 193, 196, 218, 228, + 233, 235, 236, 238, 255, 39, 46, 58, + 95, 188, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 129, 131, + 190, 191, 196, 218, 235, 236, 39, 46, + 58, 95, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 128, 132, + 135, 136, 139, 141, 150, 151, 162, 163, + 196, 218, 235, 236, 39, 46, 58, 95, + 130, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 190, 191, 196, + 218, 235, 236, 39, 46, 58, 95, 151, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 128, 130, 134, 136, + 138, 141, 196, 218, 235, 236, 39, 46, + 58, 95, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 128, 131, + 190, 193, 196, 218, 228, 233, 235, 236, + 238, 255, 39, 46, 58, 95, 133, 137, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 142, 148, 151, 161, + 164, 193, 196, 218, 228, 233, 235, 236, + 238, 255, 39, 46, 58, 95, 194, 195, + 198, 199, 203, 204, 205, 206, 207, 210, + 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 237, 239, 240, 243, 48, 57, 65, 90, + 97, 122, 128, 132, 134, 136, 138, 141, + 149, 150, 162, 163, 196, 218, 235, 236, + 39, 46, 58, 95, 194, 195, 198, 199, + 203, 204, 205, 206, 207, 210, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 237, 239, + 240, 243, 48, 57, 65, 90, 97, 122, + 129, 131, 190, 193, 196, 218, 228, 233, + 235, 236, 238, 255, 39, 46, 58, 95, + 133, 137, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 142, 150, + 152, 161, 164, 193, 196, 218, 228, 233, + 235, 236, 238, 255, 39, 46, 58, 95, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 130, 131, 196, 218, + 235, 236, 39, 46, 58, 95, 138, 150, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 143, 148, 152, 159, + 178, 179, 196, 218, 235, 236, 39, 46, + 58, 95, 177, 194, 195, 198, 199, 203, + 204, 205, 206, 207, 210, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 237, 239, 240, + 243, 48, 57, 65, 90, 97, 122, 180, + 186, 196, 218, 235, 236, 39, 46, 58, + 95, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 135, 142, 196, + 218, 235, 236, 39, 46, 58, 95, 177, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 180, 185, 187, 188, + 196, 218, 235, 236, 39, 46, 58, 95, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 136, 141, 196, 218, + 235, 236, 39, 46, 58, 95, 181, 183, + 185, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 152, 153, 190, + 191, 196, 218, 235, 236, 39, 46, 58, + 95, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 177, 191, 196, + 218, 235, 236, 39, 46, 58, 95, 194, + 195, 198, 199, 203, 204, 205, 206, 207, + 210, 212, 213, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 237, 239, 240, 243, 48, 57, 65, + 90, 97, 122, 128, 132, 134, 135, 141, + 151, 153, 188, 196, 218, 235, 236, 39, + 46, 58, 95, 134, 194, 195, 198, 199, + 203, 204, 205, 206, 207, 210, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 237, 239, + 240, 243, 48, 57, 65, 90, 97, 122, + 196, 218, 235, 236, 173, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 130, 133, 146, 159, 165, 171, + 175, 255, 194, 204, 205, 210, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 239, 240, 243, 128, + 255, 173, 194, 204, 205, 210, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 239, 240, 243, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 128, 255, 173, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 176, 255, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 131, 137, 191, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 145, 189, 135, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 129, 130, 132, 133, 156, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 128, 133, 144, 154, 176, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 139, 159, 194, 204, + 205, 210, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 239, 240, 243, 150, 157, 159, 164, 167, + 168, 170, 173, 143, 145, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 176, 255, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 176, 255, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 131, 137, 191, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 145, 189, 135, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 129, 130, 132, 133, 156, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 128, 133, 144, 154, 176, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 139, 159, 194, 204, + 205, 210, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 239, 240, 243, 150, 157, 159, 164, 167, + 168, 170, 173, 143, 145, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 176, 255, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 139, 255, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 166, 176, 194, 204, 205, 210, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 239, 240, 243, 171, + 179, 160, 161, 163, 164, 165, 167, 169, + 171, 173, 174, 175, 176, 177, 179, 180, + 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 166, 170, 172, 178, 128, 129, 130, 141, + 156, 157, 158, 159, 160, 162, 164, 168, + 169, 170, 172, 173, 174, 175, 176, 179, + 183, 194, 204, 205, 210, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 239, 240, 243, 128, 129, + 131, 179, 181, 183, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 128, 130, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 153, 154, 155, 160, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 175, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 172, 184, 187, 190, + 191, 194, 204, 205, 210, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 239, 240, 243, 144, 145, + 150, 155, 157, 158, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 160, 194, 204, 205, 210, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 239, 240, 243, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 139, 255, 194, 204, + 205, 210, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 239, 240, 243, 166, 176, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 171, 179, 160, 161, 163, 164, + 165, 167, 169, 171, 173, 174, 175, 176, + 177, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 194, 204, + 205, 210, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 239, 240, 243, 166, 170, 172, 178, 128, + 129, 130, 141, 156, 157, 158, 159, 160, + 162, 164, 168, 169, 170, 172, 173, 174, + 175, 176, 179, 183, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 128, 129, 131, 179, 181, 183, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 128, 130, 194, 204, + 205, 210, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 239, 240, 243, 153, 154, 155, 160, 162, + 163, 164, 165, 166, 167, 168, 169, 170, + 171, 175, 194, 204, 205, 210, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 239, 240, 243, 172, + 184, 187, 190, 191, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 144, 145, 150, 155, 157, 158, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 160, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 181, 190, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 176, 183, 184, 185, 186, 191, 192, + 255, 134, 140, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 136, 138, 142, 161, 163, 255, 130, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 131, 137, 190, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 136, 144, 145, 191, + 192, 255, 135, 179, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 129, 130, 132, 133, 144, 170, 176, + 178, 156, 194, 204, 205, 210, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 239, 240, 243, 128, + 133, 144, 154, 160, 191, 171, 176, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 128, 138, 139, 159, + 160, 169, 174, 255, 148, 158, 169, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 150, 164, 167, 173, + 176, 185, 189, 190, 192, 255, 144, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 143, 145, 146, 175, + 176, 255, 194, 204, 205, 210, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 239, 240, 243, 139, + 140, 141, 255, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 166, 176, 178, 255, 186, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 128, 137, 138, 170, 171, 179, + 180, 181, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 194, 204, 205, 210, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 239, 240, 243, 128, + 129, 130, 131, 132, 135, 137, 138, 139, + 140, 141, 142, 143, 144, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 167, 168, 169, 170, 172, 173, + 174, 175, 176, 177, 179, 181, 182, 183, + 188, 189, 190, 191, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 133, 134, 136, 152, 180, 184, 185, + 187, 39, 46, 58, 95, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 196, 218, 235, 236, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 235, 236, 128, 129, 130, + 131, 132, 133, 134, 146, 147, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 186, + 187, 188, 191, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 189, 190, 194, 204, 205, 210, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 239, 240, 243, 128, + 129, 130, 131, 132, 133, 134, 135, 136, + 137, 139, 140, 141, 144, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 145, 255, 39, 46, 58, 95, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 196, 218, 235, 236, + 194, 204, 205, 210, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 235, 236, + 95, 194, 204, 205, 210, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 239, 240, 243, 194, 204, + 205, 210, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 239, 240, 243, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 194, 204, 205, 210, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 239, 240, 243, 150, 153, 155, + 163, 165, 167, 169, 173, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 153, 155, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 163, 255, 173, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 194, 204, 205, 210, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 239, 240, 243, 128, 255, + 173, 194, 204, 205, 210, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 239, 240, 243, 194, 204, + 205, 210, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 239, 240, 243, 128, 255, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 176, 255, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 131, 137, 191, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 145, 189, 135, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 129, 130, 132, 133, 156, 194, 204, + 205, 210, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 239, 240, 243, 128, 133, 144, 154, 176, + 194, 204, 205, 210, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 239, 240, 243, 139, 159, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 150, 157, 159, 164, + 167, 168, 170, 173, 143, 145, 194, 204, + 205, 210, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 239, 240, 243, 176, 255, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 176, 255, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 131, 137, 191, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 145, 189, 135, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 129, 130, 132, 133, 156, 194, 204, + 205, 210, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 239, 240, 243, 128, 133, 144, 154, 176, + 194, 204, 205, 210, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 239, 240, 243, 139, 159, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 150, 157, 159, 164, + 167, 168, 170, 173, 143, 145, 194, 204, + 205, 210, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 239, 240, 243, 176, 255, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 139, 255, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 166, 176, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 171, 179, 160, 161, 163, 164, 165, 167, + 169, 171, 173, 174, 175, 176, 177, 179, + 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 166, 170, 172, 178, 128, 129, 130, + 141, 156, 157, 158, 159, 160, 162, 164, + 168, 169, 170, 172, 173, 174, 175, 176, + 179, 183, 194, 204, 205, 210, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 239, 240, 243, 128, + 129, 131, 179, 181, 183, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 128, 130, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 153, 154, 155, 160, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 175, + 194, 204, 205, 210, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 239, 240, 243, 172, 184, 187, + 190, 191, 194, 204, 205, 210, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 239, 240, 243, 144, + 145, 150, 155, 157, 158, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 160, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 194, 204, 205, 210, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 239, 240, 243, 139, 255, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 166, 176, 194, 204, + 205, 210, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 239, 240, 243, 171, 179, 160, 161, 163, + 164, 165, 167, 169, 171, 173, 174, 175, + 176, 177, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 166, 170, 172, 178, + 128, 129, 130, 141, 156, 157, 158, 159, + 160, 162, 164, 168, 169, 170, 172, 173, + 174, 175, 176, 179, 183, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 128, 129, 131, 179, 181, 183, + 194, 204, 205, 210, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 239, 240, 243, 128, 130, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 153, 154, 155, 160, + 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 175, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 172, 184, 187, 190, 191, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 144, 145, 150, 155, 157, 158, + 194, 204, 205, 210, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 239, 240, 243, 160, 194, 204, + 205, 210, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 239, 240, 243, 189, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 132, 185, 144, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 152, 161, 164, 255, 188, 194, 204, + 205, 210, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 239, 240, 243, 129, 131, 190, 255, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 133, 134, 137, 138, + 142, 150, 152, 161, 164, 255, 194, 204, + 205, 210, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 239, 240, 243, 131, 134, 137, 138, 142, + 144, 146, 175, 178, 180, 182, 255, 134, + 138, 194, 204, 205, 210, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 239, 240, 243, 142, 161, + 164, 255, 188, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 129, 131, 190, 191, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 128, 132, 135, 136, 139, 141, 150, + 151, 162, 163, 130, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 190, 191, 151, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 128, 130, 134, 136, 138, 141, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 128, 131, 190, 255, + 133, 137, 194, 204, 205, 210, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 239, 240, 243, 142, + 148, 151, 161, 164, 255, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 128, 132, 134, 136, 138, 141, + 149, 150, 162, 163, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 129, 131, 190, 255, 133, 137, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 142, 150, 152, 161, + 164, 255, 194, 204, 205, 210, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 239, 240, 243, 130, + 131, 138, 150, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 143, 148, 152, 159, 178, 179, 177, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 180, 186, 194, 204, + 205, 210, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 239, 240, 243, 135, 142, 177, 194, 204, + 205, 210, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 239, 240, 243, 180, 185, 187, 188, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 136, 141, 181, 183, + 185, 194, 204, 205, 210, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 239, 240, 243, 152, 153, + 190, 191, 194, 204, 205, 210, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 239, 240, 243, 177, + 191, 194, 204, 205, 210, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 239, 240, 243, 128, 132, + 134, 135, 141, 151, 153, 188, 134, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 171, 190, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 150, 153, 158, 160, 162, 164, 167, 173, + 177, 180, 143, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 130, 141, 154, 157, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 157, 159, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 146, 148, 178, 180, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 146, 147, 178, 179, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 180, 255, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 148, 156, 158, 255, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 139, 142, 169, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 194, 204, 205, 210, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 239, 240, 243, 160, + 171, 176, 187, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 151, 155, 191, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 149, 158, 160, 188, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 176, 190, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 128, 132, 180, 255, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 133, 170, 180, 255, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 128, 130, 161, 173, 194, 204, + 205, 210, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 239, 240, 243, 166, 179, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 164, 183, 173, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 144, 146, 148, 168, 178, 180, + 184, 185, 194, 204, 205, 210, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 239, 240, 243, 128, + 181, 188, 191, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 140, 143, 170, 174, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 160, 164, 166, 175, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 144, 176, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 175, 177, 191, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 194, 204, 205, 210, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 239, 240, 243, 160, 191, + 194, 204, 205, 210, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 239, 240, 243, 170, 175, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 153, 154, 194, 204, + 205, 210, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 239, 240, 243, 175, 178, 180, 189, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 158, 159, 194, 204, + 205, 210, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 239, 240, 243, 176, 177, 130, 134, 139, + 194, 204, 205, 210, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 239, 240, 243, 163, 167, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 128, 129, 180, 255, + 194, 204, 205, 210, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 239, 240, 243, 133, 159, 178, + 255, 194, 204, 205, 210, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 239, 240, 243, 166, 173, + 194, 204, 205, 210, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 239, 240, 243, 135, 147, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 128, 131, 179, 255, + 194, 204, 205, 210, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 239, 240, 243, 129, 164, 166, + 255, 194, 204, 205, 210, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 239, 240, 243, 169, 182, + 131, 194, 204, 205, 210, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 239, 240, 243, 140, 141, + 187, 189, 176, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 178, 180, 183, 184, 190, 191, 129, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 171, 175, 181, 182, + 194, 204, 205, 210, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 239, 240, 243, 163, 170, 172, + 173, 158, 194, 204, 205, 210, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 239, 240, 243, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 128, 143, 160, 175, + 194, 204, 205, 210, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 239, 240, 243, 185, 187, 135, + 139, 141, 168, 171, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 128, 129, 130, 132, 133, 134, 135, + 136, 139, 140, 141, 146, 147, 150, 151, + 152, 153, 154, 156, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 171, 172, 189, 190, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 178, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 133, 134, 137, 168, 169, 170, 194, 204, + 205, 210, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 239, 240, 243, 163, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 128, 129, 132, 135, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 133, 134, 182, 183, 184, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 191, 194, 204, 205, 210, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 239, 240, 243, 192, + 255, 128, 146, 147, 148, 152, 153, 154, + 155, 156, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 129, 157, 177, 255, 39, 46, + 58, 95, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 196, 218, + 235, 236, 39, 46, 58, 95, 194, 195, + 198, 199, 203, 204, 205, 206, 207, 210, + 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 237, 239, 240, 243, 48, 57, 65, 90, + 97, 122, 150, 153, 155, 163, 165, 167, + 169, 173, 196, 218, 235, 236, 39, 46, + 58, 95, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 153, 155, + 196, 218, 235, 236, 39, 46, 58, 95, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 163, 193, 196, 218, + 228, 233, 235, 236, 238, 255, 170, 173, + 181, 183, 186, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 194, 204, 205, 210, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 239, 240, 243, 128, 255, 39, + 46, 58, 95, 173, 194, 195, 198, 199, + 203, 204, 205, 206, 207, 210, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 237, 239, + 240, 243, 48, 57, 65, 90, 97, 122, + 196, 218, 235, 236, 39, 46, 58, 95, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 0, 47, + 48, 57, 59, 64, 65, 90, 91, 96, + 97, 122, 123, 127, 196, 218, 235, 236, + 181, 190, 194, 204, 205, 210, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 239, 240, 243, 176, + 183, 184, 185, 186, 191, 192, 255, 130, + 194, 204, 205, 210, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 239, 240, 243, 131, 137, 190, + 194, 204, 205, 210, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 239, 240, 243, 136, 144, 145, + 191, 192, 255, 135, 179, 180, 194, 204, + 205, 210, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 239, 240, 243, 129, 130, 132, 133, 144, + 170, 176, 178, 156, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 128, 133, 144, 154, 160, 191, 171, + 176, 194, 204, 205, 210, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 239, 240, 243, 128, 138, + 139, 159, 160, 169, 174, 255, 148, 158, + 169, 194, 204, 205, 210, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 239, 240, 243, 150, 164, + 167, 173, 176, 185, 189, 190, 192, 255, + 144, 194, 204, 205, 210, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 239, 240, 243, 143, 145, + 146, 175, 176, 255, 39, 46, 58, 95, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 176, 193, 196, 218, + 228, 233, 235, 236, 238, 255, 39, 46, + 58, 95, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 131, 137, + 196, 218, 235, 236, 39, 46, 58, 95, + 191, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 145, 189, 196, + 218, 235, 236, 39, 46, 58, 95, 135, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 129, 130, 132, 133, + 196, 218, 235, 236, 39, 46, 58, 95, + 156, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 128, 133, 144, + 154, 196, 218, 235, 236, 39, 46, 58, + 95, 176, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 139, 159, + 196, 218, 235, 236, 39, 46, 58, 95, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 150, 157, 159, 164, + 167, 168, 170, 173, 196, 218, 235, 236, + 39, 46, 58, 95, 143, 145, 194, 195, + 198, 199, 203, 204, 205, 206, 207, 210, + 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 237, 239, 240, 243, 48, 57, 65, 90, + 97, 122, 176, 193, 196, 218, 228, 233, + 235, 236, 238, 255, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 139, 140, 141, 255, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 166, 176, 178, 255, 186, 194, + 204, 205, 210, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 239, 240, 243, 128, 137, 138, 170, + 171, 179, 180, 181, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 194, 204, 205, 210, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 239, 240, + 243, 128, 129, 130, 131, 132, 135, 137, + 138, 139, 140, 141, 142, 143, 144, 153, + 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 167, 168, 169, 170, + 172, 173, 174, 175, 176, 177, 179, 181, + 182, 183, 188, 189, 190, 191, 194, 204, + 205, 210, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 239, 240, 243, 133, 134, 136, 152, 180, + 184, 185, 187, 128, 129, 130, 131, 132, + 133, 134, 146, 147, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 194, 204, 205, + 210, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 239, + 240, 243, 128, 130, 132, 133, 134, 136, + 137, 194, 204, 205, 210, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 239, 240, 243, 128, 146, + 147, 148, 152, 153, 154, 155, 156, 158, + 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 194, 204, 205, 210, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 239, 240, 243, 129, + 157, 177, 255, 39, 46, 58, 95, 194, + 195, 198, 199, 203, 204, 205, 206, 207, + 210, 212, 213, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 237, 239, 240, 243, 48, 57, 65, + 90, 97, 122, 171, 190, 196, 218, 235, + 236, 39, 46, 58, 95, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 150, 153, 158, 160, 162, 164, 167, + 173, 177, 180, 196, 218, 235, 236, 39, + 46, 58, 95, 143, 194, 195, 198, 199, + 203, 204, 205, 206, 207, 210, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 237, 239, + 240, 243, 48, 57, 65, 90, 97, 122, + 130, 141, 154, 157, 196, 218, 235, 236, + 39, 46, 58, 95, 194, 195, 198, 199, + 203, 204, 205, 206, 207, 210, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 237, 239, + 240, 243, 48, 57, 65, 90, 97, 122, + 157, 159, 196, 218, 235, 236, 39, 46, + 58, 95, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 146, 148, + 178, 180, 196, 218, 235, 236, 39, 46, + 58, 95, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 146, 147, + 178, 179, 196, 218, 235, 236, 39, 46, + 58, 95, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 180, 193, + 196, 218, 228, 233, 235, 236, 238, 255, + 194, 204, 205, 210, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 239, 240, 243, 39, 46, 58, + 95, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 140, 143, 170, + 174, 196, 218, 235, 236, 39, 46, 58, + 95, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 160, 164, 166, + 175, 196, 218, 235, 236, 39, 46, 58, + 95, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 144, 176, 196, + 218, 235, 236, 39, 46, 58, 95, 194, + 195, 198, 199, 203, 204, 205, 206, 207, + 210, 212, 213, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 237, 239, 240, 243, 48, 57, 65, + 90, 97, 122, 175, 177, 196, 218, 235, + 236, 39, 46, 58, 95, 191, 194, 195, + 198, 199, 203, 204, 205, 206, 207, 210, + 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 237, 239, 240, 243, 48, 57, 65, 90, + 97, 122, 196, 218, 235, 236, 39, 46, + 58, 95, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 160, 191, + 196, 218, 235, 236, 39, 46, 58, 95, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 170, 175, 196, 218, + 235, 236, 39, 46, 58, 95, 194, 195, + 198, 199, 203, 204, 205, 206, 207, 210, + 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 237, 239, 240, 243, 48, 57, 65, 90, + 97, 122, 153, 154, 196, 218, 235, 236, + 39, 46, 58, 95, 194, 195, 198, 199, + 203, 204, 205, 206, 207, 210, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 237, 239, + 240, 243, 48, 57, 65, 90, 97, 122, + 175, 178, 180, 189, 196, 218, 235, 236, + 39, 46, 58, 95, 194, 195, 198, 199, + 203, 204, 205, 206, 207, 210, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 237, 239, + 240, 243, 48, 57, 65, 90, 97, 122, + 158, 159, 196, 218, 235, 236, 39, 46, + 58, 95, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 176, 177, + 196, 218, 235, 236, 39, 46, 58, 95, + 130, 134, 139, 194, 195, 198, 199, 203, + 204, 205, 206, 207, 210, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 237, 239, 240, + 243, 48, 57, 65, 90, 97, 122, 163, + 167, 196, 218, 235, 236, 39, 46, 58, + 95, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 128, 129, 180, + 193, 196, 218, 228, 233, 235, 236, 238, + 255, 158, 159, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 160, 255, 172, 173, 174, 175, 180, 181, + 182, 183, 184, 185, 187, 188, 189, 190, + 191, 194, 204, 205, 210, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 239, 240, 243, 176, 186, + 144, 145, 146, 147, 148, 150, 155, 157, + 158, 159, 194, 204, 205, 210, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 239, 240, 243, 160, + 194, 204, 205, 210, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 239, 240, 243, 39, 46, 58, + 95, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 133, 159, 178, + 193, 196, 218, 228, 233, 235, 236, 238, + 255, 39, 46, 58, 95, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 166, 173, 196, 218, 235, 236, 39, + 46, 58, 95, 194, 195, 198, 199, 203, + 204, 205, 206, 207, 210, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 237, 239, 240, + 243, 48, 57, 65, 90, 97, 122, 135, + 147, 196, 218, 235, 236, 39, 46, 58, + 95, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 128, 131, 179, + 193, 196, 218, 228, 233, 235, 236, 238, + 255, 39, 46, 58, 95, 165, 194, 195, + 198, 199, 203, 204, 205, 206, 207, 210, + 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 237, 239, 240, 243, 0, 47, 48, 57, + 59, 64, 65, 90, 91, 96, 97, 122, + 123, 128, 196, 218, 235, 236, 39, 46, + 58, 95, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 169, 182, + 196, 218, 235, 236, 39, 46, 58, 95, + 131, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 140, 141, 187, + 189, 196, 218, 235, 236, 39, 46, 58, + 95, 176, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 178, 180, + 183, 184, 190, 191, 196, 218, 235, 236, + 39, 46, 58, 95, 129, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 171, 175, 181, 182, 196, 218, 235, + 236, 39, 46, 58, 95, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 163, 170, 172, 173, 196, 218, 235, + 236, 39, 46, 58, 95, 158, 194, 195, + 198, 199, 203, 204, 205, 206, 207, 210, + 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 237, 239, 240, 243, 48, 57, 65, 90, + 97, 122, 196, 218, 235, 236, 39, 46, + 58, 95, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 128, 143, + 160, 175, 196, 218, 235, 236, 39, 46, + 58, 95, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 185, 187, + 196, 218, 235, 236, 39, 46, 58, 95, + 135, 139, 141, 168, 171, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 196, 218, 235, 236, 39, 46, 58, + 95, 128, 129, 130, 132, 133, 134, 135, + 136, 139, 140, 141, 146, 147, 150, 151, + 152, 153, 154, 156, 194, 195, 198, 199, + 203, 204, 205, 206, 207, 210, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 237, 239, + 240, 243, 48, 57, 65, 90, 97, 122, + 196, 218, 235, 236, 39, 46, 58, 95, + 171, 172, 189, 190, 194, 195, 198, 199, + 203, 204, 205, 206, 207, 210, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 237, 239, + 240, 243, 48, 57, 65, 90, 97, 122, + 196, 218, 235, 236, 39, 46, 58, 95, + 178, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 196, 218, 235, + 236, 39, 46, 58, 95, 133, 134, 137, + 168, 169, 170, 194, 195, 198, 199, 203, + 204, 205, 206, 207, 210, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 237, 239, 240, + 243, 48, 57, 65, 90, 97, 122, 196, + 218, 235, 236, 39, 46, 58, 95, 163, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 196, 218, 235, 236, + 39, 46, 58, 95, 128, 129, 132, 135, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 133, 134, 196, 218, + 235, 236, 39, 46, 58, 95, 194, 195, + 198, 199, 203, 204, 205, 206, 207, 210, + 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 237, 239, 240, 243, 48, 57, 65, 90, + 97, 122, 148, 156, 158, 193, 196, 218, + 228, 233, 235, 236, 238, 255, 39, 46, + 58, 95, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 139, 142, + 196, 218, 235, 236, 39, 46, 58, 95, + 169, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 196, 218, 235, + 236, 39, 46, 58, 95, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 160, 171, 176, 187, 196, 218, 235, + 236, 39, 46, 58, 95, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 151, 155, 196, 218, 235, 236, 39, + 46, 58, 95, 191, 194, 195, 198, 199, + 203, 204, 205, 206, 207, 210, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 237, 239, + 240, 243, 48, 57, 65, 90, 97, 122, + 149, 158, 160, 188, 196, 218, 235, 236, + 39, 46, 58, 95, 194, 195, 198, 199, + 203, 204, 205, 206, 207, 210, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 237, 239, + 240, 243, 48, 57, 65, 90, 97, 122, + 176, 190, 196, 218, 235, 236, 39, 46, + 58, 95, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 128, 132, + 180, 193, 196, 218, 228, 233, 235, 236, + 238, 255, 39, 46, 58, 95, 194, 195, + 198, 199, 203, 204, 205, 206, 207, 210, + 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 237, 239, 240, 243, 48, 57, 65, 90, + 97, 122, 133, 170, 180, 193, 196, 218, + 228, 233, 235, 236, 238, 255, 39, 46, + 58, 95, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 128, 130, + 161, 173, 196, 218, 235, 236, 39, 46, + 58, 95, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 166, 179, + 196, 218, 235, 236, 39, 46, 58, 95, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 164, 183, 196, 218, + 235, 236, 39, 46, 58, 95, 173, 194, + 195, 198, 199, 203, 204, 205, 206, 207, + 210, 212, 213, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 237, 239, 240, 243, 48, 57, 65, + 90, 97, 122, 144, 146, 148, 168, 178, + 180, 184, 185, 196, 218, 235, 236, 39, + 46, 58, 95, 194, 195, 198, 199, 203, + 204, 205, 206, 207, 210, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 237, 239, 240, + 243, 48, 57, 65, 90, 97, 122, 128, + 181, 188, 191, 196, 218, 235, 236, 39, + 46, 58, 95, 194, 195, 198, 199, 203, + 204, 205, 206, 207, 210, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 237, 239, 240, + 243, 0, 47, 48, 57, 59, 64, 65, + 90, 91, 96, 97, 122, 123, 138, 196, + 218, 235, 236, 39, 46, 58, 95, 194, + 195, 198, 199, 203, 204, 205, 206, 207, + 210, 212, 213, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 237, 239, 240, 243, 48, 57, 65, + 90, 97, 122, 166, 176, 196, 218, 235, + 236, 39, 46, 58, 95, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 171, 179, 196, 218, 235, 236, 39, + 46, 58, 95, 160, 161, 163, 164, 165, + 167, 169, 171, 173, 174, 175, 176, 177, + 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 166, 170, 172, 178, 196, 218, 235, + 236, 39, 46, 58, 95, 128, 129, 130, + 141, 156, 157, 158, 159, 160, 162, 164, + 168, 169, 170, 172, 173, 174, 175, 176, + 179, 183, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 196, 218, + 235, 236, 39, 46, 58, 95, 128, 129, + 131, 179, 181, 183, 194, 195, 198, 199, + 203, 204, 205, 206, 207, 210, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 237, 239, + 240, 243, 48, 57, 65, 90, 97, 122, + 196, 218, 235, 236, 39, 46, 58, 95, + 128, 130, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 196, 218, + 235, 236, 39, 46, 58, 95, 153, 154, + 155, 160, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 175, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 196, 218, 235, 236, 39, 46, 58, + 95, 172, 184, 187, 190, 191, 194, 195, + 198, 199, 203, 204, 205, 206, 207, 210, + 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 237, 239, 240, 243, 48, 57, 65, 90, + 97, 122, 196, 218, 235, 236, 39, 46, + 58, 95, 144, 145, 150, 155, 157, 158, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 196, 218, 235, 236, + 39, 46, 58, 95, 160, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 196, 218, 235, 236, 39, 46, 58, + 95, 189, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 132, 185, + 196, 218, 235, 236, 39, 46, 58, 95, + 144, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 152, 161, 164, + 193, 196, 218, 228, 233, 235, 236, 238, + 255, 39, 46, 58, 95, 188, 194, 195, + 198, 199, 203, 204, 205, 206, 207, 210, + 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 237, 239, 240, 243, 48, 57, 65, 90, + 97, 122, 129, 131, 190, 193, 196, 218, + 228, 233, 235, 236, 238, 255, 39, 46, + 58, 95, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 133, 134, + 137, 138, 142, 150, 152, 161, 164, 193, + 196, 218, 228, 233, 235, 236, 238, 255, + 39, 46, 58, 95, 145, 181, 194, 195, + 198, 199, 203, 204, 205, 206, 207, 210, + 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 237, 239, 240, 243, 0, 47, 48, 57, + 59, 64, 65, 90, 91, 96, 97, 122, + 123, 130, 135, 136, 139, 141, 176, 177, + 196, 218, 235, 236, 39, 46, 58, 95, + 134, 138, 194, 195, 198, 199, 203, 204, + 205, 206, 207, 210, 212, 213, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 237, 239, 240, 243, + 48, 57, 65, 90, 97, 122, 142, 161, + 164, 193, 196, 218, 228, 233, 235, 236, + 238, 255, 39, 46, 58, 95, 188, 194, + 195, 198, 199, 203, 204, 205, 206, 207, + 210, 212, 213, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 237, 239, 240, 243, 48, 57, 65, + 90, 97, 122, 129, 131, 190, 191, 196, + 218, 235, 236, 39, 46, 58, 95, 194, + 195, 198, 199, 203, 204, 205, 206, 207, + 210, 212, 213, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 237, 239, 240, 243, 48, 57, 65, + 90, 97, 122, 128, 132, 135, 136, 139, + 141, 150, 151, 162, 163, 196, 218, 235, + 236, 39, 46, 58, 95, 130, 194, 195, + 198, 199, 203, 204, 205, 206, 207, 210, + 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 237, 239, 240, 243, 48, 57, 65, 90, + 97, 122, 190, 191, 196, 218, 235, 236, + 39, 46, 58, 95, 151, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 128, 130, 134, 136, 138, 141, 196, + 218, 235, 236, 39, 46, 58, 95, 194, + 195, 198, 199, 203, 204, 205, 206, 207, + 210, 212, 213, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 237, 239, 240, 243, 48, 57, 65, + 90, 97, 122, 128, 131, 190, 193, 196, + 218, 228, 233, 235, 236, 238, 255, 39, + 46, 58, 95, 133, 137, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 142, 148, 151, 161, 164, 193, 196, + 218, 228, 233, 235, 236, 238, 255, 39, + 46, 58, 95, 194, 195, 198, 199, 203, + 204, 205, 206, 207, 210, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 237, 239, 240, + 243, 48, 57, 65, 90, 97, 122, 128, + 132, 134, 136, 138, 141, 149, 150, 162, + 163, 196, 218, 235, 236, 39, 46, 58, + 95, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 129, 131, 190, + 193, 196, 218, 228, 233, 235, 236, 238, + 255, 39, 46, 58, 95, 133, 137, 194, + 195, 198, 199, 203, 204, 205, 206, 207, + 210, 212, 213, 214, 215, 216, 217, 219, + 220, 221, 222, 223, 224, 225, 226, 227, + 234, 237, 239, 240, 243, 48, 57, 65, + 90, 97, 122, 142, 150, 152, 161, 164, + 193, 196, 218, 228, 233, 235, 236, 238, + 255, 39, 46, 58, 95, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 130, 131, 196, 218, 235, 236, 39, + 46, 58, 95, 138, 150, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 143, 148, 152, 159, 178, 179, 196, + 218, 235, 236, 39, 46, 58, 95, 177, + 194, 195, 198, 199, 203, 204, 205, 206, + 207, 210, 212, 213, 214, 215, 216, 217, + 219, 220, 221, 222, 223, 224, 225, 226, + 227, 234, 237, 239, 240, 243, 48, 57, + 65, 90, 97, 122, 180, 186, 196, 218, + 235, 236, 39, 46, 58, 95, 194, 195, + 198, 199, 203, 204, 205, 206, 207, 210, + 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 237, 239, 240, 243, 48, 57, 65, 90, + 97, 122, 135, 142, 196, 218, 235, 236, + 39, 46, 58, 95, 177, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 180, 185, 187, 188, 196, 218, 235, + 236, 39, 46, 58, 95, 194, 195, 198, + 199, 203, 204, 205, 206, 207, 210, 212, + 213, 214, 215, 216, 217, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 234, 237, + 239, 240, 243, 48, 57, 65, 90, 97, + 122, 136, 141, 196, 218, 235, 236, 39, + 46, 58, 95, 181, 183, 185, 194, 195, + 198, 199, 203, 204, 205, 206, 207, 210, + 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 237, 239, 240, 243, 48, 57, 65, 90, + 97, 122, 152, 153, 190, 191, 196, 218, + 235, 236, 39, 46, 58, 95, 194, 195, + 198, 199, 203, 204, 205, 206, 207, 210, + 212, 213, 214, 215, 216, 217, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 234, + 237, 239, 240, 243, 48, 57, 65, 90, + 97, 122, 177, 191, 196, 218, 235, 236, + 39, 46, 58, 95, 194, 195, 198, 199, + 203, 204, 205, 206, 207, 210, 212, 213, + 214, 215, 216, 217, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 234, 237, 239, + 240, 243, 48, 57, 65, 90, 97, 122, + 128, 132, 134, 135, 141, 151, 153, 188, + 196, 218, 235, 236, 39, 46, 58, 95, + 134, 194, 195, 198, 199, 203, 204, 205, + 206, 207, 210, 212, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 234, 237, 239, 240, 243, 48, + 57, 65, 90, 97, 122, 196, 218, 235, + 236, 164, 169, 171, 172, 173, 174, 175, + 180, 181, 182, 183, 184, 185, 187, 188, + 189, 190, 191, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 165, 170, 176, 186, 144, 145, 146, 147, + 148, 150, 155, 157, 158, 159, 160, 170, + 171, 172, 175, 194, 204, 205, 210, 214, + 215, 216, 217, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 234, 239, 240, 243, + 161, 169, 194, 204, 205, 210, 214, 215, + 216, 217, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 234, 239, 240, 243, } var _s_single_lengths []byte = []byte{ - 1, 0, 0, 0, 1, 1, 1, 1, - 0, 2, 0, 0, 0, 26, 0, 0, - 0, 1, 1, 1, 0, 0, 2, 1, - 0, 1, 1, 0, 2, 0, 0, 2, - 0, 2, 1, 0, 1, 0, 3, 0, - 0, 1, 21, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 1, 0, - 6, 0, 0, 0, 0, 1, 0, 2, - 0, 0, 15, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 1, 1, - 1, 0, 5, 1, 0, 0, 6, 5, - 1, 1, 0, 1, 0, 19, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 1, - 1, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 1, 0, 6, - 0, 0, 0, 0, 0, 1, 1, 0, - 1, 4, 1, 0, 0, 21, 30, 4, - 0, 0, 0, 0, 1, 0, 2, 2, - 1, 1, 1, 0, 1, 1, 1, 1, - 3, 1, 0, 0, 1, 32, 3, 0, - 0, 0, 1, 1, 4, 2, 1, 1, - 1, 4, 1, 1, 3, 2, 1, 3, - 1, 1, 1, 3, 1, 2, 1, 0, - 1, 0, 4, 0, 0, 1, 41, 0, - 0, 1, 2, 3, 2, 1, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 4, 1, 0, 18, 0, - 2, 0, 0, 6, 1, 0, 0, 0, - 0, 1, 0, 2, 1, 0, 0, 1, - 5, 1, 0, 0, 0, 28, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 3, - 0, 0, 2, 0, 0, 0, 1, 0, - 1, 1, 1, 0, 1, 0, 0, 2, - 0, 0, 15, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 10, 35, 0, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 1, 0, - 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 24, 0, 0, 0, 0, 0, - 2, 0, 2, 0, 1, 0, 1, 2, - 0, 1, 0, 0, 1, 0, 0, 0, - 0, 0, 4, 0, 0, 0, 2, 2, - 0, 10, 0, 0, 0, 0, 0, 0, - 0, 3, 0, 0, 18, 0, 0, 0, - 1, 4, 1, 4, 1, 0, 3, 2, - 2, 2, 1, 0, 0, 1, 5, 0, - 4, 12, 0, 3, 0, 0, 0, 1, - 4, 1, 0, 0, 0, 21, 1, 0, - 0, 0, 1, 1, 1, 2, 0, 2, - 0, 0, 0, 26, 0, 0, 0, 1, - 1, 1, 0, 0, 2, 1, 0, 1, - 1, 0, 2, 0, 0, 2, 0, 2, - 1, 0, 1, 0, 3, 0, 0, 1, - 24, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 1, - 0, 6, 0, 0, 0, 0, 1, 0, - 2, 0, 0, 16, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 0, 5, 1, 0, 0, - 6, 6, 1, 1, 0, 1, 0, 22, - 0, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 1, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 0, 0, 0, - 0, 1, 0, 7, 0, 0, 0, 0, - 0, 0, 1, 1, 0, 1, 4, 1, - 0, 0, 4, 0, 2, 1, 1, 2, - 21, 1, 0, 0, 0, 1, 1, 4, - 0, 2, 1, 1, 2, 1, 2, 3, - 1, 0, 0, 1, 32, 3, 0, 0, - 1, 2, 4, 2, 1, 1, 1, 4, - 1, 1, 3, 2, 1, 3, 1, 1, - 1, 3, 1, 2, 1, 0, 1, 0, - 4, 0, 0, 1, 43, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 1, 0, - 0, 1, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 18, 0, 3, 0, 0, - 1, 0, 5, 1, 0, 28, 0, 1, - 0, 0, 3, 0, 2, 0, 0, 0, - 1, 0, 1, 1, 1, 0, 15, 2, - 0, 0, 0, 1, 1, 0, 0, 10, - 35, 1, 1, 0, 0, 2, 0, 25, - 0, 0, 0, 0, 0, 2, 0, 1, - 0, 0, 1, 2, 0, 1, 0, 0, - 1, 0, 0, 0, 10, 0, 0, 0, - 0, 0, 0, 3, 0, 18, 0, 0, - 0, 1, 0, 0, 1, 5, 0, 1, - 4, 1, 0, 0, 0, 1, 1, 0, - 2, 0, 0, 0, 26, 0, 0, 0, - 1, 1, 1, 0, 0, 2, 1, 0, - 1, 1, 0, 2, 0, 0, 2, 0, - 2, 1, 0, 1, 0, 3, 0, 0, - 1, 21, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 1, 0, 6, - 0, 0, 0, 0, 1, 0, 2, 0, - 0, 15, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 1, 1, 1, - 0, 6, 2, 0, 0, 0, 6, 5, - 1, 1, 0, 1, 0, 19, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 1, - 1, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 1, 0, 6, - 0, 0, 0, 0, 0, 1, 1, 0, - 1, 4, 1, 0, 0, 5, 2, 0, - 2, 2, 1, 1, 3, 1, 2, 3, - 1, 0, 0, 1, 32, 3, 0, 0, - 1, 2, 4, 2, 1, 1, 1, 4, - 1, 1, 3, 2, 1, 3, 1, 1, - 1, 3, 1, 2, 1, 0, 1, 0, - 4, 0, 0, 1, 43, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 1, 0, - 0, 1, 0, 0, 0, 0, 0, 0, - 1, 0, 18, 2, 3, 0, 0, 1, - 0, 5, 1, 0, 28, 1, 0, 0, - 3, 0, 2, 0, 0, 0, 1, 0, - 1, 1, 1, 0, 15, 1, 1, 2, - 1, 4, 0, 0, 10, 35, 1, 1, - 0, 2, 0, 25, 0, 0, 0, 0, - 2, 0, 1, 0, 0, 1, 2, 0, - 1, 0, 0, 1, 0, 0, 10, 0, - 0, 0, 0, 3, 0, 18, 0, 0, - 0, 0, 0, 1, 5, 0, 1, 4, - 1, 0, 0, 0, 1, 2, 3, 1, - 0, 0, 1, 32, 3, 0, 0, 1, - 2, 4, 2, 1, 1, 1, 4, 1, - 1, 3, 2, 1, 3, 1, 1, 1, - 3, 1, 2, 1, 0, 1, 0, 4, - 0, 0, 1, 43, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 1, - 0, 18, 0, 3, 0, 0, 1, 0, - 10, 1, 1, 0, 0, 0, 1, 1, - 1, 1, 0, 2, 0, 0, 0, 26, - 0, 0, 0, 1, 1, 1, 0, 0, - 2, 1, 0, 1, 1, 0, 2, 0, - 0, 2, 0, 2, 1, 0, 1, 0, - 3, 0, 0, 1, 21, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 1, 0, - 0, 1, 0, 0, 0, 0, 0, 0, - 1, 0, 6, 0, 1, 0, 0, 1, - 0, 7, 0, 0, 1, 0, 0, 0, - 15, 0, 0, 0, 3, 0, 0, 0, - 0, 0, 0, 0, 1, 1, 1, 0, - 8, 1, 0, 0, 1, 0, 0, 0, - 6, 5, 1, 1, 0, 1, 0, 19, - 0, 0, 0, 0, 1, 0, 0, 0, - 0, 1, 1, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, 0, 2, - 1, 0, 6, 0, 0, 0, 0, 0, - 1, 1, 0, 1, 4, 1, 0, 0, - 0, 28, 1, 0, 0, 3, 0, 2, - 0, 0, 0, 1, 0, 1, 1, 1, - 0, 15, 2, 0, 1, 0, 0, 0, - 10, 35, 1, 1, 0, 2, 0, 25, - 0, 0, 0, 0, 2, 0, 1, 0, - 0, 1, 2, 0, 1, 0, 0, 1, - 0, 0, 10, 0, 0, 0, 0, 4, - 0, 18, 0, 0, 0, 0, 0, 1, - 5, 0, 1, 4, 1, 0, 0, 0, - 4, 0, 2, 1, 2, 2, 1, 3, - 3, 1, 0, 0, 2, 32, 3, 0, - 0, 1, 2, 4, 2, 1, 1, 1, - 4, 1, 1, 3, 2, 1, 3, 1, - 1, 1, 3, 1, 2, 1, 0, 1, - 0, 4, 0, 0, 1, 43, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, 1, 0, 18, 1, 4, 0, 0, - 1, 0, 5, 1, 0, 28, 1, 0, - 0, 3, 0, 2, 0, 0, 0, 1, - 0, 1, 1, 1, 0, 15, 2, 2, - 3, 1, 5, 0, 0, 10, 35, 1, - 1, 0, 2, 0, 25, 0, 0, 0, - 0, 2, 0, 1, 0, 0, 1, 2, - 0, 1, 0, 0, 1, 0, 0, 10, - 0, 0, 0, 0, 3, 0, 18, 0, - 0, 0, 0, 0, 1, 5, 0, 1, - 4, 1, 0, 0, 0, 5, 2, 1, - 1, 3, 1, 1, 3, 0, 0, 1, - 32, 0, 0, 0, 1, 3, 1, 1, - 1, 0, 2, 0, 1, 1, 2, 0, - 3, 0, 1, 0, 2, 1, 2, 1, - 0, 1, 0, 4, 0, 0, 1, 43, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 18, 2, 3, 0, 0, - 0, 0, 5, 1, 0, 28, 1, 0, - 1, 0, 0, 0, 0, 0, 1, 1, - 0, 15, 2, 1, 0, 0, 0, 10, - 35, 1, 0, 0, 1, 0, 23, 0, - 0, 0, 1, 1, 0, 0, 0, 2, - 1, 0, 0, 0, 0, 10, 0, 0, - 0, 3, 0, 18, 0, 0, 0, 0, - 0, 1, 5, 0, 1, 4, 1, 0, - 4, 0, 2, 1, 1, 2, 1, 2, - 3, 1, 0, 0, 1, 32, 3, 0, - 0, 1, 2, 4, 2, 1, 1, 1, - 4, 1, 1, 3, 2, 1, 3, 1, - 1, 1, 3, 1, 2, 1, 0, 1, - 0, 4, 0, 0, 1, 43, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 18, 0, - 3, 0, 0, 1, 0, 10, 1, 0, - 28, 0, 1, 0, 0, 3, 0, 2, - 0, 0, 0, 1, 0, 1, 1, 1, - 0, 15, 2, 0, 0, 1, 1, 0, - 0, 10, 35, 1, 1, 0, 0, 2, - 0, 25, 0, 0, 0, 0, 0, 2, - 0, 1, 0, 0, 1, 2, 0, 1, - 0, 0, 1, 0, 0, 0, 0, 10, - 0, 0, 0, 0, 0, 0, 4, 0, - 18, 0, 0, 0, 1, 0, 0, 1, - 5, 0, 1, 4, 1, 0, 0, 0, - 4, 0, 2, 1, 2, 2, 1, 3, - 3, 1, 0, 0, 2, 32, 3, 0, - 0, 1, 2, 4, 2, 1, 1, 1, - 4, 1, 1, 3, 2, 1, 3, 1, - 1, 1, 3, 1, 2, 1, 0, 1, - 0, 4, 0, 0, 1, 43, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, 1, 0, 18, 1, 4, 0, 0, - 1, 0, 5, 1, 0, 28, 1, 0, - 0, 3, 0, 2, 0, 0, 0, 1, - 0, 1, 1, 1, 0, 15, 2, 2, - 3, 1, 5, 0, 0, 10, 35, 1, - 1, 0, 2, 0, 25, 0, 0, 0, - 0, 2, 0, 1, 0, 0, 1, 2, - 0, 1, 0, 0, 1, 0, 0, 10, - 0, 0, 0, 0, 3, 0, 18, 0, - 0, 0, 0, 0, 1, 5, 0, 1, - 4, 1, 0, 0, 0, 1, 0, 0, - 0, 1, 1, 1, 2, 0, 2, 0, - 0, 0, 26, 0, 0, 0, 1, 1, - 1, 0, 0, 2, 1, 0, 1, 1, - 0, 2, 0, 0, 2, 0, 2, 1, - 0, 1, 0, 3, 0, 0, 1, 24, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 1, 0, 6, 0, - 0, 0, 0, 1, 0, 2, 0, 0, - 16, 0, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 1, 1, 1, - 0, 5, 1, 0, 0, 6, 6, 1, - 1, 0, 1, 0, 22, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 1, - 1, 0, 0, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 0, 1, 0, 7, - 0, 0, 0, 0, 0, 0, 1, 1, - 0, 1, 4, 1, 0, 0, 4, 0, - 2, 1, 2, 2, 1, 3, 3, 1, - 0, 0, 2, 32, 3, 0, 0, 1, - 2, 4, 2, 1, 1, 1, 4, 1, - 1, 3, 2, 1, 3, 1, 1, 1, - 3, 1, 2, 1, 0, 1, 0, 4, - 0, 0, 1, 43, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 1, - 0, 18, 1, 4, 0, 0, 1, 0, - 5, 1, 0, 28, 1, 0, 0, 3, - 0, 2, 0, 0, 0, 1, 0, 1, - 1, 1, 0, 15, 2, 2, 1, 0, - 0, 10, 35, 1, 1, 0, 2, 0, - 25, 0, 0, 0, 0, 2, 0, 1, - 0, 0, 1, 2, 0, 1, 0, 0, - 1, 0, 0, 10, 0, 0, 0, 0, - 3, 0, 18, 0, 0, 0, 0, 0, - 1, 5, 0, 1, 4, 1, 0, 0, - 0, 5, 0, 2, 1, 1, 3, 1, - 2, 3, 1, 0, 0, 1, 32, 3, - 0, 0, 1, 2, 4, 2, 1, 1, - 1, 4, 1, 1, 3, 2, 1, 3, - 1, 1, 1, 3, 1, 2, 1, 0, - 1, 0, 4, 0, 0, 1, 43, 0, - 0, 1, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 1, 0, 18, 2, 3, 0, - 0, 1, 0, 5, 1, 0, 28, 1, - 0, 0, 3, 0, 2, 0, 0, 0, - 1, 0, 1, 1, 1, 0, 15, 2, - 1, 1, 0, 0, 10, 35, 1, 1, - 0, 2, 0, 25, 0, 0, 0, 0, - 2, 0, 1, 0, 0, 1, 2, 0, - 1, 0, 0, 1, 0, 0, 10, 0, - 0, 0, 0, 3, 0, 18, 0, 0, - 0, 0, 0, 1, 5, 0, 1, 4, - 1, 0, 0, 0, 4, 0, 2, 1, - 1, 2, 1, 2, 3, 1, 0, 0, - 1, 32, 3, 0, 0, 1, 2, 4, - 2, 1, 1, 1, 4, 1, 1, 3, - 2, 1, 3, 1, 1, 1, 3, 1, - 2, 1, 0, 1, 0, 4, 0, 0, - 1, 43, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 1, 0, 18, - 0, 3, 0, 0, 1, 0, 10, 1, - 0, 28, 1, 0, 0, 3, 0, 2, - 0, 0, 0, 1, 0, 1, 1, 1, - 0, 15, 2, 0, 0, 1, 1, 0, - 0, 10, 35, 1, 1, 0, 2, 0, - 25, 0, 0, 0, 0, 2, 0, 1, - 0, 0, 1, 2, 0, 1, 0, 0, - 1, 0, 0, 10, 0, 0, 0, 0, - 4, 0, 18, 0, 0, 0, 0, 0, - 1, 5, 0, 1, 4, 1, 0, 0, - 0, 4, 0, 2, 1, 1, 2, 1, - 2, 3, 1, 0, 0, 1, 32, 3, - 0, 0, 1, 2, 4, 2, 1, 1, - 1, 4, 1, 1, 3, 2, 1, 3, - 1, 1, 1, 3, 1, 2, 1, 0, - 1, 0, 4, 0, 0, 1, 43, 0, - 0, 1, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 1, 0, 18, 0, 3, 0, - 0, 1, 0, 10, 1, 0, 28, 1, - 0, 0, 3, 0, 2, 0, 0, 0, - 1, 0, 1, 1, 1, 0, 15, 2, - 0, 1, 0, 0, 10, 35, 1, 1, - 0, 2, 0, 25, 0, 0, 0, 0, - 2, 0, 1, 0, 0, 1, 2, 0, - 1, 0, 0, 1, 0, 0, 10, 0, - 0, 0, 0, 4, 0, 18, 0, 0, - 0, 0, 0, 1, 5, 0, 1, 4, - 1, 0, 0, 0, 1, 0, 0, 0, - 1, 1, 1, 1, 0, 2, 0, 0, - 0, 26, 0, 0, 0, 1, 1, 1, - 0, 0, 2, 1, 0, 1, 1, 0, - 2, 0, 0, 2, 0, 2, 1, 0, - 1, 0, 3, 0, 0, 1, 21, 0, - 0, 1, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 1, 0, 6, 0, 0, 0, - 0, 1, 0, 2, 0, 0, 15, 0, - 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 1, 1, 1, 0, 5, 1, - 0, 0, 6, 5, 1, 1, 0, 1, - 0, 19, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 1, 1, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, - 0, 1, 0, 6, 0, 0, 0, 0, - 0, 1, 1, 0, 1, 4, 1, 0, - 0, 4, 0, 2, 1, 1, 1, 1, - 1, 3, 1, 0, 0, 1, 32, 3, - 0, 0, 1, 1, 4, 2, 1, 1, - 1, 4, 1, 1, 3, 2, 1, 3, - 1, 1, 1, 3, 1, 2, 1, 0, - 1, 0, 4, 0, 0, 1, 41, 0, - 0, 1, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 1, 0, 18, 0, 2, 0, - 0, 1, 0, 5, 1, 0, 28, 1, - 0, 0, 3, 0, 2, 0, 0, 0, - 1, 0, 1, 1, 1, 0, 15, 2, - 0, 1, 0, 0, 10, 35, 1, 1, - 0, 2, 0, 24, 0, 0, 0, 0, - 2, 0, 2, 0, 0, 1, 2, 0, - 1, 0, 0, 1, 0, 0, 10, 0, - 0, 0, 0, 3, 0, 18, 0, 0, - 0, 0, 0, 1, 5, 0, 1, 4, - 1, 0, 0, 0, 4, 0, 2, 1, - 2, 2, 1, 3, 3, 1, 0, 0, - 2, 32, 3, 0, 0, 1, 2, 4, - 2, 1, 1, 1, 4, 1, 1, 3, - 2, 1, 3, 1, 1, 1, 3, 1, - 2, 1, 0, 1, 0, 4, 0, 0, - 1, 43, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 1, 0, 18, - 1, 4, 0, 0, 1, 0, 5, 1, - 0, 28, 1, 0, 0, 3, 0, 2, - 0, 0, 0, 1, 0, 1, 1, 1, - 0, 15, 2, 2, 1, 0, 0, 10, - 35, 1, 1, 0, 2, 0, 25, 0, - 0, 0, 0, 2, 0, 1, 0, 0, - 1, 2, 0, 1, 0, 0, 1, 0, - 0, 10, 0, 0, 0, 0, 3, 0, - 18, 0, 0, 0, 0, 0, 1, 5, - 0, 1, 4, 1, 0, 0, 0, 4, - 0, 2, 1, 1, 2, 1, 2, 3, - 1, 0, 0, 1, 32, 3, 0, 0, - 1, 2, 4, 2, 1, 1, 1, 4, - 1, 1, 3, 2, 1, 3, 1, 1, - 1, 3, 1, 2, 1, 0, 1, 0, - 4, 0, 0, 1, 43, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 1, 0, - 0, 1, 0, 0, 0, 0, 0, 0, - 1, 0, 18, 0, 3, 0, 0, 1, - 0, 10, 1, 0, 28, 1, 0, 0, - 3, 0, 2, 0, 0, 0, 1, 0, - 1, 1, 1, 0, 15, 2, 0, 1, - 0, 0, 10, 35, 1, 1, 0, 2, - 0, 25, 0, 0, 0, 0, 2, 0, - 1, 0, 0, 1, 2, 0, 1, 0, - 0, 1, 0, 0, 10, 0, 0, 0, - 0, 4, 0, 18, 0, 0, 0, 0, - 0, 1, 5, 0, 1, 4, 1, 0, - 0, 0, 1, 0, 0, 0, 1, 1, - 1, 1, 0, 2, 0, 0, 0, 26, - 21, 6, 2, 15, 5, 6, 1, 3, - 0, 1, 2, 4, 2, 1, 1, 1, - 4, 1, 1, 3, 2, 1, 3, 1, - 1, 1, 3, 1, 2, 0, 0, 4, - 0, 0, 0, 1, 0, 5, 0, 2, - 1, 1, 3, 1, 2, 3, 1, 0, - 0, 1, 32, 3, 0, 0, 1, 2, - 4, 2, 1, 1, 1, 4, 1, 1, - 3, 2, 1, 3, 1, 1, 1, 3, - 1, 2, 1, 0, 1, 0, 4, 0, - 0, 1, 45, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, - 0, 1, 0, 0, 0, 0, 0, 0, - 1, 0, 18, 2, 3, 0, 0, 1, - 0, 7, 1, 0, 0, 0, 0, 1, - 0, 0, 0, 1, 1, 1, 1, 0, - 2, 0, 0, 0, 26, 0, 0, 0, - 1, 1, 1, 0, 0, 2, 1, 0, - 1, 1, 0, 2, 0, 0, 2, 0, - 2, 1, 0, 1, 0, 3, 0, 0, - 1, 23, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 1, - 0, 6, 0, 0, 0, 0, 1, 0, - 7, 0, 0, 0, 0, 0, 16, 0, - 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 1, 1, 1, 0, 0, 2, - 0, 0, 5, 1, 0, 0, 0, 6, - 5, 1, 1, 0, 1, 0, 19, 0, - 0, 0, 0, 1, 0, 0, 0, 0, - 1, 1, 0, 0, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 0, 1, 0, - 6, 0, 0, 0, 0, 0, 1, 1, - 0, 1, 4, 1, 28, 1, 0, 0, - 3, 0, 2, 0, 0, 0, 1, 0, - 1, 1, 1, 0, 0, 2, 0, 0, - 15, 2, 1, 1, 0, 0, 10, 35, - 1, 1, 0, 2, 0, 25, 0, 0, - 0, 0, 2, 0, 1, 0, 0, 1, - 2, 0, 1, 0, 0, 1, 0, 0, - 10, 0, 0, 0, 0, 3, 0, 18, - 0, 0, 0, 0, 0, 1, 5, 0, - 1, 4, 1, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 3, 0, 1, - 0, 0, 1, 0, 0, 0, 1, 1, - 1, 1, 0, 2, 0, 0, 0, 26, - 0, 0, 0, 1, 1, 1, 0, 0, - 2, 1, 0, 1, 1, 0, 2, 0, - 0, 2, 0, 2, 1, 0, 1, 0, - 3, 0, 0, 1, 21, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 1, 0, - 0, 1, 0, 0, 0, 0, 0, 0, - 1, 0, 6, 0, 0, 0, 0, 1, - 0, 2, 0, 0, 15, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 0, 5, 1, 0, 0, - 6, 5, 1, 1, 0, 1, 0, 19, - 0, 0, 0, 0, 1, 0, 0, 0, - 0, 1, 1, 0, 0, 0, 0, 0, - 0, 0, 4, 0, 0, 0, 0, 1, - 0, 6, 0, 0, 0, 0, 0, 1, - 1, 0, 1, 4, 1, 0, 0, 0, - 0, 4, 5, 0, 2, 1, 1, 3, - 1, 2, 3, 1, 0, 0, 1, 32, - 3, 0, 0, 1, 2, 4, 2, 1, - 1, 1, 4, 1, 1, 3, 2, 1, - 3, 1, 1, 1, 3, 1, 2, 1, - 0, 1, 0, 4, 0, 0, 1, 43, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 1, 0, 18, 2, 3, - 0, 0, 1, 0, 5, 1, 0, 28, - 1, 0, 0, 3, 0, 2, 0, 0, - 0, 1, 0, 1, 1, 1, 0, 15, - 2, 1, 1, 0, 0, 10, 35, 1, - 1, 0, 2, 0, 25, 0, 0, 0, - 0, 2, 0, 1, 0, 0, 1, 2, - 0, 1, 0, 0, 1, 0, 0, 10, - 0, 0, 0, 0, 3, 0, 18, 0, - 0, 0, 0, 0, 1, 5, 0, 1, - 4, 1, 0, 0, 0, 1, 0, 0, - 0, 1, 1, 1, 1, 0, 2, 0, - 0, 0, 26, 0, 0, 0, 1, 1, - 1, 0, 0, 2, 1, 0, 1, 1, - 0, 2, 0, 0, 2, 0, 2, 1, - 0, 1, 0, 3, 0, 0, 1, 23, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 1, 0, 6, 0, 0, - 0, 0, 1, 0, 7, 0, 0, 16, - 0, 0, 0, 3, 0, 0, 0, 0, - 0, 0, 0, 1, 1, 1, 0, 5, - 1, 0, 0, 0, 6, 5, 1, 1, - 0, 1, 0, 19, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 1, 1, 0, - 0, 0, 0, 0, 0, 0, 4, 0, - 0, 0, 0, 1, 0, 6, 0, 0, - 0, 0, 0, 1, 1, 0, 1, 4, - 1, 0, 0, 1, 0, 0, 0, 1, - 1, 1, 1, 0, 2, 0, 0, 0, - 26, 0, 0, 0, 1, 1, 1, 0, - 0, 2, 1, 0, 1, 1, 0, 2, - 0, 0, 2, 0, 2, 1, 0, 1, - 0, 3, 0, 0, 1, 21, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, 1, 0, 6, 0, 1, 0, 0, - 1, 0, 7, 0, 0, 1, 0, 0, - 0, 15, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 1, 1, 1, - 0, 8, 1, 0, 0, 0, 0, 6, - 5, 1, 1, 0, 1, 0, 19, 0, - 0, 0, 0, 1, 0, 0, 0, 0, - 1, 1, 0, 0, 0, 0, 0, 0, - 0, 4, 0, 0, 0, 0, 2, 1, - 0, 6, 0, 0, 0, 0, 0, 1, - 1, 0, 1, 4, 1, 0, 0, 0, - 1, 0, 0, 0, 1, 1, 1, 1, - 0, 2, 0, 0, 0, 26, 0, 0, - 0, 1, 1, 1, 0, 0, 2, 1, - 0, 1, 1, 0, 2, 0, 0, 2, - 0, 2, 1, 0, 1, 0, 3, 0, - 0, 1, 21, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 1, 0, 0, 1, - 0, 0, 0, 0, 0, 0, 1, 0, - 6, 0, 0, 0, 0, 1, 0, 2, - 0, 0, 15, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 1, 1, - 1, 0, 5, 1, 0, 0, 6, 5, - 1, 1, 0, 1, 0, 19, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 1, - 1, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 1, 0, 6, - 0, 0, 0, 0, 0, 1, 1, 0, - 1, 4, 1, 0, 0, 0, 1, 1, - 0, 0, 0, 1, 1, 1, 1, 0, - 2, 0, 0, 0, 26, 0, 0, 0, - 1, 1, 1, 0, 0, 2, 1, 0, - 1, 1, 0, 2, 0, 0, 2, 0, - 2, 1, 0, 1, 0, 3, 0, 0, - 1, 21, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 1, 0, - 0, 0, 0, 0, 0, 1, 0, 6, - 0, 0, 0, 0, 1, 0, 2, 0, - 0, 15, 0, 0, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 1, 1, 1, - 0, 5, 1, 0, 0, 6, 5, 1, - 1, 0, 1, 0, 19, 0, 0, 0, - 0, 1, 0, 0, 0, 0, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 4, - 0, 0, 0, 0, 1, 0, 6, 0, - 0, 0, 0, 0, 1, 1, 0, 1, - 4, 1, 0, 0, 0, 0, 0, 1, - 1, 1, 1, 0, 2, 0, 0, 0, - 26, 21, 6, 2, 15, 5, 6, 1, - 0, 1, 0, 0, 3, 0, 2, 0, - 0, 0, 1, 0, 1, 1, 0, 1, - 5, 0, 2, 1, 1, 3, 1, 2, - 3, 1, 0, 0, 1, 32, 3, 0, - 0, 1, 2, 4, 2, 1, 1, 1, - 4, 1, 1, 3, 2, 1, 3, 1, - 1, 1, 3, 1, 2, 1, 0, 1, - 0, 4, 0, 0, 1, 45, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 1, - 0, 0, 1, 0, 0, 0, 0, 0, - 0, 1, 0, 18, 2, 3, 0, 0, - 1, 0, 7, 1, 0, 28, 1, 0, - 0, 3, 0, 2, 0, 0, 0, 1, - 0, 1, 1, 1, 0, 15, 2, 1, - 1, 0, 0, 10, 35, 1, 1, 0, - 2, 0, 25, 0, 0, 0, 0, 2, - 0, 1, 0, 0, 1, 2, 0, 1, - 0, 0, 1, 0, 0, 10, 0, 0, - 0, 0, 3, 0, 18, 0, 0, 0, - 0, 0, 1, 5, 0, 1, 4, 1, - 0, 0, 0, 0, 0, 0, 1, 1, - 1, 1, 0, 2, 0, 0, 0, 26, - 21, 6, 2, 15, 5, 6, 1, 0, - 0, 2, 0, 1, 0, 0, 0, 35, - 1, 0, 2, 0, 25, 0, 0, 0, - 0, 2, 0, 1, 0, 0, 1, 2, - 0, 1, 0, 0, 1, 0, 0, 10, - 0, 0, 0, 0, 4, 2, 0, 18, - 5, 0, 5, 0, 1, 0, 0, 0, - 1, 1, 1, 1, 0, 2, 0, 0, - 0, 26, 0, 0, 0, 1, 1, 1, - 0, 0, 2, 1, 0, 1, 1, 0, - 2, 0, 0, 2, 0, 2, 1, 0, - 1, 0, 3, 0, 0, 1, 21, 0, - 0, 1, 0, 0, 0, 0, 0, 0, - 1, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 1, 0, 6, 0, 0, 0, - 0, 1, 0, 2, 0, 0, 15, 0, - 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 1, 1, 1, 0, 5, 1, - 0, 0, 7, 5, 1, 1, 0, 1, - 0, 19, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 1, 1, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 0, 0, - 0, 1, 0, 6, 0, 0, 0, 0, - 0, 1, 1, 0, 1, 1, 4, 1, - 0, 0, 1, 1, 0, 2, 0, 3, - 0, 0, 1, 0, 2, 0, 35, 21, - 1, 35, 35, 34, 35, 31, 35, 31, - 22, 31, 34, 31, 31, 26, 21, 21, - 35, 34, 26, 21, 34, 30, 35, 31, - 34, 35, 35, 35, 35, 34, 36, 21, - 21, 34, 34, 34, 60, 55, 40, 36, - 49, 39, 40, 35, 23, 23, 23, 22, - 22, 22, 21, 22, 24, 22, 22, 24, - 21, 21, 21, 22, 53, 64, 39, 26, - 49, 34, 34, 34, 21, 34, 34, 35, - 34, 34, 34, 34, 23, 36, 31, 22, - 34, 34, 35, 34, 34, 35, 34, 34, - 34, 34, 34, 34, 35, 34, 34, 34, - 34, 34, 35, 34, 34, 34, 34, 34, - 34, 37, 34, 34, 34, 34, 34, 35, - 34, 35, 35, 35, 34, 35, 34, 34, - 39, 53, 38, 35, 40, 35, 38, 35, - 35, 35, 34, 36, 36, 35, 34, 35, - 35, 34, 36, 34, 34, 36, 34, 36, - 35, 34, 35, 34, 37, 34, 34, 35, - 22, 21, 22, 21, 22, 21, 21, 22, - 22, 22, 22, 21, 23, 21, 21, 22, - 22, 22, 22, 21, 23, 21, 21, 21, - 47, 42, 27, 23, 36, 26, 27, 22, - 21, 21, 21, 47, 42, 27, 23, 36, - 26, 27, 22, 23, 23, 22, 22, 23, - 22, 23, 24, 22, 21, 21, 22, 53, - 66, 34, 22, 43, 21, 35, 34, 22, - 22, 21, 21, 21, 21, 21, 22, 21, - 22, 21, 21, 21, 22, 22, 22, 22, - 21, 23, 21, 21, 22, 22, 22, 22, - 21, 23, 21, 21, 21, 47, 42, 27, - 23, 36, 26, 27, 22, 21, 21, 21, - 47, 42, 27, 23, 36, 26, 27, 22, - 22, 22, 22, 21, 21, 23, 22, 21, - 22, 22, 21, 23, 21, 21, 23, 21, - 23, 22, 21, 22, 21, 24, 21, 21, - 22, 21, 21, 22, 21, 21, 21, 21, - 21, 21, 22, 21, 21, 22, 21, 21, - 21, 21, 21, 21, 22, 21, 21, 21, - 21, 21, 22, 21, 21, 21, 21, 21, - 21, 24, 21, 21, 21, 21, 21, 21, - 21, 22, 22, 22, 21, 22, 21, 21, - 26, 40, 25, 22, 27, 22, 25, 24, - 21, 22, 49, 34, 34, 34, 34, 26, - 21, 35, 34, 23, 22, 22, 24, 22, - 23, 24, 22, 34, 34, 35, 35, 35, - 35, 34, 36, 21, 21, 22, 53, 66, - 39, 28, 49, 34, 34, 35, 34, 34, - 34, 34, 21, 34, 34, 34, 34, 35, - 34, 34, 34, 34, 34, 34, 37, 34, - 23, 36, 31, 22, 34, 34, 34, 34, - 35, 34, 35, 35, 35, 34, 35, 34, - 34, 39, 53, 38, 35, 40, 35, 38, - 34, 34, 35, 34, 34, 35, 34, 34, - 34, 34, 34, 34, 35, 34, 34, 34, - 34, 60, 55, 40, 36, 49, 39, 40, - 35, 35, 35, 35, 34, 36, 36, 35, - 34, 35, 35, 34, 36, 34, 34, 36, - 34, 36, 35, 34, 35, 34, 37, 34, - 34, 35, 39, 36, 21, + 1, 0, 0, 0, 1, 1, 1, 1, + 0, 2, 0, 0, 0, 26, 0, 0, + 0, 1, 1, 1, 0, 0, 2, 1, + 0, 1, 1, 0, 2, 0, 0, 2, + 0, 2, 1, 0, 1, 0, 3, 0, + 0, 1, 21, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, + 6, 0, 0, 0, 0, 1, 0, 2, + 0, 0, 15, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 1, 1, + 1, 0, 5, 1, 0, 0, 6, 5, + 1, 1, 0, 1, 0, 19, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 1, 0, 6, + 0, 0, 0, 0, 0, 1, 1, 0, + 1, 4, 1, 0, 0, 21, 30, 4, + 0, 0, 0, 0, 1, 0, 2, 2, + 1, 1, 1, 0, 1, 1, 1, 1, + 3, 1, 0, 0, 1, 32, 3, 0, + 0, 0, 1, 1, 4, 2, 1, 1, + 1, 4, 1, 1, 3, 2, 1, 3, + 1, 1, 1, 3, 1, 2, 1, 0, + 1, 0, 4, 0, 0, 1, 41, 0, + 0, 1, 2, 3, 2, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 4, 1, 0, 18, 0, + 2, 0, 0, 6, 1, 0, 0, 0, + 0, 1, 0, 2, 1, 0, 0, 1, + 5, 1, 0, 0, 0, 28, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 3, + 0, 0, 2, 0, 0, 0, 1, 0, + 1, 1, 1, 0, 1, 0, 0, 2, + 0, 0, 15, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 10, 35, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 24, 0, 0, 0, 0, 0, + 2, 0, 2, 0, 1, 0, 1, 2, + 0, 1, 0, 0, 1, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 2, 2, + 0, 10, 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 18, 0, 0, 0, + 1, 4, 1, 4, 1, 0, 3, 2, + 2, 2, 1, 0, 0, 1, 5, 0, + 4, 12, 0, 3, 0, 0, 0, 1, + 4, 1, 0, 0, 0, 21, 1, 0, + 0, 0, 1, 1, 1, 2, 0, 2, + 0, 0, 0, 26, 0, 0, 0, 1, + 1, 1, 0, 0, 2, 1, 0, 1, + 1, 0, 2, 0, 0, 2, 0, 2, + 1, 0, 1, 0, 3, 0, 0, 1, + 24, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 1, + 0, 6, 0, 0, 0, 0, 1, 0, + 2, 0, 0, 16, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 5, 1, 0, 0, + 6, 6, 1, 1, 0, 1, 0, 22, + 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, + 0, 1, 0, 7, 0, 0, 0, 0, + 0, 0, 1, 1, 0, 1, 4, 1, + 0, 0, 4, 0, 2, 1, 1, 2, + 21, 1, 0, 0, 0, 1, 1, 4, + 0, 2, 1, 1, 2, 1, 2, 3, + 1, 0, 0, 1, 32, 3, 0, 0, + 1, 2, 4, 2, 1, 1, 1, 4, + 1, 1, 3, 2, 1, 3, 1, 1, + 1, 3, 1, 2, 1, 0, 1, 0, + 4, 0, 0, 1, 43, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 18, 0, 3, 0, 0, + 1, 0, 5, 1, 0, 28, 0, 1, + 0, 0, 3, 0, 2, 0, 0, 0, + 1, 0, 1, 1, 1, 0, 15, 2, + 0, 0, 0, 1, 1, 0, 0, 10, + 35, 1, 1, 0, 0, 2, 0, 25, + 0, 0, 0, 0, 0, 2, 0, 1, + 0, 0, 1, 2, 0, 1, 0, 0, + 1, 0, 0, 0, 10, 0, 0, 0, + 0, 0, 0, 3, 0, 18, 0, 0, + 0, 1, 0, 0, 1, 5, 0, 1, + 4, 1, 0, 0, 0, 1, 1, 0, + 2, 0, 0, 0, 26, 0, 0, 0, + 1, 1, 1, 0, 0, 2, 1, 0, + 1, 1, 0, 2, 0, 0, 2, 0, + 2, 1, 0, 1, 0, 3, 0, 0, + 1, 21, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 1, 0, 6, + 0, 0, 0, 0, 1, 0, 2, 0, + 0, 15, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, + 0, 6, 2, 0, 0, 0, 6, 5, + 1, 1, 0, 1, 0, 19, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 1, 0, 6, + 0, 0, 0, 0, 0, 1, 1, 0, + 1, 4, 1, 0, 0, 5, 2, 0, + 2, 2, 1, 1, 3, 1, 2, 3, + 1, 0, 0, 1, 32, 3, 0, 0, + 1, 2, 4, 2, 1, 1, 1, 4, + 1, 1, 3, 2, 1, 3, 1, 1, + 1, 3, 1, 2, 1, 0, 1, 0, + 4, 0, 0, 1, 43, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 18, 2, 3, 0, 0, 1, + 0, 5, 1, 0, 28, 1, 0, 0, + 3, 0, 2, 0, 0, 0, 1, 0, + 1, 1, 1, 0, 15, 1, 1, 2, + 1, 4, 0, 0, 10, 35, 1, 1, + 0, 2, 0, 25, 0, 0, 0, 0, + 2, 0, 1, 0, 0, 1, 2, 0, + 1, 0, 0, 1, 0, 0, 10, 0, + 0, 0, 0, 3, 0, 18, 0, 0, + 0, 0, 0, 1, 5, 0, 1, 4, + 1, 0, 0, 0, 1, 2, 3, 1, + 0, 0, 1, 32, 3, 0, 0, 1, + 2, 4, 2, 1, 1, 1, 4, 1, + 1, 3, 2, 1, 3, 1, 1, 1, + 3, 1, 2, 1, 0, 1, 0, 4, + 0, 0, 1, 43, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 1, + 0, 18, 0, 3, 0, 0, 1, 0, + 10, 1, 1, 0, 0, 0, 1, 1, + 1, 1, 0, 2, 0, 0, 0, 26, + 0, 0, 0, 1, 1, 1, 0, 0, + 2, 1, 0, 1, 1, 0, 2, 0, + 0, 2, 0, 2, 1, 0, 1, 0, + 3, 0, 0, 1, 21, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 6, 0, 1, 0, 0, 1, + 0, 7, 0, 0, 1, 0, 0, 0, + 15, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, + 8, 1, 0, 0, 1, 0, 0, 0, + 6, 5, 1, 1, 0, 1, 0, 19, + 0, 0, 0, 0, 1, 0, 0, 0, + 0, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, 2, + 1, 0, 6, 0, 0, 0, 0, 0, + 1, 1, 0, 1, 4, 1, 0, 0, + 0, 28, 1, 0, 0, 3, 0, 2, + 0, 0, 0, 1, 0, 1, 1, 1, + 0, 15, 2, 0, 1, 0, 0, 0, + 10, 35, 1, 1, 0, 2, 0, 25, + 0, 0, 0, 0, 2, 0, 1, 0, + 0, 1, 2, 0, 1, 0, 0, 1, + 0, 0, 10, 0, 0, 0, 0, 4, + 0, 18, 0, 0, 0, 0, 0, 1, + 5, 0, 1, 4, 1, 0, 0, 0, + 4, 0, 2, 1, 2, 2, 1, 3, + 3, 1, 0, 0, 2, 32, 3, 0, + 0, 1, 2, 4, 2, 1, 1, 1, + 4, 1, 1, 3, 2, 1, 3, 1, + 1, 1, 3, 1, 2, 1, 0, 1, + 0, 4, 0, 0, 1, 43, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 1, 0, 18, 1, 4, 0, 0, + 1, 0, 5, 1, 0, 28, 1, 0, + 0, 3, 0, 2, 0, 0, 0, 1, + 0, 1, 1, 1, 0, 15, 2, 2, + 3, 1, 5, 0, 0, 10, 35, 1, + 1, 0, 2, 0, 25, 0, 0, 0, + 0, 2, 0, 1, 0, 0, 1, 2, + 0, 1, 0, 0, 1, 0, 0, 10, + 0, 0, 0, 0, 3, 0, 18, 0, + 0, 0, 0, 0, 1, 5, 0, 1, + 4, 1, 0, 0, 0, 5, 2, 1, + 1, 3, 1, 1, 3, 0, 0, 1, + 32, 0, 0, 0, 1, 3, 1, 1, + 1, 0, 2, 0, 1, 1, 2, 0, + 3, 0, 1, 0, 2, 1, 2, 1, + 0, 1, 0, 4, 0, 0, 1, 43, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 18, 2, 3, 0, 0, + 0, 0, 5, 1, 0, 28, 1, 0, + 1, 0, 0, 0, 0, 0, 1, 1, + 0, 15, 2, 1, 0, 0, 0, 10, + 35, 1, 0, 0, 1, 0, 23, 0, + 0, 0, 1, 1, 0, 0, 0, 2, + 1, 0, 0, 0, 0, 10, 0, 0, + 0, 3, 0, 18, 0, 0, 0, 0, + 0, 1, 5, 0, 1, 4, 1, 0, + 4, 0, 2, 1, 1, 2, 1, 2, + 3, 1, 0, 0, 1, 32, 3, 0, + 0, 1, 2, 4, 2, 1, 1, 1, + 4, 1, 1, 3, 2, 1, 3, 1, + 1, 1, 3, 1, 2, 1, 0, 1, + 0, 4, 0, 0, 1, 43, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 18, 0, + 3, 0, 0, 1, 0, 10, 1, 0, + 28, 0, 1, 0, 0, 3, 0, 2, + 0, 0, 0, 1, 0, 1, 1, 1, + 0, 15, 2, 0, 0, 1, 1, 0, + 0, 10, 35, 1, 1, 0, 0, 2, + 0, 25, 0, 0, 0, 0, 0, 2, + 0, 1, 0, 0, 1, 2, 0, 1, + 0, 0, 1, 0, 0, 0, 0, 10, + 0, 0, 0, 0, 0, 0, 4, 0, + 18, 0, 0, 0, 1, 0, 0, 1, + 5, 0, 1, 4, 1, 0, 0, 0, + 4, 0, 2, 1, 2, 2, 1, 3, + 3, 1, 0, 0, 2, 32, 3, 0, + 0, 1, 2, 4, 2, 1, 1, 1, + 4, 1, 1, 3, 2, 1, 3, 1, + 1, 1, 3, 1, 2, 1, 0, 1, + 0, 4, 0, 0, 1, 43, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 1, 0, 18, 1, 4, 0, 0, + 1, 0, 5, 1, 0, 28, 1, 0, + 0, 3, 0, 2, 0, 0, 0, 1, + 0, 1, 1, 1, 0, 15, 2, 2, + 3, 1, 5, 0, 0, 10, 35, 1, + 1, 0, 2, 0, 25, 0, 0, 0, + 0, 2, 0, 1, 0, 0, 1, 2, + 0, 1, 0, 0, 1, 0, 0, 10, + 0, 0, 0, 0, 3, 0, 18, 0, + 0, 0, 0, 0, 1, 5, 0, 1, + 4, 1, 0, 0, 0, 1, 0, 0, + 0, 1, 1, 1, 2, 0, 2, 0, + 0, 0, 26, 0, 0, 0, 1, 1, + 1, 0, 0, 2, 1, 0, 1, 1, + 0, 2, 0, 0, 2, 0, 2, 1, + 0, 1, 0, 3, 0, 0, 1, 24, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 6, 0, + 0, 0, 0, 1, 0, 2, 0, 0, + 16, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, + 0, 5, 1, 0, 0, 6, 6, 1, + 1, 0, 1, 0, 22, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, 1, 0, 7, + 0, 0, 0, 0, 0, 0, 1, 1, + 0, 1, 4, 1, 0, 0, 4, 0, + 2, 1, 2, 2, 1, 3, 3, 1, + 0, 0, 2, 32, 3, 0, 0, 1, + 2, 4, 2, 1, 1, 1, 4, 1, + 1, 3, 2, 1, 3, 1, 1, 1, + 3, 1, 2, 1, 0, 1, 0, 4, + 0, 0, 1, 43, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 1, + 0, 18, 1, 4, 0, 0, 1, 0, + 5, 1, 0, 28, 1, 0, 0, 3, + 0, 2, 0, 0, 0, 1, 0, 1, + 1, 1, 0, 15, 2, 2, 1, 0, + 0, 10, 35, 1, 1, 0, 2, 0, + 25, 0, 0, 0, 0, 2, 0, 1, + 0, 0, 1, 2, 0, 1, 0, 0, + 1, 0, 0, 10, 0, 0, 0, 0, + 3, 0, 18, 0, 0, 0, 0, 0, + 1, 5, 0, 1, 4, 1, 0, 0, + 0, 5, 0, 2, 1, 1, 3, 1, + 2, 3, 1, 0, 0, 1, 32, 3, + 0, 0, 1, 2, 4, 2, 1, 1, + 1, 4, 1, 1, 3, 2, 1, 3, + 1, 1, 1, 3, 1, 2, 1, 0, + 1, 0, 4, 0, 0, 1, 43, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 18, 2, 3, 0, + 0, 1, 0, 5, 1, 0, 28, 1, + 0, 0, 3, 0, 2, 0, 0, 0, + 1, 0, 1, 1, 1, 0, 15, 2, + 1, 1, 0, 0, 10, 35, 1, 1, + 0, 2, 0, 25, 0, 0, 0, 0, + 2, 0, 1, 0, 0, 1, 2, 0, + 1, 0, 0, 1, 0, 0, 10, 0, + 0, 0, 0, 3, 0, 18, 0, 0, + 0, 0, 0, 1, 5, 0, 1, 4, + 1, 0, 0, 0, 4, 0, 2, 1, + 1, 2, 1, 2, 3, 1, 0, 0, + 1, 32, 3, 0, 0, 1, 2, 4, + 2, 1, 1, 1, 4, 1, 1, 3, + 2, 1, 3, 1, 1, 1, 3, 1, + 2, 1, 0, 1, 0, 4, 0, 0, + 1, 43, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 1, 0, 18, + 0, 3, 0, 0, 1, 0, 10, 1, + 0, 28, 1, 0, 0, 3, 0, 2, + 0, 0, 0, 1, 0, 1, 1, 1, + 0, 15, 2, 0, 0, 1, 1, 0, + 0, 10, 35, 1, 1, 0, 2, 0, + 25, 0, 0, 0, 0, 2, 0, 1, + 0, 0, 1, 2, 0, 1, 0, 0, + 1, 0, 0, 10, 0, 0, 0, 0, + 4, 0, 18, 0, 0, 0, 0, 0, + 1, 5, 0, 1, 4, 1, 0, 0, + 0, 4, 0, 2, 1, 1, 2, 1, + 2, 3, 1, 0, 0, 1, 32, 3, + 0, 0, 1, 2, 4, 2, 1, 1, + 1, 4, 1, 1, 3, 2, 1, 3, + 1, 1, 1, 3, 1, 2, 1, 0, + 1, 0, 4, 0, 0, 1, 43, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 18, 0, 3, 0, + 0, 1, 0, 10, 1, 0, 28, 1, + 0, 0, 3, 0, 2, 0, 0, 0, + 1, 0, 1, 1, 1, 0, 15, 2, + 0, 1, 0, 0, 10, 35, 1, 1, + 0, 2, 0, 25, 0, 0, 0, 0, + 2, 0, 1, 0, 0, 1, 2, 0, + 1, 0, 0, 1, 0, 0, 10, 0, + 0, 0, 0, 4, 0, 18, 0, 0, + 0, 0, 0, 1, 5, 0, 1, 4, + 1, 0, 0, 0, 1, 0, 0, 0, + 1, 1, 1, 1, 0, 2, 0, 0, + 0, 26, 0, 0, 0, 1, 1, 1, + 0, 0, 2, 1, 0, 1, 1, 0, + 2, 0, 0, 2, 0, 2, 1, 0, + 1, 0, 3, 0, 0, 1, 21, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 6, 0, 0, 0, + 0, 1, 0, 2, 0, 0, 15, 0, + 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 5, 1, + 0, 0, 6, 5, 1, 1, 0, 1, + 0, 19, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + 0, 1, 0, 6, 0, 0, 0, 0, + 0, 1, 1, 0, 1, 4, 1, 0, + 0, 4, 0, 2, 1, 1, 1, 1, + 1, 3, 1, 0, 0, 1, 32, 3, + 0, 0, 1, 1, 4, 2, 1, 1, + 1, 4, 1, 1, 3, 2, 1, 3, + 1, 1, 1, 3, 1, 2, 1, 0, + 1, 0, 4, 0, 0, 1, 41, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 18, 0, 2, 0, + 0, 1, 0, 5, 1, 0, 28, 1, + 0, 0, 3, 0, 2, 0, 0, 0, + 1, 0, 1, 1, 1, 0, 15, 2, + 0, 1, 0, 0, 10, 35, 1, 1, + 0, 2, 0, 24, 0, 0, 0, 0, + 2, 0, 2, 0, 0, 1, 2, 0, + 1, 0, 0, 1, 0, 0, 10, 0, + 0, 0, 0, 3, 0, 18, 0, 0, + 0, 0, 0, 1, 5, 0, 1, 4, + 1, 0, 0, 0, 4, 0, 2, 1, + 2, 2, 1, 3, 3, 1, 0, 0, + 2, 32, 3, 0, 0, 1, 2, 4, + 2, 1, 1, 1, 4, 1, 1, 3, + 2, 1, 3, 1, 1, 1, 3, 1, + 2, 1, 0, 1, 0, 4, 0, 0, + 1, 43, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 1, 0, 18, + 1, 4, 0, 0, 1, 0, 5, 1, + 0, 28, 1, 0, 0, 3, 0, 2, + 0, 0, 0, 1, 0, 1, 1, 1, + 0, 15, 2, 2, 1, 0, 0, 10, + 35, 1, 1, 0, 2, 0, 25, 0, + 0, 0, 0, 2, 0, 1, 0, 0, + 1, 2, 0, 1, 0, 0, 1, 0, + 0, 10, 0, 0, 0, 0, 3, 0, + 18, 0, 0, 0, 0, 0, 1, 5, + 0, 1, 4, 1, 0, 0, 0, 4, + 0, 2, 1, 1, 2, 1, 2, 3, + 1, 0, 0, 1, 32, 3, 0, 0, + 1, 2, 4, 2, 1, 1, 1, 4, + 1, 1, 3, 2, 1, 3, 1, 1, + 1, 3, 1, 2, 1, 0, 1, 0, + 4, 0, 0, 1, 43, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 18, 0, 3, 0, 0, 1, + 0, 10, 1, 0, 28, 1, 0, 0, + 3, 0, 2, 0, 0, 0, 1, 0, + 1, 1, 1, 0, 15, 2, 0, 1, + 0, 0, 10, 35, 1, 1, 0, 2, + 0, 25, 0, 0, 0, 0, 2, 0, + 1, 0, 0, 1, 2, 0, 1, 0, + 0, 1, 0, 0, 10, 0, 0, 0, + 0, 4, 0, 18, 0, 0, 0, 0, + 0, 1, 5, 0, 1, 4, 1, 0, + 0, 0, 1, 0, 0, 0, 1, 1, + 1, 1, 0, 2, 0, 0, 0, 26, + 21, 6, 2, 15, 5, 6, 1, 3, + 0, 1, 2, 4, 2, 1, 1, 1, + 4, 1, 1, 3, 2, 1, 3, 1, + 1, 1, 3, 1, 2, 0, 0, 4, + 0, 0, 0, 1, 0, 5, 0, 2, + 1, 1, 3, 1, 2, 3, 1, 0, + 0, 1, 32, 3, 0, 0, 1, 2, + 4, 2, 1, 1, 1, 4, 1, 1, + 3, 2, 1, 3, 1, 1, 1, 3, + 1, 2, 1, 0, 1, 0, 4, 0, + 0, 1, 45, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 18, 2, 3, 0, 0, 1, + 0, 7, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 1, 1, 1, 0, + 2, 0, 0, 0, 26, 0, 0, 0, + 1, 1, 1, 0, 0, 2, 1, 0, + 1, 1, 0, 2, 0, 0, 2, 0, + 2, 1, 0, 1, 0, 3, 0, 0, + 1, 23, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 1, + 0, 6, 0, 0, 0, 0, 1, 0, + 7, 0, 0, 0, 0, 0, 16, 0, + 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 0, 2, + 0, 0, 5, 1, 0, 0, 0, 6, + 5, 1, 1, 0, 1, 0, 19, 0, + 0, 0, 0, 1, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, + 0, 4, 0, 0, 0, 0, 1, 0, + 6, 0, 0, 0, 0, 0, 1, 1, + 0, 1, 4, 1, 28, 1, 0, 0, + 3, 0, 2, 0, 0, 0, 1, 0, + 1, 1, 1, 0, 0, 2, 0, 0, + 15, 2, 1, 1, 0, 0, 10, 35, + 1, 1, 0, 2, 0, 25, 0, 0, + 0, 0, 2, 0, 1, 0, 0, 1, + 2, 0, 1, 0, 0, 1, 0, 0, + 10, 0, 0, 0, 0, 3, 0, 18, + 0, 0, 0, 0, 0, 1, 5, 0, + 1, 4, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 3, 0, 1, + 0, 0, 1, 0, 0, 0, 1, 1, + 1, 1, 0, 2, 0, 0, 0, 26, + 0, 0, 0, 1, 1, 1, 0, 0, + 2, 1, 0, 1, 1, 0, 2, 0, + 0, 2, 0, 2, 1, 0, 1, 0, + 3, 0, 0, 1, 21, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 6, 0, 0, 0, 0, 1, + 0, 2, 0, 0, 15, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 5, 1, 0, 0, + 6, 5, 1, 1, 0, 1, 0, 19, + 0, 0, 0, 0, 1, 0, 0, 0, + 0, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, 0, 1, + 0, 6, 0, 0, 0, 0, 0, 1, + 1, 0, 1, 4, 1, 0, 0, 0, + 0, 4, 5, 0, 2, 1, 1, 3, + 1, 2, 3, 1, 0, 0, 1, 32, + 3, 0, 0, 1, 2, 4, 2, 1, + 1, 1, 4, 1, 1, 3, 2, 1, + 3, 1, 1, 1, 3, 1, 2, 1, + 0, 1, 0, 4, 0, 0, 1, 43, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 0, 18, 2, 3, + 0, 0, 1, 0, 5, 1, 0, 28, + 1, 0, 0, 3, 0, 2, 0, 0, + 0, 1, 0, 1, 1, 1, 0, 15, + 2, 1, 1, 0, 0, 10, 35, 1, + 1, 0, 2, 0, 25, 0, 0, 0, + 0, 2, 0, 1, 0, 0, 1, 2, + 0, 1, 0, 0, 1, 0, 0, 10, + 0, 0, 0, 0, 3, 0, 18, 0, + 0, 0, 0, 0, 1, 5, 0, 1, + 4, 1, 0, 0, 0, 1, 0, 0, + 0, 1, 1, 1, 1, 0, 2, 0, + 0, 0, 26, 0, 0, 0, 1, 1, + 1, 0, 0, 2, 1, 0, 1, 1, + 0, 2, 0, 0, 2, 0, 2, 1, + 0, 1, 0, 3, 0, 0, 1, 23, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 0, 6, 0, 0, + 0, 0, 1, 0, 7, 0, 0, 16, + 0, 0, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 5, + 1, 0, 0, 0, 6, 5, 1, 1, + 0, 1, 0, 19, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 1, 0, 6, 0, 0, + 0, 0, 0, 1, 1, 0, 1, 4, + 1, 0, 0, 1, 0, 0, 0, 1, + 1, 1, 1, 0, 2, 0, 0, 0, + 26, 0, 0, 0, 1, 1, 1, 0, + 0, 2, 1, 0, 1, 1, 0, 2, + 0, 0, 2, 0, 2, 1, 0, 1, + 0, 3, 0, 0, 1, 21, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 1, 0, 6, 0, 1, 0, 0, + 1, 0, 7, 0, 0, 1, 0, 0, + 0, 15, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, + 0, 8, 1, 0, 0, 0, 0, 6, + 5, 1, 1, 0, 1, 0, 19, 0, + 0, 0, 0, 1, 0, 0, 0, 0, + 1, 1, 0, 0, 0, 0, 0, 0, + 0, 4, 0, 0, 0, 0, 2, 1, + 0, 6, 0, 0, 0, 0, 0, 1, + 1, 0, 1, 4, 1, 0, 0, 0, + 1, 0, 0, 0, 1, 1, 1, 1, + 0, 2, 0, 0, 0, 26, 0, 0, + 0, 1, 1, 1, 0, 0, 2, 1, + 0, 1, 1, 0, 2, 0, 0, 2, + 0, 2, 1, 0, 1, 0, 3, 0, + 0, 1, 21, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 1, 0, + 6, 0, 0, 0, 0, 1, 0, 2, + 0, 0, 15, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 1, 1, + 1, 0, 5, 1, 0, 0, 6, 5, + 1, 1, 0, 1, 0, 19, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 1, 0, 6, + 0, 0, 0, 0, 0, 1, 1, 0, + 1, 4, 1, 0, 0, 0, 1, 1, + 0, 0, 0, 1, 1, 1, 1, 0, + 2, 0, 0, 0, 26, 0, 0, 0, + 1, 1, 1, 0, 0, 2, 1, 0, + 1, 1, 0, 2, 0, 0, 2, 0, + 2, 1, 0, 1, 0, 3, 0, 0, + 1, 21, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 1, 0, 6, + 0, 0, 0, 0, 1, 0, 2, 0, + 0, 15, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, + 0, 5, 1, 0, 0, 6, 5, 1, + 1, 0, 1, 0, 19, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 4, + 0, 0, 0, 0, 1, 0, 6, 0, + 0, 0, 0, 0, 1, 1, 0, 1, + 4, 1, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 0, 2, 0, 0, 0, + 26, 21, 6, 2, 15, 5, 6, 1, + 0, 1, 0, 0, 3, 0, 2, 0, + 0, 0, 1, 0, 1, 1, 0, 1, + 5, 0, 2, 1, 1, 3, 1, 2, + 3, 1, 0, 0, 1, 32, 3, 0, + 0, 1, 2, 4, 2, 1, 1, 1, + 4, 1, 1, 3, 2, 1, 3, 1, + 1, 1, 3, 1, 2, 1, 0, 1, + 0, 4, 0, 0, 1, 45, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 1, 0, 18, 2, 3, 0, 0, + 1, 0, 7, 1, 0, 28, 1, 0, + 0, 3, 0, 2, 0, 0, 0, 1, + 0, 1, 1, 1, 0, 15, 2, 1, + 1, 0, 0, 10, 35, 1, 1, 0, + 2, 0, 25, 0, 0, 0, 0, 2, + 0, 1, 0, 0, 1, 2, 0, 1, + 0, 0, 1, 0, 0, 10, 0, 0, + 0, 0, 3, 0, 18, 0, 0, 0, + 0, 0, 1, 5, 0, 1, 4, 1, + 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 2, 0, 0, 0, 26, + 21, 6, 2, 15, 5, 6, 1, 0, + 0, 2, 0, 1, 0, 0, 0, 35, + 1, 0, 2, 0, 25, 0, 0, 0, + 0, 2, 0, 1, 0, 0, 1, 2, + 0, 1, 0, 0, 1, 0, 0, 10, + 0, 0, 0, 0, 4, 2, 0, 18, + 5, 0, 5, 0, 1, 0, 0, 0, + 1, 1, 1, 1, 0, 2, 0, 0, + 0, 26, 0, 0, 0, 1, 1, 1, + 0, 0, 2, 1, 0, 1, 1, 0, + 2, 0, 0, 2, 0, 2, 1, 0, + 1, 0, 3, 0, 0, 1, 21, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 6, 0, 0, 0, + 0, 1, 0, 2, 0, 0, 15, 0, + 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 5, 1, + 0, 0, 7, 5, 1, 1, 0, 1, + 0, 19, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, + 0, 1, 0, 6, 0, 0, 0, 0, + 0, 1, 1, 0, 1, 1, 4, 1, + 0, 0, 1, 1, 0, 2, 0, 3, + 0, 0, 1, 0, 2, 0, 35, 21, + 1, 35, 35, 34, 35, 31, 35, 31, + 22, 31, 34, 31, 31, 26, 21, 21, + 35, 34, 26, 21, 34, 30, 35, 31, + 34, 35, 35, 35, 35, 34, 36, 21, + 21, 34, 34, 34, 60, 55, 40, 36, + 49, 39, 40, 35, 23, 23, 23, 22, + 22, 22, 21, 22, 24, 22, 22, 24, + 21, 21, 21, 22, 53, 64, 39, 26, + 49, 34, 34, 34, 21, 34, 34, 35, + 34, 34, 34, 34, 23, 36, 31, 22, + 34, 34, 35, 34, 34, 35, 34, 34, + 34, 34, 34, 34, 35, 34, 34, 34, + 34, 34, 35, 34, 34, 34, 34, 34, + 34, 37, 34, 34, 34, 34, 34, 35, + 34, 35, 35, 35, 34, 35, 34, 34, + 39, 53, 38, 35, 40, 35, 38, 35, + 35, 35, 34, 36, 36, 35, 34, 35, + 35, 34, 36, 34, 34, 36, 34, 36, + 35, 34, 35, 34, 37, 34, 34, 35, + 22, 21, 22, 21, 22, 21, 21, 22, + 22, 22, 22, 21, 23, 21, 21, 22, + 22, 22, 22, 21, 23, 21, 21, 21, + 47, 42, 27, 23, 36, 26, 27, 22, + 21, 21, 21, 47, 42, 27, 23, 36, + 26, 27, 22, 23, 23, 22, 22, 23, + 22, 23, 24, 22, 21, 21, 22, 53, + 66, 34, 22, 43, 21, 35, 34, 22, + 22, 21, 21, 21, 21, 21, 22, 21, + 22, 21, 21, 21, 22, 22, 22, 22, + 21, 23, 21, 21, 22, 22, 22, 22, + 21, 23, 21, 21, 21, 47, 42, 27, + 23, 36, 26, 27, 22, 21, 21, 21, + 47, 42, 27, 23, 36, 26, 27, 22, + 22, 22, 22, 21, 21, 23, 22, 21, + 22, 22, 21, 23, 21, 21, 23, 21, + 23, 22, 21, 22, 21, 24, 21, 21, + 22, 21, 21, 22, 21, 21, 21, 21, + 21, 21, 22, 21, 21, 22, 21, 21, + 21, 21, 21, 21, 22, 21, 21, 21, + 21, 21, 22, 21, 21, 21, 21, 21, + 21, 24, 21, 21, 21, 21, 21, 21, + 21, 22, 22, 22, 21, 22, 21, 21, + 26, 40, 25, 22, 27, 22, 25, 24, + 21, 22, 49, 34, 34, 34, 34, 26, + 21, 35, 34, 23, 22, 22, 24, 22, + 23, 24, 22, 34, 34, 35, 35, 35, + 35, 34, 36, 21, 21, 22, 53, 66, + 39, 28, 49, 34, 34, 35, 34, 34, + 34, 34, 21, 34, 34, 34, 34, 35, + 34, 34, 34, 34, 34, 34, 37, 34, + 23, 36, 31, 22, 34, 34, 34, 34, + 35, 34, 35, 35, 35, 34, 35, 34, + 34, 39, 53, 38, 35, 40, 35, 38, + 34, 34, 35, 34, 34, 35, 34, 34, + 34, 34, 34, 34, 35, 34, 34, 34, + 34, 60, 55, 40, 36, 49, 39, 40, + 35, 35, 35, 35, 34, 36, 36, 35, + 34, 35, 35, 34, 36, 34, 34, 36, + 34, 36, 35, 34, 35, 34, 37, 34, + 34, 35, 39, 36, 21, } var _s_range_lengths []byte = []byte{ - 0, 1, 1, 1, 1, 2, 2, 1, - 4, 1, 1, 1, 1, 2, 4, 1, - 1, 1, 2, 2, 5, 6, 2, 2, - 5, 1, 3, 2, 3, 5, 2, 3, - 1, 3, 1, 1, 2, 1, 2, 1, - 4, 0, 0, 1, 5, 2, 1, 2, - 2, 1, 2, 1, 0, 2, 1, 2, - 1, 2, 2, 2, 1, 1, 4, 2, - 0, 2, 2, 1, 1, 0, 1, 0, - 1, 1, 0, 2, 1, 1, 1, 2, - 2, 1, 1, 2, 2, 1, 2, 3, - 2, 2, 0, 0, 2, 1, 0, 0, - 0, 0, 1, 4, 1, 0, 2, 1, - 3, 2, 0, 2, 2, 1, 1, 2, - 6, 1, 1, 2, 2, 1, 1, 1, - 0, 1, 1, 1, 1, 0, 2, 0, - 2, 3, 1, 2, 2, 2, 0, 1, - 0, 1, 1, 1, 0, 1, 4, 0, - 3, 0, 1, 1, 4, 1, 4, 3, - 0, 1, 0, 2, 3, 4, 3, 3, - 5, 3, 2, 2, 3, 0, 2, 2, - 1, 1, 1, 3, 6, 8, 9, 8, - 8, 3, 8, 7, 9, 3, 6, 5, - 7, 7, 5, 6, 4, 4, 1, 1, - 2, 1, 2, 3, 5, 0, 3, 1, - 5, 3, 2, 2, 3, 3, 1, 3, - 2, 2, 1, 2, 2, 2, 5, 5, - 1, 2, 2, 1, 2, 1, 3, 2, - 2, 1, 3, 3, 5, 2, 2, 2, - 6, 2, 2, 3, 2, 7, 0, 2, - 2, 1, 1, 5, 2, 1, 1, 1, - 2, 0, 3, 2, 2, 5, 5, 0, - 0, 2, 1, 2, 2, 1, 1, 1, - 3, 3, 3, 2, 2, 3, 1, 2, - 1, 3, 3, 3, 3, 3, 2, 2, - 3, 3, 4, 6, 1, 3, 0, 1, - 1, 2, 1, 5, 3, 1, 1, 1, - 1, 1, 2, 2, 2, 1, 1, 1, - 2, 5, 0, 2, 5, 2, 1, 1, - 0, 2, 1, 2, 3, 2, 2, 1, - 2, 1, 1, 2, 4, 2, 1, 2, - 2, 2, 7, 1, 1, 3, 1, 2, - 1, 1, 0, 3, 1, 3, 1, 3, - 1, 3, 3, 3, 5, 2, 8, 7, - 2, 2, 3, 3, 1, 2, 1, 1, - 2, 1, 3, 1, 1, 1, 1, 1, - 1, 1, 1, 2, 2, 3, 1, 3, - 2, 0, 2, 4, 1, 2, 3, 1, - 0, 3, 0, 2, 3, 1, 0, 0, - 0, 0, 1, 2, 2, 2, 1, 3, - 5, 7, 5, 0, 1, 2, 1, 0, - 1, 1, 1, 0, 1, 1, 0, 1, - 1, 1, 1, 2, 2, 2, 5, 1, - 1, 1, 2, 2, 4, 1, 1, 1, - 4, 2, 7, 7, 4, 2, 6, 1, - 4, 2, 5, 6, 2, 5, 1, 4, - 1, 2, 2, 2, 3, 1, 4, 0, - 0, 1, 6, 3, 1, 2, 2, 1, - 4, 2, 0, 2, 1, 1, 1, 2, - 3, 2, 4, 3, 1, 1, 2, 4, - 2, 0, 2, 2, 1, 1, 0, 1, - 0, 1, 1, 0, 1, 2, 1, 1, - 1, 2, 4, 2, 1, 2, 6, 1, - 3, 3, 2, 3, 0, 0, 2, 1, - 0, 0, 0, 0, 1, 4, 1, 0, - 2, 3, 3, 1, 3, 0, 2, 4, - 1, 2, 2, 6, 1, 3, 2, 2, - 3, 1, 1, 2, 0, 1, 1, 1, - 1, 0, 2, 0, 2, 3, 1, 1, - 2, 2, 2, 0, 1, 0, 1, 1, - 1, 0, 0, 1, 4, 1, 3, 4, - 0, 0, 1, 1, 1, 1, 4, 0, - 1, 4, 1, 3, 4, 3, 4, 5, - 3, 2, 2, 4, 0, 2, 2, 1, - 1, 4, 6, 9, 9, 9, 8, 5, - 8, 8, 9, 4, 6, 7, 7, 8, - 5, 8, 4, 5, 1, 2, 2, 2, - 3, 3, 5, 0, 3, 1, 6, 4, - 3, 5, 5, 1, 4, 3, 2, 3, - 2, 2, 3, 3, 5, 6, 2, 2, - 4, 6, 2, 0, 3, 4, 1, 3, - 2, 5, 0, 2, 1, 1, 3, 3, - 3, 2, 2, 3, 5, 4, 3, 3, - 6, 2, 4, 3, 4, 4, 1, 5, - 4, 3, 3, 1, 1, 2, 5, 0, - 2, 0, 1, 3, 3, 7, 3, 0, - 3, 3, 3, 2, 4, 1, 3, 6, - 3, 4, 8, 7, 2, 4, 3, 3, - 3, 2, 2, 3, 1, 2, 2, 2, - 4, 3, 2, 0, 4, 1, 2, 3, - 1, 3, 2, 2, 2, 1, 3, 0, - 1, 1, 1, 0, 1, 2, 1, 4, - 1, 1, 1, 1, 2, 4, 1, 1, - 1, 2, 2, 5, 6, 2, 2, 5, - 1, 3, 2, 3, 5, 2, 3, 1, - 3, 1, 1, 2, 1, 2, 1, 4, - 0, 0, 1, 5, 2, 1, 2, 2, - 1, 2, 1, 0, 2, 1, 2, 1, - 2, 2, 2, 1, 1, 4, 2, 0, - 2, 2, 1, 1, 0, 1, 0, 1, - 1, 0, 2, 1, 1, 1, 2, 2, - 1, 1, 2, 2, 1, 2, 3, 2, - 2, 0, 3, 3, 2, 1, 0, 0, - 0, 0, 1, 4, 1, 0, 2, 1, - 3, 2, 0, 2, 2, 1, 1, 2, - 6, 1, 1, 2, 2, 1, 1, 1, - 0, 1, 1, 1, 1, 0, 2, 0, - 2, 3, 1, 2, 2, 2, 0, 1, - 0, 1, 1, 1, 0, 0, 4, 1, - 4, 3, 1, 3, 4, 3, 4, 5, - 3, 2, 2, 4, 0, 2, 2, 1, - 1, 4, 6, 9, 9, 9, 8, 5, - 8, 8, 9, 4, 6, 7, 7, 8, - 5, 8, 4, 5, 1, 2, 2, 2, - 3, 3, 5, 0, 3, 1, 6, 4, - 3, 5, 5, 1, 4, 3, 2, 3, - 2, 2, 3, 3, 5, 6, 2, 2, - 6, 2, 0, 4, 4, 1, 3, 2, - 5, 0, 2, 1, 1, 3, 3, 2, - 2, 3, 5, 4, 3, 3, 6, 2, - 4, 3, 4, 4, 1, 5, 3, 3, - 1, 1, 2, 5, 0, 2, 0, 1, - 3, 7, 3, 0, 3, 3, 3, 4, - 1, 3, 6, 3, 4, 8, 7, 2, - 4, 3, 3, 3, 2, 2, 1, 2, - 2, 3, 2, 0, 4, 1, 2, 3, - 1, 2, 2, 2, 1, 3, 0, 1, - 1, 1, 0, 1, 3, 4, 5, 3, - 2, 2, 4, 0, 2, 2, 1, 1, - 4, 6, 9, 9, 9, 8, 5, 8, - 8, 9, 4, 6, 7, 7, 8, 5, - 8, 4, 5, 1, 2, 2, 2, 3, - 3, 5, 0, 3, 1, 6, 4, 3, - 5, 5, 1, 4, 3, 2, 3, 2, - 2, 3, 3, 5, 6, 2, 2, 6, - 2, 0, 3, 3, 1, 3, 2, 5, - 0, 3, 0, 1, 1, 1, 1, 2, - 2, 1, 4, 1, 1, 1, 1, 2, - 4, 1, 1, 1, 2, 2, 5, 6, - 2, 2, 5, 1, 3, 2, 3, 5, - 2, 3, 1, 3, 1, 1, 2, 1, - 2, 1, 4, 0, 0, 1, 5, 2, - 1, 2, 2, 1, 2, 1, 0, 2, - 1, 2, 1, 2, 2, 2, 1, 1, - 4, 2, 0, 3, 4, 1, 1, 0, - 1, 0, 2, 2, 1, 1, 1, 1, - 0, 2, 1, 1, 1, 2, 2, 1, - 1, 2, 2, 1, 2, 3, 2, 2, - 0, 0, 3, 1, 0, 1, 1, 1, - 0, 0, 0, 0, 1, 4, 1, 0, - 2, 1, 3, 2, 0, 2, 2, 1, - 1, 2, 6, 1, 1, 2, 2, 1, - 1, 1, 0, 1, 1, 1, 1, 0, - 0, 2, 0, 2, 3, 1, 2, 2, - 2, 0, 1, 0, 1, 1, 1, 0, - 3, 1, 3, 3, 2, 2, 3, 5, - 4, 3, 3, 6, 2, 4, 3, 4, - 4, 1, 5, 3, 1, 2, 3, 5, - 0, 2, 0, 1, 3, 7, 3, 0, - 3, 3, 3, 4, 1, 3, 6, 3, - 4, 8, 7, 2, 4, 3, 3, 3, - 2, 2, 1, 2, 2, 3, 2, 0, - 4, 1, 2, 3, 1, 2, 2, 2, - 1, 3, 0, 1, 1, 1, 0, 1, - 0, 1, 4, 1, 3, 4, 4, 3, - 5, 3, 2, 2, 4, 0, 2, 2, - 1, 1, 3, 6, 8, 9, 8, 8, - 4, 8, 8, 9, 4, 6, 6, 7, - 8, 5, 7, 4, 5, 1, 2, 2, - 2, 3, 3, 5, 0, 3, 1, 6, - 3, 3, 5, 5, 1, 3, 3, 2, - 3, 2, 2, 3, 3, 4, 6, 2, - 2, 6, 2, 0, 4, 4, 1, 3, - 2, 5, 0, 2, 1, 1, 3, 3, - 2, 2, 3, 4, 4, 3, 3, 4, - 2, 4, 3, 4, 4, 1, 5, 3, - 3, 1, 1, 2, 5, 0, 2, 0, - 1, 3, 7, 3, 0, 3, 2, 3, - 4, 1, 3, 5, 3, 4, 8, 7, - 2, 3, 3, 3, 2, 2, 2, 1, - 2, 2, 3, 2, 0, 4, 1, 2, - 3, 1, 2, 2, 2, 1, 3, 0, - 1, 1, 1, 0, 1, 0, 2, 0, - 2, 4, 3, 3, 3, 1, 1, 2, - 0, 1, 1, 1, 2, 4, 7, 9, - 7, 8, 6, 8, 7, 10, 4, 6, - 5, 7, 7, 5, 6, 4, 5, 1, - 2, 2, 2, 3, 3, 3, 0, 3, - 1, 6, 4, 2, 3, 4, 1, 4, - 3, 2, 3, 2, 3, 4, 3, 1, - 1, 3, 2, 0, 4, 4, 1, 2, - 3, 5, 0, 2, 1, 1, 2, 1, - 5, 3, 2, 6, 1, 3, 3, 2, - 3, 1, 5, 3, 2, 1, 5, 0, - 2, 0, 2, 2, 6, 2, 1, 3, - 2, 2, 1, 4, 2, 3, 8, 6, - 3, 2, 2, 4, 2, 1, 2, 2, - 1, 0, 4, 1, 2, 3, 1, 2, - 2, 2, 1, 2, 0, 1, 1, 1, - 0, 1, 4, 1, 3, 4, 3, 4, - 5, 3, 2, 2, 4, 0, 2, 2, - 1, 1, 4, 6, 9, 9, 9, 8, - 5, 8, 8, 9, 4, 6, 7, 7, - 8, 5, 8, 4, 5, 1, 2, 2, - 2, 3, 3, 5, 0, 3, 1, 6, - 4, 3, 5, 5, 1, 4, 3, 2, - 3, 1, 1, 2, 2, 3, 3, 5, - 6, 2, 2, 4, 6, 2, 0, 3, - 3, 1, 3, 2, 5, 0, 3, 3, - 1, 3, 3, 3, 2, 2, 3, 5, - 4, 3, 3, 6, 2, 4, 3, 4, - 4, 1, 5, 3, 3, 1, 1, 3, - 5, 0, 2, 0, 1, 3, 3, 7, - 3, 0, 3, 3, 3, 2, 4, 1, - 3, 6, 3, 4, 8, 7, 2, 4, - 3, 3, 3, 2, 1, 2, 3, 1, - 2, 2, 2, 4, 3, 2, 0, 4, - 1, 2, 3, 1, 3, 2, 2, 2, - 1, 3, 0, 1, 1, 1, 0, 1, - 0, 1, 4, 1, 3, 4, 4, 3, - 5, 3, 2, 2, 4, 0, 2, 2, - 1, 1, 3, 6, 8, 9, 8, 8, - 4, 8, 8, 9, 4, 6, 6, 7, - 8, 5, 7, 4, 5, 1, 2, 2, - 2, 3, 3, 5, 0, 3, 1, 6, - 3, 3, 5, 5, 1, 3, 3, 2, - 3, 2, 2, 3, 3, 4, 6, 2, - 2, 6, 2, 0, 4, 4, 1, 3, - 2, 5, 0, 2, 1, 1, 3, 3, - 2, 2, 3, 4, 4, 3, 3, 4, - 2, 4, 3, 4, 4, 1, 5, 3, - 3, 1, 1, 2, 5, 0, 2, 0, - 1, 3, 7, 3, 0, 3, 2, 3, - 4, 1, 3, 5, 3, 4, 8, 7, - 2, 3, 3, 3, 2, 2, 2, 1, - 2, 2, 3, 2, 0, 4, 1, 2, - 3, 1, 2, 2, 2, 1, 3, 0, - 1, 1, 1, 0, 1, 0, 1, 1, - 1, 1, 2, 2, 2, 5, 1, 1, - 1, 2, 2, 4, 1, 1, 1, 4, - 2, 7, 7, 4, 2, 6, 1, 4, - 2, 5, 6, 2, 5, 1, 4, 1, - 2, 2, 2, 3, 1, 4, 0, 0, - 1, 6, 3, 1, 2, 2, 1, 4, - 2, 0, 2, 1, 2, 3, 2, 4, - 3, 1, 1, 2, 4, 2, 0, 2, - 2, 1, 1, 0, 1, 0, 1, 1, - 0, 1, 2, 1, 1, 1, 2, 4, - 2, 1, 2, 6, 1, 3, 3, 2, - 3, 0, 0, 2, 1, 0, 0, 0, - 0, 1, 4, 1, 0, 2, 3, 3, - 1, 3, 0, 2, 4, 1, 2, 2, - 6, 1, 3, 2, 2, 3, 1, 2, - 0, 1, 1, 1, 1, 0, 2, 0, - 2, 3, 1, 1, 2, 2, 2, 0, - 1, 0, 1, 1, 1, 0, 0, 1, - 4, 1, 3, 4, 4, 4, 5, 3, - 2, 2, 4, 0, 2, 2, 1, 1, - 4, 6, 9, 9, 9, 8, 5, 8, - 8, 9, 4, 6, 7, 7, 8, 5, - 8, 4, 5, 1, 2, 2, 2, 3, - 3, 5, 0, 3, 1, 6, 4, 3, - 5, 5, 1, 4, 3, 2, 3, 2, - 2, 3, 3, 5, 6, 2, 2, 6, - 2, 0, 4, 4, 1, 3, 2, 5, - 0, 2, 1, 1, 3, 3, 2, 2, - 3, 5, 4, 3, 3, 6, 2, 4, - 3, 4, 4, 1, 5, 3, 1, 2, - 5, 0, 2, 0, 1, 3, 7, 3, - 0, 3, 3, 3, 4, 1, 3, 6, - 3, 4, 8, 7, 2, 4, 3, 3, - 3, 2, 2, 1, 2, 2, 3, 2, - 0, 4, 1, 2, 3, 1, 2, 2, - 2, 1, 3, 0, 1, 1, 1, 0, - 1, 0, 1, 4, 1, 3, 4, 3, - 4, 5, 3, 2, 2, 4, 0, 2, - 2, 1, 1, 4, 6, 9, 9, 9, - 8, 5, 8, 8, 9, 4, 6, 7, - 7, 8, 5, 8, 4, 5, 1, 2, - 2, 2, 3, 3, 5, 0, 3, 1, - 6, 4, 3, 5, 5, 1, 4, 3, - 2, 3, 2, 2, 3, 3, 5, 6, - 2, 2, 6, 2, 0, 4, 4, 1, - 3, 2, 5, 0, 2, 1, 1, 3, - 3, 2, 2, 3, 5, 4, 3, 3, - 6, 2, 4, 3, 4, 4, 1, 5, - 3, 1, 2, 5, 0, 2, 0, 1, - 3, 7, 3, 0, 3, 3, 3, 4, - 1, 3, 6, 3, 4, 8, 7, 2, - 4, 3, 3, 3, 2, 2, 1, 2, - 2, 3, 2, 0, 4, 1, 2, 3, - 1, 2, 2, 2, 1, 3, 0, 1, - 1, 1, 0, 1, 0, 1, 4, 1, - 3, 4, 3, 4, 5, 3, 2, 2, - 4, 0, 2, 2, 1, 1, 4, 6, - 9, 9, 9, 8, 5, 8, 8, 9, - 4, 6, 7, 7, 8, 5, 8, 4, - 5, 1, 2, 2, 2, 3, 3, 5, - 0, 3, 1, 6, 4, 3, 5, 5, - 1, 4, 3, 2, 3, 2, 2, 3, - 3, 5, 6, 2, 2, 6, 2, 0, - 3, 3, 1, 3, 2, 5, 0, 3, - 3, 1, 3, 3, 2, 2, 3, 5, - 4, 3, 3, 6, 2, 4, 3, 4, - 4, 1, 5, 3, 3, 1, 1, 3, - 5, 0, 2, 0, 1, 3, 7, 3, - 0, 3, 3, 3, 4, 1, 3, 6, - 3, 4, 8, 7, 2, 4, 3, 3, - 3, 2, 2, 1, 2, 2, 3, 2, - 0, 4, 1, 2, 3, 1, 2, 2, - 2, 1, 3, 0, 1, 1, 1, 0, - 1, 0, 1, 4, 1, 3, 4, 3, - 4, 5, 3, 2, 2, 4, 0, 2, - 2, 1, 1, 4, 6, 9, 9, 9, - 8, 5, 8, 8, 9, 4, 6, 7, - 7, 8, 5, 8, 4, 5, 1, 2, - 2, 2, 3, 3, 5, 0, 3, 1, - 6, 4, 3, 5, 5, 1, 4, 3, - 2, 3, 2, 2, 3, 3, 5, 6, - 2, 2, 6, 2, 0, 3, 4, 1, - 3, 2, 5, 0, 3, 3, 1, 3, - 3, 2, 2, 3, 5, 4, 3, 3, - 6, 2, 4, 3, 4, 4, 1, 5, - 3, 1, 3, 5, 0, 2, 0, 1, - 3, 7, 3, 0, 3, 3, 3, 4, - 1, 3, 6, 3, 4, 8, 7, 2, - 4, 3, 3, 3, 2, 2, 1, 2, - 2, 3, 2, 0, 4, 1, 2, 3, - 1, 2, 2, 2, 1, 3, 0, 1, - 1, 1, 0, 1, 0, 1, 1, 1, - 1, 2, 2, 1, 4, 1, 1, 1, - 1, 2, 4, 1, 1, 1, 2, 2, - 5, 6, 2, 2, 5, 1, 3, 2, - 3, 5, 2, 3, 1, 3, 1, 1, - 2, 1, 2, 1, 4, 0, 0, 1, - 5, 2, 1, 2, 2, 1, 2, 1, - 0, 2, 1, 2, 1, 2, 2, 2, - 1, 1, 4, 2, 0, 2, 2, 1, - 1, 0, 1, 0, 1, 1, 0, 2, - 1, 1, 1, 2, 2, 1, 1, 2, - 2, 1, 2, 3, 2, 2, 0, 0, - 2, 1, 0, 0, 0, 0, 1, 4, - 1, 0, 2, 1, 3, 2, 0, 2, - 2, 1, 1, 2, 6, 1, 1, 2, - 2, 1, 1, 1, 0, 1, 1, 1, - 1, 0, 2, 0, 2, 3, 1, 2, - 2, 2, 0, 1, 0, 1, 1, 1, - 0, 0, 1, 4, 1, 3, 4, 3, - 3, 5, 3, 2, 2, 3, 0, 2, - 2, 1, 1, 3, 6, 8, 9, 8, - 8, 3, 8, 7, 9, 3, 6, 5, - 7, 7, 5, 6, 4, 4, 1, 1, - 2, 1, 2, 3, 5, 0, 3, 1, - 5, 3, 3, 5, 5, 1, 2, 2, - 2, 3, 2, 2, 1, 3, 3, 5, - 2, 2, 6, 2, 0, 2, 2, 1, - 3, 2, 5, 0, 2, 1, 1, 3, - 3, 2, 2, 3, 3, 3, 3, 3, - 2, 2, 3, 3, 4, 3, 1, 5, - 2, 1, 2, 5, 0, 2, 0, 1, - 3, 7, 3, 0, 3, 1, 3, 3, - 1, 3, 3, 3, 2, 8, 7, 2, - 2, 3, 3, 1, 2, 1, 1, 2, - 2, 3, 2, 0, 4, 1, 2, 3, - 1, 2, 2, 2, 1, 3, 0, 1, - 1, 1, 0, 1, 0, 1, 4, 1, - 3, 4, 4, 4, 5, 3, 2, 2, - 4, 0, 2, 2, 1, 1, 4, 6, - 9, 9, 9, 8, 5, 8, 8, 9, - 4, 6, 7, 7, 8, 5, 8, 4, - 5, 1, 2, 2, 2, 3, 3, 5, - 0, 3, 1, 6, 4, 3, 5, 5, - 1, 4, 3, 2, 3, 2, 2, 3, - 3, 5, 6, 2, 2, 6, 2, 0, - 4, 4, 1, 3, 2, 5, 0, 2, - 1, 1, 3, 3, 2, 2, 3, 5, - 4, 3, 3, 6, 2, 4, 3, 4, - 4, 1, 5, 3, 1, 2, 5, 0, - 2, 0, 1, 3, 7, 3, 0, 3, - 3, 3, 4, 1, 3, 6, 3, 4, - 8, 7, 2, 4, 3, 3, 3, 2, - 2, 1, 2, 2, 3, 2, 0, 4, - 1, 2, 3, 1, 2, 2, 2, 1, - 3, 0, 1, 1, 1, 0, 1, 0, - 1, 4, 1, 3, 4, 3, 4, 5, - 3, 2, 2, 4, 0, 2, 2, 1, - 1, 4, 6, 9, 9, 9, 8, 5, - 8, 8, 9, 4, 6, 7, 7, 8, - 5, 8, 4, 5, 1, 2, 2, 2, - 3, 3, 5, 0, 3, 1, 6, 4, - 3, 5, 5, 1, 4, 3, 2, 3, - 2, 2, 3, 3, 5, 6, 2, 2, - 6, 2, 0, 3, 4, 1, 3, 2, - 5, 0, 3, 3, 1, 3, 3, 2, - 2, 3, 5, 4, 3, 3, 6, 2, - 4, 3, 4, 4, 1, 5, 3, 1, - 3, 5, 0, 2, 0, 1, 3, 7, - 3, 0, 3, 3, 3, 4, 1, 3, - 6, 3, 4, 8, 7, 2, 4, 3, - 3, 3, 2, 2, 1, 2, 2, 3, - 2, 0, 4, 1, 2, 3, 1, 2, - 2, 2, 1, 3, 0, 1, 1, 1, - 0, 1, 0, 1, 1, 1, 1, 2, - 2, 1, 4, 1, 1, 1, 1, 2, - 0, 0, 0, 0, 0, 0, 0, 2, - 2, 1, 4, 6, 9, 9, 9, 8, - 5, 8, 8, 9, 4, 6, 7, 7, - 8, 5, 8, 4, 5, 2, 2, 3, - 3, 5, 6, 4, 1, 0, 1, 4, - 1, 3, 4, 3, 4, 5, 3, 2, - 2, 4, 0, 2, 2, 1, 1, 4, - 6, 9, 9, 9, 8, 5, 8, 8, - 9, 4, 6, 7, 7, 8, 5, 8, - 4, 5, 1, 2, 2, 2, 3, 3, - 5, 0, 4, 1, 6, 4, 0, 1, - 3, 5, 5, 1, 4, 3, 2, 3, - 2, 2, 3, 3, 5, 6, 2, 2, - 6, 2, 0, 4, 4, 1, 3, 2, - 5, 0, 2, 1, 2, 3, 1, 0, - 1, 1, 1, 1, 2, 2, 1, 4, - 1, 1, 1, 1, 2, 4, 1, 1, - 1, 2, 2, 5, 6, 2, 2, 5, - 1, 3, 2, 3, 5, 2, 3, 1, - 3, 1, 1, 2, 1, 2, 1, 4, - 0, 1, 1, 5, 2, 0, 1, 1, - 2, 2, 1, 2, 1, 0, 2, 1, - 2, 1, 2, 2, 2, 1, 1, 4, - 2, 0, 2, 2, 1, 1, 0, 1, - 0, 1, 1, 1, 1, 1, 1, 2, - 1, 1, 1, 2, 2, 1, 2, 2, - 2, 1, 2, 3, 2, 2, 0, 1, - 1, 2, 0, 0, 2, 1, 5, 0, - 0, 0, 0, 1, 4, 1, 0, 2, - 1, 3, 2, 0, 2, 2, 1, 1, - 2, 6, 1, 1, 2, 2, 1, 1, - 1, 0, 1, 1, 1, 1, 0, 2, - 0, 2, 3, 1, 2, 2, 2, 0, - 1, 0, 1, 1, 2, 3, 3, 2, - 2, 3, 5, 4, 4, 3, 6, 2, - 4, 3, 4, 4, 0, 1, 1, 2, - 1, 5, 3, 1, 1, 5, 0, 2, - 0, 1, 3, 7, 3, 0, 3, 3, - 3, 4, 1, 3, 6, 3, 4, 8, - 7, 2, 4, 3, 3, 3, 2, 2, - 1, 2, 2, 3, 2, 0, 4, 1, - 2, 3, 1, 2, 2, 2, 1, 3, - 0, 1, 1, 1, 1, 3, 5, 5, - 4, 3, 2, 3, 2, 3, 3, 5, - 6, 2, 2, 6, 4, 4, 3, 2, - 5, 2, 0, 1, 1, 1, 1, 2, - 2, 1, 4, 1, 1, 1, 1, 2, - 4, 1, 1, 1, 2, 2, 5, 6, - 2, 2, 5, 1, 3, 2, 3, 5, - 2, 3, 1, 3, 1, 1, 2, 1, - 2, 1, 4, 0, 0, 1, 5, 2, - 1, 2, 2, 1, 2, 1, 0, 2, - 1, 2, 1, 2, 2, 2, 1, 1, - 4, 2, 0, 2, 2, 1, 1, 0, - 1, 0, 1, 1, 0, 2, 1, 1, - 1, 2, 2, 1, 1, 2, 2, 1, - 2, 3, 2, 2, 0, 0, 2, 1, - 0, 0, 0, 0, 1, 4, 1, 0, - 2, 1, 3, 2, 0, 2, 2, 1, - 1, 2, 6, 1, 1, 2, 2, 1, - 1, 1, 0, 1, 1, 1, 1, 0, - 2, 0, 2, 3, 1, 2, 2, 2, - 0, 1, 0, 1, 1, 1, 0, 1, - 1, 5, 0, 1, 4, 1, 3, 4, - 3, 4, 5, 3, 2, 2, 4, 0, - 2, 2, 1, 1, 4, 6, 9, 9, - 9, 8, 5, 8, 8, 9, 4, 6, - 7, 7, 8, 5, 8, 4, 5, 1, - 2, 2, 2, 3, 3, 5, 0, 3, - 1, 6, 4, 3, 5, 5, 1, 4, - 3, 2, 3, 2, 2, 3, 3, 5, - 6, 2, 2, 6, 2, 0, 4, 4, - 1, 3, 2, 5, 0, 2, 1, 1, - 3, 3, 2, 2, 3, 5, 4, 3, - 3, 6, 2, 4, 3, 4, 4, 1, - 5, 3, 1, 2, 5, 0, 2, 0, - 1, 3, 7, 3, 0, 3, 3, 3, - 4, 1, 3, 6, 3, 4, 8, 7, - 2, 4, 3, 3, 3, 2, 2, 1, - 2, 2, 3, 2, 0, 4, 1, 2, - 3, 1, 2, 2, 2, 1, 3, 0, - 1, 1, 1, 0, 1, 0, 1, 1, - 1, 1, 2, 2, 1, 4, 1, 1, - 1, 1, 2, 4, 1, 1, 1, 2, - 2, 5, 6, 2, 2, 5, 1, 3, - 2, 3, 5, 2, 3, 1, 3, 1, - 1, 2, 1, 2, 1, 4, 0, 1, - 1, 5, 2, 1, 2, 2, 1, 2, - 1, 0, 2, 1, 2, 1, 2, 2, - 2, 1, 1, 4, 2, 0, 2, 2, - 1, 1, 0, 1, 0, 1, 1, 1, - 2, 1, 1, 1, 2, 2, 1, 2, - 2, 2, 1, 2, 3, 2, 2, 0, - 0, 2, 2, 5, 0, 0, 0, 0, - 1, 4, 1, 0, 2, 1, 3, 2, - 0, 2, 2, 1, 1, 2, 6, 1, - 1, 2, 2, 1, 1, 1, 0, 1, - 1, 1, 1, 0, 2, 0, 2, 3, - 1, 2, 2, 2, 0, 1, 0, 1, - 1, 1, 0, 0, 1, 1, 1, 1, - 2, 2, 1, 4, 1, 1, 1, 1, - 2, 4, 1, 1, 1, 2, 2, 5, - 6, 2, 2, 5, 1, 3, 2, 3, - 5, 2, 3, 1, 3, 1, 1, 2, - 1, 2, 1, 4, 0, 0, 1, 5, - 2, 1, 2, 2, 1, 2, 1, 0, - 2, 1, 2, 1, 2, 2, 2, 1, - 1, 4, 2, 0, 3, 4, 1, 1, - 0, 1, 0, 2, 2, 1, 1, 1, - 1, 0, 2, 1, 1, 1, 2, 2, - 1, 1, 2, 2, 1, 2, 3, 2, - 2, 0, 0, 3, 1, 1, 1, 0, - 0, 0, 0, 1, 4, 1, 0, 2, - 1, 3, 2, 0, 2, 2, 1, 1, - 2, 6, 1, 1, 2, 2, 1, 1, - 1, 0, 1, 1, 1, 1, 0, 0, - 2, 0, 2, 3, 1, 2, 2, 2, - 0, 1, 0, 1, 1, 1, 0, 1, - 0, 1, 1, 1, 1, 2, 2, 1, - 4, 1, 1, 1, 1, 2, 4, 1, - 1, 1, 2, 2, 5, 6, 2, 2, - 5, 1, 3, 2, 3, 5, 2, 3, - 1, 3, 1, 1, 2, 1, 2, 1, - 4, 0, 0, 1, 5, 2, 1, 2, - 2, 1, 2, 1, 0, 2, 1, 2, - 1, 2, 2, 2, 1, 1, 4, 2, - 0, 2, 2, 1, 1, 0, 1, 0, - 1, 1, 0, 2, 1, 1, 1, 2, - 2, 1, 1, 2, 2, 1, 2, 3, - 2, 2, 0, 0, 2, 1, 0, 0, - 0, 0, 1, 4, 1, 0, 2, 1, - 3, 2, 0, 2, 2, 1, 1, 2, - 6, 1, 1, 2, 2, 1, 1, 1, - 0, 1, 1, 1, 1, 0, 2, 0, - 2, 3, 1, 2, 2, 2, 0, 1, - 0, 1, 1, 1, 0, 4, 0, 0, - 1, 1, 1, 1, 2, 2, 1, 4, - 1, 1, 1, 1, 2, 4, 1, 1, - 1, 2, 2, 5, 6, 2, 2, 5, - 1, 3, 2, 3, 5, 2, 3, 1, - 3, 1, 1, 2, 1, 2, 1, 4, - 0, 0, 1, 5, 2, 1, 2, 2, - 1, 2, 1, 0, 2, 1, 2, 1, - 2, 2, 2, 1, 1, 4, 2, 0, - 2, 2, 1, 1, 0, 1, 0, 1, - 1, 0, 2, 1, 1, 1, 2, 2, - 1, 1, 2, 2, 1, 2, 3, 2, - 2, 0, 0, 2, 1, 0, 0, 0, - 0, 1, 4, 1, 0, 2, 1, 3, - 2, 0, 2, 2, 1, 1, 2, 6, - 1, 1, 2, 2, 1, 1, 1, 0, - 1, 1, 1, 1, 0, 2, 0, 2, - 3, 1, 2, 2, 2, 0, 1, 0, - 1, 1, 1, 0, 1, 1, 1, 1, - 2, 2, 1, 4, 1, 1, 1, 1, - 2, 0, 0, 0, 0, 0, 0, 0, - 1, 3, 3, 2, 2, 3, 5, 4, - 4, 3, 6, 2, 4, 4, 4, 0, - 0, 1, 4, 1, 3, 4, 3, 4, - 5, 3, 2, 2, 4, 0, 2, 2, - 1, 1, 4, 6, 9, 9, 9, 8, - 5, 8, 8, 9, 4, 6, 7, 7, - 8, 5, 8, 4, 5, 1, 2, 2, - 2, 3, 3, 5, 0, 4, 1, 6, - 4, 3, 5, 5, 1, 4, 3, 2, - 3, 2, 2, 3, 3, 5, 6, 2, - 2, 6, 2, 0, 4, 4, 1, 3, - 2, 5, 0, 2, 1, 2, 3, 3, - 2, 2, 3, 5, 4, 4, 3, 6, - 2, 4, 3, 4, 4, 1, 5, 3, - 1, 2, 5, 0, 2, 0, 1, 3, - 7, 3, 0, 3, 3, 3, 4, 1, - 3, 6, 3, 4, 8, 7, 2, 4, - 3, 3, 3, 2, 2, 1, 2, 2, - 3, 2, 0, 4, 1, 2, 3, 1, - 2, 2, 2, 1, 3, 0, 1, 1, - 1, 0, 1, 1, 1, 1, 1, 2, - 2, 1, 4, 1, 1, 1, 1, 2, - 0, 0, 0, 0, 0, 0, 0, 1, - 1, 5, 3, 1, 2, 3, 5, 2, - 1, 3, 7, 3, 0, 3, 3, 3, - 4, 1, 3, 6, 3, 4, 8, 7, - 2, 4, 3, 3, 3, 2, 2, 1, - 2, 2, 3, 2, 0, 0, 4, 1, - 1, 3, 0, 1, 0, 1, 1, 1, - 1, 2, 2, 1, 4, 1, 1, 1, - 1, 2, 4, 1, 1, 1, 2, 2, - 5, 6, 2, 2, 5, 1, 3, 2, - 3, 5, 2, 3, 1, 3, 1, 1, - 2, 1, 2, 1, 4, 0, 0, 1, - 5, 2, 1, 2, 2, 1, 2, 1, - 0, 2, 1, 2, 1, 2, 2, 2, - 1, 1, 4, 2, 0, 2, 2, 1, - 1, 0, 1, 0, 1, 1, 0, 2, - 1, 1, 1, 2, 2, 1, 1, 2, - 2, 1, 2, 3, 2, 2, 0, 0, - 2, 1, 0, 0, 0, 0, 1, 4, - 1, 0, 2, 1, 3, 2, 0, 2, - 2, 1, 1, 2, 6, 1, 1, 2, - 2, 1, 1, 1, 0, 1, 1, 1, - 1, 0, 2, 0, 2, 3, 1, 2, - 2, 2, 0, 1, 0, 0, 1, 1, - 1, 0, 0, 1, 0, 0, 1, 0, - 1, 1, 1, 1, 1, 1, 7, 0, - 0, 5, 5, 5, 5, 5, 5, 5, - 0, 5, 5, 5, 5, 0, 0, 3, - 5, 9, 0, 0, 8, 4, 5, 5, - 6, 6, 7, 7, 6, 9, 8, 1, - 1, 9, 6, 6, 7, 5, 5, 5, - 5, 5, 5, 5, 4, 2, 3, 0, - 0, 0, 2, 2, 4, 3, 3, 3, - 1, 1, 1, 2, 0, 3, 0, 0, - 1, 9, 6, 8, 0, 6, 10, 7, - 6, 7, 7, 8, 1, 1, 0, 0, - 9, 6, 5, 7, 6, 7, 6, 9, - 9, 7, 6, 6, 9, 7, 7, 7, - 6, 6, 5, 6, 6, 6, 7, 6, - 6, 6, 9, 9, 6, 6, 9, 9, - 6, 7, 8, 7, 7, 5, 7, 6, - 5, 5, 5, 5, 5, 5, 6, 6, - 9, 9, 12, 12, 9, 7, 10, 6, - 8, 9, 10, 10, 9, 10, 6, 8, - 6, 6, 7, 6, 7, 6, 9, 5, - 4, 1, 0, 1, 0, 1, 1, 1, - 2, 2, 1, 4, 1, 1, 1, 1, - 2, 2, 1, 4, 1, 1, 1, 1, - 2, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 2, 0, 0, 0, 0, - 0, 0, 0, 4, 3, 1, 3, 4, - 3, 4, 5, 3, 2, 2, 4, 0, - 4, 5, 1, 1, 0, 1, 5, 1, - 0, 0, 0, 4, 1, 1, 0, 1, - 0, 1, 1, 1, 1, 2, 2, 1, - 4, 1, 1, 1, 1, 2, 2, 1, - 4, 1, 1, 1, 1, 2, 0, 0, - 0, 0, 0, 0, 0, 1, 1, 1, - 2, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 2, 5, 6, 2, 2, 5, - 1, 3, 2, 3, 5, 2, 3, 1, - 3, 1, 1, 2, 1, 2, 1, 4, - 0, 1, 5, 2, 1, 2, 2, 1, - 2, 1, 0, 2, 1, 2, 1, 2, - 2, 2, 1, 1, 4, 2, 2, 2, - 1, 1, 0, 1, 1, 1, 2, 1, - 1, 1, 2, 2, 1, 1, 2, 2, - 1, 2, 3, 2, 2, 0, 2, 1, - 0, 0, 0, 0, 0, 0, 1, 0, - 0, 1, 2, 5, 9, 6, 8, 0, - 1, 5, 9, 4, 1, 3, 4, 3, - 4, 5, 3, 8, 6, 6, 7, 7, - 6, 9, 8, 2, 2, 4, 0, 4, - 0, 0, 2, 6, 10, 7, 6, 7, - 7, 8, 0, 7, 7, 6, 6, 5, - 6, 6, 6, 7, 6, 6, 6, 9, - 1, 1, 0, 0, 9, 6, 6, 9, - 9, 6, 7, 8, 7, 7, 5, 7, - 6, 5, 5, 5, 5, 5, 5, 6, - 9, 6, 5, 7, 6, 7, 6, 9, - 9, 7, 6, 6, 9, 7, 9, 6, - 6, 7, 5, 5, 5, 5, 5, 5, - 5, 6, 9, 9, 12, 12, 9, 7, - 10, 6, 8, 9, 10, 10, 9, 10, - 6, 8, 6, 6, 7, 6, 7, 6, - 9, 5, 2, 1, 0, + 0, 1, 1, 1, 1, 2, 2, 1, + 4, 1, 1, 1, 1, 2, 4, 1, + 1, 1, 2, 2, 5, 6, 2, 2, + 5, 1, 3, 2, 3, 5, 2, 3, + 1, 3, 1, 1, 2, 1, 2, 1, + 4, 0, 0, 1, 5, 2, 1, 2, + 2, 1, 2, 1, 0, 2, 1, 2, + 1, 2, 2, 2, 1, 1, 4, 2, + 0, 2, 2, 1, 1, 0, 1, 0, + 1, 1, 0, 2, 1, 1, 1, 2, + 2, 1, 1, 2, 2, 1, 2, 3, + 2, 2, 0, 0, 2, 1, 0, 0, + 0, 0, 1, 4, 1, 0, 2, 1, + 3, 2, 0, 2, 2, 1, 1, 2, + 6, 1, 1, 2, 2, 1, 1, 1, + 0, 1, 1, 1, 1, 0, 2, 0, + 2, 3, 1, 2, 2, 2, 0, 1, + 0, 1, 1, 1, 0, 1, 4, 0, + 3, 0, 1, 1, 4, 1, 4, 3, + 0, 1, 0, 2, 3, 4, 3, 3, + 5, 3, 2, 2, 3, 0, 2, 2, + 1, 1, 1, 3, 6, 8, 9, 8, + 8, 3, 8, 7, 9, 3, 6, 5, + 7, 7, 5, 6, 4, 4, 1, 1, + 2, 1, 2, 3, 5, 0, 3, 1, + 5, 3, 2, 2, 3, 3, 1, 3, + 2, 2, 1, 2, 2, 2, 5, 5, + 1, 2, 2, 1, 2, 1, 3, 2, + 2, 1, 3, 3, 5, 2, 2, 2, + 6, 2, 2, 3, 2, 7, 0, 2, + 2, 1, 1, 5, 2, 1, 1, 1, + 2, 0, 3, 2, 2, 5, 5, 0, + 0, 2, 1, 2, 2, 1, 1, 1, + 3, 3, 3, 2, 2, 3, 1, 2, + 1, 3, 3, 3, 3, 3, 2, 2, + 3, 3, 4, 6, 1, 3, 0, 1, + 1, 2, 1, 5, 3, 1, 1, 1, + 1, 1, 2, 2, 2, 1, 1, 1, + 2, 5, 0, 2, 5, 2, 1, 1, + 0, 2, 1, 2, 3, 2, 2, 1, + 2, 1, 1, 2, 4, 2, 1, 2, + 2, 2, 7, 1, 1, 3, 1, 2, + 1, 1, 0, 3, 1, 3, 1, 3, + 1, 3, 3, 3, 5, 2, 8, 7, + 2, 2, 3, 3, 1, 2, 1, 1, + 2, 1, 3, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 3, 1, 3, + 2, 0, 2, 4, 1, 2, 3, 1, + 0, 3, 0, 2, 3, 1, 0, 0, + 0, 0, 1, 2, 2, 2, 1, 3, + 5, 7, 5, 0, 1, 2, 1, 0, + 1, 1, 1, 0, 1, 1, 0, 1, + 1, 1, 1, 2, 2, 2, 5, 1, + 1, 1, 2, 2, 4, 1, 1, 1, + 4, 2, 7, 7, 4, 2, 6, 1, + 4, 2, 5, 6, 2, 5, 1, 4, + 1, 2, 2, 2, 3, 1, 4, 0, + 0, 1, 6, 3, 1, 2, 2, 1, + 4, 2, 0, 2, 1, 1, 1, 2, + 3, 2, 4, 3, 1, 1, 2, 4, + 2, 0, 2, 2, 1, 1, 0, 1, + 0, 1, 1, 0, 1, 2, 1, 1, + 1, 2, 4, 2, 1, 2, 6, 1, + 3, 3, 2, 3, 0, 0, 2, 1, + 0, 0, 0, 0, 1, 4, 1, 0, + 2, 3, 3, 1, 3, 0, 2, 4, + 1, 2, 2, 6, 1, 3, 2, 2, + 3, 1, 1, 2, 0, 1, 1, 1, + 1, 0, 2, 0, 2, 3, 1, 1, + 2, 2, 2, 0, 1, 0, 1, 1, + 1, 0, 0, 1, 4, 1, 3, 4, + 0, 0, 1, 1, 1, 1, 4, 0, + 1, 4, 1, 3, 4, 3, 4, 5, + 3, 2, 2, 4, 0, 2, 2, 1, + 1, 4, 6, 9, 9, 9, 8, 5, + 8, 8, 9, 4, 6, 7, 7, 8, + 5, 8, 4, 5, 1, 2, 2, 2, + 3, 3, 5, 0, 3, 1, 6, 4, + 3, 5, 5, 1, 4, 3, 2, 3, + 2, 2, 3, 3, 5, 6, 2, 2, + 4, 6, 2, 0, 3, 4, 1, 3, + 2, 5, 0, 2, 1, 1, 3, 3, + 3, 2, 2, 3, 5, 4, 3, 3, + 6, 2, 4, 3, 4, 4, 1, 5, + 4, 3, 3, 1, 1, 2, 5, 0, + 2, 0, 1, 3, 3, 7, 3, 0, + 3, 3, 3, 2, 4, 1, 3, 6, + 3, 4, 8, 7, 2, 4, 3, 3, + 3, 2, 2, 3, 1, 2, 2, 2, + 4, 3, 2, 0, 4, 1, 2, 3, + 1, 3, 2, 2, 2, 1, 3, 0, + 1, 1, 1, 0, 1, 2, 1, 4, + 1, 1, 1, 1, 2, 4, 1, 1, + 1, 2, 2, 5, 6, 2, 2, 5, + 1, 3, 2, 3, 5, 2, 3, 1, + 3, 1, 1, 2, 1, 2, 1, 4, + 0, 0, 1, 5, 2, 1, 2, 2, + 1, 2, 1, 0, 2, 1, 2, 1, + 2, 2, 2, 1, 1, 4, 2, 0, + 2, 2, 1, 1, 0, 1, 0, 1, + 1, 0, 2, 1, 1, 1, 2, 2, + 1, 1, 2, 2, 1, 2, 3, 2, + 2, 0, 3, 3, 2, 1, 0, 0, + 0, 0, 1, 4, 1, 0, 2, 1, + 3, 2, 0, 2, 2, 1, 1, 2, + 6, 1, 1, 2, 2, 1, 1, 1, + 0, 1, 1, 1, 1, 0, 2, 0, + 2, 3, 1, 2, 2, 2, 0, 1, + 0, 1, 1, 1, 0, 0, 4, 1, + 4, 3, 1, 3, 4, 3, 4, 5, + 3, 2, 2, 4, 0, 2, 2, 1, + 1, 4, 6, 9, 9, 9, 8, 5, + 8, 8, 9, 4, 6, 7, 7, 8, + 5, 8, 4, 5, 1, 2, 2, 2, + 3, 3, 5, 0, 3, 1, 6, 4, + 3, 5, 5, 1, 4, 3, 2, 3, + 2, 2, 3, 3, 5, 6, 2, 2, + 6, 2, 0, 4, 4, 1, 3, 2, + 5, 0, 2, 1, 1, 3, 3, 2, + 2, 3, 5, 4, 3, 3, 6, 2, + 4, 3, 4, 4, 1, 5, 3, 3, + 1, 1, 2, 5, 0, 2, 0, 1, + 3, 7, 3, 0, 3, 3, 3, 4, + 1, 3, 6, 3, 4, 8, 7, 2, + 4, 3, 3, 3, 2, 2, 1, 2, + 2, 3, 2, 0, 4, 1, 2, 3, + 1, 2, 2, 2, 1, 3, 0, 1, + 1, 1, 0, 1, 3, 4, 5, 3, + 2, 2, 4, 0, 2, 2, 1, 1, + 4, 6, 9, 9, 9, 8, 5, 8, + 8, 9, 4, 6, 7, 7, 8, 5, + 8, 4, 5, 1, 2, 2, 2, 3, + 3, 5, 0, 3, 1, 6, 4, 3, + 5, 5, 1, 4, 3, 2, 3, 2, + 2, 3, 3, 5, 6, 2, 2, 6, + 2, 0, 3, 3, 1, 3, 2, 5, + 0, 3, 0, 1, 1, 1, 1, 2, + 2, 1, 4, 1, 1, 1, 1, 2, + 4, 1, 1, 1, 2, 2, 5, 6, + 2, 2, 5, 1, 3, 2, 3, 5, + 2, 3, 1, 3, 1, 1, 2, 1, + 2, 1, 4, 0, 0, 1, 5, 2, + 1, 2, 2, 1, 2, 1, 0, 2, + 1, 2, 1, 2, 2, 2, 1, 1, + 4, 2, 0, 3, 4, 1, 1, 0, + 1, 0, 2, 2, 1, 1, 1, 1, + 0, 2, 1, 1, 1, 2, 2, 1, + 1, 2, 2, 1, 2, 3, 2, 2, + 0, 0, 3, 1, 0, 1, 1, 1, + 0, 0, 0, 0, 1, 4, 1, 0, + 2, 1, 3, 2, 0, 2, 2, 1, + 1, 2, 6, 1, 1, 2, 2, 1, + 1, 1, 0, 1, 1, 1, 1, 0, + 0, 2, 0, 2, 3, 1, 2, 2, + 2, 0, 1, 0, 1, 1, 1, 0, + 3, 1, 3, 3, 2, 2, 3, 5, + 4, 3, 3, 6, 2, 4, 3, 4, + 4, 1, 5, 3, 1, 2, 3, 5, + 0, 2, 0, 1, 3, 7, 3, 0, + 3, 3, 3, 4, 1, 3, 6, 3, + 4, 8, 7, 2, 4, 3, 3, 3, + 2, 2, 1, 2, 2, 3, 2, 0, + 4, 1, 2, 3, 1, 2, 2, 2, + 1, 3, 0, 1, 1, 1, 0, 1, + 0, 1, 4, 1, 3, 4, 4, 3, + 5, 3, 2, 2, 4, 0, 2, 2, + 1, 1, 3, 6, 8, 9, 8, 8, + 4, 8, 8, 9, 4, 6, 6, 7, + 8, 5, 7, 4, 5, 1, 2, 2, + 2, 3, 3, 5, 0, 3, 1, 6, + 3, 3, 5, 5, 1, 3, 3, 2, + 3, 2, 2, 3, 3, 4, 6, 2, + 2, 6, 2, 0, 4, 4, 1, 3, + 2, 5, 0, 2, 1, 1, 3, 3, + 2, 2, 3, 4, 4, 3, 3, 4, + 2, 4, 3, 4, 4, 1, 5, 3, + 3, 1, 1, 2, 5, 0, 2, 0, + 1, 3, 7, 3, 0, 3, 2, 3, + 4, 1, 3, 5, 3, 4, 8, 7, + 2, 3, 3, 3, 2, 2, 2, 1, + 2, 2, 3, 2, 0, 4, 1, 2, + 3, 1, 2, 2, 2, 1, 3, 0, + 1, 1, 1, 0, 1, 0, 2, 0, + 2, 4, 3, 3, 3, 1, 1, 2, + 0, 1, 1, 1, 2, 4, 7, 9, + 7, 8, 6, 8, 7, 10, 4, 6, + 5, 7, 7, 5, 6, 4, 5, 1, + 2, 2, 2, 3, 3, 3, 0, 3, + 1, 6, 4, 2, 3, 4, 1, 4, + 3, 2, 3, 2, 3, 4, 3, 1, + 1, 3, 2, 0, 4, 4, 1, 2, + 3, 5, 0, 2, 1, 1, 2, 1, + 5, 3, 2, 6, 1, 3, 3, 2, + 3, 1, 5, 3, 2, 1, 5, 0, + 2, 0, 2, 2, 6, 2, 1, 3, + 2, 2, 1, 4, 2, 3, 8, 6, + 3, 2, 2, 4, 2, 1, 2, 2, + 1, 0, 4, 1, 2, 3, 1, 2, + 2, 2, 1, 2, 0, 1, 1, 1, + 0, 1, 4, 1, 3, 4, 3, 4, + 5, 3, 2, 2, 4, 0, 2, 2, + 1, 1, 4, 6, 9, 9, 9, 8, + 5, 8, 8, 9, 4, 6, 7, 7, + 8, 5, 8, 4, 5, 1, 2, 2, + 2, 3, 3, 5, 0, 3, 1, 6, + 4, 3, 5, 5, 1, 4, 3, 2, + 3, 1, 1, 2, 2, 3, 3, 5, + 6, 2, 2, 4, 6, 2, 0, 3, + 3, 1, 3, 2, 5, 0, 3, 3, + 1, 3, 3, 3, 2, 2, 3, 5, + 4, 3, 3, 6, 2, 4, 3, 4, + 4, 1, 5, 3, 3, 1, 1, 3, + 5, 0, 2, 0, 1, 3, 3, 7, + 3, 0, 3, 3, 3, 2, 4, 1, + 3, 6, 3, 4, 8, 7, 2, 4, + 3, 3, 3, 2, 1, 2, 3, 1, + 2, 2, 2, 4, 3, 2, 0, 4, + 1, 2, 3, 1, 3, 2, 2, 2, + 1, 3, 0, 1, 1, 1, 0, 1, + 0, 1, 4, 1, 3, 4, 4, 3, + 5, 3, 2, 2, 4, 0, 2, 2, + 1, 1, 3, 6, 8, 9, 8, 8, + 4, 8, 8, 9, 4, 6, 6, 7, + 8, 5, 7, 4, 5, 1, 2, 2, + 2, 3, 3, 5, 0, 3, 1, 6, + 3, 3, 5, 5, 1, 3, 3, 2, + 3, 2, 2, 3, 3, 4, 6, 2, + 2, 6, 2, 0, 4, 4, 1, 3, + 2, 5, 0, 2, 1, 1, 3, 3, + 2, 2, 3, 4, 4, 3, 3, 4, + 2, 4, 3, 4, 4, 1, 5, 3, + 3, 1, 1, 2, 5, 0, 2, 0, + 1, 3, 7, 3, 0, 3, 2, 3, + 4, 1, 3, 5, 3, 4, 8, 7, + 2, 3, 3, 3, 2, 2, 2, 1, + 2, 2, 3, 2, 0, 4, 1, 2, + 3, 1, 2, 2, 2, 1, 3, 0, + 1, 1, 1, 0, 1, 0, 1, 1, + 1, 1, 2, 2, 2, 5, 1, 1, + 1, 2, 2, 4, 1, 1, 1, 4, + 2, 7, 7, 4, 2, 6, 1, 4, + 2, 5, 6, 2, 5, 1, 4, 1, + 2, 2, 2, 3, 1, 4, 0, 0, + 1, 6, 3, 1, 2, 2, 1, 4, + 2, 0, 2, 1, 2, 3, 2, 4, + 3, 1, 1, 2, 4, 2, 0, 2, + 2, 1, 1, 0, 1, 0, 1, 1, + 0, 1, 2, 1, 1, 1, 2, 4, + 2, 1, 2, 6, 1, 3, 3, 2, + 3, 0, 0, 2, 1, 0, 0, 0, + 0, 1, 4, 1, 0, 2, 3, 3, + 1, 3, 0, 2, 4, 1, 2, 2, + 6, 1, 3, 2, 2, 3, 1, 2, + 0, 1, 1, 1, 1, 0, 2, 0, + 2, 3, 1, 1, 2, 2, 2, 0, + 1, 0, 1, 1, 1, 0, 0, 1, + 4, 1, 3, 4, 4, 4, 5, 3, + 2, 2, 4, 0, 2, 2, 1, 1, + 4, 6, 9, 9, 9, 8, 5, 8, + 8, 9, 4, 6, 7, 7, 8, 5, + 8, 4, 5, 1, 2, 2, 2, 3, + 3, 5, 0, 3, 1, 6, 4, 3, + 5, 5, 1, 4, 3, 2, 3, 2, + 2, 3, 3, 5, 6, 2, 2, 6, + 2, 0, 4, 4, 1, 3, 2, 5, + 0, 2, 1, 1, 3, 3, 2, 2, + 3, 5, 4, 3, 3, 6, 2, 4, + 3, 4, 4, 1, 5, 3, 1, 2, + 5, 0, 2, 0, 1, 3, 7, 3, + 0, 3, 3, 3, 4, 1, 3, 6, + 3, 4, 8, 7, 2, 4, 3, 3, + 3, 2, 2, 1, 2, 2, 3, 2, + 0, 4, 1, 2, 3, 1, 2, 2, + 2, 1, 3, 0, 1, 1, 1, 0, + 1, 0, 1, 4, 1, 3, 4, 3, + 4, 5, 3, 2, 2, 4, 0, 2, + 2, 1, 1, 4, 6, 9, 9, 9, + 8, 5, 8, 8, 9, 4, 6, 7, + 7, 8, 5, 8, 4, 5, 1, 2, + 2, 2, 3, 3, 5, 0, 3, 1, + 6, 4, 3, 5, 5, 1, 4, 3, + 2, 3, 2, 2, 3, 3, 5, 6, + 2, 2, 6, 2, 0, 4, 4, 1, + 3, 2, 5, 0, 2, 1, 1, 3, + 3, 2, 2, 3, 5, 4, 3, 3, + 6, 2, 4, 3, 4, 4, 1, 5, + 3, 1, 2, 5, 0, 2, 0, 1, + 3, 7, 3, 0, 3, 3, 3, 4, + 1, 3, 6, 3, 4, 8, 7, 2, + 4, 3, 3, 3, 2, 2, 1, 2, + 2, 3, 2, 0, 4, 1, 2, 3, + 1, 2, 2, 2, 1, 3, 0, 1, + 1, 1, 0, 1, 0, 1, 4, 1, + 3, 4, 3, 4, 5, 3, 2, 2, + 4, 0, 2, 2, 1, 1, 4, 6, + 9, 9, 9, 8, 5, 8, 8, 9, + 4, 6, 7, 7, 8, 5, 8, 4, + 5, 1, 2, 2, 2, 3, 3, 5, + 0, 3, 1, 6, 4, 3, 5, 5, + 1, 4, 3, 2, 3, 2, 2, 3, + 3, 5, 6, 2, 2, 6, 2, 0, + 3, 3, 1, 3, 2, 5, 0, 3, + 3, 1, 3, 3, 2, 2, 3, 5, + 4, 3, 3, 6, 2, 4, 3, 4, + 4, 1, 5, 3, 3, 1, 1, 3, + 5, 0, 2, 0, 1, 3, 7, 3, + 0, 3, 3, 3, 4, 1, 3, 6, + 3, 4, 8, 7, 2, 4, 3, 3, + 3, 2, 2, 1, 2, 2, 3, 2, + 0, 4, 1, 2, 3, 1, 2, 2, + 2, 1, 3, 0, 1, 1, 1, 0, + 1, 0, 1, 4, 1, 3, 4, 3, + 4, 5, 3, 2, 2, 4, 0, 2, + 2, 1, 1, 4, 6, 9, 9, 9, + 8, 5, 8, 8, 9, 4, 6, 7, + 7, 8, 5, 8, 4, 5, 1, 2, + 2, 2, 3, 3, 5, 0, 3, 1, + 6, 4, 3, 5, 5, 1, 4, 3, + 2, 3, 2, 2, 3, 3, 5, 6, + 2, 2, 6, 2, 0, 3, 4, 1, + 3, 2, 5, 0, 3, 3, 1, 3, + 3, 2, 2, 3, 5, 4, 3, 3, + 6, 2, 4, 3, 4, 4, 1, 5, + 3, 1, 3, 5, 0, 2, 0, 1, + 3, 7, 3, 0, 3, 3, 3, 4, + 1, 3, 6, 3, 4, 8, 7, 2, + 4, 3, 3, 3, 2, 2, 1, 2, + 2, 3, 2, 0, 4, 1, 2, 3, + 1, 2, 2, 2, 1, 3, 0, 1, + 1, 1, 0, 1, 0, 1, 1, 1, + 1, 2, 2, 1, 4, 1, 1, 1, + 1, 2, 4, 1, 1, 1, 2, 2, + 5, 6, 2, 2, 5, 1, 3, 2, + 3, 5, 2, 3, 1, 3, 1, 1, + 2, 1, 2, 1, 4, 0, 0, 1, + 5, 2, 1, 2, 2, 1, 2, 1, + 0, 2, 1, 2, 1, 2, 2, 2, + 1, 1, 4, 2, 0, 2, 2, 1, + 1, 0, 1, 0, 1, 1, 0, 2, + 1, 1, 1, 2, 2, 1, 1, 2, + 2, 1, 2, 3, 2, 2, 0, 0, + 2, 1, 0, 0, 0, 0, 1, 4, + 1, 0, 2, 1, 3, 2, 0, 2, + 2, 1, 1, 2, 6, 1, 1, 2, + 2, 1, 1, 1, 0, 1, 1, 1, + 1, 0, 2, 0, 2, 3, 1, 2, + 2, 2, 0, 1, 0, 1, 1, 1, + 0, 0, 1, 4, 1, 3, 4, 3, + 3, 5, 3, 2, 2, 3, 0, 2, + 2, 1, 1, 3, 6, 8, 9, 8, + 8, 3, 8, 7, 9, 3, 6, 5, + 7, 7, 5, 6, 4, 4, 1, 1, + 2, 1, 2, 3, 5, 0, 3, 1, + 5, 3, 3, 5, 5, 1, 2, 2, + 2, 3, 2, 2, 1, 3, 3, 5, + 2, 2, 6, 2, 0, 2, 2, 1, + 3, 2, 5, 0, 2, 1, 1, 3, + 3, 2, 2, 3, 3, 3, 3, 3, + 2, 2, 3, 3, 4, 3, 1, 5, + 2, 1, 2, 5, 0, 2, 0, 1, + 3, 7, 3, 0, 3, 1, 3, 3, + 1, 3, 3, 3, 2, 8, 7, 2, + 2, 3, 3, 1, 2, 1, 1, 2, + 2, 3, 2, 0, 4, 1, 2, 3, + 1, 2, 2, 2, 1, 3, 0, 1, + 1, 1, 0, 1, 0, 1, 4, 1, + 3, 4, 4, 4, 5, 3, 2, 2, + 4, 0, 2, 2, 1, 1, 4, 6, + 9, 9, 9, 8, 5, 8, 8, 9, + 4, 6, 7, 7, 8, 5, 8, 4, + 5, 1, 2, 2, 2, 3, 3, 5, + 0, 3, 1, 6, 4, 3, 5, 5, + 1, 4, 3, 2, 3, 2, 2, 3, + 3, 5, 6, 2, 2, 6, 2, 0, + 4, 4, 1, 3, 2, 5, 0, 2, + 1, 1, 3, 3, 2, 2, 3, 5, + 4, 3, 3, 6, 2, 4, 3, 4, + 4, 1, 5, 3, 1, 2, 5, 0, + 2, 0, 1, 3, 7, 3, 0, 3, + 3, 3, 4, 1, 3, 6, 3, 4, + 8, 7, 2, 4, 3, 3, 3, 2, + 2, 1, 2, 2, 3, 2, 0, 4, + 1, 2, 3, 1, 2, 2, 2, 1, + 3, 0, 1, 1, 1, 0, 1, 0, + 1, 4, 1, 3, 4, 3, 4, 5, + 3, 2, 2, 4, 0, 2, 2, 1, + 1, 4, 6, 9, 9, 9, 8, 5, + 8, 8, 9, 4, 6, 7, 7, 8, + 5, 8, 4, 5, 1, 2, 2, 2, + 3, 3, 5, 0, 3, 1, 6, 4, + 3, 5, 5, 1, 4, 3, 2, 3, + 2, 2, 3, 3, 5, 6, 2, 2, + 6, 2, 0, 3, 4, 1, 3, 2, + 5, 0, 3, 3, 1, 3, 3, 2, + 2, 3, 5, 4, 3, 3, 6, 2, + 4, 3, 4, 4, 1, 5, 3, 1, + 3, 5, 0, 2, 0, 1, 3, 7, + 3, 0, 3, 3, 3, 4, 1, 3, + 6, 3, 4, 8, 7, 2, 4, 3, + 3, 3, 2, 2, 1, 2, 2, 3, + 2, 0, 4, 1, 2, 3, 1, 2, + 2, 2, 1, 3, 0, 1, 1, 1, + 0, 1, 0, 1, 1, 1, 1, 2, + 2, 1, 4, 1, 1, 1, 1, 2, + 0, 0, 0, 0, 0, 0, 0, 2, + 2, 1, 4, 6, 9, 9, 9, 8, + 5, 8, 8, 9, 4, 6, 7, 7, + 8, 5, 8, 4, 5, 2, 2, 3, + 3, 5, 6, 4, 1, 0, 1, 4, + 1, 3, 4, 3, 4, 5, 3, 2, + 2, 4, 0, 2, 2, 1, 1, 4, + 6, 9, 9, 9, 8, 5, 8, 8, + 9, 4, 6, 7, 7, 8, 5, 8, + 4, 5, 1, 2, 2, 2, 3, 3, + 5, 0, 4, 1, 6, 4, 0, 1, + 3, 5, 5, 1, 4, 3, 2, 3, + 2, 2, 3, 3, 5, 6, 2, 2, + 6, 2, 0, 4, 4, 1, 3, 2, + 5, 0, 2, 1, 2, 3, 1, 0, + 1, 1, 1, 1, 2, 2, 1, 4, + 1, 1, 1, 1, 2, 4, 1, 1, + 1, 2, 2, 5, 6, 2, 2, 5, + 1, 3, 2, 3, 5, 2, 3, 1, + 3, 1, 1, 2, 1, 2, 1, 4, + 0, 1, 1, 5, 2, 0, 1, 1, + 2, 2, 1, 2, 1, 0, 2, 1, + 2, 1, 2, 2, 2, 1, 1, 4, + 2, 0, 2, 2, 1, 1, 0, 1, + 0, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 2, 2, 1, 2, 2, + 2, 1, 2, 3, 2, 2, 0, 1, + 1, 2, 0, 0, 2, 1, 5, 0, + 0, 0, 0, 1, 4, 1, 0, 2, + 1, 3, 2, 0, 2, 2, 1, 1, + 2, 6, 1, 1, 2, 2, 1, 1, + 1, 0, 1, 1, 1, 1, 0, 2, + 0, 2, 3, 1, 2, 2, 2, 0, + 1, 0, 1, 1, 2, 3, 3, 2, + 2, 3, 5, 4, 4, 3, 6, 2, + 4, 3, 4, 4, 0, 1, 1, 2, + 1, 5, 3, 1, 1, 5, 0, 2, + 0, 1, 3, 7, 3, 0, 3, 3, + 3, 4, 1, 3, 6, 3, 4, 8, + 7, 2, 4, 3, 3, 3, 2, 2, + 1, 2, 2, 3, 2, 0, 4, 1, + 2, 3, 1, 2, 2, 2, 1, 3, + 0, 1, 1, 1, 1, 3, 5, 5, + 4, 3, 2, 3, 2, 3, 3, 5, + 6, 2, 2, 6, 4, 4, 3, 2, + 5, 2, 0, 1, 1, 1, 1, 2, + 2, 1, 4, 1, 1, 1, 1, 2, + 4, 1, 1, 1, 2, 2, 5, 6, + 2, 2, 5, 1, 3, 2, 3, 5, + 2, 3, 1, 3, 1, 1, 2, 1, + 2, 1, 4, 0, 0, 1, 5, 2, + 1, 2, 2, 1, 2, 1, 0, 2, + 1, 2, 1, 2, 2, 2, 1, 1, + 4, 2, 0, 2, 2, 1, 1, 0, + 1, 0, 1, 1, 0, 2, 1, 1, + 1, 2, 2, 1, 1, 2, 2, 1, + 2, 3, 2, 2, 0, 0, 2, 1, + 0, 0, 0, 0, 1, 4, 1, 0, + 2, 1, 3, 2, 0, 2, 2, 1, + 1, 2, 6, 1, 1, 2, 2, 1, + 1, 1, 0, 1, 1, 1, 1, 0, + 2, 0, 2, 3, 1, 2, 2, 2, + 0, 1, 0, 1, 1, 1, 0, 1, + 1, 5, 0, 1, 4, 1, 3, 4, + 3, 4, 5, 3, 2, 2, 4, 0, + 2, 2, 1, 1, 4, 6, 9, 9, + 9, 8, 5, 8, 8, 9, 4, 6, + 7, 7, 8, 5, 8, 4, 5, 1, + 2, 2, 2, 3, 3, 5, 0, 3, + 1, 6, 4, 3, 5, 5, 1, 4, + 3, 2, 3, 2, 2, 3, 3, 5, + 6, 2, 2, 6, 2, 0, 4, 4, + 1, 3, 2, 5, 0, 2, 1, 1, + 3, 3, 2, 2, 3, 5, 4, 3, + 3, 6, 2, 4, 3, 4, 4, 1, + 5, 3, 1, 2, 5, 0, 2, 0, + 1, 3, 7, 3, 0, 3, 3, 3, + 4, 1, 3, 6, 3, 4, 8, 7, + 2, 4, 3, 3, 3, 2, 2, 1, + 2, 2, 3, 2, 0, 4, 1, 2, + 3, 1, 2, 2, 2, 1, 3, 0, + 1, 1, 1, 0, 1, 0, 1, 1, + 1, 1, 2, 2, 1, 4, 1, 1, + 1, 1, 2, 4, 1, 1, 1, 2, + 2, 5, 6, 2, 2, 5, 1, 3, + 2, 3, 5, 2, 3, 1, 3, 1, + 1, 2, 1, 2, 1, 4, 0, 1, + 1, 5, 2, 1, 2, 2, 1, 2, + 1, 0, 2, 1, 2, 1, 2, 2, + 2, 1, 1, 4, 2, 0, 2, 2, + 1, 1, 0, 1, 0, 1, 1, 1, + 2, 1, 1, 1, 2, 2, 1, 2, + 2, 2, 1, 2, 3, 2, 2, 0, + 0, 2, 2, 5, 0, 0, 0, 0, + 1, 4, 1, 0, 2, 1, 3, 2, + 0, 2, 2, 1, 1, 2, 6, 1, + 1, 2, 2, 1, 1, 1, 0, 1, + 1, 1, 1, 0, 2, 0, 2, 3, + 1, 2, 2, 2, 0, 1, 0, 1, + 1, 1, 0, 0, 1, 1, 1, 1, + 2, 2, 1, 4, 1, 1, 1, 1, + 2, 4, 1, 1, 1, 2, 2, 5, + 6, 2, 2, 5, 1, 3, 2, 3, + 5, 2, 3, 1, 3, 1, 1, 2, + 1, 2, 1, 4, 0, 0, 1, 5, + 2, 1, 2, 2, 1, 2, 1, 0, + 2, 1, 2, 1, 2, 2, 2, 1, + 1, 4, 2, 0, 3, 4, 1, 1, + 0, 1, 0, 2, 2, 1, 1, 1, + 1, 0, 2, 1, 1, 1, 2, 2, + 1, 1, 2, 2, 1, 2, 3, 2, + 2, 0, 0, 3, 1, 1, 1, 0, + 0, 0, 0, 1, 4, 1, 0, 2, + 1, 3, 2, 0, 2, 2, 1, 1, + 2, 6, 1, 1, 2, 2, 1, 1, + 1, 0, 1, 1, 1, 1, 0, 0, + 2, 0, 2, 3, 1, 2, 2, 2, + 0, 1, 0, 1, 1, 1, 0, 1, + 0, 1, 1, 1, 1, 2, 2, 1, + 4, 1, 1, 1, 1, 2, 4, 1, + 1, 1, 2, 2, 5, 6, 2, 2, + 5, 1, 3, 2, 3, 5, 2, 3, + 1, 3, 1, 1, 2, 1, 2, 1, + 4, 0, 0, 1, 5, 2, 1, 2, + 2, 1, 2, 1, 0, 2, 1, 2, + 1, 2, 2, 2, 1, 1, 4, 2, + 0, 2, 2, 1, 1, 0, 1, 0, + 1, 1, 0, 2, 1, 1, 1, 2, + 2, 1, 1, 2, 2, 1, 2, 3, + 2, 2, 0, 0, 2, 1, 0, 0, + 0, 0, 1, 4, 1, 0, 2, 1, + 3, 2, 0, 2, 2, 1, 1, 2, + 6, 1, 1, 2, 2, 1, 1, 1, + 0, 1, 1, 1, 1, 0, 2, 0, + 2, 3, 1, 2, 2, 2, 0, 1, + 0, 1, 1, 1, 0, 4, 0, 0, + 1, 1, 1, 1, 2, 2, 1, 4, + 1, 1, 1, 1, 2, 4, 1, 1, + 1, 2, 2, 5, 6, 2, 2, 5, + 1, 3, 2, 3, 5, 2, 3, 1, + 3, 1, 1, 2, 1, 2, 1, 4, + 0, 0, 1, 5, 2, 1, 2, 2, + 1, 2, 1, 0, 2, 1, 2, 1, + 2, 2, 2, 1, 1, 4, 2, 0, + 2, 2, 1, 1, 0, 1, 0, 1, + 1, 0, 2, 1, 1, 1, 2, 2, + 1, 1, 2, 2, 1, 2, 3, 2, + 2, 0, 0, 2, 1, 0, 0, 0, + 0, 1, 4, 1, 0, 2, 1, 3, + 2, 0, 2, 2, 1, 1, 2, 6, + 1, 1, 2, 2, 1, 1, 1, 0, + 1, 1, 1, 1, 0, 2, 0, 2, + 3, 1, 2, 2, 2, 0, 1, 0, + 1, 1, 1, 0, 1, 1, 1, 1, + 2, 2, 1, 4, 1, 1, 1, 1, + 2, 0, 0, 0, 0, 0, 0, 0, + 1, 3, 3, 2, 2, 3, 5, 4, + 4, 3, 6, 2, 4, 4, 4, 0, + 0, 1, 4, 1, 3, 4, 3, 4, + 5, 3, 2, 2, 4, 0, 2, 2, + 1, 1, 4, 6, 9, 9, 9, 8, + 5, 8, 8, 9, 4, 6, 7, 7, + 8, 5, 8, 4, 5, 1, 2, 2, + 2, 3, 3, 5, 0, 4, 1, 6, + 4, 3, 5, 5, 1, 4, 3, 2, + 3, 2, 2, 3, 3, 5, 6, 2, + 2, 6, 2, 0, 4, 4, 1, 3, + 2, 5, 0, 2, 1, 2, 3, 3, + 2, 2, 3, 5, 4, 4, 3, 6, + 2, 4, 3, 4, 4, 1, 5, 3, + 1, 2, 5, 0, 2, 0, 1, 3, + 7, 3, 0, 3, 3, 3, 4, 1, + 3, 6, 3, 4, 8, 7, 2, 4, + 3, 3, 3, 2, 2, 1, 2, 2, + 3, 2, 0, 4, 1, 2, 3, 1, + 2, 2, 2, 1, 3, 0, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 2, + 2, 1, 4, 1, 1, 1, 1, 2, + 0, 0, 0, 0, 0, 0, 0, 1, + 1, 5, 3, 1, 2, 3, 5, 2, + 1, 3, 7, 3, 0, 3, 3, 3, + 4, 1, 3, 6, 3, 4, 8, 7, + 2, 4, 3, 3, 3, 2, 2, 1, + 2, 2, 3, 2, 0, 0, 4, 1, + 1, 3, 0, 1, 0, 1, 1, 1, + 1, 2, 2, 1, 4, 1, 1, 1, + 1, 2, 4, 1, 1, 1, 2, 2, + 5, 6, 2, 2, 5, 1, 3, 2, + 3, 5, 2, 3, 1, 3, 1, 1, + 2, 1, 2, 1, 4, 0, 0, 1, + 5, 2, 1, 2, 2, 1, 2, 1, + 0, 2, 1, 2, 1, 2, 2, 2, + 1, 1, 4, 2, 0, 2, 2, 1, + 1, 0, 1, 0, 1, 1, 0, 2, + 1, 1, 1, 2, 2, 1, 1, 2, + 2, 1, 2, 3, 2, 2, 0, 0, + 2, 1, 0, 0, 0, 0, 1, 4, + 1, 0, 2, 1, 3, 2, 0, 2, + 2, 1, 1, 2, 6, 1, 1, 2, + 2, 1, 1, 1, 0, 1, 1, 1, + 1, 0, 2, 0, 2, 3, 1, 2, + 2, 2, 0, 1, 0, 0, 1, 1, + 1, 0, 0, 1, 0, 0, 1, 0, + 1, 1, 1, 1, 1, 1, 7, 0, + 0, 5, 5, 5, 5, 5, 5, 5, + 0, 5, 5, 5, 5, 0, 0, 3, + 5, 9, 0, 0, 8, 4, 5, 5, + 6, 6, 7, 7, 6, 9, 8, 1, + 1, 9, 6, 6, 7, 5, 5, 5, + 5, 5, 5, 5, 4, 2, 3, 0, + 0, 0, 2, 2, 4, 3, 3, 3, + 1, 1, 1, 2, 0, 3, 0, 0, + 1, 9, 6, 8, 0, 6, 10, 7, + 6, 7, 7, 8, 1, 1, 0, 0, + 9, 6, 5, 7, 6, 7, 6, 9, + 9, 7, 6, 6, 9, 7, 7, 7, + 6, 6, 5, 6, 6, 6, 7, 6, + 6, 6, 9, 9, 6, 6, 9, 9, + 6, 7, 8, 7, 7, 5, 7, 6, + 5, 5, 5, 5, 5, 5, 6, 6, + 9, 9, 12, 12, 9, 7, 10, 6, + 8, 9, 10, 10, 9, 10, 6, 8, + 6, 6, 7, 6, 7, 6, 9, 5, + 4, 1, 0, 1, 0, 1, 1, 1, + 2, 2, 1, 4, 1, 1, 1, 1, + 2, 2, 1, 4, 1, 1, 1, 1, + 2, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 2, 0, 0, 0, 0, + 0, 0, 0, 4, 3, 1, 3, 4, + 3, 4, 5, 3, 2, 2, 4, 0, + 4, 5, 1, 1, 0, 1, 5, 1, + 0, 0, 0, 4, 1, 1, 0, 1, + 0, 1, 1, 1, 1, 2, 2, 1, + 4, 1, 1, 1, 1, 2, 2, 1, + 4, 1, 1, 1, 1, 2, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, + 2, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 2, 5, 6, 2, 2, 5, + 1, 3, 2, 3, 5, 2, 3, 1, + 3, 1, 1, 2, 1, 2, 1, 4, + 0, 1, 5, 2, 1, 2, 2, 1, + 2, 1, 0, 2, 1, 2, 1, 2, + 2, 2, 1, 1, 4, 2, 2, 2, + 1, 1, 0, 1, 1, 1, 2, 1, + 1, 1, 2, 2, 1, 1, 2, 2, + 1, 2, 3, 2, 2, 0, 2, 1, + 0, 0, 0, 0, 0, 0, 1, 0, + 0, 1, 2, 5, 9, 6, 8, 0, + 1, 5, 9, 4, 1, 3, 4, 3, + 4, 5, 3, 8, 6, 6, 7, 7, + 6, 9, 8, 2, 2, 4, 0, 4, + 0, 0, 2, 6, 10, 7, 6, 7, + 7, 8, 0, 7, 7, 6, 6, 5, + 6, 6, 6, 7, 6, 6, 6, 9, + 1, 1, 0, 0, 9, 6, 6, 9, + 9, 6, 7, 8, 7, 7, 5, 7, + 6, 5, 5, 5, 5, 5, 5, 6, + 9, 6, 5, 7, 6, 7, 6, 9, + 9, 7, 6, 6, 9, 7, 9, 6, + 6, 7, 5, 5, 5, 5, 5, 5, + 5, 6, 9, 9, 12, 12, 9, 7, + 10, 6, 8, 9, 10, 10, 9, 10, + 6, 8, 6, 6, 7, 6, 7, 6, + 9, 5, 2, 1, 0, } var _s_index_offsets []uint16 = []uint16{ - 0, 2, 4, 6, 8, 11, 15, 19, - 22, 27, 31, 33, 35, 37, 66, 71, - 73, 75, 78, 82, 86, 92, 99, 104, - 108, 114, 117, 122, 125, 131, 137, 140, - 146, 148, 154, 157, 159, 163, 165, 171, - 173, 178, 180, 202, 204, 210, 214, 216, - 219, 222, 224, 227, 229, 231, 234, 236, - 240, 242, 245, 248, 251, 253, 255, 261, - 264, 271, 274, 277, 279, 281, 283, 285, - 288, 290, 292, 308, 311, 313, 315, 320, - 323, 326, 328, 330, 333, 336, 338, 342, - 347, 351, 354, 360, 362, 365, 367, 374, - 380, 382, 384, 386, 392, 394, 414, 417, - 419, 423, 426, 428, 431, 434, 436, 438, - 442, 450, 452, 454, 457, 460, 462, 464, - 466, 471, 473, 475, 477, 479, 481, 484, - 491, 494, 498, 500, 503, 506, 510, 512, - 514, 516, 522, 525, 527, 528, 551, 586, - 591, 595, 596, 598, 600, 606, 608, 615, - 621, 623, 626, 628, 631, 636, 642, 647, - 652, 661, 666, 669, 672, 677, 710, 716, - 719, 721, 723, 726, 731, 742, 753, 764, - 774, 784, 792, 802, 811, 824, 830, 838, - 847, 856, 865, 872, 882, 888, 895, 898, - 900, 904, 906, 913, 917, 923, 925, 970, - 972, 978, 983, 988, 994, 1000, 1005, 1008, - 1012, 1015, 1018, 1020, 1023, 1026, 1029, 1035, - 1041, 1043, 1046, 1049, 1051, 1055, 1057, 1061, - 1064, 1068, 1070, 1074, 1078, 1084, 1087, 1090, - 1093, 1101, 1104, 1107, 1115, 1119, 1127, 1146, - 1149, 1154, 1156, 1158, 1170, 1174, 1176, 1178, - 1180, 1183, 1185, 1189, 1194, 1198, 1204, 1210, - 1212, 1218, 1222, 1224, 1227, 1230, 1260, 1262, - 1264, 1268, 1273, 1277, 1280, 1283, 1287, 1289, - 1295, 1297, 1301, 1307, 1311, 1315, 1319, 1323, - 1326, 1331, 1336, 1342, 1349, 1352, 1356, 1357, - 1361, 1363, 1366, 1383, 1391, 1395, 1397, 1399, - 1401, 1403, 1405, 1408, 1411, 1414, 1417, 1419, - 1421, 1424, 1430, 1441, 1479, 1485, 1488, 1490, - 1492, 1494, 1497, 1500, 1503, 1507, 1510, 1514, - 1516, 1519, 1521, 1523, 1526, 1533, 1536, 1538, - 1541, 1544, 1547, 1557, 1559, 1561, 1565, 1567, - 1570, 1572, 1574, 1599, 1603, 1605, 1609, 1611, - 1615, 1619, 1623, 1629, 1633, 1640, 1643, 1653, - 1663, 1666, 1670, 1674, 1678, 1681, 1684, 1686, - 1688, 1691, 1693, 1701, 1703, 1705, 1707, 1711, - 1715, 1717, 1729, 1731, 1734, 1737, 1741, 1743, - 1747, 1750, 1754, 1757, 1762, 1782, 1785, 1789, - 1791, 1793, 1801, 1803, 1810, 1815, 1817, 1821, - 1824, 1827, 1830, 1833, 1836, 1839, 1843, 1850, - 1854, 1864, 1884, 1890, 1894, 1896, 1899, 1901, - 1903, 1909, 1912, 1914, 1915, 1917, 1940, 1942, - 1944, 1946, 1948, 1951, 1955, 1959, 1964, 1970, - 1974, 1976, 1978, 1981, 2010, 2015, 2017, 2019, - 2022, 2028, 2032, 2040, 2048, 2055, 2059, 2066, - 2069, 2075, 2078, 2086, 2093, 2096, 2104, 2106, - 2113, 2116, 2119, 2123, 2126, 2133, 2135, 2140, - 2142, 2167, 2169, 2176, 2181, 2183, 2186, 2189, - 2191, 2196, 2199, 2201, 2204, 2206, 2208, 2210, - 2214, 2218, 2221, 2226, 2230, 2232, 2234, 2237, - 2243, 2246, 2253, 2256, 2259, 2261, 2263, 2265, - 2267, 2270, 2272, 2274, 2291, 2293, 2296, 2298, - 2300, 2305, 2308, 2313, 2316, 2318, 2321, 2328, - 2330, 2335, 2340, 2344, 2348, 2354, 2356, 2359, - 2361, 2368, 2375, 2377, 2379, 2381, 2387, 2389, - 2412, 2415, 2419, 2423, 2425, 2429, 2431, 2434, - 2439, 2441, 2444, 2448, 2456, 2458, 2462, 2465, - 2468, 2472, 2474, 2476, 2479, 2486, 2488, 2490, - 2492, 2494, 2496, 2499, 2507, 2510, 2514, 2516, - 2518, 2521, 2524, 2528, 2530, 2532, 2534, 2540, - 2543, 2545, 2546, 2551, 2553, 2560, 2563, 2568, - 2575, 2597, 2599, 2601, 2603, 2605, 2608, 2614, - 2619, 2621, 2628, 2631, 2636, 2643, 2648, 2655, - 2664, 2669, 2672, 2675, 2681, 2714, 2720, 2723, - 2725, 2728, 2735, 2746, 2758, 2769, 2780, 2790, - 2800, 2810, 2820, 2833, 2840, 2848, 2859, 2868, - 2878, 2885, 2897, 2903, 2911, 2914, 2917, 2921, - 2924, 2932, 2936, 2942, 2944, 2991, 2993, 3000, - 3006, 3010, 3016, 3022, 3024, 3029, 3033, 3037, - 3041, 3044, 3048, 3052, 3056, 3062, 3069, 3072, - 3075, 3080, 3088, 3091, 3110, 3114, 3122, 3124, - 3128, 3132, 3138, 3144, 3148, 3150, 3180, 3184, - 3189, 3193, 3196, 3202, 3206, 3214, 3219, 3223, - 3227, 3235, 3238, 3244, 3249, 3255, 3260, 3277, - 3285, 3290, 3294, 3298, 3301, 3304, 3307, 3313, - 3324, 3362, 3364, 3367, 3371, 3375, 3385, 3389, - 3415, 3419, 3423, 3427, 3430, 3435, 3439, 3443, - 3451, 3455, 3460, 3470, 3480, 3483, 3489, 3493, - 3497, 3502, 3505, 3508, 3512, 3524, 3527, 3530, - 3533, 3538, 3542, 3545, 3549, 3554, 3574, 3577, - 3581, 3583, 3588, 3591, 3594, 3598, 3605, 3609, - 3611, 3617, 3620, 3622, 3623, 3625, 3629, 3632, - 3637, 3641, 3643, 3645, 3647, 3676, 3681, 3683, - 3685, 3688, 3692, 3696, 3702, 3709, 3714, 3718, - 3724, 3727, 3732, 3735, 3741, 3747, 3750, 3756, - 3758, 3764, 3767, 3769, 3773, 3775, 3781, 3783, - 3788, 3790, 3812, 3814, 3820, 3824, 3826, 3829, - 3832, 3834, 3837, 3839, 3841, 3844, 3846, 3850, - 3852, 3855, 3858, 3861, 3863, 3865, 3871, 3874, - 3881, 3884, 3887, 3889, 3891, 3893, 3895, 3898, - 3900, 3902, 3918, 3921, 3923, 3925, 3930, 3933, - 3936, 3938, 3940, 3943, 3946, 3948, 3952, 3957, - 3961, 3964, 3971, 3977, 3981, 3984, 3986, 3993, - 3999, 4001, 4003, 4005, 4011, 4013, 4033, 4036, - 4038, 4042, 4045, 4047, 4050, 4053, 4055, 4057, - 4061, 4069, 4071, 4073, 4076, 4079, 4081, 4083, - 4085, 4090, 4092, 4094, 4096, 4098, 4100, 4103, - 4110, 4113, 4117, 4119, 4122, 4125, 4129, 4131, - 4133, 4135, 4141, 4144, 4146, 4147, 4153, 4160, - 4162, 4169, 4175, 4178, 4183, 4191, 4196, 4203, - 4212, 4217, 4220, 4223, 4229, 4262, 4268, 4271, - 4273, 4276, 4283, 4294, 4306, 4317, 4328, 4338, - 4348, 4358, 4368, 4381, 4388, 4396, 4407, 4416, - 4426, 4433, 4445, 4451, 4459, 4462, 4465, 4469, - 4472, 4480, 4484, 4490, 4492, 4539, 4541, 4548, - 4554, 4558, 4564, 4570, 4572, 4577, 4581, 4585, - 4589, 4592, 4596, 4600, 4604, 4610, 4617, 4620, - 4623, 4631, 4634, 4653, 4660, 4668, 4670, 4674, - 4678, 4684, 4690, 4694, 4696, 4726, 4731, 4735, - 4738, 4744, 4748, 4756, 4761, 4765, 4769, 4777, - 4780, 4786, 4791, 4797, 4802, 4819, 4826, 4831, - 4837, 4840, 4846, 4849, 4855, 4866, 4904, 4906, - 4909, 4913, 4923, 4927, 4953, 4957, 4961, 4965, - 4970, 4974, 4978, 4986, 4990, 4995, 5005, 5015, - 5018, 5024, 5028, 5032, 5037, 5040, 5043, 5055, - 5058, 5061, 5065, 5068, 5072, 5077, 5097, 5100, - 5104, 5106, 5109, 5112, 5116, 5123, 5127, 5129, - 5135, 5138, 5140, 5141, 5143, 5148, 5155, 5164, - 5169, 5172, 5175, 5181, 5214, 5220, 5223, 5225, - 5228, 5235, 5246, 5258, 5269, 5280, 5290, 5300, - 5310, 5320, 5333, 5340, 5348, 5359, 5368, 5378, - 5385, 5397, 5403, 5411, 5414, 5417, 5421, 5424, - 5432, 5436, 5442, 5444, 5491, 5493, 5500, 5506, - 5510, 5516, 5522, 5524, 5529, 5533, 5537, 5541, - 5544, 5548, 5552, 5556, 5562, 5569, 5572, 5575, - 5583, 5586, 5605, 5609, 5616, 5618, 5622, 5626, - 5632, 5643, 5648, 5650, 5652, 5654, 5656, 5659, - 5663, 5667, 5670, 5675, 5679, 5681, 5683, 5685, - 5714, 5719, 5721, 5723, 5726, 5730, 5734, 5740, - 5747, 5752, 5756, 5762, 5765, 5770, 5773, 5779, - 5785, 5788, 5794, 5796, 5802, 5805, 5807, 5811, - 5813, 5819, 5821, 5826, 5828, 5850, 5852, 5858, - 5862, 5864, 5867, 5870, 5872, 5875, 5877, 5879, - 5882, 5884, 5888, 5890, 5893, 5896, 5899, 5901, - 5903, 5909, 5912, 5919, 5923, 5929, 5931, 5933, - 5935, 5937, 5945, 5948, 5951, 5954, 5956, 5958, - 5960, 5976, 5979, 5981, 5983, 5988, 5991, 5994, - 5996, 5998, 6001, 6004, 6006, 6010, 6015, 6019, - 6022, 6031, 6033, 6037, 6039, 6041, 6043, 6045, - 6047, 6054, 6060, 6062, 6064, 6066, 6072, 6074, - 6094, 6097, 6099, 6103, 6106, 6108, 6111, 6114, - 6116, 6118, 6122, 6130, 6132, 6134, 6137, 6140, - 6142, 6144, 6146, 6151, 6153, 6155, 6157, 6159, - 6162, 6164, 6167, 6174, 6177, 6181, 6183, 6186, - 6189, 6193, 6195, 6197, 6199, 6205, 6208, 6210, - 6211, 6215, 6245, 6250, 6254, 6257, 6263, 6267, - 6275, 6280, 6284, 6288, 6296, 6299, 6305, 6310, - 6316, 6321, 6338, 6346, 6350, 6353, 6356, 6360, - 6366, 6377, 6415, 6417, 6420, 6424, 6434, 6438, - 6464, 6468, 6472, 6476, 6481, 6485, 6489, 6497, - 6501, 6506, 6516, 6526, 6529, 6535, 6539, 6543, - 6548, 6551, 6554, 6566, 6569, 6572, 6576, 6579, - 6584, 6589, 6609, 6612, 6616, 6618, 6621, 6624, - 6628, 6635, 6639, 6641, 6647, 6650, 6652, 6653, - 6655, 6660, 6662, 6669, 6672, 6678, 6685, 6691, - 6698, 6707, 6712, 6715, 6718, 6725, 6758, 6764, - 6767, 6769, 6772, 6778, 6789, 6800, 6811, 6821, - 6831, 6840, 6850, 6860, 6873, 6880, 6888, 6898, - 6907, 6917, 6924, 6935, 6941, 6949, 6952, 6955, - 6959, 6962, 6970, 6974, 6980, 6982, 7029, 7031, - 7038, 7042, 7046, 7052, 7058, 7060, 7064, 7068, - 7072, 7076, 7079, 7083, 7087, 7091, 7096, 7103, - 7106, 7109, 7117, 7120, 7139, 7145, 7154, 7156, - 7160, 7164, 7170, 7176, 7180, 7182, 7212, 7217, - 7221, 7224, 7230, 7234, 7241, 7246, 7250, 7254, - 7260, 7263, 7269, 7274, 7280, 7285, 7302, 7310, - 7316, 7323, 7326, 7333, 7336, 7342, 7353, 7391, - 7393, 7396, 7400, 7410, 7414, 7440, 7444, 7447, - 7451, 7456, 7460, 7464, 7471, 7475, 7480, 7490, - 7500, 7503, 7508, 7512, 7516, 7520, 7523, 7526, - 7538, 7541, 7544, 7548, 7551, 7555, 7560, 7580, - 7583, 7587, 7589, 7592, 7595, 7599, 7606, 7610, - 7612, 7618, 7621, 7623, 7624, 7626, 7632, 7637, - 7639, 7643, 7651, 7656, 7661, 7668, 7670, 7672, - 7676, 7709, 7711, 7713, 7715, 7719, 7727, 7736, - 7747, 7756, 7765, 7774, 7783, 7792, 7804, 7811, - 7818, 7827, 7835, 7844, 7850, 7859, 7865, 7873, - 7876, 7879, 7883, 7886, 7894, 7898, 7902, 7904, - 7951, 7953, 7960, 7966, 7969, 7973, 7978, 7980, - 7985, 7989, 7992, 7996, 8000, 8004, 8009, 8013, - 8015, 8017, 8021, 8024, 8043, 8050, 8058, 8060, - 8063, 8067, 8073, 8079, 8083, 8085, 8115, 8119, - 8121, 8128, 8132, 8135, 8142, 8144, 8148, 8153, - 8157, 8161, 8178, 8186, 8191, 8194, 8196, 8202, - 8213, 8251, 8253, 8256, 8259, 8267, 8270, 8295, - 8299, 8302, 8305, 8308, 8314, 8317, 8321, 8330, - 8339, 8344, 8347, 8350, 8355, 8358, 8370, 8373, - 8376, 8378, 8382, 8387, 8407, 8410, 8414, 8416, - 8419, 8422, 8426, 8433, 8436, 8438, 8444, 8447, - 8449, 8454, 8456, 8463, 8466, 8471, 8478, 8483, - 8490, 8499, 8504, 8507, 8510, 8516, 8549, 8555, - 8558, 8560, 8563, 8570, 8581, 8593, 8604, 8615, - 8625, 8635, 8645, 8655, 8668, 8675, 8683, 8694, - 8703, 8713, 8720, 8732, 8738, 8746, 8749, 8752, - 8756, 8759, 8767, 8771, 8777, 8779, 8826, 8828, - 8835, 8841, 8845, 8851, 8857, 8859, 8864, 8868, - 8872, 8876, 8878, 8880, 8883, 8887, 8891, 8895, - 8901, 8908, 8911, 8914, 8919, 8927, 8930, 8949, - 8953, 8960, 8962, 8966, 8970, 8976, 8987, 8992, - 8996, 9026, 9030, 9035, 9039, 9042, 9048, 9052, - 9060, 9065, 9069, 9073, 9081, 9084, 9090, 9095, - 9101, 9106, 9123, 9131, 9135, 9139, 9142, 9145, - 9149, 9155, 9166, 9204, 9206, 9209, 9213, 9217, - 9227, 9231, 9257, 9261, 9265, 9269, 9272, 9277, - 9281, 9285, 9293, 9297, 9302, 9312, 9322, 9325, - 9331, 9335, 9339, 9344, 9347, 9349, 9352, 9356, - 9368, 9371, 9374, 9377, 9382, 9386, 9389, 9394, - 9399, 9419, 9422, 9426, 9428, 9433, 9436, 9439, - 9443, 9450, 9454, 9456, 9462, 9465, 9467, 9468, - 9470, 9475, 9477, 9484, 9487, 9493, 9500, 9506, - 9513, 9522, 9527, 9530, 9533, 9540, 9573, 9579, - 9582, 9584, 9587, 9593, 9604, 9615, 9626, 9636, - 9646, 9655, 9665, 9675, 9688, 9695, 9703, 9713, - 9722, 9732, 9739, 9750, 9756, 9764, 9767, 9770, - 9774, 9777, 9785, 9789, 9795, 9797, 9844, 9846, - 9853, 9857, 9861, 9867, 9873, 9875, 9879, 9883, - 9887, 9891, 9894, 9898, 9902, 9906, 9911, 9918, - 9921, 9924, 9932, 9935, 9954, 9960, 9969, 9971, - 9975, 9979, 9985, 9991, 9995, 9997, 10027, 10032, - 10036, 10039, 10045, 10049, 10056, 10061, 10065, 10069, - 10075, 10078, 10084, 10089, 10095, 10100, 10117, 10125, - 10131, 10138, 10141, 10148, 10151, 10157, 10168, 10206, - 10208, 10211, 10215, 10225, 10229, 10255, 10259, 10262, - 10266, 10271, 10275, 10279, 10286, 10290, 10295, 10305, - 10315, 10318, 10323, 10327, 10331, 10335, 10338, 10341, - 10353, 10356, 10359, 10363, 10366, 10370, 10375, 10395, - 10398, 10402, 10404, 10407, 10410, 10414, 10421, 10425, - 10427, 10433, 10436, 10438, 10439, 10441, 10443, 10445, - 10447, 10449, 10452, 10456, 10460, 10465, 10471, 10475, - 10477, 10479, 10482, 10511, 10516, 10518, 10520, 10523, - 10529, 10533, 10541, 10549, 10556, 10560, 10567, 10570, - 10576, 10579, 10587, 10594, 10597, 10605, 10607, 10614, - 10617, 10620, 10624, 10627, 10634, 10636, 10641, 10643, - 10668, 10670, 10677, 10682, 10684, 10687, 10690, 10692, - 10697, 10700, 10702, 10705, 10707, 10711, 10715, 10718, - 10723, 10727, 10729, 10731, 10734, 10740, 10743, 10750, - 10753, 10756, 10758, 10760, 10762, 10764, 10767, 10769, - 10771, 10788, 10790, 10793, 10795, 10797, 10802, 10805, - 10810, 10813, 10815, 10818, 10825, 10827, 10832, 10837, - 10841, 10845, 10851, 10853, 10856, 10858, 10865, 10872, - 10874, 10876, 10878, 10884, 10886, 10909, 10912, 10916, - 10920, 10922, 10926, 10928, 10931, 10936, 10938, 10941, - 10945, 10953, 10955, 10959, 10962, 10965, 10969, 10971, - 10974, 10981, 10983, 10985, 10987, 10989, 10991, 10994, - 11002, 11005, 11009, 11011, 11013, 11016, 11019, 11023, - 11025, 11027, 11029, 11035, 11038, 11040, 11041, 11046, - 11048, 11055, 11058, 11064, 11071, 11077, 11085, 11094, - 11099, 11102, 11105, 11112, 11145, 11151, 11154, 11156, - 11159, 11166, 11177, 11189, 11200, 11211, 11221, 11231, - 11241, 11251, 11264, 11271, 11279, 11290, 11299, 11309, - 11316, 11328, 11334, 11342, 11345, 11348, 11352, 11355, - 11363, 11367, 11373, 11375, 11422, 11424, 11431, 11437, - 11441, 11447, 11453, 11455, 11460, 11464, 11468, 11472, - 11475, 11479, 11483, 11487, 11493, 11500, 11503, 11506, - 11514, 11517, 11536, 11542, 11551, 11553, 11557, 11561, - 11567, 11573, 11577, 11579, 11609, 11614, 11618, 11621, - 11627, 11631, 11639, 11644, 11648, 11652, 11660, 11663, - 11669, 11674, 11680, 11685, 11702, 11710, 11716, 11719, - 11722, 11728, 11739, 11777, 11779, 11782, 11786, 11796, - 11800, 11826, 11830, 11834, 11838, 11843, 11847, 11851, - 11859, 11863, 11868, 11878, 11888, 11891, 11897, 11901, - 11905, 11910, 11913, 11916, 11928, 11931, 11934, 11938, - 11941, 11945, 11950, 11970, 11973, 11977, 11979, 11982, - 11985, 11989, 11996, 12000, 12002, 12008, 12011, 12013, - 12014, 12016, 12022, 12024, 12031, 12034, 12039, 12047, - 12052, 12059, 12068, 12073, 12076, 12079, 12085, 12118, - 12124, 12127, 12129, 12132, 12139, 12150, 12162, 12173, - 12184, 12194, 12204, 12214, 12224, 12237, 12244, 12252, - 12263, 12272, 12282, 12289, 12301, 12307, 12315, 12318, - 12321, 12325, 12328, 12336, 12340, 12346, 12348, 12395, - 12397, 12404, 12410, 12414, 12420, 12426, 12428, 12433, - 12437, 12441, 12445, 12448, 12452, 12456, 12460, 12466, - 12473, 12476, 12479, 12487, 12490, 12509, 12516, 12524, - 12526, 12530, 12534, 12540, 12546, 12550, 12552, 12582, - 12587, 12591, 12594, 12600, 12604, 12612, 12617, 12621, - 12625, 12633, 12636, 12642, 12647, 12653, 12658, 12675, - 12683, 12688, 12691, 12694, 12700, 12711, 12749, 12751, - 12754, 12758, 12768, 12772, 12798, 12802, 12806, 12810, - 12815, 12819, 12823, 12831, 12835, 12840, 12850, 12860, - 12863, 12869, 12873, 12877, 12882, 12885, 12888, 12900, - 12903, 12906, 12910, 12913, 12917, 12922, 12942, 12945, - 12949, 12951, 12954, 12957, 12961, 12968, 12972, 12974, - 12980, 12983, 12985, 12986, 12988, 12993, 12995, 13002, - 13005, 13010, 13017, 13022, 13029, 13038, 13043, 13046, - 13049, 13055, 13088, 13094, 13097, 13099, 13102, 13109, - 13120, 13132, 13143, 13154, 13164, 13174, 13184, 13194, - 13207, 13214, 13222, 13233, 13242, 13252, 13259, 13271, - 13277, 13285, 13288, 13291, 13295, 13298, 13306, 13310, - 13316, 13318, 13365, 13367, 13374, 13380, 13384, 13390, - 13396, 13398, 13403, 13407, 13411, 13415, 13418, 13422, - 13426, 13430, 13436, 13443, 13446, 13449, 13457, 13460, - 13479, 13483, 13490, 13492, 13496, 13500, 13506, 13517, - 13522, 13526, 13556, 13561, 13565, 13568, 13574, 13578, - 13586, 13591, 13595, 13599, 13607, 13610, 13616, 13621, - 13627, 13632, 13649, 13657, 13661, 13665, 13668, 13671, - 13675, 13681, 13692, 13730, 13732, 13735, 13739, 13749, - 13753, 13779, 13783, 13787, 13791, 13796, 13800, 13804, - 13812, 13816, 13821, 13831, 13841, 13844, 13850, 13854, - 13858, 13863, 13866, 13869, 13881, 13884, 13887, 13891, - 13894, 13899, 13904, 13924, 13927, 13931, 13933, 13936, - 13939, 13943, 13950, 13954, 13956, 13962, 13965, 13967, - 13968, 13970, 13975, 13977, 13984, 13987, 13992, 13999, - 14004, 14011, 14020, 14025, 14028, 14031, 14037, 14070, - 14076, 14079, 14081, 14084, 14091, 14102, 14114, 14125, - 14136, 14146, 14156, 14166, 14176, 14189, 14196, 14204, - 14215, 14224, 14234, 14241, 14253, 14259, 14267, 14270, - 14273, 14277, 14280, 14288, 14292, 14298, 14300, 14347, - 14349, 14356, 14362, 14366, 14372, 14378, 14380, 14385, - 14389, 14393, 14397, 14400, 14404, 14408, 14412, 14418, - 14425, 14428, 14431, 14439, 14442, 14461, 14465, 14473, - 14475, 14479, 14483, 14489, 14500, 14505, 14509, 14539, - 14544, 14548, 14551, 14557, 14561, 14569, 14574, 14578, - 14582, 14590, 14593, 14599, 14604, 14610, 14615, 14632, - 14640, 14644, 14647, 14651, 14657, 14668, 14706, 14708, - 14711, 14715, 14725, 14729, 14755, 14759, 14763, 14767, - 14772, 14776, 14780, 14788, 14792, 14797, 14807, 14817, - 14820, 14826, 14830, 14834, 14839, 14842, 14845, 14857, - 14860, 14863, 14867, 14870, 14875, 14880, 14900, 14903, - 14907, 14909, 14912, 14915, 14919, 14926, 14930, 14932, - 14938, 14941, 14943, 14944, 14946, 14948, 14950, 14952, - 14954, 14957, 14961, 14965, 14968, 14973, 14977, 14979, - 14981, 14983, 15012, 15017, 15019, 15021, 15024, 15028, - 15032, 15038, 15045, 15050, 15054, 15060, 15063, 15068, - 15071, 15077, 15083, 15086, 15092, 15094, 15100, 15103, - 15105, 15109, 15111, 15117, 15119, 15124, 15126, 15148, - 15150, 15156, 15160, 15162, 15165, 15168, 15170, 15173, - 15175, 15177, 15180, 15182, 15186, 15188, 15191, 15194, - 15197, 15199, 15201, 15207, 15210, 15217, 15220, 15223, - 15225, 15227, 15229, 15231, 15234, 15236, 15238, 15254, - 15257, 15259, 15261, 15266, 15269, 15272, 15274, 15276, - 15279, 15282, 15284, 15288, 15293, 15297, 15300, 15306, - 15308, 15311, 15313, 15320, 15326, 15328, 15330, 15332, - 15338, 15340, 15360, 15363, 15365, 15369, 15372, 15374, - 15377, 15380, 15382, 15384, 15388, 15396, 15398, 15400, - 15403, 15406, 15408, 15410, 15412, 15417, 15419, 15421, - 15423, 15425, 15427, 15430, 15437, 15440, 15444, 15446, - 15449, 15452, 15456, 15458, 15460, 15462, 15468, 15471, - 15473, 15474, 15479, 15481, 15488, 15491, 15496, 15502, - 15507, 15512, 15521, 15526, 15529, 15532, 15537, 15570, - 15576, 15579, 15581, 15584, 15589, 15600, 15611, 15622, - 15632, 15642, 15650, 15660, 15669, 15682, 15688, 15696, - 15705, 15714, 15723, 15730, 15740, 15746, 15753, 15756, - 15758, 15762, 15764, 15771, 15775, 15781, 15783, 15828, - 15830, 15836, 15841, 15845, 15851, 15857, 15859, 15862, - 15865, 15869, 15873, 15876, 15880, 15882, 15886, 15890, - 15896, 15899, 15902, 15910, 15913, 15932, 15935, 15940, - 15942, 15946, 15950, 15956, 15962, 15966, 15968, 15998, - 16003, 16007, 16010, 16016, 16020, 16026, 16030, 16034, - 16038, 16042, 16045, 16050, 16055, 16061, 16065, 16082, - 16090, 16093, 16096, 16099, 16105, 16116, 16154, 16156, - 16159, 16163, 16173, 16177, 16202, 16206, 16208, 16212, - 16216, 16220, 16224, 16230, 16234, 16237, 16247, 16257, - 16260, 16264, 16268, 16272, 16275, 16278, 16280, 16292, - 16295, 16298, 16302, 16305, 16309, 16314, 16334, 16337, - 16341, 16343, 16346, 16349, 16353, 16360, 16364, 16366, - 16372, 16375, 16377, 16378, 16380, 16385, 16387, 16394, - 16397, 16403, 16410, 16416, 16424, 16433, 16438, 16441, - 16444, 16451, 16484, 16490, 16493, 16495, 16498, 16505, - 16516, 16528, 16539, 16550, 16560, 16570, 16580, 16590, - 16603, 16610, 16618, 16629, 16638, 16648, 16655, 16667, - 16673, 16681, 16684, 16687, 16691, 16694, 16702, 16706, - 16712, 16714, 16761, 16763, 16770, 16776, 16780, 16786, - 16792, 16794, 16799, 16803, 16807, 16811, 16814, 16818, - 16822, 16826, 16832, 16839, 16842, 16845, 16853, 16856, - 16875, 16881, 16890, 16892, 16896, 16900, 16906, 16912, - 16916, 16918, 16948, 16953, 16957, 16960, 16966, 16970, - 16978, 16983, 16987, 16991, 16999, 17002, 17008, 17013, - 17019, 17024, 17041, 17049, 17055, 17058, 17061, 17067, - 17078, 17116, 17118, 17121, 17125, 17135, 17139, 17165, - 17169, 17173, 17177, 17182, 17186, 17190, 17198, 17202, - 17207, 17217, 17227, 17230, 17236, 17240, 17244, 17249, - 17252, 17255, 17267, 17270, 17273, 17277, 17280, 17284, - 17289, 17309, 17312, 17316, 17318, 17321, 17324, 17328, - 17335, 17339, 17341, 17347, 17350, 17352, 17353, 17355, - 17360, 17362, 17369, 17372, 17377, 17384, 17389, 17396, - 17405, 17410, 17413, 17416, 17422, 17455, 17461, 17464, - 17466, 17469, 17476, 17487, 17499, 17510, 17521, 17531, - 17541, 17551, 17561, 17574, 17581, 17589, 17600, 17609, - 17619, 17626, 17638, 17644, 17652, 17655, 17658, 17662, - 17665, 17673, 17677, 17683, 17685, 17732, 17734, 17741, - 17747, 17751, 17757, 17763, 17765, 17770, 17774, 17778, - 17782, 17785, 17789, 17793, 17797, 17803, 17810, 17813, - 17816, 17824, 17827, 17846, 17850, 17858, 17860, 17864, - 17868, 17874, 17885, 17890, 17894, 17924, 17929, 17933, - 17936, 17942, 17946, 17954, 17959, 17963, 17967, 17975, - 17978, 17984, 17989, 17995, 18000, 18017, 18025, 18029, - 18032, 18036, 18042, 18053, 18091, 18093, 18096, 18100, - 18110, 18114, 18140, 18144, 18148, 18152, 18157, 18161, - 18165, 18173, 18177, 18182, 18192, 18202, 18205, 18211, - 18215, 18219, 18224, 18227, 18230, 18242, 18245, 18248, - 18252, 18255, 18260, 18265, 18285, 18288, 18292, 18294, - 18297, 18300, 18304, 18311, 18315, 18317, 18323, 18326, - 18328, 18329, 18331, 18333, 18335, 18337, 18339, 18342, - 18346, 18350, 18353, 18358, 18362, 18364, 18366, 18368, - 18397, 18419, 18426, 18429, 18445, 18451, 18458, 18460, - 18466, 18469, 18472, 18479, 18490, 18502, 18513, 18524, - 18534, 18544, 18554, 18564, 18577, 18584, 18592, 18603, - 18612, 18622, 18629, 18641, 18647, 18655, 18658, 18661, - 18669, 18673, 18679, 18686, 18692, 18694, 18700, 18702, - 18709, 18712, 18717, 18725, 18730, 18737, 18746, 18751, - 18754, 18757, 18763, 18796, 18802, 18805, 18807, 18810, - 18817, 18828, 18840, 18851, 18862, 18872, 18882, 18892, - 18902, 18915, 18922, 18930, 18941, 18950, 18960, 18967, - 18979, 18985, 18993, 18996, 18999, 19003, 19006, 19014, - 19018, 19024, 19026, 19076, 19078, 19085, 19091, 19092, - 19094, 19098, 19104, 19110, 19112, 19117, 19121, 19125, - 19129, 19132, 19136, 19140, 19144, 19150, 19157, 19160, - 19163, 19171, 19174, 19193, 19200, 19208, 19210, 19214, - 19218, 19224, 19232, 19236, 19238, 19241, 19245, 19247, - 19249, 19251, 19253, 19255, 19258, 19262, 19266, 19269, - 19274, 19278, 19280, 19282, 19284, 19313, 19318, 19320, - 19322, 19325, 19329, 19333, 19339, 19346, 19351, 19355, - 19361, 19364, 19369, 19372, 19378, 19384, 19387, 19393, - 19395, 19401, 19404, 19406, 19410, 19412, 19418, 19420, - 19425, 19427, 19452, 19454, 19460, 19464, 19465, 19467, - 19469, 19472, 19475, 19477, 19480, 19482, 19484, 19487, - 19489, 19493, 19495, 19498, 19501, 19504, 19506, 19508, - 19514, 19517, 19524, 19527, 19530, 19532, 19534, 19536, - 19538, 19546, 19548, 19550, 19552, 19554, 19556, 19574, - 19577, 19579, 19581, 19586, 19589, 19592, 19594, 19597, - 19600, 19603, 19605, 19609, 19614, 19618, 19621, 19622, - 19626, 19628, 19631, 19637, 19639, 19642, 19644, 19650, - 19657, 19663, 19665, 19667, 19669, 19675, 19677, 19697, - 19700, 19702, 19706, 19709, 19711, 19714, 19717, 19719, - 19721, 19725, 19733, 19735, 19737, 19740, 19743, 19745, - 19747, 19749, 19754, 19756, 19758, 19760, 19762, 19764, - 19767, 19774, 19777, 19781, 19783, 19786, 19789, 19793, - 19795, 19797, 19799, 19805, 19808, 19839, 19844, 19848, - 19851, 19857, 19861, 19869, 19874, 19879, 19883, 19891, - 19894, 19900, 19905, 19911, 19916, 19917, 19921, 19923, - 19926, 19943, 19951, 19956, 19959, 19961, 19967, 19978, - 20016, 20018, 20021, 20025, 20035, 20039, 20065, 20069, - 20073, 20077, 20082, 20086, 20090, 20098, 20102, 20107, - 20117, 20127, 20130, 20136, 20140, 20144, 20149, 20152, - 20155, 20167, 20170, 20173, 20177, 20180, 20184, 20189, - 20209, 20212, 20216, 20218, 20221, 20224, 20228, 20235, - 20239, 20241, 20247, 20250, 20252, 20254, 20258, 20264, - 20270, 20275, 20279, 20283, 20287, 20290, 20294, 20298, - 20304, 20311, 20314, 20317, 20325, 20330, 20338, 20342, - 20346, 20352, 20355, 20357, 20359, 20361, 20363, 20366, - 20370, 20374, 20377, 20382, 20386, 20388, 20390, 20392, - 20421, 20426, 20428, 20430, 20433, 20437, 20441, 20447, - 20454, 20459, 20463, 20469, 20472, 20477, 20480, 20486, - 20492, 20495, 20501, 20503, 20509, 20512, 20514, 20518, - 20520, 20526, 20528, 20533, 20535, 20557, 20559, 20565, - 20569, 20571, 20574, 20577, 20579, 20582, 20584, 20586, - 20589, 20591, 20595, 20597, 20600, 20603, 20606, 20608, - 20610, 20616, 20619, 20626, 20629, 20632, 20634, 20636, - 20638, 20640, 20643, 20645, 20647, 20663, 20666, 20668, - 20670, 20675, 20678, 20681, 20683, 20685, 20688, 20691, - 20693, 20697, 20702, 20706, 20709, 20715, 20717, 20720, - 20722, 20729, 20735, 20737, 20739, 20741, 20747, 20749, - 20769, 20772, 20774, 20778, 20781, 20783, 20786, 20789, - 20791, 20793, 20797, 20805, 20807, 20809, 20812, 20815, - 20817, 20819, 20821, 20826, 20828, 20830, 20832, 20834, - 20836, 20839, 20846, 20849, 20853, 20855, 20858, 20861, - 20865, 20867, 20869, 20871, 20877, 20880, 20882, 20883, - 20885, 20887, 20897, 20903, 20905, 20912, 20915, 20920, - 20928, 20933, 20940, 20949, 20954, 20957, 20960, 20966, - 20999, 21005, 21008, 21010, 21013, 21020, 21031, 21043, - 21054, 21065, 21075, 21085, 21095, 21105, 21118, 21125, - 21133, 21144, 21153, 21163, 21170, 21182, 21188, 21196, - 21199, 21202, 21206, 21209, 21217, 21221, 21227, 21229, - 21276, 21278, 21285, 21291, 21295, 21301, 21307, 21309, - 21314, 21318, 21322, 21326, 21329, 21333, 21337, 21341, - 21347, 21354, 21357, 21360, 21368, 21371, 21390, 21397, - 21405, 21407, 21411, 21415, 21421, 21427, 21431, 21433, - 21463, 21468, 21472, 21475, 21481, 21485, 21493, 21498, - 21502, 21506, 21514, 21517, 21523, 21528, 21534, 21539, - 21556, 21564, 21569, 21572, 21575, 21581, 21592, 21630, - 21632, 21635, 21639, 21649, 21653, 21679, 21683, 21687, - 21691, 21696, 21700, 21704, 21712, 21716, 21721, 21731, - 21741, 21744, 21750, 21754, 21758, 21763, 21766, 21769, - 21781, 21784, 21787, 21791, 21794, 21798, 21803, 21823, - 21826, 21830, 21832, 21835, 21838, 21842, 21849, 21853, - 21855, 21861, 21864, 21866, 21867, 21869, 21871, 21873, - 21875, 21877, 21880, 21884, 21888, 21891, 21896, 21900, - 21902, 21904, 21906, 21935, 21940, 21942, 21944, 21947, - 21951, 21955, 21961, 21968, 21973, 21977, 21983, 21986, - 21991, 21994, 22000, 22006, 22009, 22015, 22017, 22023, - 22026, 22028, 22032, 22034, 22040, 22042, 22047, 22049, - 22074, 22076, 22082, 22086, 22088, 22091, 22094, 22096, - 22099, 22101, 22103, 22106, 22108, 22112, 22114, 22117, - 22120, 22123, 22125, 22127, 22133, 22136, 22143, 22146, - 22149, 22151, 22153, 22155, 22157, 22165, 22167, 22169, - 22187, 22190, 22192, 22194, 22199, 22202, 22205, 22207, - 22210, 22213, 22216, 22218, 22222, 22227, 22231, 22234, - 22240, 22242, 22245, 22248, 22254, 22261, 22267, 22269, - 22271, 22273, 22279, 22281, 22301, 22304, 22306, 22310, - 22313, 22315, 22318, 22321, 22323, 22325, 22329, 22337, - 22339, 22341, 22344, 22347, 22349, 22351, 22353, 22358, - 22360, 22362, 22364, 22366, 22368, 22371, 22378, 22381, - 22385, 22387, 22390, 22393, 22397, 22399, 22401, 22403, - 22409, 22412, 22414, 22415, 22417, 22419, 22421, 22423, - 22426, 22430, 22434, 22437, 22442, 22446, 22448, 22450, - 22452, 22481, 22486, 22488, 22490, 22493, 22497, 22501, - 22507, 22514, 22519, 22523, 22529, 22532, 22537, 22540, - 22546, 22552, 22555, 22561, 22563, 22569, 22572, 22574, - 22578, 22580, 22586, 22588, 22593, 22595, 22617, 22619, - 22625, 22629, 22631, 22634, 22637, 22639, 22642, 22644, - 22646, 22649, 22651, 22655, 22657, 22660, 22663, 22666, - 22668, 22670, 22676, 22679, 22686, 22690, 22696, 22698, - 22700, 22702, 22704, 22712, 22715, 22718, 22721, 22723, - 22725, 22727, 22743, 22746, 22748, 22750, 22755, 22758, - 22761, 22763, 22765, 22768, 22771, 22773, 22777, 22782, - 22786, 22789, 22798, 22800, 22804, 22806, 22808, 22810, - 22817, 22823, 22825, 22827, 22829, 22835, 22837, 22857, - 22860, 22862, 22866, 22869, 22871, 22874, 22877, 22879, - 22881, 22885, 22893, 22895, 22897, 22900, 22903, 22905, - 22907, 22909, 22914, 22916, 22918, 22920, 22922, 22925, - 22927, 22930, 22937, 22940, 22944, 22946, 22949, 22952, - 22956, 22958, 22960, 22962, 22968, 22971, 22973, 22974, - 22976, 22978, 22980, 22982, 22984, 22987, 22991, 22995, - 22998, 23003, 23007, 23009, 23011, 23013, 23042, 23047, - 23049, 23051, 23054, 23058, 23062, 23068, 23075, 23080, - 23084, 23090, 23093, 23098, 23101, 23107, 23113, 23116, - 23122, 23124, 23130, 23133, 23135, 23139, 23141, 23147, - 23149, 23154, 23156, 23178, 23180, 23186, 23190, 23192, - 23195, 23198, 23200, 23203, 23205, 23207, 23210, 23212, - 23216, 23218, 23221, 23224, 23227, 23229, 23231, 23237, - 23240, 23247, 23250, 23253, 23255, 23257, 23259, 23261, - 23264, 23266, 23268, 23284, 23287, 23289, 23291, 23296, - 23299, 23302, 23304, 23306, 23309, 23312, 23314, 23318, - 23323, 23327, 23330, 23336, 23338, 23341, 23343, 23350, - 23356, 23358, 23360, 23362, 23368, 23370, 23390, 23393, - 23395, 23399, 23402, 23404, 23407, 23410, 23412, 23414, - 23418, 23426, 23428, 23430, 23433, 23436, 23438, 23440, - 23442, 23447, 23449, 23451, 23453, 23455, 23457, 23460, - 23467, 23470, 23474, 23476, 23479, 23482, 23486, 23488, - 23490, 23492, 23498, 23501, 23503, 23504, 23509, 23511, - 23513, 23515, 23517, 23519, 23522, 23526, 23530, 23533, - 23538, 23542, 23544, 23546, 23548, 23577, 23582, 23584, - 23586, 23589, 23593, 23597, 23603, 23610, 23615, 23619, - 23625, 23628, 23633, 23636, 23642, 23648, 23651, 23657, - 23659, 23665, 23668, 23670, 23674, 23676, 23682, 23684, - 23689, 23691, 23713, 23715, 23721, 23725, 23727, 23730, - 23733, 23735, 23738, 23740, 23742, 23745, 23747, 23751, - 23753, 23756, 23759, 23762, 23764, 23766, 23772, 23775, - 23782, 23785, 23788, 23790, 23792, 23794, 23796, 23799, - 23801, 23803, 23819, 23822, 23824, 23826, 23831, 23834, - 23837, 23839, 23841, 23844, 23847, 23849, 23853, 23858, - 23862, 23865, 23871, 23873, 23876, 23878, 23885, 23891, - 23893, 23895, 23897, 23903, 23905, 23925, 23928, 23930, - 23934, 23937, 23939, 23942, 23945, 23947, 23949, 23953, - 23961, 23963, 23965, 23968, 23971, 23973, 23975, 23977, - 23982, 23984, 23986, 23988, 23990, 23992, 23995, 24002, - 24005, 24009, 24011, 24014, 24017, 24021, 24023, 24025, - 24027, 24033, 24036, 24038, 24039, 24041, 24043, 24045, - 24048, 24052, 24056, 24059, 24064, 24068, 24070, 24072, - 24074, 24103, 24125, 24132, 24135, 24151, 24157, 24164, - 24166, 24168, 24173, 24177, 24180, 24186, 24190, 24198, - 24203, 24208, 24212, 24220, 24223, 24229, 24235, 24240, - 24242, 24248, 24250, 24257, 24260, 24265, 24273, 24278, - 24285, 24294, 24299, 24302, 24305, 24311, 24344, 24350, - 24353, 24355, 24358, 24365, 24376, 24388, 24399, 24410, - 24420, 24430, 24440, 24450, 24463, 24470, 24478, 24489, - 24498, 24508, 24515, 24527, 24533, 24541, 24544, 24547, - 24551, 24554, 24562, 24566, 24572, 24574, 24624, 24626, - 24633, 24639, 24643, 24649, 24655, 24657, 24662, 24666, - 24670, 24674, 24677, 24681, 24685, 24689, 24695, 24702, - 24705, 24708, 24716, 24719, 24738, 24745, 24753, 24755, - 24759, 24763, 24769, 24777, 24781, 24783, 24814, 24819, - 24823, 24826, 24832, 24836, 24844, 24849, 24854, 24858, - 24866, 24869, 24875, 24880, 24886, 24891, 24908, 24916, - 24921, 24924, 24927, 24933, 24944, 24982, 24984, 24987, - 24991, 25001, 25005, 25031, 25035, 25039, 25043, 25048, - 25052, 25056, 25064, 25068, 25073, 25083, 25093, 25096, - 25102, 25106, 25110, 25115, 25118, 25121, 25133, 25136, - 25139, 25143, 25146, 25150, 25155, 25175, 25178, 25182, - 25184, 25187, 25190, 25194, 25201, 25205, 25207, 25213, - 25216, 25218, 25219, 25221, 25223, 25225, 25227, 25230, - 25234, 25238, 25241, 25246, 25250, 25252, 25254, 25256, - 25285, 25307, 25314, 25317, 25333, 25339, 25346, 25348, - 25350, 25352, 25360, 25364, 25367, 25370, 25374, 25380, - 25418, 25421, 25425, 25435, 25439, 25465, 25469, 25473, - 25477, 25482, 25486, 25490, 25498, 25502, 25507, 25517, - 25527, 25530, 25536, 25540, 25544, 25549, 25552, 25555, - 25567, 25570, 25573, 25577, 25580, 25585, 25588, 25593, - 25613, 25620, 25624, 25630, 25632, 25634, 25636, 25638, - 25640, 25643, 25647, 25651, 25654, 25659, 25663, 25665, - 25667, 25669, 25698, 25703, 25705, 25707, 25710, 25714, - 25718, 25724, 25731, 25736, 25740, 25746, 25749, 25754, - 25757, 25763, 25769, 25772, 25778, 25780, 25786, 25789, - 25791, 25795, 25797, 25803, 25805, 25810, 25812, 25834, - 25836, 25842, 25846, 25848, 25851, 25854, 25856, 25859, - 25861, 25863, 25866, 25868, 25872, 25874, 25877, 25880, - 25883, 25885, 25887, 25893, 25896, 25903, 25906, 25909, - 25911, 25913, 25915, 25917, 25920, 25922, 25924, 25940, - 25943, 25945, 25947, 25952, 25955, 25958, 25960, 25962, - 25965, 25968, 25970, 25974, 25979, 25983, 25986, 25992, - 25994, 25997, 25999, 26007, 26013, 26015, 26017, 26019, - 26025, 26027, 26047, 26050, 26052, 26056, 26059, 26061, - 26064, 26067, 26069, 26071, 26075, 26083, 26085, 26087, - 26090, 26093, 26095, 26097, 26099, 26104, 26106, 26108, - 26110, 26112, 26114, 26117, 26124, 26127, 26131, 26133, - 26136, 26139, 26143, 26145, 26147, 26149, 26151, 26157, - 26160, 26162, 26163, 26165, 26168, 26169, 26172, 26174, - 26178, 26180, 26182, 26185, 26187, 26191, 26193, 26236, - 26258, 26260, 26301, 26342, 26382, 26423, 26460, 26501, - 26538, 26561, 26598, 26638, 26675, 26712, 26739, 26761, - 26786, 26827, 26871, 26898, 26920, 26963, 26998, 27039, - 27076, 27117, 27159, 27202, 27245, 27287, 27331, 27376, - 27399, 27422, 27466, 27507, 27548, 27616, 27677, 27723, - 27765, 27820, 27865, 27911, 27952, 27980, 28006, 28033, - 28056, 28079, 28102, 28126, 28151, 28180, 28206, 28232, - 28260, 28283, 28306, 28329, 28354, 28408, 28476, 28516, - 28543, 28594, 28638, 28679, 28722, 28744, 28785, 28830, - 28873, 28914, 28956, 28998, 29041, 29066, 29104, 29136, - 29159, 29203, 29244, 29285, 29327, 29368, 29411, 29452, - 29496, 29540, 29582, 29623, 29664, 29709, 29751, 29793, - 29835, 29876, 29917, 29958, 29999, 30040, 30081, 30123, - 30164, 30205, 30249, 30293, 30337, 30378, 30419, 30463, - 30508, 30549, 30592, 30636, 30679, 30721, 30762, 30804, - 30845, 30890, 30949, 30993, 31034, 31080, 31121, 31166, - 31208, 31253, 31298, 31345, 31394, 31440, 31483, 31528, - 31570, 31614, 31658, 31705, 31750, 31794, 31841, 31882, - 31927, 31969, 32010, 32053, 32094, 32139, 32180, 32224, - 32265, 32292, 32315, 32338, 32361, 32384, 32407, 32430, - 32454, 32479, 32504, 32528, 32554, 32579, 32602, 32625, - 32649, 32674, 32699, 32723, 32749, 32774, 32797, 32820, - 32843, 32893, 32936, 32964, 32988, 33025, 33052, 33080, - 33103, 33126, 33149, 33172, 33222, 33265, 33293, 33317, - 33354, 33381, 33409, 33432, 33460, 33487, 33511, 33537, - 33565, 33591, 33619, 33649, 33675, 33699, 33723, 33750, - 33804, 33875, 33915, 33939, 33984, 34006, 34043, 34083, - 34107, 34130, 34152, 34174, 34200, 34223, 34246, 34269, - 34292, 34315, 34338, 34361, 34384, 34408, 34433, 34458, - 34482, 34508, 34533, 34556, 34579, 34603, 34628, 34653, - 34677, 34703, 34728, 34751, 34774, 34797, 34847, 34890, - 34918, 34942, 34979, 35006, 35034, 35057, 35080, 35103, - 35126, 35176, 35219, 35247, 35271, 35308, 35335, 35363, - 35386, 35410, 35435, 35460, 35487, 35515, 35541, 35566, - 35593, 35617, 35643, 35667, 35694, 35721, 35745, 35772, - 35795, 35822, 35846, 35869, 35894, 35917, 35944, 35967, - 35993, 36016, 36039, 36066, 36091, 36114, 36138, 36162, - 36185, 36209, 36232, 36255, 36279, 36302, 36327, 36350, - 36374, 36398, 36422, 36445, 36468, 36495, 36519, 36543, - 36567, 36590, 36613, 36636, 36659, 36682, 36705, 36729, - 36752, 36775, 36801, 36825, 36849, 36872, 36895, 36919, - 36943, 36966, 36991, 37017, 37042, 37066, 37089, 37113, - 37136, 37163, 37204, 37230, 37253, 37281, 37304, 37331, - 37356, 37378, 37402, 37454, 37494, 37538, 37579, 37622, - 37649, 37672, 37713, 37757, 37785, 37809, 37835, 37864, - 37890, 37918, 37948, 37974, 38017, 38058, 38100, 38143, - 38186, 38228, 38272, 38317, 38341, 38365, 38392, 38446, - 38517, 38557, 38586, 38638, 38679, 38724, 38767, 38808, - 38850, 38892, 38935, 38957, 38999, 39041, 39082, 39123, - 39164, 39205, 39246, 39287, 39329, 39370, 39411, 39455, - 39499, 39524, 39562, 39594, 39617, 39661, 39702, 39743, - 39787, 39832, 39873, 39916, 39960, 40003, 40045, 40086, - 40128, 40169, 40214, 40273, 40317, 40358, 40404, 40445, - 40490, 40534, 40575, 40616, 40658, 40699, 40742, 40783, - 40827, 40871, 40913, 40954, 40995, 41040, 41082, 41126, - 41167, 41208, 41276, 41337, 41383, 41425, 41480, 41525, - 41571, 41612, 41654, 41699, 41744, 41791, 41840, 41886, - 41929, 41974, 42016, 42060, 42104, 42151, 42196, 42240, - 42287, 42328, 42373, 42415, 42456, 42499, 42540, 42585, - 42626, 42670, 42711, 42753, 42791, + 0, 2, 4, 6, 8, 11, 15, 19, + 22, 27, 31, 33, 35, 37, 66, 71, + 73, 75, 78, 82, 86, 92, 99, 104, + 108, 114, 117, 122, 125, 131, 137, 140, + 146, 148, 154, 157, 159, 163, 165, 171, + 173, 178, 180, 202, 204, 210, 214, 216, + 219, 222, 224, 227, 229, 231, 234, 236, + 240, 242, 245, 248, 251, 253, 255, 261, + 264, 271, 274, 277, 279, 281, 283, 285, + 288, 290, 292, 308, 311, 313, 315, 320, + 323, 326, 328, 330, 333, 336, 338, 342, + 347, 351, 354, 360, 362, 365, 367, 374, + 380, 382, 384, 386, 392, 394, 414, 417, + 419, 423, 426, 428, 431, 434, 436, 438, + 442, 450, 452, 454, 457, 460, 462, 464, + 466, 471, 473, 475, 477, 479, 481, 484, + 491, 494, 498, 500, 503, 506, 510, 512, + 514, 516, 522, 525, 527, 528, 551, 586, + 591, 595, 596, 598, 600, 606, 608, 615, + 621, 623, 626, 628, 631, 636, 642, 647, + 652, 661, 666, 669, 672, 677, 710, 716, + 719, 721, 723, 726, 731, 742, 753, 764, + 774, 784, 792, 802, 811, 824, 830, 838, + 847, 856, 865, 872, 882, 888, 895, 898, + 900, 904, 906, 913, 917, 923, 925, 970, + 972, 978, 983, 988, 994, 1000, 1005, 1008, + 1012, 1015, 1018, 1020, 1023, 1026, 1029, 1035, + 1041, 1043, 1046, 1049, 1051, 1055, 1057, 1061, + 1064, 1068, 1070, 1074, 1078, 1084, 1087, 1090, + 1093, 1101, 1104, 1107, 1115, 1119, 1127, 1146, + 1149, 1154, 1156, 1158, 1170, 1174, 1176, 1178, + 1180, 1183, 1185, 1189, 1194, 1198, 1204, 1210, + 1212, 1218, 1222, 1224, 1227, 1230, 1260, 1262, + 1264, 1268, 1273, 1277, 1280, 1283, 1287, 1289, + 1295, 1297, 1301, 1307, 1311, 1315, 1319, 1323, + 1326, 1331, 1336, 1342, 1349, 1352, 1356, 1357, + 1361, 1363, 1366, 1383, 1391, 1395, 1397, 1399, + 1401, 1403, 1405, 1408, 1411, 1414, 1417, 1419, + 1421, 1424, 1430, 1441, 1479, 1485, 1488, 1490, + 1492, 1494, 1497, 1500, 1503, 1507, 1510, 1514, + 1516, 1519, 1521, 1523, 1526, 1533, 1536, 1538, + 1541, 1544, 1547, 1557, 1559, 1561, 1565, 1567, + 1570, 1572, 1574, 1599, 1603, 1605, 1609, 1611, + 1615, 1619, 1623, 1629, 1633, 1640, 1643, 1653, + 1663, 1666, 1670, 1674, 1678, 1681, 1684, 1686, + 1688, 1691, 1693, 1701, 1703, 1705, 1707, 1711, + 1715, 1717, 1729, 1731, 1734, 1737, 1741, 1743, + 1747, 1750, 1754, 1757, 1762, 1782, 1785, 1789, + 1791, 1793, 1801, 1803, 1810, 1815, 1817, 1821, + 1824, 1827, 1830, 1833, 1836, 1839, 1843, 1850, + 1854, 1864, 1884, 1890, 1894, 1896, 1899, 1901, + 1903, 1909, 1912, 1914, 1915, 1917, 1940, 1942, + 1944, 1946, 1948, 1951, 1955, 1959, 1964, 1970, + 1974, 1976, 1978, 1981, 2010, 2015, 2017, 2019, + 2022, 2028, 2032, 2040, 2048, 2055, 2059, 2066, + 2069, 2075, 2078, 2086, 2093, 2096, 2104, 2106, + 2113, 2116, 2119, 2123, 2126, 2133, 2135, 2140, + 2142, 2167, 2169, 2176, 2181, 2183, 2186, 2189, + 2191, 2196, 2199, 2201, 2204, 2206, 2208, 2210, + 2214, 2218, 2221, 2226, 2230, 2232, 2234, 2237, + 2243, 2246, 2253, 2256, 2259, 2261, 2263, 2265, + 2267, 2270, 2272, 2274, 2291, 2293, 2296, 2298, + 2300, 2305, 2308, 2313, 2316, 2318, 2321, 2328, + 2330, 2335, 2340, 2344, 2348, 2354, 2356, 2359, + 2361, 2368, 2375, 2377, 2379, 2381, 2387, 2389, + 2412, 2415, 2419, 2423, 2425, 2429, 2431, 2434, + 2439, 2441, 2444, 2448, 2456, 2458, 2462, 2465, + 2468, 2472, 2474, 2476, 2479, 2486, 2488, 2490, + 2492, 2494, 2496, 2499, 2507, 2510, 2514, 2516, + 2518, 2521, 2524, 2528, 2530, 2532, 2534, 2540, + 2543, 2545, 2546, 2551, 2553, 2560, 2563, 2568, + 2575, 2597, 2599, 2601, 2603, 2605, 2608, 2614, + 2619, 2621, 2628, 2631, 2636, 2643, 2648, 2655, + 2664, 2669, 2672, 2675, 2681, 2714, 2720, 2723, + 2725, 2728, 2735, 2746, 2758, 2769, 2780, 2790, + 2800, 2810, 2820, 2833, 2840, 2848, 2859, 2868, + 2878, 2885, 2897, 2903, 2911, 2914, 2917, 2921, + 2924, 2932, 2936, 2942, 2944, 2991, 2993, 3000, + 3006, 3010, 3016, 3022, 3024, 3029, 3033, 3037, + 3041, 3044, 3048, 3052, 3056, 3062, 3069, 3072, + 3075, 3080, 3088, 3091, 3110, 3114, 3122, 3124, + 3128, 3132, 3138, 3144, 3148, 3150, 3180, 3184, + 3189, 3193, 3196, 3202, 3206, 3214, 3219, 3223, + 3227, 3235, 3238, 3244, 3249, 3255, 3260, 3277, + 3285, 3290, 3294, 3298, 3301, 3304, 3307, 3313, + 3324, 3362, 3364, 3367, 3371, 3375, 3385, 3389, + 3415, 3419, 3423, 3427, 3430, 3435, 3439, 3443, + 3451, 3455, 3460, 3470, 3480, 3483, 3489, 3493, + 3497, 3502, 3505, 3508, 3512, 3524, 3527, 3530, + 3533, 3538, 3542, 3545, 3549, 3554, 3574, 3577, + 3581, 3583, 3588, 3591, 3594, 3598, 3605, 3609, + 3611, 3617, 3620, 3622, 3623, 3625, 3629, 3632, + 3637, 3641, 3643, 3645, 3647, 3676, 3681, 3683, + 3685, 3688, 3692, 3696, 3702, 3709, 3714, 3718, + 3724, 3727, 3732, 3735, 3741, 3747, 3750, 3756, + 3758, 3764, 3767, 3769, 3773, 3775, 3781, 3783, + 3788, 3790, 3812, 3814, 3820, 3824, 3826, 3829, + 3832, 3834, 3837, 3839, 3841, 3844, 3846, 3850, + 3852, 3855, 3858, 3861, 3863, 3865, 3871, 3874, + 3881, 3884, 3887, 3889, 3891, 3893, 3895, 3898, + 3900, 3902, 3918, 3921, 3923, 3925, 3930, 3933, + 3936, 3938, 3940, 3943, 3946, 3948, 3952, 3957, + 3961, 3964, 3971, 3977, 3981, 3984, 3986, 3993, + 3999, 4001, 4003, 4005, 4011, 4013, 4033, 4036, + 4038, 4042, 4045, 4047, 4050, 4053, 4055, 4057, + 4061, 4069, 4071, 4073, 4076, 4079, 4081, 4083, + 4085, 4090, 4092, 4094, 4096, 4098, 4100, 4103, + 4110, 4113, 4117, 4119, 4122, 4125, 4129, 4131, + 4133, 4135, 4141, 4144, 4146, 4147, 4153, 4160, + 4162, 4169, 4175, 4178, 4183, 4191, 4196, 4203, + 4212, 4217, 4220, 4223, 4229, 4262, 4268, 4271, + 4273, 4276, 4283, 4294, 4306, 4317, 4328, 4338, + 4348, 4358, 4368, 4381, 4388, 4396, 4407, 4416, + 4426, 4433, 4445, 4451, 4459, 4462, 4465, 4469, + 4472, 4480, 4484, 4490, 4492, 4539, 4541, 4548, + 4554, 4558, 4564, 4570, 4572, 4577, 4581, 4585, + 4589, 4592, 4596, 4600, 4604, 4610, 4617, 4620, + 4623, 4631, 4634, 4653, 4660, 4668, 4670, 4674, + 4678, 4684, 4690, 4694, 4696, 4726, 4731, 4735, + 4738, 4744, 4748, 4756, 4761, 4765, 4769, 4777, + 4780, 4786, 4791, 4797, 4802, 4819, 4826, 4831, + 4837, 4840, 4846, 4849, 4855, 4866, 4904, 4906, + 4909, 4913, 4923, 4927, 4953, 4957, 4961, 4965, + 4970, 4974, 4978, 4986, 4990, 4995, 5005, 5015, + 5018, 5024, 5028, 5032, 5037, 5040, 5043, 5055, + 5058, 5061, 5065, 5068, 5072, 5077, 5097, 5100, + 5104, 5106, 5109, 5112, 5116, 5123, 5127, 5129, + 5135, 5138, 5140, 5141, 5143, 5148, 5155, 5164, + 5169, 5172, 5175, 5181, 5214, 5220, 5223, 5225, + 5228, 5235, 5246, 5258, 5269, 5280, 5290, 5300, + 5310, 5320, 5333, 5340, 5348, 5359, 5368, 5378, + 5385, 5397, 5403, 5411, 5414, 5417, 5421, 5424, + 5432, 5436, 5442, 5444, 5491, 5493, 5500, 5506, + 5510, 5516, 5522, 5524, 5529, 5533, 5537, 5541, + 5544, 5548, 5552, 5556, 5562, 5569, 5572, 5575, + 5583, 5586, 5605, 5609, 5616, 5618, 5622, 5626, + 5632, 5643, 5648, 5650, 5652, 5654, 5656, 5659, + 5663, 5667, 5670, 5675, 5679, 5681, 5683, 5685, + 5714, 5719, 5721, 5723, 5726, 5730, 5734, 5740, + 5747, 5752, 5756, 5762, 5765, 5770, 5773, 5779, + 5785, 5788, 5794, 5796, 5802, 5805, 5807, 5811, + 5813, 5819, 5821, 5826, 5828, 5850, 5852, 5858, + 5862, 5864, 5867, 5870, 5872, 5875, 5877, 5879, + 5882, 5884, 5888, 5890, 5893, 5896, 5899, 5901, + 5903, 5909, 5912, 5919, 5923, 5929, 5931, 5933, + 5935, 5937, 5945, 5948, 5951, 5954, 5956, 5958, + 5960, 5976, 5979, 5981, 5983, 5988, 5991, 5994, + 5996, 5998, 6001, 6004, 6006, 6010, 6015, 6019, + 6022, 6031, 6033, 6037, 6039, 6041, 6043, 6045, + 6047, 6054, 6060, 6062, 6064, 6066, 6072, 6074, + 6094, 6097, 6099, 6103, 6106, 6108, 6111, 6114, + 6116, 6118, 6122, 6130, 6132, 6134, 6137, 6140, + 6142, 6144, 6146, 6151, 6153, 6155, 6157, 6159, + 6162, 6164, 6167, 6174, 6177, 6181, 6183, 6186, + 6189, 6193, 6195, 6197, 6199, 6205, 6208, 6210, + 6211, 6215, 6245, 6250, 6254, 6257, 6263, 6267, + 6275, 6280, 6284, 6288, 6296, 6299, 6305, 6310, + 6316, 6321, 6338, 6346, 6350, 6353, 6356, 6360, + 6366, 6377, 6415, 6417, 6420, 6424, 6434, 6438, + 6464, 6468, 6472, 6476, 6481, 6485, 6489, 6497, + 6501, 6506, 6516, 6526, 6529, 6535, 6539, 6543, + 6548, 6551, 6554, 6566, 6569, 6572, 6576, 6579, + 6584, 6589, 6609, 6612, 6616, 6618, 6621, 6624, + 6628, 6635, 6639, 6641, 6647, 6650, 6652, 6653, + 6655, 6660, 6662, 6669, 6672, 6678, 6685, 6691, + 6698, 6707, 6712, 6715, 6718, 6725, 6758, 6764, + 6767, 6769, 6772, 6778, 6789, 6800, 6811, 6821, + 6831, 6840, 6850, 6860, 6873, 6880, 6888, 6898, + 6907, 6917, 6924, 6935, 6941, 6949, 6952, 6955, + 6959, 6962, 6970, 6974, 6980, 6982, 7029, 7031, + 7038, 7042, 7046, 7052, 7058, 7060, 7064, 7068, + 7072, 7076, 7079, 7083, 7087, 7091, 7096, 7103, + 7106, 7109, 7117, 7120, 7139, 7145, 7154, 7156, + 7160, 7164, 7170, 7176, 7180, 7182, 7212, 7217, + 7221, 7224, 7230, 7234, 7241, 7246, 7250, 7254, + 7260, 7263, 7269, 7274, 7280, 7285, 7302, 7310, + 7316, 7323, 7326, 7333, 7336, 7342, 7353, 7391, + 7393, 7396, 7400, 7410, 7414, 7440, 7444, 7447, + 7451, 7456, 7460, 7464, 7471, 7475, 7480, 7490, + 7500, 7503, 7508, 7512, 7516, 7520, 7523, 7526, + 7538, 7541, 7544, 7548, 7551, 7555, 7560, 7580, + 7583, 7587, 7589, 7592, 7595, 7599, 7606, 7610, + 7612, 7618, 7621, 7623, 7624, 7626, 7632, 7637, + 7639, 7643, 7651, 7656, 7661, 7668, 7670, 7672, + 7676, 7709, 7711, 7713, 7715, 7719, 7727, 7736, + 7747, 7756, 7765, 7774, 7783, 7792, 7804, 7811, + 7818, 7827, 7835, 7844, 7850, 7859, 7865, 7873, + 7876, 7879, 7883, 7886, 7894, 7898, 7902, 7904, + 7951, 7953, 7960, 7966, 7969, 7973, 7978, 7980, + 7985, 7989, 7992, 7996, 8000, 8004, 8009, 8013, + 8015, 8017, 8021, 8024, 8043, 8050, 8058, 8060, + 8063, 8067, 8073, 8079, 8083, 8085, 8115, 8119, + 8121, 8128, 8132, 8135, 8142, 8144, 8148, 8153, + 8157, 8161, 8178, 8186, 8191, 8194, 8196, 8202, + 8213, 8251, 8253, 8256, 8259, 8267, 8270, 8295, + 8299, 8302, 8305, 8308, 8314, 8317, 8321, 8330, + 8339, 8344, 8347, 8350, 8355, 8358, 8370, 8373, + 8376, 8378, 8382, 8387, 8407, 8410, 8414, 8416, + 8419, 8422, 8426, 8433, 8436, 8438, 8444, 8447, + 8449, 8454, 8456, 8463, 8466, 8471, 8478, 8483, + 8490, 8499, 8504, 8507, 8510, 8516, 8549, 8555, + 8558, 8560, 8563, 8570, 8581, 8593, 8604, 8615, + 8625, 8635, 8645, 8655, 8668, 8675, 8683, 8694, + 8703, 8713, 8720, 8732, 8738, 8746, 8749, 8752, + 8756, 8759, 8767, 8771, 8777, 8779, 8826, 8828, + 8835, 8841, 8845, 8851, 8857, 8859, 8864, 8868, + 8872, 8876, 8878, 8880, 8883, 8887, 8891, 8895, + 8901, 8908, 8911, 8914, 8919, 8927, 8930, 8949, + 8953, 8960, 8962, 8966, 8970, 8976, 8987, 8992, + 8996, 9026, 9030, 9035, 9039, 9042, 9048, 9052, + 9060, 9065, 9069, 9073, 9081, 9084, 9090, 9095, + 9101, 9106, 9123, 9131, 9135, 9139, 9142, 9145, + 9149, 9155, 9166, 9204, 9206, 9209, 9213, 9217, + 9227, 9231, 9257, 9261, 9265, 9269, 9272, 9277, + 9281, 9285, 9293, 9297, 9302, 9312, 9322, 9325, + 9331, 9335, 9339, 9344, 9347, 9349, 9352, 9356, + 9368, 9371, 9374, 9377, 9382, 9386, 9389, 9394, + 9399, 9419, 9422, 9426, 9428, 9433, 9436, 9439, + 9443, 9450, 9454, 9456, 9462, 9465, 9467, 9468, + 9470, 9475, 9477, 9484, 9487, 9493, 9500, 9506, + 9513, 9522, 9527, 9530, 9533, 9540, 9573, 9579, + 9582, 9584, 9587, 9593, 9604, 9615, 9626, 9636, + 9646, 9655, 9665, 9675, 9688, 9695, 9703, 9713, + 9722, 9732, 9739, 9750, 9756, 9764, 9767, 9770, + 9774, 9777, 9785, 9789, 9795, 9797, 9844, 9846, + 9853, 9857, 9861, 9867, 9873, 9875, 9879, 9883, + 9887, 9891, 9894, 9898, 9902, 9906, 9911, 9918, + 9921, 9924, 9932, 9935, 9954, 9960, 9969, 9971, + 9975, 9979, 9985, 9991, 9995, 9997, 10027, 10032, + 10036, 10039, 10045, 10049, 10056, 10061, 10065, 10069, + 10075, 10078, 10084, 10089, 10095, 10100, 10117, 10125, + 10131, 10138, 10141, 10148, 10151, 10157, 10168, 10206, + 10208, 10211, 10215, 10225, 10229, 10255, 10259, 10262, + 10266, 10271, 10275, 10279, 10286, 10290, 10295, 10305, + 10315, 10318, 10323, 10327, 10331, 10335, 10338, 10341, + 10353, 10356, 10359, 10363, 10366, 10370, 10375, 10395, + 10398, 10402, 10404, 10407, 10410, 10414, 10421, 10425, + 10427, 10433, 10436, 10438, 10439, 10441, 10443, 10445, + 10447, 10449, 10452, 10456, 10460, 10465, 10471, 10475, + 10477, 10479, 10482, 10511, 10516, 10518, 10520, 10523, + 10529, 10533, 10541, 10549, 10556, 10560, 10567, 10570, + 10576, 10579, 10587, 10594, 10597, 10605, 10607, 10614, + 10617, 10620, 10624, 10627, 10634, 10636, 10641, 10643, + 10668, 10670, 10677, 10682, 10684, 10687, 10690, 10692, + 10697, 10700, 10702, 10705, 10707, 10711, 10715, 10718, + 10723, 10727, 10729, 10731, 10734, 10740, 10743, 10750, + 10753, 10756, 10758, 10760, 10762, 10764, 10767, 10769, + 10771, 10788, 10790, 10793, 10795, 10797, 10802, 10805, + 10810, 10813, 10815, 10818, 10825, 10827, 10832, 10837, + 10841, 10845, 10851, 10853, 10856, 10858, 10865, 10872, + 10874, 10876, 10878, 10884, 10886, 10909, 10912, 10916, + 10920, 10922, 10926, 10928, 10931, 10936, 10938, 10941, + 10945, 10953, 10955, 10959, 10962, 10965, 10969, 10971, + 10974, 10981, 10983, 10985, 10987, 10989, 10991, 10994, + 11002, 11005, 11009, 11011, 11013, 11016, 11019, 11023, + 11025, 11027, 11029, 11035, 11038, 11040, 11041, 11046, + 11048, 11055, 11058, 11064, 11071, 11077, 11085, 11094, + 11099, 11102, 11105, 11112, 11145, 11151, 11154, 11156, + 11159, 11166, 11177, 11189, 11200, 11211, 11221, 11231, + 11241, 11251, 11264, 11271, 11279, 11290, 11299, 11309, + 11316, 11328, 11334, 11342, 11345, 11348, 11352, 11355, + 11363, 11367, 11373, 11375, 11422, 11424, 11431, 11437, + 11441, 11447, 11453, 11455, 11460, 11464, 11468, 11472, + 11475, 11479, 11483, 11487, 11493, 11500, 11503, 11506, + 11514, 11517, 11536, 11542, 11551, 11553, 11557, 11561, + 11567, 11573, 11577, 11579, 11609, 11614, 11618, 11621, + 11627, 11631, 11639, 11644, 11648, 11652, 11660, 11663, + 11669, 11674, 11680, 11685, 11702, 11710, 11716, 11719, + 11722, 11728, 11739, 11777, 11779, 11782, 11786, 11796, + 11800, 11826, 11830, 11834, 11838, 11843, 11847, 11851, + 11859, 11863, 11868, 11878, 11888, 11891, 11897, 11901, + 11905, 11910, 11913, 11916, 11928, 11931, 11934, 11938, + 11941, 11945, 11950, 11970, 11973, 11977, 11979, 11982, + 11985, 11989, 11996, 12000, 12002, 12008, 12011, 12013, + 12014, 12016, 12022, 12024, 12031, 12034, 12039, 12047, + 12052, 12059, 12068, 12073, 12076, 12079, 12085, 12118, + 12124, 12127, 12129, 12132, 12139, 12150, 12162, 12173, + 12184, 12194, 12204, 12214, 12224, 12237, 12244, 12252, + 12263, 12272, 12282, 12289, 12301, 12307, 12315, 12318, + 12321, 12325, 12328, 12336, 12340, 12346, 12348, 12395, + 12397, 12404, 12410, 12414, 12420, 12426, 12428, 12433, + 12437, 12441, 12445, 12448, 12452, 12456, 12460, 12466, + 12473, 12476, 12479, 12487, 12490, 12509, 12516, 12524, + 12526, 12530, 12534, 12540, 12546, 12550, 12552, 12582, + 12587, 12591, 12594, 12600, 12604, 12612, 12617, 12621, + 12625, 12633, 12636, 12642, 12647, 12653, 12658, 12675, + 12683, 12688, 12691, 12694, 12700, 12711, 12749, 12751, + 12754, 12758, 12768, 12772, 12798, 12802, 12806, 12810, + 12815, 12819, 12823, 12831, 12835, 12840, 12850, 12860, + 12863, 12869, 12873, 12877, 12882, 12885, 12888, 12900, + 12903, 12906, 12910, 12913, 12917, 12922, 12942, 12945, + 12949, 12951, 12954, 12957, 12961, 12968, 12972, 12974, + 12980, 12983, 12985, 12986, 12988, 12993, 12995, 13002, + 13005, 13010, 13017, 13022, 13029, 13038, 13043, 13046, + 13049, 13055, 13088, 13094, 13097, 13099, 13102, 13109, + 13120, 13132, 13143, 13154, 13164, 13174, 13184, 13194, + 13207, 13214, 13222, 13233, 13242, 13252, 13259, 13271, + 13277, 13285, 13288, 13291, 13295, 13298, 13306, 13310, + 13316, 13318, 13365, 13367, 13374, 13380, 13384, 13390, + 13396, 13398, 13403, 13407, 13411, 13415, 13418, 13422, + 13426, 13430, 13436, 13443, 13446, 13449, 13457, 13460, + 13479, 13483, 13490, 13492, 13496, 13500, 13506, 13517, + 13522, 13526, 13556, 13561, 13565, 13568, 13574, 13578, + 13586, 13591, 13595, 13599, 13607, 13610, 13616, 13621, + 13627, 13632, 13649, 13657, 13661, 13665, 13668, 13671, + 13675, 13681, 13692, 13730, 13732, 13735, 13739, 13749, + 13753, 13779, 13783, 13787, 13791, 13796, 13800, 13804, + 13812, 13816, 13821, 13831, 13841, 13844, 13850, 13854, + 13858, 13863, 13866, 13869, 13881, 13884, 13887, 13891, + 13894, 13899, 13904, 13924, 13927, 13931, 13933, 13936, + 13939, 13943, 13950, 13954, 13956, 13962, 13965, 13967, + 13968, 13970, 13975, 13977, 13984, 13987, 13992, 13999, + 14004, 14011, 14020, 14025, 14028, 14031, 14037, 14070, + 14076, 14079, 14081, 14084, 14091, 14102, 14114, 14125, + 14136, 14146, 14156, 14166, 14176, 14189, 14196, 14204, + 14215, 14224, 14234, 14241, 14253, 14259, 14267, 14270, + 14273, 14277, 14280, 14288, 14292, 14298, 14300, 14347, + 14349, 14356, 14362, 14366, 14372, 14378, 14380, 14385, + 14389, 14393, 14397, 14400, 14404, 14408, 14412, 14418, + 14425, 14428, 14431, 14439, 14442, 14461, 14465, 14473, + 14475, 14479, 14483, 14489, 14500, 14505, 14509, 14539, + 14544, 14548, 14551, 14557, 14561, 14569, 14574, 14578, + 14582, 14590, 14593, 14599, 14604, 14610, 14615, 14632, + 14640, 14644, 14647, 14651, 14657, 14668, 14706, 14708, + 14711, 14715, 14725, 14729, 14755, 14759, 14763, 14767, + 14772, 14776, 14780, 14788, 14792, 14797, 14807, 14817, + 14820, 14826, 14830, 14834, 14839, 14842, 14845, 14857, + 14860, 14863, 14867, 14870, 14875, 14880, 14900, 14903, + 14907, 14909, 14912, 14915, 14919, 14926, 14930, 14932, + 14938, 14941, 14943, 14944, 14946, 14948, 14950, 14952, + 14954, 14957, 14961, 14965, 14968, 14973, 14977, 14979, + 14981, 14983, 15012, 15017, 15019, 15021, 15024, 15028, + 15032, 15038, 15045, 15050, 15054, 15060, 15063, 15068, + 15071, 15077, 15083, 15086, 15092, 15094, 15100, 15103, + 15105, 15109, 15111, 15117, 15119, 15124, 15126, 15148, + 15150, 15156, 15160, 15162, 15165, 15168, 15170, 15173, + 15175, 15177, 15180, 15182, 15186, 15188, 15191, 15194, + 15197, 15199, 15201, 15207, 15210, 15217, 15220, 15223, + 15225, 15227, 15229, 15231, 15234, 15236, 15238, 15254, + 15257, 15259, 15261, 15266, 15269, 15272, 15274, 15276, + 15279, 15282, 15284, 15288, 15293, 15297, 15300, 15306, + 15308, 15311, 15313, 15320, 15326, 15328, 15330, 15332, + 15338, 15340, 15360, 15363, 15365, 15369, 15372, 15374, + 15377, 15380, 15382, 15384, 15388, 15396, 15398, 15400, + 15403, 15406, 15408, 15410, 15412, 15417, 15419, 15421, + 15423, 15425, 15427, 15430, 15437, 15440, 15444, 15446, + 15449, 15452, 15456, 15458, 15460, 15462, 15468, 15471, + 15473, 15474, 15479, 15481, 15488, 15491, 15496, 15502, + 15507, 15512, 15521, 15526, 15529, 15532, 15537, 15570, + 15576, 15579, 15581, 15584, 15589, 15600, 15611, 15622, + 15632, 15642, 15650, 15660, 15669, 15682, 15688, 15696, + 15705, 15714, 15723, 15730, 15740, 15746, 15753, 15756, + 15758, 15762, 15764, 15771, 15775, 15781, 15783, 15828, + 15830, 15836, 15841, 15845, 15851, 15857, 15859, 15862, + 15865, 15869, 15873, 15876, 15880, 15882, 15886, 15890, + 15896, 15899, 15902, 15910, 15913, 15932, 15935, 15940, + 15942, 15946, 15950, 15956, 15962, 15966, 15968, 15998, + 16003, 16007, 16010, 16016, 16020, 16026, 16030, 16034, + 16038, 16042, 16045, 16050, 16055, 16061, 16065, 16082, + 16090, 16093, 16096, 16099, 16105, 16116, 16154, 16156, + 16159, 16163, 16173, 16177, 16202, 16206, 16208, 16212, + 16216, 16220, 16224, 16230, 16234, 16237, 16247, 16257, + 16260, 16264, 16268, 16272, 16275, 16278, 16280, 16292, + 16295, 16298, 16302, 16305, 16309, 16314, 16334, 16337, + 16341, 16343, 16346, 16349, 16353, 16360, 16364, 16366, + 16372, 16375, 16377, 16378, 16380, 16385, 16387, 16394, + 16397, 16403, 16410, 16416, 16424, 16433, 16438, 16441, + 16444, 16451, 16484, 16490, 16493, 16495, 16498, 16505, + 16516, 16528, 16539, 16550, 16560, 16570, 16580, 16590, + 16603, 16610, 16618, 16629, 16638, 16648, 16655, 16667, + 16673, 16681, 16684, 16687, 16691, 16694, 16702, 16706, + 16712, 16714, 16761, 16763, 16770, 16776, 16780, 16786, + 16792, 16794, 16799, 16803, 16807, 16811, 16814, 16818, + 16822, 16826, 16832, 16839, 16842, 16845, 16853, 16856, + 16875, 16881, 16890, 16892, 16896, 16900, 16906, 16912, + 16916, 16918, 16948, 16953, 16957, 16960, 16966, 16970, + 16978, 16983, 16987, 16991, 16999, 17002, 17008, 17013, + 17019, 17024, 17041, 17049, 17055, 17058, 17061, 17067, + 17078, 17116, 17118, 17121, 17125, 17135, 17139, 17165, + 17169, 17173, 17177, 17182, 17186, 17190, 17198, 17202, + 17207, 17217, 17227, 17230, 17236, 17240, 17244, 17249, + 17252, 17255, 17267, 17270, 17273, 17277, 17280, 17284, + 17289, 17309, 17312, 17316, 17318, 17321, 17324, 17328, + 17335, 17339, 17341, 17347, 17350, 17352, 17353, 17355, + 17360, 17362, 17369, 17372, 17377, 17384, 17389, 17396, + 17405, 17410, 17413, 17416, 17422, 17455, 17461, 17464, + 17466, 17469, 17476, 17487, 17499, 17510, 17521, 17531, + 17541, 17551, 17561, 17574, 17581, 17589, 17600, 17609, + 17619, 17626, 17638, 17644, 17652, 17655, 17658, 17662, + 17665, 17673, 17677, 17683, 17685, 17732, 17734, 17741, + 17747, 17751, 17757, 17763, 17765, 17770, 17774, 17778, + 17782, 17785, 17789, 17793, 17797, 17803, 17810, 17813, + 17816, 17824, 17827, 17846, 17850, 17858, 17860, 17864, + 17868, 17874, 17885, 17890, 17894, 17924, 17929, 17933, + 17936, 17942, 17946, 17954, 17959, 17963, 17967, 17975, + 17978, 17984, 17989, 17995, 18000, 18017, 18025, 18029, + 18032, 18036, 18042, 18053, 18091, 18093, 18096, 18100, + 18110, 18114, 18140, 18144, 18148, 18152, 18157, 18161, + 18165, 18173, 18177, 18182, 18192, 18202, 18205, 18211, + 18215, 18219, 18224, 18227, 18230, 18242, 18245, 18248, + 18252, 18255, 18260, 18265, 18285, 18288, 18292, 18294, + 18297, 18300, 18304, 18311, 18315, 18317, 18323, 18326, + 18328, 18329, 18331, 18333, 18335, 18337, 18339, 18342, + 18346, 18350, 18353, 18358, 18362, 18364, 18366, 18368, + 18397, 18419, 18426, 18429, 18445, 18451, 18458, 18460, + 18466, 18469, 18472, 18479, 18490, 18502, 18513, 18524, + 18534, 18544, 18554, 18564, 18577, 18584, 18592, 18603, + 18612, 18622, 18629, 18641, 18647, 18655, 18658, 18661, + 18669, 18673, 18679, 18686, 18692, 18694, 18700, 18702, + 18709, 18712, 18717, 18725, 18730, 18737, 18746, 18751, + 18754, 18757, 18763, 18796, 18802, 18805, 18807, 18810, + 18817, 18828, 18840, 18851, 18862, 18872, 18882, 18892, + 18902, 18915, 18922, 18930, 18941, 18950, 18960, 18967, + 18979, 18985, 18993, 18996, 18999, 19003, 19006, 19014, + 19018, 19024, 19026, 19076, 19078, 19085, 19091, 19092, + 19094, 19098, 19104, 19110, 19112, 19117, 19121, 19125, + 19129, 19132, 19136, 19140, 19144, 19150, 19157, 19160, + 19163, 19171, 19174, 19193, 19200, 19208, 19210, 19214, + 19218, 19224, 19232, 19236, 19238, 19241, 19245, 19247, + 19249, 19251, 19253, 19255, 19258, 19262, 19266, 19269, + 19274, 19278, 19280, 19282, 19284, 19313, 19318, 19320, + 19322, 19325, 19329, 19333, 19339, 19346, 19351, 19355, + 19361, 19364, 19369, 19372, 19378, 19384, 19387, 19393, + 19395, 19401, 19404, 19406, 19410, 19412, 19418, 19420, + 19425, 19427, 19452, 19454, 19460, 19464, 19465, 19467, + 19469, 19472, 19475, 19477, 19480, 19482, 19484, 19487, + 19489, 19493, 19495, 19498, 19501, 19504, 19506, 19508, + 19514, 19517, 19524, 19527, 19530, 19532, 19534, 19536, + 19538, 19546, 19548, 19550, 19552, 19554, 19556, 19574, + 19577, 19579, 19581, 19586, 19589, 19592, 19594, 19597, + 19600, 19603, 19605, 19609, 19614, 19618, 19621, 19622, + 19626, 19628, 19631, 19637, 19639, 19642, 19644, 19650, + 19657, 19663, 19665, 19667, 19669, 19675, 19677, 19697, + 19700, 19702, 19706, 19709, 19711, 19714, 19717, 19719, + 19721, 19725, 19733, 19735, 19737, 19740, 19743, 19745, + 19747, 19749, 19754, 19756, 19758, 19760, 19762, 19764, + 19767, 19774, 19777, 19781, 19783, 19786, 19789, 19793, + 19795, 19797, 19799, 19805, 19808, 19839, 19844, 19848, + 19851, 19857, 19861, 19869, 19874, 19879, 19883, 19891, + 19894, 19900, 19905, 19911, 19916, 19917, 19921, 19923, + 19926, 19943, 19951, 19956, 19959, 19961, 19967, 19978, + 20016, 20018, 20021, 20025, 20035, 20039, 20065, 20069, + 20073, 20077, 20082, 20086, 20090, 20098, 20102, 20107, + 20117, 20127, 20130, 20136, 20140, 20144, 20149, 20152, + 20155, 20167, 20170, 20173, 20177, 20180, 20184, 20189, + 20209, 20212, 20216, 20218, 20221, 20224, 20228, 20235, + 20239, 20241, 20247, 20250, 20252, 20254, 20258, 20264, + 20270, 20275, 20279, 20283, 20287, 20290, 20294, 20298, + 20304, 20311, 20314, 20317, 20325, 20330, 20338, 20342, + 20346, 20352, 20355, 20357, 20359, 20361, 20363, 20366, + 20370, 20374, 20377, 20382, 20386, 20388, 20390, 20392, + 20421, 20426, 20428, 20430, 20433, 20437, 20441, 20447, + 20454, 20459, 20463, 20469, 20472, 20477, 20480, 20486, + 20492, 20495, 20501, 20503, 20509, 20512, 20514, 20518, + 20520, 20526, 20528, 20533, 20535, 20557, 20559, 20565, + 20569, 20571, 20574, 20577, 20579, 20582, 20584, 20586, + 20589, 20591, 20595, 20597, 20600, 20603, 20606, 20608, + 20610, 20616, 20619, 20626, 20629, 20632, 20634, 20636, + 20638, 20640, 20643, 20645, 20647, 20663, 20666, 20668, + 20670, 20675, 20678, 20681, 20683, 20685, 20688, 20691, + 20693, 20697, 20702, 20706, 20709, 20715, 20717, 20720, + 20722, 20729, 20735, 20737, 20739, 20741, 20747, 20749, + 20769, 20772, 20774, 20778, 20781, 20783, 20786, 20789, + 20791, 20793, 20797, 20805, 20807, 20809, 20812, 20815, + 20817, 20819, 20821, 20826, 20828, 20830, 20832, 20834, + 20836, 20839, 20846, 20849, 20853, 20855, 20858, 20861, + 20865, 20867, 20869, 20871, 20877, 20880, 20882, 20883, + 20885, 20887, 20897, 20903, 20905, 20912, 20915, 20920, + 20928, 20933, 20940, 20949, 20954, 20957, 20960, 20966, + 20999, 21005, 21008, 21010, 21013, 21020, 21031, 21043, + 21054, 21065, 21075, 21085, 21095, 21105, 21118, 21125, + 21133, 21144, 21153, 21163, 21170, 21182, 21188, 21196, + 21199, 21202, 21206, 21209, 21217, 21221, 21227, 21229, + 21276, 21278, 21285, 21291, 21295, 21301, 21307, 21309, + 21314, 21318, 21322, 21326, 21329, 21333, 21337, 21341, + 21347, 21354, 21357, 21360, 21368, 21371, 21390, 21397, + 21405, 21407, 21411, 21415, 21421, 21427, 21431, 21433, + 21463, 21468, 21472, 21475, 21481, 21485, 21493, 21498, + 21502, 21506, 21514, 21517, 21523, 21528, 21534, 21539, + 21556, 21564, 21569, 21572, 21575, 21581, 21592, 21630, + 21632, 21635, 21639, 21649, 21653, 21679, 21683, 21687, + 21691, 21696, 21700, 21704, 21712, 21716, 21721, 21731, + 21741, 21744, 21750, 21754, 21758, 21763, 21766, 21769, + 21781, 21784, 21787, 21791, 21794, 21798, 21803, 21823, + 21826, 21830, 21832, 21835, 21838, 21842, 21849, 21853, + 21855, 21861, 21864, 21866, 21867, 21869, 21871, 21873, + 21875, 21877, 21880, 21884, 21888, 21891, 21896, 21900, + 21902, 21904, 21906, 21935, 21940, 21942, 21944, 21947, + 21951, 21955, 21961, 21968, 21973, 21977, 21983, 21986, + 21991, 21994, 22000, 22006, 22009, 22015, 22017, 22023, + 22026, 22028, 22032, 22034, 22040, 22042, 22047, 22049, + 22074, 22076, 22082, 22086, 22088, 22091, 22094, 22096, + 22099, 22101, 22103, 22106, 22108, 22112, 22114, 22117, + 22120, 22123, 22125, 22127, 22133, 22136, 22143, 22146, + 22149, 22151, 22153, 22155, 22157, 22165, 22167, 22169, + 22187, 22190, 22192, 22194, 22199, 22202, 22205, 22207, + 22210, 22213, 22216, 22218, 22222, 22227, 22231, 22234, + 22240, 22242, 22245, 22248, 22254, 22261, 22267, 22269, + 22271, 22273, 22279, 22281, 22301, 22304, 22306, 22310, + 22313, 22315, 22318, 22321, 22323, 22325, 22329, 22337, + 22339, 22341, 22344, 22347, 22349, 22351, 22353, 22358, + 22360, 22362, 22364, 22366, 22368, 22371, 22378, 22381, + 22385, 22387, 22390, 22393, 22397, 22399, 22401, 22403, + 22409, 22412, 22414, 22415, 22417, 22419, 22421, 22423, + 22426, 22430, 22434, 22437, 22442, 22446, 22448, 22450, + 22452, 22481, 22486, 22488, 22490, 22493, 22497, 22501, + 22507, 22514, 22519, 22523, 22529, 22532, 22537, 22540, + 22546, 22552, 22555, 22561, 22563, 22569, 22572, 22574, + 22578, 22580, 22586, 22588, 22593, 22595, 22617, 22619, + 22625, 22629, 22631, 22634, 22637, 22639, 22642, 22644, + 22646, 22649, 22651, 22655, 22657, 22660, 22663, 22666, + 22668, 22670, 22676, 22679, 22686, 22690, 22696, 22698, + 22700, 22702, 22704, 22712, 22715, 22718, 22721, 22723, + 22725, 22727, 22743, 22746, 22748, 22750, 22755, 22758, + 22761, 22763, 22765, 22768, 22771, 22773, 22777, 22782, + 22786, 22789, 22798, 22800, 22804, 22806, 22808, 22810, + 22817, 22823, 22825, 22827, 22829, 22835, 22837, 22857, + 22860, 22862, 22866, 22869, 22871, 22874, 22877, 22879, + 22881, 22885, 22893, 22895, 22897, 22900, 22903, 22905, + 22907, 22909, 22914, 22916, 22918, 22920, 22922, 22925, + 22927, 22930, 22937, 22940, 22944, 22946, 22949, 22952, + 22956, 22958, 22960, 22962, 22968, 22971, 22973, 22974, + 22976, 22978, 22980, 22982, 22984, 22987, 22991, 22995, + 22998, 23003, 23007, 23009, 23011, 23013, 23042, 23047, + 23049, 23051, 23054, 23058, 23062, 23068, 23075, 23080, + 23084, 23090, 23093, 23098, 23101, 23107, 23113, 23116, + 23122, 23124, 23130, 23133, 23135, 23139, 23141, 23147, + 23149, 23154, 23156, 23178, 23180, 23186, 23190, 23192, + 23195, 23198, 23200, 23203, 23205, 23207, 23210, 23212, + 23216, 23218, 23221, 23224, 23227, 23229, 23231, 23237, + 23240, 23247, 23250, 23253, 23255, 23257, 23259, 23261, + 23264, 23266, 23268, 23284, 23287, 23289, 23291, 23296, + 23299, 23302, 23304, 23306, 23309, 23312, 23314, 23318, + 23323, 23327, 23330, 23336, 23338, 23341, 23343, 23350, + 23356, 23358, 23360, 23362, 23368, 23370, 23390, 23393, + 23395, 23399, 23402, 23404, 23407, 23410, 23412, 23414, + 23418, 23426, 23428, 23430, 23433, 23436, 23438, 23440, + 23442, 23447, 23449, 23451, 23453, 23455, 23457, 23460, + 23467, 23470, 23474, 23476, 23479, 23482, 23486, 23488, + 23490, 23492, 23498, 23501, 23503, 23504, 23509, 23511, + 23513, 23515, 23517, 23519, 23522, 23526, 23530, 23533, + 23538, 23542, 23544, 23546, 23548, 23577, 23582, 23584, + 23586, 23589, 23593, 23597, 23603, 23610, 23615, 23619, + 23625, 23628, 23633, 23636, 23642, 23648, 23651, 23657, + 23659, 23665, 23668, 23670, 23674, 23676, 23682, 23684, + 23689, 23691, 23713, 23715, 23721, 23725, 23727, 23730, + 23733, 23735, 23738, 23740, 23742, 23745, 23747, 23751, + 23753, 23756, 23759, 23762, 23764, 23766, 23772, 23775, + 23782, 23785, 23788, 23790, 23792, 23794, 23796, 23799, + 23801, 23803, 23819, 23822, 23824, 23826, 23831, 23834, + 23837, 23839, 23841, 23844, 23847, 23849, 23853, 23858, + 23862, 23865, 23871, 23873, 23876, 23878, 23885, 23891, + 23893, 23895, 23897, 23903, 23905, 23925, 23928, 23930, + 23934, 23937, 23939, 23942, 23945, 23947, 23949, 23953, + 23961, 23963, 23965, 23968, 23971, 23973, 23975, 23977, + 23982, 23984, 23986, 23988, 23990, 23992, 23995, 24002, + 24005, 24009, 24011, 24014, 24017, 24021, 24023, 24025, + 24027, 24033, 24036, 24038, 24039, 24041, 24043, 24045, + 24048, 24052, 24056, 24059, 24064, 24068, 24070, 24072, + 24074, 24103, 24125, 24132, 24135, 24151, 24157, 24164, + 24166, 24168, 24173, 24177, 24180, 24186, 24190, 24198, + 24203, 24208, 24212, 24220, 24223, 24229, 24235, 24240, + 24242, 24248, 24250, 24257, 24260, 24265, 24273, 24278, + 24285, 24294, 24299, 24302, 24305, 24311, 24344, 24350, + 24353, 24355, 24358, 24365, 24376, 24388, 24399, 24410, + 24420, 24430, 24440, 24450, 24463, 24470, 24478, 24489, + 24498, 24508, 24515, 24527, 24533, 24541, 24544, 24547, + 24551, 24554, 24562, 24566, 24572, 24574, 24624, 24626, + 24633, 24639, 24643, 24649, 24655, 24657, 24662, 24666, + 24670, 24674, 24677, 24681, 24685, 24689, 24695, 24702, + 24705, 24708, 24716, 24719, 24738, 24745, 24753, 24755, + 24759, 24763, 24769, 24777, 24781, 24783, 24814, 24819, + 24823, 24826, 24832, 24836, 24844, 24849, 24854, 24858, + 24866, 24869, 24875, 24880, 24886, 24891, 24908, 24916, + 24921, 24924, 24927, 24933, 24944, 24982, 24984, 24987, + 24991, 25001, 25005, 25031, 25035, 25039, 25043, 25048, + 25052, 25056, 25064, 25068, 25073, 25083, 25093, 25096, + 25102, 25106, 25110, 25115, 25118, 25121, 25133, 25136, + 25139, 25143, 25146, 25150, 25155, 25175, 25178, 25182, + 25184, 25187, 25190, 25194, 25201, 25205, 25207, 25213, + 25216, 25218, 25219, 25221, 25223, 25225, 25227, 25230, + 25234, 25238, 25241, 25246, 25250, 25252, 25254, 25256, + 25285, 25307, 25314, 25317, 25333, 25339, 25346, 25348, + 25350, 25352, 25360, 25364, 25367, 25370, 25374, 25380, + 25418, 25421, 25425, 25435, 25439, 25465, 25469, 25473, + 25477, 25482, 25486, 25490, 25498, 25502, 25507, 25517, + 25527, 25530, 25536, 25540, 25544, 25549, 25552, 25555, + 25567, 25570, 25573, 25577, 25580, 25585, 25588, 25593, + 25613, 25620, 25624, 25630, 25632, 25634, 25636, 25638, + 25640, 25643, 25647, 25651, 25654, 25659, 25663, 25665, + 25667, 25669, 25698, 25703, 25705, 25707, 25710, 25714, + 25718, 25724, 25731, 25736, 25740, 25746, 25749, 25754, + 25757, 25763, 25769, 25772, 25778, 25780, 25786, 25789, + 25791, 25795, 25797, 25803, 25805, 25810, 25812, 25834, + 25836, 25842, 25846, 25848, 25851, 25854, 25856, 25859, + 25861, 25863, 25866, 25868, 25872, 25874, 25877, 25880, + 25883, 25885, 25887, 25893, 25896, 25903, 25906, 25909, + 25911, 25913, 25915, 25917, 25920, 25922, 25924, 25940, + 25943, 25945, 25947, 25952, 25955, 25958, 25960, 25962, + 25965, 25968, 25970, 25974, 25979, 25983, 25986, 25992, + 25994, 25997, 25999, 26007, 26013, 26015, 26017, 26019, + 26025, 26027, 26047, 26050, 26052, 26056, 26059, 26061, + 26064, 26067, 26069, 26071, 26075, 26083, 26085, 26087, + 26090, 26093, 26095, 26097, 26099, 26104, 26106, 26108, + 26110, 26112, 26114, 26117, 26124, 26127, 26131, 26133, + 26136, 26139, 26143, 26145, 26147, 26149, 26151, 26157, + 26160, 26162, 26163, 26165, 26168, 26169, 26172, 26174, + 26178, 26180, 26182, 26185, 26187, 26191, 26193, 26236, + 26258, 26260, 26301, 26342, 26382, 26423, 26460, 26501, + 26538, 26561, 26598, 26638, 26675, 26712, 26739, 26761, + 26786, 26827, 26871, 26898, 26920, 26963, 26998, 27039, + 27076, 27117, 27159, 27202, 27245, 27287, 27331, 27376, + 27399, 27422, 27466, 27507, 27548, 27616, 27677, 27723, + 27765, 27820, 27865, 27911, 27952, 27980, 28006, 28033, + 28056, 28079, 28102, 28126, 28151, 28180, 28206, 28232, + 28260, 28283, 28306, 28329, 28354, 28408, 28476, 28516, + 28543, 28594, 28638, 28679, 28722, 28744, 28785, 28830, + 28873, 28914, 28956, 28998, 29041, 29066, 29104, 29136, + 29159, 29203, 29244, 29285, 29327, 29368, 29411, 29452, + 29496, 29540, 29582, 29623, 29664, 29709, 29751, 29793, + 29835, 29876, 29917, 29958, 29999, 30040, 30081, 30123, + 30164, 30205, 30249, 30293, 30337, 30378, 30419, 30463, + 30508, 30549, 30592, 30636, 30679, 30721, 30762, 30804, + 30845, 30890, 30949, 30993, 31034, 31080, 31121, 31166, + 31208, 31253, 31298, 31345, 31394, 31440, 31483, 31528, + 31570, 31614, 31658, 31705, 31750, 31794, 31841, 31882, + 31927, 31969, 32010, 32053, 32094, 32139, 32180, 32224, + 32265, 32292, 32315, 32338, 32361, 32384, 32407, 32430, + 32454, 32479, 32504, 32528, 32554, 32579, 32602, 32625, + 32649, 32674, 32699, 32723, 32749, 32774, 32797, 32820, + 32843, 32893, 32936, 32964, 32988, 33025, 33052, 33080, + 33103, 33126, 33149, 33172, 33222, 33265, 33293, 33317, + 33354, 33381, 33409, 33432, 33460, 33487, 33511, 33537, + 33565, 33591, 33619, 33649, 33675, 33699, 33723, 33750, + 33804, 33875, 33915, 33939, 33984, 34006, 34043, 34083, + 34107, 34130, 34152, 34174, 34200, 34223, 34246, 34269, + 34292, 34315, 34338, 34361, 34384, 34408, 34433, 34458, + 34482, 34508, 34533, 34556, 34579, 34603, 34628, 34653, + 34677, 34703, 34728, 34751, 34774, 34797, 34847, 34890, + 34918, 34942, 34979, 35006, 35034, 35057, 35080, 35103, + 35126, 35176, 35219, 35247, 35271, 35308, 35335, 35363, + 35386, 35410, 35435, 35460, 35487, 35515, 35541, 35566, + 35593, 35617, 35643, 35667, 35694, 35721, 35745, 35772, + 35795, 35822, 35846, 35869, 35894, 35917, 35944, 35967, + 35993, 36016, 36039, 36066, 36091, 36114, 36138, 36162, + 36185, 36209, 36232, 36255, 36279, 36302, 36327, 36350, + 36374, 36398, 36422, 36445, 36468, 36495, 36519, 36543, + 36567, 36590, 36613, 36636, 36659, 36682, 36705, 36729, + 36752, 36775, 36801, 36825, 36849, 36872, 36895, 36919, + 36943, 36966, 36991, 37017, 37042, 37066, 37089, 37113, + 37136, 37163, 37204, 37230, 37253, 37281, 37304, 37331, + 37356, 37378, 37402, 37454, 37494, 37538, 37579, 37622, + 37649, 37672, 37713, 37757, 37785, 37809, 37835, 37864, + 37890, 37918, 37948, 37974, 38017, 38058, 38100, 38143, + 38186, 38228, 38272, 38317, 38341, 38365, 38392, 38446, + 38517, 38557, 38586, 38638, 38679, 38724, 38767, 38808, + 38850, 38892, 38935, 38957, 38999, 39041, 39082, 39123, + 39164, 39205, 39246, 39287, 39329, 39370, 39411, 39455, + 39499, 39524, 39562, 39594, 39617, 39661, 39702, 39743, + 39787, 39832, 39873, 39916, 39960, 40003, 40045, 40086, + 40128, 40169, 40214, 40273, 40317, 40358, 40404, 40445, + 40490, 40534, 40575, 40616, 40658, 40699, 40742, 40783, + 40827, 40871, 40913, 40954, 40995, 41040, 41082, 41126, + 41167, 41208, 41276, 41337, 41383, 41425, 41480, 41525, + 41571, 41612, 41654, 41699, 41744, 41791, 41840, 41886, + 41929, 41974, 42016, 42060, 42104, 42151, 42196, 42240, + 42287, 42328, 42373, 42415, 42456, 42499, 42540, 42585, + 42626, 42670, 42711, 42753, 42791, } var _s_indicies []int16 = []int16{ - 1, 0, 2, 1, 2, 1, 1, 0, - 1, 1, 0, 1, 1, 1, 0, 1, - 1, 1, 0, 1, 1, 0, 1, 1, - 1, 1, 0, 1, 1, 1, 0, 0, - 1, 1, 0, 1, 0, 3, 4, 5, - 6, 7, 9, 10, 11, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 8, - 12, 0, 1, 1, 1, 1, 2, 1, - 2, 1, 2, 2, 2, 1, 2, 2, - 2, 1, 1, 1, 1, 2, 2, 2, - 2, 2, 2, 1, 2, 2, 2, 2, - 2, 2, 1, 2, 2, 2, 2, 1, - 1, 1, 1, 2, 1, 1, 1, 1, - 1, 2, 1, 1, 2, 1, 1, 1, - 1, 2, 1, 1, 2, 2, 2, 2, - 2, 2, 1, 1, 1, 1, 1, 1, - 2, 1, 1, 2, 2, 2, 2, 2, - 2, 1, 1, 2, 1, 1, 1, 1, - 1, 2, 1, 1, 2, 1, 2, 1, - 1, 1, 2, 1, 2, 1, 1, 1, - 1, 1, 2, 1, 2, 1, 1, 1, - 1, 2, 1, 2, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, - 51, 0, 1, 2, 1, 1, 1, 1, - 1, 2, 1, 1, 1, 2, 1, 2, - 1, 1, 2, 1, 1, 2, 1, 2, - 2, 2, 1, 1, 2, 1, 2, 1, - 1, 2, 1, 2, 1, 1, 1, 2, - 1, 2, 1, 1, 2, 2, 2, 1, - 1, 1, 2, 1, 2, 1, 2, 1, - 1, 1, 1, 1, 2, 1, 1, 2, - 52, 53, 54, 55, 56, 57, 0, 1, - 1, 2, 1, 1, 2, 1, 2, 1, - 2, 1, 2, 1, 2, 58, 59, 0, - 1, 2, 1, 2, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 0, 1, 1, 2, 1, - 2, 1, 2, 1, 1, 1, 1, 2, - 1, 1, 2, 2, 2, 1, 1, 2, - 1, 2, 1, 1, 2, 2, 2, 1, - 1, 2, 1, 1, 1, 2, 1, 1, - 1, 1, 2, 1, 1, 1, 2, 1, - 1, 2, 75, 76, 56, 61, 77, 0, - 1, 2, 1, 1, 2, 1, 2, 78, - 79, 80, 81, 82, 83, 0, 84, 85, - 86, 87, 88, 2, 1, 2, 1, 2, - 1, 2, 1, 1, 1, 1, 1, 2, - 1, 2, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, - 103, 100, 104, 105, 106, 2, 1, 1, - 2, 2, 1, 2, 2, 2, 1, 1, - 1, 2, 1, 2, 1, 1, 2, 2, - 2, 1, 1, 2, 1, 2, 1, 1, - 1, 2, 1, 1, 1, 1, 1, 1, - 1, 2, 1, 2, 2, 1, 1, 1, - 2, 2, 2, 1, 2, 1, 1, 2, - 1, 2, 107, 108, 109, 110, 2, 1, - 2, 1, 2, 1, 2, 1, 2, 111, - 2, 1, 1, 2, 112, 113, 114, 115, - 116, 117, 2, 1, 1, 2, 2, 2, - 2, 1, 1, 2, 1, 1, 2, 2, - 2, 1, 1, 1, 1, 2, 118, 2, - 1, 2, 119, 0, 120, 121, 122, 124, - 123, 2, 1, 1, 2, 2, 1, 1, - 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 145, 146, 147, 126, 125, 149, - 150, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 165, 166, - 167, 168, 169, 170, 171, 172, 173, 174, - 175, 177, 178, 179, 180, 148, 148, 151, - 176, 2, 148, 181, 148, 148, 2, 148, - 148, 148, 2, 148, 2, 148, 148, 2, - 2, 2, 2, 2, 2, 148, 2, 181, - 2, 2, 148, 2, 148, 2, 181, 148, - 148, 148, 148, 148, 2, 2, 148, 2, - 181, 148, 2, 148, 2, 2, 148, 2, - 2, 181, 2, 148, 181, 181, 181, 148, - 148, 2, 181, 181, 181, 148, 2, 181, - 148, 181, 148, 2, 2, 2, 2, 181, - 181, 2, 2, 2, 148, 148, 181, 148, - 181, 2, 2, 148, 181, 181, 2, 148, - 148, 148, 181, 148, 2, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, - 209, 210, 211, 212, 213, 2, 148, 148, - 148, 148, 181, 2, 148, 181, 2, 148, - 2, 181, 2, 148, 148, 181, 148, 148, - 2, 148, 181, 2, 2, 2, 181, 181, - 2, 2, 2, 2, 181, 148, 148, 2, - 2, 2, 2, 2, 148, 2, 148, 2, - 181, 181, 181, 148, 148, 148, 148, 148, - 148, 148, 181, 2, 2, 2, 2, 2, - 2, 148, 2, 148, 2, 181, 148, 181, - 148, 148, 148, 148, 148, 148, 181, 2, - 2, 2, 148, 148, 2, 148, 2, 181, - 148, 181, 148, 148, 148, 148, 148, 148, - 181, 2, 148, 181, 181, 181, 181, 148, - 148, 181, 2, 181, 148, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 181, 2, - 148, 181, 181, 181, 181, 2, 148, 181, - 148, 148, 148, 148, 181, 2, 2, 2, - 2, 2, 148, 2, 148, 2, 181, 148, - 181, 148, 148, 148, 148, 148, 181, 2, - 148, 181, 181, 181, 181, 148, 181, 148, - 2, 148, 181, 148, 148, 148, 181, 2, - 2, 2, 148, 2, 2, 148, 2, 148, - 2, 181, 148, 181, 148, 148, 148, 2, - 181, 181, 148, 181, 181, 181, 2, 181, - 181, 2, 181, 2, 181, 181, 181, 2, - 181, 2, 148, 181, 181, 181, 181, 181, - 2, 148, 148, 181, 2, 181, 181, 148, - 181, 181, 2, 181, 2, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 151, - 152, 248, 249, 250, 251, 252, 151, 153, - 151, 2, 181, 2, 181, 181, 181, 181, - 181, 2, 181, 181, 181, 148, 2, 2, - 2, 2, 2, 148, 2, 2, 2, 2, - 2, 148, 2, 2, 2, 2, 2, 148, - 148, 148, 148, 148, 2, 2, 2, 148, - 2, 181, 2, 148, 148, 148, 2, 2, - 2, 148, 148, 2, 2, 2, 148, 148, - 148, 2, 2, 2, 148, 148, 148, 181, - 148, 181, 2, 148, 181, 148, 148, 181, - 2, 181, 2, 2, 2, 181, 181, 148, - 2, 2, 148, 181, 148, 148, 2, 2, - 148, 148, 181, 181, 2, 148, 181, 2, - 181, 181, 181, 2, 181, 2, 181, 148, - 181, 2, 148, 2, 2, 181, 181, 148, - 181, 148, 148, 2, 181, 2, 148, 148, - 181, 2, 148, 148, 2, 181, 181, 181, - 148, 181, 148, 181, 2, 181, 181, 2, - 2, 2, 148, 2, 2, 2, 2, 2, - 2, 2, 148, 148, 148, 148, 2, 148, - 148, 148, 148, 148, 148, 148, 2, 253, - 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 151, 264, 265, 266, 267, 268, - 269, 2, 181, 181, 2, 148, 148, 181, - 181, 2, 148, 2, 181, 2, 148, 148, - 148, 148, 148, 148, 148, 148, 148, 148, - 148, 2, 148, 148, 148, 2, 2, 148, - 148, 2, 2, 148, 148, 148, 2, 2, - 148, 2, 181, 2, 148, 148, 148, 148, - 148, 2, 181, 2, 2, 148, 148, 148, - 148, 148, 148, 2, 148, 148, 148, 148, - 181, 2, 148, 2, 270, 271, 272, 151, - 273, 2, 148, 181, 148, 2, 181, 2, - 148, 148, 2, 2, 2, 148, 153, 274, - 275, 153, 276, 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 152, - 297, 153, 151, 2, 2, 148, 148, 2, - 2, 2, 2, 148, 148, 148, 181, 181, - 2, 148, 181, 148, 2, 181, 2, 148, - 148, 148, 2, 2, 2, 2, 148, 148, - 2, 181, 181, 181, 181, 2, 148, 148, - 2, 181, 148, 181, 2, 148, 148, 2, - 148, 2, 181, 148, 181, 148, 2, 181, - 2, 2, 148, 181, 148, 181, 2, 148, - 2, 2, 181, 148, 181, 2, 181, 148, - 181, 181, 2, 181, 181, 181, 181, 2, - 181, 148, 181, 148, 181, 2, 148, 148, - 148, 148, 148, 148, 2, 2, 2, 148, - 148, 181, 181, 2, 151, 298, 299, 2, - 151, 2, 148, 2, 2, 148, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 151, 2, 181, - 148, 148, 148, 148, 148, 148, 2, 148, - 148, 148, 2, 2, 148, 148, 2, 2, - 148, 148, 2, 2, 148, 2, 2, 148, - 181, 181, 2, 148, 148, 2, 181, 2, - 148, 148, 2, 148, 2, 181, 148, 2, - 148, 148, 148, 148, 181, 2, 315, 316, - 317, 318, 319, 320, 321, 322, 323, 324, - 2, 325, 326, 153, 327, 328, 329, 330, - 331, 332, 333, 334, 335, 153, 151, 336, - 337, 338, 153, 339, 340, 341, 342, 343, - 344, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 153, 259, 151, 354, 2, 148, - 148, 148, 148, 148, 2, 2, 2, 148, - 2, 148, 148, 2, 181, 2, 148, 148, - 2, 181, 2, 148, 148, 148, 2, 2, - 181, 2, 148, 148, 148, 2, 2, 2, - 2, 148, 2, 148, 148, 148, 2, 2, - 148, 2, 148, 148, 148, 2, 148, 148, - 148, 148, 148, 148, 2, 2, 2, 148, - 148, 2, 148, 148, 2, 148, 148, 2, - 148, 148, 2, 148, 181, 181, 181, 181, - 148, 148, 148, 181, 2, 148, 2, 148, - 2, 148, 148, 181, 2, 148, 2, 148, - 148, 2, 148, 2, 148, 2, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 368, 369, 370, 371, 368, - 372, 373, 374, 375, 376, 377, 2, 181, - 148, 181, 2, 2, 181, 148, 2, 2, - 181, 148, 2, 181, 148, 181, 2, 181, - 148, 148, 2, 181, 148, 181, 2, 148, - 148, 148, 2, 2, 181, 148, 148, 181, - 2, 148, 148, 148, 148, 148, 148, 2, - 181, 2, 148, 148, 181, 148, 148, 148, - 148, 148, 148, 181, 2, 148, 181, 181, - 181, 181, 148, 181, 181, 181, 2, 148, - 181, 2, 2, 148, 2, 181, 148, 181, - 181, 2, 2, 148, 2, 181, 148, 2, - 181, 148, 181, 2, 181, 2, 148, 2, - 2, 2, 148, 148, 2, 153, 378, 379, - 380, 151, 153, 151, 2, 2, 148, 2, - 148, 2, 148, 153, 379, 151, 2, 153, - 381, 151, 2, 2, 148, 153, 382, 343, - 383, 384, 385, 386, 153, 387, 388, 151, - 2, 2, 148, 148, 181, 2, 148, 181, - 2, 148, 148, 148, 2, 2, 148, 2, - 181, 2, 148, 181, 148, 2, 153, 389, - 390, 2, 2, 2, 148, 148, 148, 181, - 181, 2, 391, 392, 393, 153, 394, 395, - 396, 397, 398, 399, 400, 401, 402, 403, - 404, 405, 406, 407, 151, 2, 181, 181, - 2, 2, 2, 2, 181, 181, 2, 2, - 148, 2, 2, 2, 2, 2, 2, 2, - 148, 2, 148, 2, 2, 2, 2, 2, - 2, 148, 148, 148, 148, 148, 2, 2, - 148, 2, 2, 2, 148, 2, 2, 148, - 2, 2, 148, 2, 2, 148, 2, 2, - 148, 181, 181, 2, 2, 2, 181, 181, - 181, 181, 2, 153, 408, 409, 410, 411, - 151, 2, 2, 181, 2, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 148, 2, - 148, 148, 148, 148, 148, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 148, 148, - 148, 148, 148, 2, 148, 148, 148, 148, - 148, 2, 412, 413, 414, 2, 148, 2, - 2, 2, 148, 2, 148, 415, 2, 416, - 417, 155, 419, 418, 2, 181, 181, 2, - 2, 181, 181, 2, 181, 422, 423, 424, - 425, 426, 427, 428, 429, 430, 431, 432, - 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 421, 420, 443, 420, 443, 420, - 420, 443, 443, 420, 443, 443, 420, 443, - 443, 443, 420, 443, 443, 443, 420, 421, - 443, 443, 421, 420, 443, 443, 443, 443, - 421, 420, 443, 443, 443, 420, 420, 443, - 443, 420, 421, 443, 420, 444, 445, 446, - 447, 448, 450, 451, 452, 454, 455, 456, - 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 449, - 453, 420, 443, 443, 443, 443, 420, 443, - 420, 443, 420, 420, 420, 443, 420, 420, - 420, 421, 420, 443, 443, 443, 443, 420, - 420, 420, 420, 420, 420, 421, 420, 443, - 420, 420, 420, 420, 421, 420, 420, 443, - 420, 420, 420, 420, 421, 420, 443, 443, - 443, 443, 420, 443, 443, 443, 443, 443, - 421, 420, 443, 443, 420, 443, 443, 443, - 443, 421, 420, 443, 443, 420, 420, 420, - 420, 420, 420, 421, 420, 443, 443, 443, - 443, 443, 443, 421, 420, 443, 443, 420, - 420, 420, 420, 420, 420, 421, 420, 443, - 443, 420, 443, 443, 443, 443, 421, 443, - 420, 443, 443, 420, 443, 421, 420, 443, - 443, 443, 420, 443, 421, 420, 443, 443, - 443, 443, 421, 443, 420, 443, 420, 443, - 443, 443, 443, 420, 443, 420, 472, 473, - 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, - 490, 491, 492, 493, 494, 495, 420, 443, - 420, 421, 443, 443, 443, 443, 443, 420, - 443, 443, 421, 443, 420, 443, 420, 443, - 443, 420, 443, 443, 420, 443, 420, 420, - 420, 421, 420, 443, 443, 421, 420, 443, - 420, 443, 443, 420, 421, 2, 421, 2, - 443, 420, 443, 443, 443, 420, 421, 421, - 443, 420, 443, 443, 420, 420, 421, 420, - 420, 443, 443, 443, 421, 420, 443, 420, - 443, 420, 421, 421, 420, 443, 443, 443, - 443, 443, 420, 443, 443, 420, 496, 497, - 498, 499, 500, 501, 420, 443, 443, 420, - 443, 443, 420, 443, 420, 443, 420, 443, - 420, 443, 420, 502, 503, 420, 443, 420, - 443, 420, 504, 505, 506, 507, 508, 509, - 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 420, 421, 420, 443, 443, 420, - 443, 420, 443, 420, 443, 443, 443, 443, - 420, 443, 443, 420, 420, 421, 420, 420, - 443, 421, 443, 420, 443, 420, 443, 443, - 420, 420, 421, 420, 420, 421, 420, 443, - 443, 420, 443, 443, 421, 443, 420, 443, - 443, 443, 443, 420, 443, 443, 443, 420, - 443, 443, 421, 420, 520, 521, 500, 506, - 522, 420, 443, 420, 443, 443, 420, 443, - 420, 523, 524, 525, 526, 527, 528, 420, - 529, 530, 531, 504, 532, 533, 420, 443, - 420, 443, 420, 443, 420, 443, 443, 443, - 443, 443, 420, 443, 420, 534, 535, 536, - 537, 538, 539, 540, 541, 542, 543, 544, - 545, 546, 547, 548, 549, 546, 550, 551, - 552, 553, 504, 420, 443, 443, 420, 420, - 421, 420, 443, 420, 420, 420, 443, 421, - 420, 443, 443, 421, 420, 443, 420, 443, - 443, 420, 420, 420, 421, 420, 443, 443, - 420, 443, 421, 420, 443, 443, 443, 420, - 443, 443, 443, 443, 443, 443, 443, 420, - 443, 420, 420, 421, 420, 443, 443, 443, - 420, 420, 420, 443, 420, 421, 420, 443, - 443, 420, 421, 2, 443, 421, 420, 504, - 554, 555, 484, 556, 557, 420, 443, 420, - 443, 420, 443, 420, 443, 420, 558, 420, - 443, 443, 420, 559, 560, 561, 562, 563, - 564, 565, 420, 443, 443, 420, 420, 420, - 420, 443, 443, 420, 421, 420, 443, 443, - 420, 420, 420, 443, 443, 443, 443, 420, - 566, 420, 443, 420, 567, 420, 568, 569, - 423, 424, 570, 420, 443, 443, 420, 420, - 443, 443, 148, 571, 148, 148, 420, 571, - 420, 420, 420, 148, 420, 148, 420, 571, - 420, 571, 148, 420, 420, 571, 420, 148, - 571, 148, 571, 571, 572, 572, 420, 573, - 574, 575, 576, 577, 578, 579, 580, 581, - 582, 583, 584, 585, 586, 587, 588, 589, - 590, 591, 592, 593, 420, 594, 420, 594, - 420, 420, 594, 594, 420, 594, 594, 420, - 594, 594, 594, 595, 595, 420, 148, 595, - 148, 148, 420, 420, 595, 420, 420, 148, - 420, 148, 420, 595, 420, 595, 148, 420, - 420, 595, 420, 148, 595, 148, 595, 595, - 572, 572, 420, 595, 595, 595, 148, 420, - 421, 595, 148, 595, 421, 148, 420, 420, - 420, 420, 595, 595, 421, 420, 420, 148, - 148, 595, 148, 595, 420, 420, 148, 595, - 595, 420, 148, 148, 421, 148, 595, 148, - 420, 596, 597, 184, 598, 599, 600, 601, - 602, 603, 604, 605, 606, 607, 608, 609, - 610, 611, 612, 613, 614, 615, 616, 617, - 618, 619, 620, 621, 622, 623, 624, 625, - 626, 420, 148, 148, 148, 148, 595, 420, - 148, 595, 420, 595, 420, 148, 148, 595, - 148, 420, 148, 420, 421, 148, 595, 420, - 420, 420, 595, 595, 420, 420, 420, 420, - 595, 148, 148, 420, 420, 420, 420, 420, - 148, 420, 421, 148, 420, 595, 595, 595, - 148, 148, 148, 148, 148, 148, 148, 595, - 420, 420, 420, 420, 420, 420, 148, 420, - 421, 148, 420, 595, 148, 595, 148, 148, - 148, 148, 148, 148, 595, 420, 420, 420, - 148, 148, 420, 148, 420, 421, 420, 595, - 148, 595, 148, 148, 148, 148, 148, 148, - 595, 420, 148, 595, 595, 595, 595, 148, - 148, 595, 421, 420, 595, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 148, 595, - 420, 148, 595, 595, 595, 595, 421, 420, - 148, 595, 148, 148, 148, 148, 595, 420, - 420, 420, 420, 420, 148, 420, 148, 420, - 421, 420, 595, 148, 595, 148, 148, 148, - 148, 148, 595, 420, 148, 595, 595, 595, - 595, 148, 595, 421, 148, 420, 148, 595, - 148, 148, 148, 595, 420, 420, 420, 148, - 420, 420, 148, 420, 421, 420, 148, 420, - 595, 148, 595, 148, 148, 148, 420, 595, - 595, 148, 595, 595, 421, 595, 420, 595, - 595, 420, 595, 421, 420, 595, 595, 595, - 420, 595, 421, 420, 148, 595, 595, 595, - 595, 421, 595, 420, 148, 148, 595, 420, - 595, 595, 148, 595, 595, 420, 595, 420, - 627, 628, 629, 217, 218, 219, 220, 221, - 630, 223, 224, 225, 226, 227, 228, 631, - 632, 633, 634, 635, 234, 636, 236, 637, - 483, 484, 638, 639, 640, 641, 642, 643, - 644, 645, 646, 647, 151, 152, 648, 249, - 250, 251, 252, 151, 153, 151, 420, 595, - 420, 421, 595, 595, 595, 595, 595, 420, - 595, 595, 421, 595, 148, 420, 420, 595, - 420, 148, 148, 148, 595, 148, 595, 420, - 148, 595, 148, 148, 595, 420, 595, 420, - 420, 420, 421, 420, 595, 595, 421, 148, - 420, 595, 148, 148, 420, 148, 595, 595, - 420, 148, 595, 420, 595, 595, 595, 420, - 421, 421, 595, 420, 595, 148, 595, 420, - 148, 420, 421, 420, 420, 595, 595, 148, - 595, 148, 421, 148, 420, 595, 420, 148, - 148, 595, 420, 421, 148, 421, 148, 2, - 595, 595, 595, 148, 595, 148, 595, 420, - 595, 595, 420, 649, 650, 255, 651, 257, - 258, 259, 260, 261, 262, 263, 151, 652, - 265, 653, 267, 654, 269, 420, 595, 595, - 571, 420, 420, 148, 148, 420, 420, 595, - 420, 571, 595, 420, 420, 595, 420, 148, - 595, 420, 420, 148, 148, 148, 148, 148, - 595, 420, 655, 656, 272, 151, 273, 420, - 148, 595, 148, 420, 595, 420, 153, 274, - 275, 153, 657, 658, 659, 660, 280, 281, - 282, 661, 284, 662, 663, 664, 665, 666, - 667, 668, 669, 670, 671, 295, 296, 152, - 672, 153, 151, 420, 2, 421, 2, 148, - 148, 148, 595, 595, 420, 148, 595, 148, - 420, 595, 420, 148, 595, 595, 595, 595, - 420, 148, 595, 148, 595, 420, 148, 148, - 420, 421, 420, 148, 420, 595, 421, 148, - 595, 148, 420, 595, 420, 420, 148, 595, - 148, 595, 420, 148, 420, 421, 420, 420, - 421, 420, 595, 148, 595, 420, 595, 148, - 595, 421, 595, 420, 595, 595, 595, 595, - 420, 595, 148, 595, 148, 595, 420, 148, - 595, 595, 421, 420, 673, 674, 302, 303, - 304, 305, 306, 307, 675, 676, 677, 678, - 312, 679, 680, 151, 420, 595, 572, 148, - 148, 572, 572, 572, 420, 572, 572, 572, - 148, 2, 595, 595, 571, 420, 571, 148, - 148, 420, 595, 420, 148, 571, 148, 420, - 595, 148, 420, 148, 148, 148, 148, 595, - 420, 681, 682, 317, 318, 319, 683, 684, - 685, 686, 324, 420, 325, 326, 153, 327, - 328, 687, 330, 688, 332, 689, 334, 335, - 153, 151, 690, 337, 338, 153, 339, 340, - 341, 342, 343, 344, 345, 346, 691, 348, - 349, 692, 351, 352, 353, 153, 259, 151, - 354, 420, 595, 420, 595, 420, 148, 420, - 595, 420, 148, 2, 421, 2, 148, 148, - 595, 595, 595, 595, 148, 148, 148, 595, - 420, 148, 148, 595, 420, 693, 694, 695, - 696, 697, 698, 699, 700, 701, 364, 702, - 703, 704, 705, 706, 707, 708, 705, 709, - 710, 552, 711, 375, 712, 377, 420, 595, - 148, 595, 420, 420, 421, 420, 595, 148, - 420, 420, 595, 148, 421, 2, 595, 148, - 595, 421, 420, 595, 148, 148, 420, 595, - 148, 595, 420, 420, 148, 420, 420, 421, - 148, 420, 595, 148, 148, 595, 420, 595, - 420, 421, 420, 148, 148, 595, 148, 148, - 148, 148, 148, 148, 595, 420, 148, 595, - 595, 595, 595, 148, 595, 595, 595, 420, - 148, 595, 420, 420, 148, 420, 421, 420, - 595, 148, 595, 595, 420, 420, 148, 420, - 595, 148, 420, 421, 420, 595, 148, 595, - 420, 595, 421, 420, 421, 2, 2, 148, - 153, 382, 713, 714, 715, 716, 386, 153, - 717, 718, 151, 420, 148, 421, 2, 148, - 595, 420, 148, 595, 420, 148, 421, 148, - 148, 2, 420, 595, 420, 148, 595, 148, - 420, 153, 389, 719, 420, 148, 148, 595, - 595, 420, 720, 721, 722, 153, 394, 395, - 396, 397, 398, 399, 400, 401, 402, 403, - 723, 724, 725, 726, 151, 420, 595, 595, - 420, 420, 420, 420, 595, 595, 420, 2, - 2, 421, 2, 148, 595, 595, 420, 420, - 420, 595, 595, 595, 595, 420, 153, 727, - 409, 410, 411, 151, 420, 420, 595, 420, - 148, 728, 420, 729, 730, 731, 733, 732, - 420, 595, 595, 420, 420, 595, 595, 420, - 595, 594, 594, 594, 420, 594, 594, 420, - 594, 594, 594, 594, 420, 594, 594, 594, - 420, 420, 594, 594, 420, 594, 420, 734, - 735, 736, 737, 738, 740, 741, 742, 744, - 745, 746, 747, 748, 749, 750, 751, 752, - 753, 754, 755, 756, 757, 758, 759, 760, - 761, 739, 743, 420, 594, 594, 594, 594, - 420, 594, 420, 594, 420, 420, 420, 594, - 420, 420, 420, 594, 594, 594, 594, 420, - 420, 420, 420, 420, 420, 594, 420, 420, - 420, 420, 420, 420, 594, 420, 420, 420, - 420, 594, 594, 594, 594, 420, 594, 594, - 594, 594, 594, 420, 594, 594, 420, 594, - 594, 594, 594, 420, 594, 594, 420, 420, - 420, 420, 420, 420, 594, 594, 594, 594, - 594, 594, 420, 594, 594, 420, 420, 420, - 420, 420, 420, 594, 594, 420, 594, 594, - 594, 594, 594, 420, 594, 594, 420, 594, - 420, 594, 594, 594, 420, 594, 420, 594, - 594, 594, 594, 594, 420, 594, 420, 594, - 594, 594, 594, 420, 594, 420, 762, 763, - 764, 765, 766, 767, 768, 769, 770, 771, - 772, 773, 774, 775, 776, 777, 778, 779, - 780, 781, 782, 420, 594, 420, 594, 594, - 594, 594, 594, 420, 594, 594, 594, 420, - 594, 420, 594, 594, 420, 594, 594, 420, - 594, 420, 420, 420, 594, 594, 420, 594, - 420, 594, 594, 420, 594, 420, 594, 594, - 594, 420, 594, 420, 594, 594, 420, 420, - 420, 594, 594, 594, 420, 594, 420, 594, - 420, 594, 594, 594, 594, 594, 420, 594, - 594, 420, 783, 784, 785, 786, 787, 788, - 420, 594, 594, 420, 594, 594, 420, 594, - 420, 594, 420, 594, 420, 594, 420, 789, - 790, 420, 594, 420, 594, 420, 791, 792, - 793, 794, 795, 796, 797, 798, 799, 800, - 801, 802, 803, 804, 805, 420, 594, 594, - 420, 594, 420, 594, 420, 594, 594, 594, - 594, 420, 594, 594, 420, 420, 420, 594, - 594, 420, 594, 420, 594, 594, 420, 420, - 420, 594, 594, 420, 594, 594, 594, 420, - 594, 594, 594, 594, 420, 594, 594, 594, - 420, 594, 594, 420, 806, 807, 808, 787, - 792, 809, 420, 594, 595, 595, 595, 595, - 420, 595, 595, 595, 420, 594, 594, 420, - 594, 420, 810, 811, 812, 813, 814, 815, - 420, 816, 817, 818, 819, 820, 420, 594, - 420, 594, 420, 594, 420, 594, 594, 594, - 594, 594, 420, 594, 420, 821, 822, 823, - 824, 825, 826, 827, 828, 829, 830, 831, - 832, 833, 834, 835, 832, 836, 837, 838, - 420, 594, 594, 420, 420, 594, 420, 420, - 420, 594, 594, 594, 420, 594, 420, 594, - 594, 420, 420, 420, 594, 594, 420, 594, - 420, 594, 594, 594, 420, 594, 594, 594, - 594, 594, 594, 594, 420, 594, 420, 420, - 594, 594, 594, 420, 420, 420, 594, 420, - 594, 594, 420, 594, 420, 839, 840, 841, - 842, 420, 594, 420, 594, 420, 594, 420, - 594, 420, 843, 420, 594, 594, 420, 844, - 845, 846, 847, 848, 849, 420, 594, 594, - 420, 420, 420, 420, 594, 594, 420, 594, - 594, 420, 420, 420, 594, 594, 594, 594, - 420, 850, 420, 594, 420, 851, 420, 852, - 853, 574, 575, 854, 420, 594, 594, 420, - 420, 594, 594, 148, 572, 148, 181, 148, - 420, 181, 2, 2, 2, 2, 2, 148, - 572, 420, 420, 420, 148, 420, 148, 420, - 572, 181, 148, 148, 148, 148, 2, 420, - 572, 148, 420, 420, 572, 420, 148, 572, - 148, 181, 572, 572, 572, 572, 420, 572, - 572, 572, 148, 420, 421, 572, 148, 572, - 421, 148, 420, 420, 420, 420, 572, 572, - 421, 420, 420, 148, 148, 572, 148, 572, - 420, 420, 148, 572, 572, 420, 148, 148, - 421, 148, 572, 148, 420, 855, 856, 184, - 857, 858, 859, 860, 861, 862, 863, 864, - 865, 866, 867, 868, 869, 870, 871, 872, - 873, 874, 875, 876, 877, 878, 879, 880, - 881, 882, 883, 884, 885, 420, 148, 148, - 148, 148, 572, 420, 148, 572, 420, 572, - 420, 148, 148, 572, 148, 420, 148, 420, - 421, 148, 572, 420, 420, 420, 572, 572, - 420, 420, 420, 420, 572, 148, 148, 420, - 420, 420, 420, 420, 148, 420, 421, 148, - 420, 572, 572, 572, 148, 148, 148, 148, - 148, 148, 148, 572, 420, 420, 420, 420, - 420, 420, 148, 420, 421, 148, 420, 572, - 148, 572, 148, 148, 148, 148, 148, 148, - 572, 420, 420, 420, 148, 148, 420, 148, - 420, 421, 420, 572, 148, 572, 148, 148, - 148, 148, 148, 148, 572, 420, 148, 572, - 572, 572, 572, 148, 148, 572, 421, 420, - 572, 148, 148, 148, 148, 148, 148, 148, - 148, 148, 148, 572, 420, 148, 572, 572, - 572, 572, 421, 420, 148, 572, 148, 148, - 148, 148, 572, 420, 420, 420, 420, 420, - 148, 420, 148, 420, 421, 420, 572, 148, - 572, 148, 148, 148, 148, 148, 572, 420, - 148, 572, 572, 572, 572, 148, 572, 421, - 148, 420, 148, 572, 148, 148, 148, 572, - 420, 420, 420, 148, 420, 420, 148, 420, - 421, 420, 148, 420, 572, 148, 572, 148, - 148, 148, 420, 572, 572, 148, 572, 572, - 421, 572, 420, 572, 572, 420, 572, 421, - 420, 572, 572, 572, 420, 572, 421, 420, - 148, 572, 572, 572, 572, 421, 572, 420, - 148, 148, 572, 420, 572, 572, 148, 572, - 572, 420, 572, 420, 886, 887, 888, 217, - 218, 219, 220, 221, 889, 223, 224, 225, - 226, 227, 228, 890, 891, 892, 893, 894, - 234, 895, 236, 896, 483, 484, 897, 898, - 899, 900, 901, 902, 903, 904, 646, 905, - 151, 152, 906, 249, 250, 251, 252, 151, - 153, 151, 420, 572, 420, 421, 572, 572, - 572, 572, 572, 420, 572, 572, 421, 572, - 148, 420, 420, 572, 420, 148, 148, 148, - 572, 148, 572, 420, 148, 572, 148, 148, - 572, 420, 572, 420, 420, 420, 421, 420, - 572, 572, 421, 148, 420, 572, 148, 148, - 420, 148, 572, 572, 420, 148, 572, 420, - 572, 572, 572, 420, 421, 421, 572, 420, - 572, 148, 572, 420, 148, 420, 421, 420, - 420, 572, 572, 148, 572, 148, 421, 148, - 420, 572, 420, 148, 148, 572, 420, 572, - 572, 572, 148, 572, 148, 572, 420, 572, - 572, 420, 907, 908, 255, 909, 257, 258, - 259, 260, 261, 262, 263, 151, 910, 265, - 911, 267, 912, 269, 420, 181, 181, 572, - 181, 572, 571, 420, 420, 148, 148, 420, - 420, 572, 420, 571, 572, 420, 420, 572, - 420, 148, 572, 420, 420, 148, 148, 148, - 148, 148, 572, 420, 913, 914, 272, 151, - 273, 420, 148, 572, 148, 420, 572, 420, - 153, 274, 275, 153, 657, 915, 916, 917, - 280, 281, 282, 918, 284, 919, 920, 921, - 922, 923, 924, 925, 926, 927, 928, 295, - 296, 152, 929, 153, 151, 420, 148, 148, - 572, 572, 420, 148, 572, 148, 420, 572, - 420, 148, 572, 572, 572, 572, 420, 148, - 572, 148, 572, 420, 148, 148, 420, 421, - 420, 148, 420, 572, 421, 148, 572, 148, - 420, 572, 420, 420, 148, 572, 148, 572, - 420, 148, 420, 421, 420, 420, 421, 420, - 572, 148, 572, 420, 572, 148, 572, 421, - 572, 420, 572, 572, 572, 572, 420, 572, - 148, 572, 148, 572, 420, 148, 572, 572, - 421, 420, 930, 674, 302, 303, 304, 305, - 306, 307, 931, 932, 933, 934, 312, 935, - 936, 151, 420, 572, 148, 148, 572, 572, - 572, 420, 181, 572, 572, 571, 420, 181, - 181, 571, 148, 148, 2, 572, 420, 148, - 181, 181, 181, 571, 148, 2, 572, 148, - 420, 148, 148, 148, 148, 572, 420, 937, - 938, 317, 318, 319, 939, 940, 941, 942, - 324, 420, 325, 326, 153, 327, 328, 943, - 330, 944, 332, 945, 334, 335, 153, 151, - 690, 337, 338, 153, 339, 340, 341, 342, - 343, 344, 345, 346, 946, 348, 349, 947, - 351, 352, 353, 153, 259, 151, 354, 420, - 572, 420, 572, 420, 148, 420, 572, 420, - 148, 148, 572, 572, 572, 572, 148, 148, - 148, 572, 420, 148, 148, 572, 420, 948, - 949, 950, 696, 951, 952, 953, 954, 955, - 364, 956, 957, 958, 959, 960, 961, 962, - 959, 963, 964, 552, 965, 375, 712, 377, - 420, 572, 148, 572, 420, 420, 421, 420, - 572, 148, 420, 420, 572, 572, 148, 572, - 421, 420, 572, 148, 148, 420, 572, 148, - 572, 420, 420, 148, 420, 420, 421, 148, - 420, 572, 148, 148, 572, 420, 572, 420, - 421, 420, 148, 148, 572, 148, 148, 148, - 148, 148, 148, 572, 420, 148, 572, 572, - 572, 572, 148, 572, 572, 572, 420, 148, - 572, 420, 420, 148, 420, 421, 420, 572, - 148, 572, 572, 420, 420, 148, 420, 572, - 148, 420, 421, 420, 572, 148, 572, 420, - 572, 421, 420, 153, 382, 713, 966, 967, - 716, 386, 153, 968, 969, 151, 420, 148, - 572, 420, 148, 572, 420, 420, 572, 420, - 148, 572, 148, 420, 153, 389, 970, 420, - 148, 148, 572, 572, 420, 971, 972, 973, - 153, 394, 395, 396, 397, 398, 399, 400, - 401, 402, 403, 723, 974, 975, 976, 151, - 420, 572, 572, 420, 420, 420, 420, 572, - 572, 420, 572, 572, 420, 420, 420, 572, - 572, 572, 572, 420, 153, 977, 409, 410, - 411, 151, 420, 420, 572, 420, 148, 978, - 420, 979, 980, 981, 983, 982, 420, 572, - 572, 420, 420, 572, 572, 420, 572, 571, - 571, 571, 148, 420, 421, 571, 148, 571, - 421, 148, 420, 420, 420, 420, 571, 571, - 421, 420, 420, 148, 148, 571, 148, 571, - 420, 420, 148, 571, 571, 420, 148, 148, - 421, 148, 571, 148, 420, 984, 985, 184, - 986, 987, 988, 989, 990, 991, 992, 993, - 994, 995, 996, 997, 998, 999, 1000, 1001, - 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, - 1010, 1011, 1012, 1013, 1014, 420, 148, 148, - 148, 148, 571, 420, 148, 571, 420, 571, - 420, 148, 148, 571, 148, 420, 148, 420, - 421, 148, 571, 420, 420, 420, 571, 571, - 420, 420, 420, 420, 571, 148, 148, 420, - 420, 420, 420, 420, 148, 420, 421, 148, - 420, 571, 571, 571, 148, 148, 148, 148, - 148, 148, 148, 571, 420, 420, 420, 420, - 420, 420, 148, 420, 421, 148, 420, 571, - 148, 571, 148, 148, 148, 148, 148, 148, - 571, 420, 420, 420, 148, 148, 420, 148, - 420, 421, 420, 571, 148, 571, 148, 148, - 148, 148, 148, 148, 571, 420, 148, 571, - 571, 571, 571, 148, 148, 571, 421, 420, - 571, 148, 148, 148, 148, 148, 148, 148, - 148, 148, 148, 571, 420, 148, 571, 571, - 571, 571, 421, 420, 148, 571, 148, 148, - 148, 148, 571, 420, 420, 420, 420, 420, - 148, 420, 148, 420, 421, 420, 571, 148, - 571, 148, 148, 148, 148, 148, 571, 420, - 148, 571, 571, 571, 571, 148, 571, 421, - 148, 420, 148, 571, 148, 148, 148, 571, - 420, 420, 420, 148, 420, 420, 148, 420, - 421, 420, 148, 420, 571, 148, 571, 148, - 148, 148, 420, 571, 571, 148, 571, 571, - 421, 571, 420, 571, 571, 420, 571, 421, - 420, 571, 571, 571, 420, 571, 421, 420, - 148, 571, 571, 571, 571, 421, 571, 420, - 148, 148, 571, 420, 571, 571, 148, 571, - 571, 420, 571, 420, 1015, 1016, 1017, 217, - 218, 219, 220, 221, 1018, 223, 224, 225, - 226, 227, 228, 1019, 1020, 1021, 1022, 1023, - 234, 1024, 236, 1025, 483, 484, 1026, 1027, - 1028, 1029, 1030, 1031, 1032, 1033, 646, 1034, - 151, 152, 1035, 249, 250, 251, 252, 151, - 153, 151, 420, 571, 420, 421, 571, 571, - 571, 571, 571, 420, 571, 571, 421, 571, - 148, 420, 420, 571, 420, 148, 148, 148, - 571, 148, 571, 420, 148, 571, 148, 148, - 571, 420, 571, 420, 420, 420, 421, 420, - 571, 571, 421, 148, 420, 571, 148, 148, - 420, 148, 571, 571, 420, 148, 571, 420, - 571, 571, 571, 420, 421, 421, 571, 420, - 571, 148, 571, 420, 148, 420, 421, 420, - 420, 571, 571, 148, 571, 148, 421, 148, - 420, 571, 420, 148, 148, 571, 420, 571, - 571, 571, 148, 571, 148, 571, 420, 571, - 571, 420, 1036, 1037, 255, 1038, 257, 258, - 259, 260, 261, 262, 263, 151, 1039, 265, - 1040, 267, 1041, 269, 420, 571, 571, 571, - 420, 420, 148, 148, 420, 420, 420, 571, - 571, 420, 420, 571, 420, 148, 571, 420, - 420, 148, 148, 148, 148, 148, 571, 420, - 1042, 1043, 1044, 272, 151, 273, 1045, 1046, - 1047, 1048, 420, 148, 571, 1049, 148, 420, - 1049, 420, 1049, 2, 420, 1049, 1049, 420, - 1049, 1049, 420, 1049, 1049, 1049, 420, 1049, - 1049, 1049, 420, 1049, 1049, 420, 1049, 1049, - 1049, 1049, 420, 1049, 1049, 1049, 420, 420, - 1049, 1049, 420, 1049, 420, 1050, 1051, 1052, - 1053, 1054, 1056, 1057, 1058, 1060, 1061, 1062, - 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, - 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1055, - 1059, 420, 1049, 1049, 1049, 1049, 420, 1049, - 420, 1049, 420, 420, 420, 1049, 420, 420, - 420, 1049, 1049, 1049, 1049, 420, 420, 420, - 420, 420, 420, 1049, 420, 420, 420, 420, - 420, 420, 1049, 420, 420, 420, 420, 1049, - 1049, 1049, 1049, 420, 1049, 1049, 1049, 1049, - 1049, 420, 1049, 1049, 420, 1049, 1049, 1049, - 1049, 420, 1049, 1049, 420, 420, 420, 420, - 420, 420, 1049, 1049, 1049, 1049, 1049, 1049, - 420, 1049, 1049, 420, 420, 420, 420, 420, - 420, 1049, 1049, 420, 1049, 1049, 1049, 1049, - 1049, 420, 1049, 1049, 420, 1049, 420, 1049, - 1049, 1049, 420, 1049, 420, 1049, 1049, 1049, - 1049, 1049, 420, 1049, 420, 1049, 1049, 1049, - 1049, 420, 1049, 420, 1078, 1079, 1080, 1081, - 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, - 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, - 1098, 420, 1049, 420, 1049, 1049, 1049, 1049, - 1049, 420, 1049, 1049, 1049, 420, 1049, 420, - 1049, 1049, 420, 1049, 1049, 420, 1049, 420, - 420, 420, 1049, 1049, 420, 1049, 420, 1049, - 1049, 420, 1049, 420, 1049, 1049, 1049, 420, - 1049, 420, 1049, 1049, 420, 420, 420, 1049, - 1049, 1049, 420, 1049, 420, 1049, 420, 1049, - 1049, 1049, 1049, 1049, 420, 1049, 1049, 420, - 1099, 1100, 1101, 1102, 1103, 1104, 420, 1049, - 1049, 571, 420, 420, 420, 420, 1049, 420, - 571, 1049, 420, 1049, 420, 1049, 420, 1049, - 420, 1105, 1106, 1044, 1045, 1046, 1047, 1048, - 420, 1049, 1049, 420, 1049, 1049, 420, 2, - 2, 1049, 1049, 2, 1049, 2, 2, 1049, - 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, - 1115, 1116, 1117, 1118, 1119, 1120, 1121, 420, - 1049, 1049, 420, 1049, 420, 1049, 420, 1049, - 1049, 1049, 1049, 420, 1049, 1049, 420, 420, - 420, 1049, 1049, 420, 1049, 420, 1049, 1049, - 420, 420, 420, 1049, 1049, 420, 1049, 1049, - 1049, 420, 1049, 1049, 1049, 1049, 420, 1049, - 1049, 1049, 420, 1049, 1049, 420, 1122, 1123, - 1124, 1103, 1125, 1126, 1127, 1128, 420, 1049, - 420, 1049, 1049, 571, 420, 571, 2, 571, - 2, 1049, 420, 420, 1049, 1049, 420, 1129, - 1130, 1131, 1132, 1133, 1134, 420, 1135, 1136, - 1137, 1138, 1139, 420, 1049, 420, 1049, 420, - 1049, 420, 1049, 1049, 1049, 1049, 1049, 420, - 1049, 420, 1140, 1141, 1142, 1143, 1144, 1145, - 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, - 1154, 1151, 1155, 1156, 1157, 420, 1049, 1049, - 420, 420, 1049, 420, 420, 420, 1049, 1049, - 1049, 420, 1049, 420, 1049, 1049, 420, 420, - 420, 1049, 1049, 420, 1049, 420, 1049, 1049, - 1049, 420, 1049, 1049, 1049, 1049, 1049, 1049, - 1049, 420, 1049, 420, 420, 1049, 1049, 1049, - 420, 420, 420, 1049, 420, 1049, 1049, 420, - 1049, 420, 1158, 1159, 1160, 1161, 420, 1049, - 420, 1049, 420, 1049, 420, 1049, 420, 1162, - 1163, 420, 1049, 2, 1049, 1049, 420, 1164, - 1165, 1166, 1167, 1168, 1169, 420, 1049, 1049, - 420, 420, 420, 420, 1049, 1049, 420, 1049, - 1049, 420, 420, 420, 1049, 1049, 1049, 1049, - 420, 1170, 420, 1049, 420, 1171, 420, 1172, - 1173, 1047, 1175, 1174, 420, 1049, 1049, 420, - 420, 1049, 1049, 571, 1049, 1049, 420, 153, - 274, 275, 153, 657, 1176, 1177, 1178, 280, - 281, 282, 1179, 284, 1180, 1181, 1182, 1183, - 1184, 1185, 1186, 1187, 1188, 1189, 295, 296, - 152, 1190, 153, 151, 420, 148, 148, 571, - 571, 420, 148, 571, 148, 420, 571, 420, - 148, 571, 571, 571, 571, 420, 148, 571, - 148, 571, 420, 148, 148, 420, 421, 420, - 148, 420, 571, 421, 148, 571, 148, 420, - 571, 420, 420, 148, 571, 148, 571, 420, - 148, 420, 421, 420, 420, 421, 420, 571, - 148, 571, 420, 571, 148, 571, 421, 571, - 420, 571, 571, 571, 571, 420, 571, 148, - 571, 148, 571, 420, 148, 571, 571, 421, - 420, 1191, 674, 302, 303, 304, 305, 306, - 307, 1192, 676, 1193, 678, 1194, 1195, 1196, - 151, 420, 571, 572, 148, 148, 572, 572, - 572, 420, 571, 571, 571, 420, 571, 420, - 148, 148, 1049, 2, 571, 148, 420, 1049, - 148, 148, 148, 148, 571, 420, 1197, 1198, - 317, 318, 319, 1199, 1200, 1201, 1202, 324, - 420, 325, 326, 153, 327, 328, 1203, 330, - 1204, 332, 1205, 334, 335, 153, 151, 690, - 337, 338, 153, 339, 340, 341, 342, 343, - 344, 345, 346, 1206, 348, 349, 1207, 351, - 352, 353, 153, 259, 151, 354, 420, 571, - 420, 571, 420, 148, 420, 571, 420, 148, - 148, 571, 571, 571, 571, 148, 148, 148, - 571, 420, 148, 148, 571, 420, 1208, 1209, - 1210, 696, 1211, 1212, 1213, 1214, 1215, 364, - 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1219, - 1223, 1224, 552, 1225, 375, 712, 377, 420, - 571, 148, 571, 420, 420, 421, 420, 571, - 148, 420, 420, 571, 571, 148, 571, 421, - 420, 571, 148, 148, 420, 571, 148, 571, - 420, 420, 148, 420, 420, 421, 148, 420, - 571, 148, 148, 571, 420, 571, 420, 421, - 420, 148, 148, 571, 148, 148, 148, 148, - 148, 148, 571, 420, 148, 571, 571, 571, - 571, 148, 571, 571, 571, 420, 148, 571, - 420, 420, 148, 420, 421, 420, 571, 148, - 571, 571, 420, 420, 148, 420, 571, 148, - 420, 421, 420, 571, 148, 571, 420, 571, - 421, 420, 153, 382, 713, 1226, 1227, 716, - 386, 153, 1228, 1229, 151, 420, 148, 571, - 420, 148, 571, 420, 420, 571, 420, 148, - 571, 148, 420, 1162, 153, 389, 1230, 420, - 148, 148, 571, 571, 420, 1231, 1232, 1233, - 153, 394, 395, 396, 397, 398, 399, 400, - 401, 402, 403, 723, 1234, 1235, 1236, 151, - 420, 571, 571, 420, 420, 420, 420, 571, - 571, 420, 571, 571, 420, 420, 420, 571, - 571, 571, 571, 420, 153, 1237, 409, 410, - 411, 151, 420, 420, 571, 420, 148, 1238, - 420, 1239, 1240, 1241, 1243, 1242, 420, 571, - 571, 420, 420, 571, 571, 420, 571, 148, - 421, 148, 148, 420, 420, 421, 420, 443, - 148, 420, 148, 420, 421, 420, 421, 148, - 443, 420, 420, 421, 420, 148, 421, 148, - 421, 421, 572, 572, 420, 421, 421, 443, - 421, 148, 420, 421, 443, 421, 148, 421, - 148, 420, 420, 420, 420, 421, 421, 421, - 420, 420, 148, 148, 421, 148, 421, 420, - 420, 148, 421, 421, 420, 148, 443, 148, - 421, 148, 421, 148, 420, 1244, 1245, 184, - 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, - 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, - 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, - 1270, 1271, 1272, 1273, 1274, 420, 148, 148, - 148, 148, 421, 420, 148, 421, 420, 421, - 420, 148, 148, 421, 148, 420, 148, 420, - 148, 421, 420, 420, 420, 421, 421, 420, - 420, 420, 420, 421, 148, 148, 420, 420, - 420, 420, 420, 148, 420, 148, 420, 421, - 421, 421, 148, 148, 148, 148, 148, 148, - 148, 421, 420, 420, 420, 420, 420, 420, - 148, 420, 148, 420, 421, 148, 421, 148, - 148, 148, 148, 148, 148, 421, 420, 420, - 420, 148, 148, 420, 148, 420, 420, 421, - 148, 421, 148, 148, 148, 148, 148, 148, - 421, 420, 148, 421, 421, 421, 421, 148, - 148, 421, 421, 420, 421, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 148, 421, - 420, 148, 421, 421, 421, 421, 421, 420, - 148, 421, 148, 148, 148, 148, 421, 420, - 420, 420, 420, 420, 148, 420, 148, 420, - 420, 421, 148, 421, 148, 148, 148, 148, - 148, 421, 420, 148, 421, 421, 421, 421, - 148, 421, 421, 148, 420, 148, 421, 148, - 148, 148, 421, 420, 420, 420, 148, 420, - 420, 148, 420, 420, 148, 420, 421, 148, - 421, 148, 148, 148, 420, 421, 421, 148, - 421, 421, 421, 421, 420, 421, 421, 420, - 421, 421, 420, 421, 421, 421, 420, 421, - 421, 420, 148, 421, 421, 421, 421, 421, - 421, 420, 148, 148, 421, 420, 421, 421, - 148, 421, 421, 420, 421, 420, 1275, 1276, - 1277, 217, 218, 219, 220, 221, 1278, 223, - 224, 225, 226, 227, 228, 1279, 1280, 1281, - 1282, 1283, 234, 1284, 236, 1285, 483, 484, - 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, - 646, 1294, 151, 152, 1295, 249, 250, 251, - 252, 151, 153, 151, 420, 421, 420, 421, - 421, 421, 421, 421, 421, 420, 421, 421, - 148, 420, 420, 421, 420, 148, 148, 148, - 421, 148, 421, 420, 148, 421, 148, 148, - 421, 420, 421, 420, 420, 420, 420, 421, - 421, 421, 148, 420, 421, 148, 148, 420, - 148, 421, 421, 420, 148, 421, 420, 421, - 421, 421, 420, 421, 421, 421, 420, 421, - 148, 421, 420, 148, 420, 420, 420, 421, - 421, 148, 421, 148, 421, 148, 420, 421, - 420, 148, 148, 421, 420, 421, 421, 421, - 148, 421, 148, 421, 420, 421, 421, 420, - 1296, 1297, 255, 1298, 257, 258, 259, 260, - 261, 262, 263, 151, 1299, 265, 1300, 267, - 1301, 269, 420, 443, 421, 443, 421, 571, - 420, 443, 420, 148, 148, 420, 420, 421, - 420, 571, 421, 420, 420, 421, 420, 148, - 421, 420, 420, 148, 148, 148, 148, 148, - 421, 420, 1302, 1303, 272, 151, 273, 420, - 148, 421, 148, 420, 421, 420, 153, 274, - 275, 153, 657, 1304, 1305, 1306, 280, 281, - 282, 1307, 284, 1308, 1309, 1310, 1311, 1312, - 1313, 1314, 1315, 1316, 1317, 295, 296, 152, - 1318, 153, 151, 420, 148, 148, 421, 421, - 420, 148, 421, 148, 420, 421, 420, 148, - 421, 421, 421, 421, 420, 148, 421, 148, - 421, 420, 148, 148, 420, 420, 148, 420, - 421, 421, 148, 421, 148, 420, 421, 420, - 420, 148, 421, 148, 421, 420, 148, 420, - 420, 420, 420, 421, 148, 421, 420, 421, - 148, 421, 421, 421, 420, 421, 421, 421, - 421, 420, 421, 148, 421, 148, 421, 420, - 148, 421, 421, 421, 420, 1319, 674, 302, - 303, 304, 305, 306, 307, 1320, 1321, 1322, - 1323, 312, 1324, 1325, 151, 420, 421, 572, - 148, 148, 572, 572, 572, 420, 443, 443, - 421, 421, 571, 420, 443, 443, 443, 571, - 148, 148, 420, 421, 420, 148, 443, 443, - 443, 443, 571, 148, 420, 421, 148, 420, - 148, 148, 148, 148, 421, 420, 1326, 1327, - 317, 318, 319, 1328, 1329, 1330, 1331, 324, - 420, 325, 326, 153, 327, 328, 1332, 330, - 1333, 332, 1334, 334, 335, 153, 151, 690, - 337, 338, 153, 339, 340, 341, 342, 343, - 344, 345, 346, 1335, 348, 349, 1336, 351, - 352, 353, 153, 259, 151, 354, 420, 421, - 420, 421, 420, 148, 420, 421, 420, 148, - 148, 421, 421, 421, 421, 148, 148, 148, - 421, 420, 148, 148, 421, 420, 1337, 1338, - 1339, 696, 1340, 1341, 1342, 1343, 1344, 364, - 1345, 1346, 1347, 1348, 1349, 1350, 1351, 1348, - 1352, 1353, 552, 1354, 375, 712, 377, 420, - 421, 148, 421, 420, 420, 420, 421, 148, - 420, 420, 421, 421, 148, 421, 421, 420, - 421, 148, 148, 420, 421, 148, 421, 420, - 420, 148, 420, 420, 148, 420, 421, 148, - 148, 421, 420, 421, 420, 421, 420, 148, - 148, 421, 148, 148, 148, 148, 148, 148, - 421, 420, 148, 421, 421, 421, 421, 148, - 421, 421, 421, 420, 148, 421, 420, 420, - 148, 420, 420, 421, 148, 421, 421, 420, - 420, 148, 420, 421, 148, 420, 420, 421, - 148, 421, 420, 421, 421, 420, 153, 382, - 713, 1355, 1356, 716, 386, 153, 1357, 1358, - 151, 420, 148, 421, 420, 148, 421, 420, - 420, 421, 420, 148, 421, 148, 420, 153, - 389, 1359, 420, 148, 148, 421, 421, 420, - 1360, 1361, 1362, 153, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 723, 1363, - 1364, 1365, 151, 420, 421, 421, 420, 420, - 420, 420, 421, 421, 420, 421, 421, 420, - 420, 420, 421, 421, 421, 421, 420, 153, - 1366, 409, 410, 411, 151, 420, 420, 421, - 420, 148, 1367, 420, 1368, 1369, 1370, 1372, - 1371, 420, 421, 421, 420, 420, 421, 421, - 420, 421, 148, 148, 148, 181, 148, 420, - 420, 420, 420, 420, 148, 420, 148, 420, - 420, 420, 148, 148, 148, 181, 148, 148, - 572, 572, 420, 148, 148, 148, 148, 420, - 421, 148, 421, 148, 420, 420, 420, 420, - 421, 420, 420, 148, 148, 420, 420, 148, - 148, 421, 148, 420, 1373, 1374, 184, 1375, - 151, 1376, 1377, 1378, 1379, 1380, 1381, 1382, - 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, - 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, - 1399, 1400, 1401, 1402, 420, 148, 2, 148, - 2, 148, 2, 2, 2, 421, 148, 2, - 2, 2, 2, 2, 2, 2, 148, 2, - 2, 2, 2, 2, 2, 421, 2, 148, - 148, 148, 148, 148, 148, 148, 148, 148, - 148, 148, 2, 2, 2, 2, 2, 2, - 2, 421, 2, 148, 148, 148, 148, 148, - 148, 148, 148, 148, 2, 2, 2, 2, - 2, 2, 421, 2, 2, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 2, 148, - 148, 148, 148, 148, 148, 148, 421, 2, - 148, 148, 148, 148, 148, 148, 148, 148, - 148, 148, 148, 2, 148, 148, 148, 148, - 148, 421, 2, 148, 148, 148, 148, 148, - 148, 2, 2, 2, 2, 2, 2, 2, - 421, 2, 148, 148, 148, 148, 148, 148, - 148, 148, 2, 148, 148, 148, 148, 148, - 148, 421, 148, 2, 148, 148, 148, 148, - 148, 2, 2, 2, 2, 2, 2, 421, - 2, 2, 148, 148, 148, 148, 148, 148, - 2, 148, 148, 148, 148, 148, 421, 148, - 2, 148, 148, 2, 148, 421, 2, 148, - 148, 148, 2, 148, 421, 2, 148, 148, - 148, 148, 148, 421, 148, 2, 148, 148, - 148, 2, 148, 148, 148, 2, 148, 2, - 1403, 1404, 1405, 217, 218, 219, 220, 221, - 1406, 223, 224, 225, 226, 227, 228, 1407, - 1408, 1409, 1410, 1411, 234, 1412, 236, 1413, - 483, 484, 1374, 1414, 1415, 153, 1416, 1417, - 1418, 1419, 646, 1420, 151, 152, 1421, 249, - 250, 251, 252, 151, 153, 151, 420, 148, - 2, 421, 148, 148, 148, 148, 148, 2, - 148, 148, 421, 148, 148, 2, 2, 2, - 148, 148, 148, 148, 2, 148, 148, 148, - 148, 2, 148, 2, 2, 2, 421, 2, - 148, 148, 421, 148, 2, 148, 148, 2, - 148, 148, 148, 2, 148, 148, 148, 2, - 421, 421, 148, 2, 2, 421, 2, 2, - 148, 148, 421, 148, 2, 2, 148, 148, - 2, 148, 148, 148, 2, 148, 148, 2, - 1422, 1423, 255, 1424, 257, 258, 259, 260, - 261, 262, 263, 151, 1425, 265, 1426, 267, - 1427, 269, 420, 181, 181, 148, 181, 148, - 571, 2, 2, 2, 148, 2, 2, 148, - 2, 571, 148, 2, 2, 2, 148, 2, - 2, 2, 148, 148, 148, 148, 148, 148, - 2, 1428, 1429, 272, 151, 273, 420, 148, - 148, 148, 2, 148, 2, 153, 274, 275, - 153, 657, 1430, 153, 302, 280, 281, 282, - 1431, 284, 153, 1432, 1433, 1434, 153, 1435, - 1436, 1437, 1438, 1439, 295, 296, 152, 1440, - 153, 151, 420, 148, 148, 148, 2, 2, - 148, 2, 2, 421, 2, 2, 2, 148, - 421, 148, 148, 2, 2, 2, 148, 2, - 421, 2, 2, 421, 2, 148, 148, 2, - 148, 421, 148, 2, 148, 148, 148, 148, - 2, 148, 148, 148, 2, 148, 148, 421, - 2, 1441, 674, 302, 303, 304, 305, 306, - 307, 1442, 932, 1443, 934, 312, 1444, 1445, - 151, 420, 148, 572, 148, 148, 572, 572, - 572, 2, 181, 148, 148, 571, 2, 2, - 2, 148, 148, 2, 148, 148, 148, 148, - 148, 2, 1446, 1447, 317, 318, 319, 1448, - 1449, 1450, 1451, 324, 420, 325, 326, 153, - 327, 328, 1452, 330, 1453, 332, 1454, 334, - 335, 153, 151, 690, 337, 338, 153, 339, - 340, 341, 342, 343, 344, 345, 346, 1455, - 348, 349, 1456, 351, 352, 353, 153, 259, - 151, 354, 2, 148, 2, 2, 2, 148, - 2, 2, 148, 148, 148, 148, 148, 148, - 148, 148, 2, 148, 148, 2, 1457, 1458, - 696, 1459, 1460, 1461, 1462, 364, 1463, 1464, - 1465, 153, 1466, 1467, 1468, 153, 1469, 1419, - 552, 1470, 375, 712, 377, 153, 2, 2, - 421, 2, 148, 2, 2, 148, 148, 421, - 2, 148, 148, 2, 2, 2, 2, 421, - 2, 148, 148, 148, 2, 2, 421, 2, - 148, 148, 148, 148, 148, 148, 148, 148, - 148, 2, 148, 148, 148, 148, 148, 148, - 148, 148, 2, 2, 2, 421, 2, 148, - 148, 148, 2, 2, 2, 148, 2, 2, - 421, 2, 148, 148, 421, 2, 153, 382, - 713, 1471, 1436, 716, 386, 153, 1472, 1473, - 151, 2, 148, 148, 2, 2, 2, 148, - 148, 2, 153, 389, 1474, 2, 148, 148, - 148, 148, 2, 1475, 1476, 1477, 153, 394, - 395, 396, 397, 398, 399, 400, 401, 402, - 403, 723, 1478, 1479, 1480, 151, 2, 148, - 148, 2, 2, 2, 2, 148, 148, 2, - 148, 148, 2, 2, 2, 148, 148, 148, - 148, 2, 153, 1481, 409, 410, 411, 151, - 2, 2, 2, 148, 1482, 420, 1483, 152, - 153, 1484, 151, 2, 148, 148, 2, 2, - 148, 148, 1485, 148, 148, 125, 1485, 125, - 125, 125, 148, 125, 148, 125, 1485, 125, - 1485, 148, 125, 125, 1485, 125, 148, 1485, - 148, 1485, 1485, 572, 572, 125, 1485, 1485, - 1485, 148, 125, 126, 1485, 148, 1485, 126, - 148, 125, 125, 125, 125, 1485, 1485, 126, - 125, 125, 148, 148, 1485, 148, 1485, 125, - 125, 148, 1485, 1485, 125, 148, 148, 126, - 148, 1485, 148, 125, 1486, 1487, 184, 1488, - 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, - 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, - 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, - 1513, 1514, 1515, 1516, 125, 148, 148, 148, - 148, 1485, 125, 148, 1485, 125, 1485, 125, - 148, 148, 1485, 148, 125, 148, 125, 126, - 148, 1485, 125, 125, 125, 1485, 1485, 125, - 125, 125, 125, 1485, 148, 148, 125, 125, - 125, 125, 125, 148, 125, 126, 148, 125, - 1485, 1485, 1485, 148, 148, 148, 148, 148, - 148, 148, 1485, 125, 125, 125, 125, 125, - 125, 148, 125, 126, 148, 125, 1485, 148, - 1485, 148, 148, 148, 148, 148, 148, 1485, - 125, 125, 125, 148, 148, 125, 148, 125, - 126, 125, 1485, 148, 1485, 148, 148, 148, - 148, 148, 148, 1485, 125, 148, 1485, 1485, - 1485, 1485, 148, 148, 1485, 126, 125, 1485, - 148, 148, 148, 148, 148, 148, 148, 148, - 148, 148, 1485, 125, 148, 1485, 1485, 1485, - 1485, 126, 125, 148, 1485, 148, 148, 148, - 148, 1485, 125, 125, 125, 125, 125, 148, - 125, 148, 125, 126, 125, 1485, 148, 1485, - 148, 148, 148, 148, 148, 1485, 125, 148, - 1485, 1485, 1485, 1485, 148, 1485, 126, 148, - 125, 148, 1485, 148, 148, 148, 1485, 125, - 125, 125, 148, 125, 125, 148, 125, 126, - 125, 148, 125, 1485, 148, 1485, 148, 148, - 148, 125, 1485, 1485, 148, 1485, 1485, 126, - 1485, 125, 1485, 1485, 125, 1485, 126, 125, - 1485, 1485, 1485, 125, 1485, 126, 125, 148, - 1485, 1485, 1485, 1485, 126, 1485, 125, 148, - 148, 1485, 125, 1485, 1485, 148, 1485, 1485, - 125, 1485, 125, 1517, 1518, 1519, 217, 218, - 219, 220, 221, 1520, 223, 224, 225, 226, - 227, 228, 1521, 1522, 1523, 1524, 1525, 234, - 1526, 236, 1527, 1528, 1529, 1530, 1531, 1532, - 1533, 1534, 1535, 1536, 1537, 1538, 1539, 151, - 152, 1540, 249, 250, 251, 252, 151, 153, - 151, 125, 1485, 125, 126, 1485, 1485, 1485, - 1485, 1485, 125, 1485, 1485, 126, 1485, 148, - 125, 125, 1485, 125, 148, 148, 148, 1485, - 148, 1485, 125, 148, 1485, 148, 148, 1485, - 125, 1485, 125, 125, 125, 126, 125, 1485, - 1485, 126, 148, 125, 1485, 148, 148, 125, - 148, 1485, 1485, 125, 126, 2, 126, 2, - 148, 1485, 125, 1485, 1485, 1485, 125, 126, - 126, 1485, 125, 1485, 148, 1485, 125, 148, - 125, 126, 125, 125, 1485, 1485, 148, 1485, - 148, 126, 148, 125, 1485, 125, 148, 148, - 1485, 125, 126, 148, 126, 148, 2, 1485, - 1485, 1485, 148, 1485, 148, 1485, 125, 1485, - 1485, 125, 1541, 1542, 255, 1543, 257, 258, - 259, 260, 261, 262, 263, 151, 1544, 265, - 1545, 267, 1546, 269, 125, 1485, 1485, 1485, - 125, 125, 148, 148, 125, 125, 125, 1485, - 1485, 125, 125, 1485, 125, 148, 1485, 125, - 125, 148, 148, 148, 148, 148, 1485, 125, - 1547, 1548, 1044, 272, 151, 273, 1045, 1046, - 1047, 1048, 125, 148, 1485, 1049, 148, 125, - 1485, 1049, 1049, 125, 153, 274, 275, 153, - 1549, 1550, 1551, 1552, 280, 281, 282, 1553, - 284, 1554, 1555, 1556, 1557, 1558, 1559, 1560, - 1561, 1562, 1563, 295, 296, 152, 1564, 153, - 151, 125, 2, 126, 2, 148, 148, 148, - 1485, 1485, 125, 148, 1485, 148, 125, 1485, - 125, 148, 1485, 1485, 1485, 1485, 125, 148, - 1485, 148, 1485, 125, 148, 148, 125, 126, - 125, 148, 125, 1485, 126, 148, 1485, 148, - 125, 1485, 125, 125, 148, 1485, 148, 1485, - 125, 148, 125, 126, 125, 125, 126, 125, - 1485, 148, 1485, 125, 1485, 148, 1485, 126, - 1485, 125, 1485, 1485, 1485, 1485, 125, 1485, - 148, 1485, 148, 1485, 125, 148, 1485, 1485, - 126, 125, 1565, 674, 302, 303, 304, 305, - 306, 307, 1566, 1567, 1568, 1569, 1194, 1570, - 1571, 151, 125, 1485, 572, 148, 148, 572, - 572, 572, 125, 1485, 1485, 1485, 125, 1485, - 148, 148, 125, 1485, 125, 148, 1485, 148, - 125, 1485, 148, 125, 1049, 148, 148, 148, - 148, 1485, 125, 1572, 1573, 317, 318, 319, - 1574, 1575, 1576, 1577, 324, 125, 325, 326, - 153, 327, 328, 1578, 330, 1579, 332, 1580, - 334, 335, 153, 151, 1581, 337, 338, 153, - 339, 340, 341, 342, 343, 344, 345, 346, - 1582, 348, 349, 1583, 351, 352, 353, 153, - 259, 151, 354, 125, 1485, 125, 1485, 125, - 148, 125, 1485, 125, 148, 2, 126, 2, - 148, 148, 1485, 1485, 1485, 1485, 148, 148, - 148, 1485, 125, 148, 148, 1485, 125, 1584, - 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, - 364, 1593, 1594, 1595, 1596, 1597, 1598, 1599, - 1596, 1600, 1601, 1602, 1603, 375, 1604, 377, - 125, 1485, 148, 1485, 125, 125, 126, 125, - 1485, 148, 125, 125, 1485, 148, 126, 2, - 1485, 148, 1485, 126, 125, 1485, 148, 148, - 125, 1485, 148, 1485, 125, 125, 148, 125, - 125, 126, 148, 125, 1485, 148, 148, 1485, - 125, 1485, 125, 126, 125, 148, 148, 1485, - 148, 148, 148, 148, 148, 148, 1485, 125, - 148, 1485, 1485, 1485, 1485, 148, 1485, 1485, - 1485, 125, 148, 1485, 125, 125, 148, 125, - 126, 125, 1485, 148, 1485, 1485, 125, 125, - 148, 125, 1485, 148, 125, 126, 125, 1485, - 148, 1485, 125, 126, 2, 1485, 126, 125, - 126, 2, 2, 148, 153, 382, 1605, 1606, - 1607, 1608, 386, 153, 1609, 1610, 151, 125, - 148, 126, 2, 148, 1485, 125, 148, 1485, - 125, 148, 126, 148, 148, 2, 125, 1485, - 125, 148, 1485, 148, 125, 1162, 153, 389, - 1611, 125, 148, 148, 1485, 1485, 125, 1612, - 1613, 1614, 153, 394, 395, 396, 397, 398, - 399, 400, 401, 402, 403, 1615, 1616, 1617, - 1618, 151, 125, 1485, 1485, 125, 125, 125, - 125, 1485, 1485, 125, 2, 2, 126, 2, - 148, 1485, 1485, 125, 125, 125, 1485, 1485, - 1485, 1485, 125, 153, 1619, 409, 410, 411, - 151, 125, 125, 1485, 125, 148, 1620, 125, - 1621, 1622, 1623, 1625, 1624, 125, 1485, 1485, - 125, 125, 1485, 1485, 125, 1485, 148, 126, - 148, 148, 125, 126, 125, 125, 1626, 148, - 125, 148, 125, 126, 125, 126, 148, 1626, - 125, 125, 126, 125, 148, 126, 148, 126, - 126, 572, 572, 125, 126, 126, 1626, 126, - 148, 125, 126, 1626, 126, 148, 126, 148, - 125, 125, 125, 125, 126, 126, 126, 125, - 125, 148, 148, 126, 148, 126, 125, 125, - 148, 126, 126, 125, 148, 1626, 148, 126, - 148, 126, 148, 125, 1627, 1628, 184, 1629, - 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, - 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, - 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, - 1654, 1655, 1656, 1657, 125, 148, 148, 148, - 148, 126, 125, 148, 126, 125, 126, 125, - 148, 148, 126, 148, 125, 148, 125, 148, - 126, 125, 125, 125, 126, 126, 125, 125, - 125, 125, 126, 148, 148, 125, 125, 125, - 125, 125, 148, 125, 148, 125, 126, 126, - 126, 148, 148, 148, 148, 148, 148, 148, - 126, 125, 125, 125, 125, 125, 125, 148, - 125, 148, 125, 126, 148, 126, 148, 148, - 148, 148, 148, 148, 126, 125, 125, 125, - 148, 148, 125, 148, 125, 125, 126, 148, - 126, 148, 148, 148, 148, 148, 148, 126, - 125, 148, 126, 126, 126, 126, 148, 148, - 126, 126, 125, 126, 148, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 126, 125, - 148, 126, 126, 126, 126, 126, 125, 148, - 126, 148, 148, 148, 148, 126, 125, 125, - 125, 125, 125, 148, 125, 148, 125, 125, - 126, 148, 126, 148, 148, 148, 148, 148, - 126, 125, 148, 126, 126, 126, 126, 148, - 126, 126, 148, 125, 148, 126, 148, 148, - 148, 126, 125, 125, 125, 148, 125, 125, - 148, 125, 125, 148, 125, 126, 148, 126, - 148, 148, 148, 125, 126, 126, 148, 126, - 126, 126, 126, 125, 126, 126, 125, 126, - 126, 125, 126, 126, 126, 125, 126, 126, - 125, 148, 126, 126, 126, 126, 126, 126, - 125, 148, 148, 126, 125, 126, 126, 148, - 126, 126, 125, 126, 125, 1658, 1659, 1660, - 217, 218, 219, 220, 221, 1661, 223, 224, - 225, 226, 227, 228, 1662, 1663, 1664, 1665, - 1666, 234, 1667, 236, 1668, 1528, 1529, 1669, - 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1538, - 1677, 151, 152, 1678, 249, 250, 251, 252, - 151, 153, 151, 125, 126, 125, 126, 126, - 126, 126, 126, 126, 125, 126, 126, 148, - 125, 125, 126, 125, 148, 148, 148, 126, - 148, 126, 125, 148, 126, 148, 148, 126, - 125, 126, 125, 125, 125, 125, 126, 126, - 126, 148, 125, 126, 148, 148, 125, 148, - 126, 126, 125, 148, 126, 125, 126, 126, - 126, 125, 126, 126, 126, 125, 126, 148, - 126, 125, 148, 125, 125, 125, 126, 126, - 148, 126, 148, 126, 148, 125, 126, 125, - 148, 148, 126, 125, 126, 126, 126, 148, - 126, 148, 126, 125, 126, 126, 125, 1679, - 1680, 255, 1681, 257, 258, 259, 260, 261, - 262, 263, 151, 1682, 265, 1683, 267, 1684, - 269, 125, 1626, 126, 1626, 126, 1485, 125, - 1626, 125, 148, 148, 125, 125, 126, 125, - 1485, 126, 125, 125, 126, 125, 148, 126, - 125, 125, 148, 148, 148, 148, 148, 126, - 125, 1685, 1686, 272, 151, 273, 125, 148, - 126, 148, 125, 126, 125, 153, 274, 275, - 153, 1549, 1687, 1688, 1689, 280, 281, 282, - 1690, 284, 1691, 1692, 1693, 1694, 1695, 1696, - 1697, 1698, 1699, 1700, 295, 296, 152, 1701, - 153, 151, 125, 148, 148, 126, 126, 125, - 148, 126, 148, 125, 126, 125, 148, 126, - 126, 126, 126, 125, 148, 126, 148, 126, - 125, 148, 148, 125, 125, 148, 125, 126, - 126, 148, 126, 148, 125, 126, 125, 125, - 148, 126, 148, 126, 125, 148, 125, 125, - 125, 125, 126, 148, 126, 125, 126, 148, - 126, 126, 126, 125, 126, 126, 126, 126, - 125, 126, 148, 126, 148, 126, 125, 148, - 126, 126, 126, 125, 1702, 674, 302, 303, - 304, 305, 306, 307, 1703, 1704, 1705, 1706, - 312, 1707, 1708, 151, 125, 126, 572, 148, - 148, 572, 572, 572, 125, 1626, 1626, 126, - 126, 1485, 125, 1626, 1626, 1626, 1485, 148, - 148, 125, 126, 125, 148, 1626, 1626, 1626, - 1626, 1485, 148, 125, 126, 148, 125, 148, - 148, 148, 148, 126, 125, 1709, 1710, 317, - 318, 319, 1711, 1712, 1713, 1714, 324, 125, - 325, 326, 153, 327, 328, 1715, 330, 1716, - 332, 1717, 334, 335, 153, 151, 1581, 337, - 338, 153, 339, 340, 341, 342, 343, 344, - 345, 346, 1718, 348, 349, 1719, 351, 352, - 353, 153, 259, 151, 354, 125, 126, 125, - 126, 125, 148, 125, 126, 125, 148, 148, - 126, 126, 126, 126, 148, 148, 148, 126, - 125, 148, 148, 126, 125, 1720, 1721, 1722, - 1587, 1723, 1724, 1725, 1726, 1727, 364, 1728, - 1729, 1730, 1731, 1732, 1733, 1734, 1731, 1735, - 1736, 1602, 1737, 375, 1604, 377, 125, 126, - 148, 126, 125, 125, 125, 126, 148, 125, - 125, 126, 126, 148, 126, 126, 125, 126, - 148, 148, 125, 126, 148, 126, 125, 125, - 148, 125, 125, 148, 125, 126, 148, 148, - 126, 125, 126, 125, 126, 125, 148, 148, - 126, 148, 148, 148, 148, 148, 148, 126, - 125, 148, 126, 126, 126, 126, 148, 126, - 126, 126, 125, 148, 126, 125, 125, 148, - 125, 125, 126, 148, 126, 126, 125, 125, - 148, 125, 126, 148, 125, 125, 126, 148, - 126, 125, 126, 126, 125, 153, 382, 1605, - 1738, 1739, 1608, 386, 153, 1740, 1741, 151, - 125, 148, 126, 125, 148, 126, 125, 125, - 126, 125, 148, 126, 148, 125, 153, 389, - 1742, 125, 148, 148, 126, 126, 125, 1743, - 1744, 1745, 153, 394, 395, 396, 397, 398, - 399, 400, 401, 402, 403, 1615, 1746, 1747, - 1748, 151, 125, 126, 126, 125, 125, 125, - 125, 126, 126, 125, 126, 126, 125, 125, - 125, 126, 126, 126, 126, 125, 153, 1749, - 409, 410, 411, 151, 125, 125, 126, 125, - 148, 1750, 125, 1751, 1752, 1753, 1755, 1754, - 125, 126, 126, 125, 125, 126, 126, 125, - 126, 1626, 125, 1626, 125, 125, 1626, 1626, - 125, 1626, 1626, 125, 1626, 1626, 1626, 125, - 1626, 1626, 1626, 125, 126, 1626, 1626, 126, - 125, 1626, 1626, 1626, 1626, 126, 125, 1626, - 1626, 1626, 125, 125, 1626, 1626, 125, 126, - 1626, 125, 1756, 1757, 1758, 1759, 1760, 1762, - 1763, 1764, 1766, 1767, 1768, 1769, 1770, 1771, - 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, - 1780, 1781, 1782, 1783, 1761, 1765, 125, 1626, - 1626, 1626, 1626, 125, 1626, 125, 1626, 125, - 125, 125, 1626, 125, 125, 125, 126, 125, - 1626, 1626, 1626, 1626, 125, 125, 125, 125, - 125, 125, 126, 125, 1626, 125, 125, 125, - 125, 126, 125, 125, 1626, 125, 125, 125, - 125, 126, 125, 1626, 1626, 1626, 1626, 125, - 1626, 1626, 1626, 1626, 1626, 126, 125, 1626, - 1626, 125, 1626, 1626, 1626, 1626, 126, 125, - 1626, 1626, 125, 125, 125, 125, 125, 125, - 126, 125, 1626, 1626, 1626, 1626, 1626, 1626, - 126, 125, 1626, 1626, 125, 125, 125, 125, - 125, 125, 126, 125, 1626, 1626, 125, 1626, - 1626, 1626, 1626, 126, 1626, 125, 1626, 1626, - 125, 1626, 126, 125, 1626, 1626, 1626, 125, - 1626, 126, 125, 1626, 1626, 1626, 1626, 126, - 1626, 125, 1626, 125, 1626, 1626, 1626, 1626, - 125, 1626, 125, 1784, 1785, 1786, 1787, 1788, - 1789, 1790, 1791, 1792, 1793, 1794, 1528, 1529, - 1795, 1796, 1797, 1798, 1799, 1800, 1801, 1802, - 1803, 1804, 1805, 125, 1626, 125, 126, 1626, - 1626, 1626, 1626, 1626, 125, 1626, 1626, 126, - 1626, 125, 1626, 125, 1626, 1626, 125, 1626, - 1626, 125, 1626, 125, 125, 125, 126, 125, - 1626, 1626, 126, 125, 1626, 125, 1626, 1626, - 125, 1626, 125, 1626, 1626, 1626, 125, 126, - 126, 1626, 125, 1626, 1626, 125, 125, 126, - 125, 125, 1626, 1626, 1626, 126, 125, 1626, - 125, 1626, 125, 126, 126, 125, 1626, 1626, - 1626, 1626, 1626, 125, 1626, 1626, 125, 1806, - 1807, 1808, 1809, 1810, 1811, 125, 1626, 1626, - 125, 1626, 1626, 125, 1626, 125, 1626, 125, - 1626, 125, 1626, 125, 1812, 1813, 125, 1626, - 125, 1626, 125, 1814, 1815, 1816, 1817, 1818, - 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, - 1827, 1828, 1829, 125, 126, 125, 1626, 1626, - 125, 1626, 125, 1626, 125, 1626, 1626, 1626, - 1626, 125, 1626, 1626, 125, 125, 126, 125, - 125, 1626, 126, 1626, 125, 1626, 125, 1626, - 1626, 125, 125, 126, 125, 125, 126, 125, - 1626, 1626, 125, 1626, 1626, 126, 1626, 125, - 1626, 1626, 1626, 1626, 125, 1626, 1626, 1626, - 125, 1626, 1626, 126, 125, 1830, 1831, 1810, - 1816, 1832, 125, 1626, 125, 1626, 1626, 125, - 1626, 125, 1833, 1834, 1835, 1836, 1837, 1838, - 125, 1839, 1840, 1841, 1814, 1842, 1843, 125, - 1626, 125, 1626, 125, 1626, 125, 1626, 1626, - 1626, 1626, 1626, 125, 1626, 125, 1844, 1845, - 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853, - 1854, 1855, 1856, 1857, 1858, 1859, 1856, 1860, - 1861, 1602, 1862, 1814, 125, 1626, 1626, 125, - 125, 126, 125, 1626, 125, 125, 125, 1626, - 126, 125, 1626, 1626, 126, 125, 1626, 125, - 1626, 1626, 125, 125, 125, 126, 125, 1626, - 1626, 125, 1626, 126, 125, 1626, 1626, 1626, - 125, 1626, 1626, 1626, 1626, 1626, 1626, 1626, - 125, 1626, 125, 125, 126, 125, 1626, 1626, - 1626, 125, 125, 125, 1626, 125, 126, 125, - 1626, 1626, 125, 1626, 126, 125, 1814, 1863, - 1864, 1529, 1865, 1866, 125, 1626, 125, 1626, - 125, 1626, 125, 1626, 125, 1867, 125, 1626, - 1626, 125, 1868, 1869, 1870, 1871, 1872, 1873, - 1874, 125, 1626, 1626, 125, 125, 125, 125, - 1626, 1626, 125, 126, 125, 1626, 1626, 125, - 125, 125, 1626, 1626, 1626, 1626, 125, 1875, - 125, 1626, 125, 1876, 125, 1877, 1878, 128, - 129, 1879, 125, 1626, 1626, 125, 125, 1626, - 1626, 148, 1880, 148, 148, 125, 1880, 125, - 125, 1626, 148, 125, 148, 125, 1880, 125, - 1880, 148, 1626, 125, 125, 1880, 125, 148, - 1880, 148, 1880, 1880, 572, 572, 125, 1880, - 1880, 1626, 1880, 148, 125, 126, 1626, 1880, - 148, 1880, 126, 148, 125, 125, 125, 125, - 1880, 1880, 126, 125, 125, 148, 148, 1880, - 148, 1880, 125, 125, 148, 1880, 1880, 125, - 148, 1626, 148, 126, 148, 1880, 148, 125, - 1881, 1882, 184, 1883, 1884, 1885, 1886, 1887, - 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, - 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, - 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, - 125, 148, 148, 148, 148, 1880, 125, 148, - 1880, 125, 1880, 125, 148, 148, 1880, 148, - 125, 148, 125, 126, 148, 1880, 125, 125, - 125, 1880, 1880, 125, 125, 125, 125, 1880, - 148, 148, 125, 125, 125, 125, 125, 148, - 125, 126, 148, 125, 1880, 1880, 1880, 148, - 148, 148, 148, 148, 148, 148, 1880, 125, - 125, 125, 125, 125, 125, 148, 125, 126, - 148, 125, 1880, 148, 1880, 148, 148, 148, - 148, 148, 148, 1880, 125, 125, 125, 148, - 148, 125, 148, 125, 126, 125, 1880, 148, - 1880, 148, 148, 148, 148, 148, 148, 1880, - 125, 148, 1880, 1880, 1880, 1880, 148, 148, - 1880, 126, 125, 1880, 148, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 1880, 125, - 148, 1880, 1880, 1880, 1880, 126, 125, 148, - 1880, 148, 148, 148, 148, 1880, 125, 125, - 125, 125, 125, 148, 125, 148, 125, 126, - 125, 1880, 148, 1880, 148, 148, 148, 148, - 148, 1880, 125, 148, 1880, 1880, 1880, 1880, - 148, 1880, 126, 148, 125, 148, 1880, 148, - 148, 148, 1880, 125, 125, 125, 148, 125, - 125, 148, 125, 126, 125, 148, 125, 1880, - 148, 1880, 148, 148, 148, 125, 1880, 1880, - 148, 1880, 1880, 126, 1880, 125, 1880, 1880, - 125, 1880, 126, 125, 1880, 1880, 1880, 125, - 1880, 126, 125, 148, 1880, 1880, 1880, 1880, - 126, 1880, 125, 148, 148, 1880, 125, 1880, - 1880, 148, 1880, 1880, 125, 1880, 125, 1912, - 1913, 1914, 217, 218, 219, 220, 221, 1915, - 223, 224, 225, 226, 227, 228, 1916, 1917, - 1918, 1919, 1920, 234, 1921, 236, 1922, 1528, - 1529, 1923, 1924, 1925, 1926, 1927, 1928, 1929, - 1930, 1538, 1931, 151, 152, 1932, 249, 250, - 251, 252, 151, 153, 151, 125, 1880, 125, - 126, 1880, 1880, 1880, 1880, 1880, 125, 1880, - 1880, 126, 1880, 148, 125, 125, 1880, 125, - 148, 148, 148, 1880, 148, 1880, 125, 148, - 1880, 148, 148, 1880, 125, 1880, 125, 125, - 125, 126, 125, 1880, 1880, 126, 148, 125, - 1880, 148, 148, 125, 148, 1880, 1880, 125, - 148, 1880, 125, 1880, 1880, 1880, 125, 126, - 126, 1880, 125, 1880, 148, 1880, 125, 148, - 125, 126, 125, 125, 1880, 1880, 148, 1880, - 148, 126, 148, 125, 1880, 125, 148, 148, - 1880, 125, 1880, 1880, 1880, 148, 1880, 148, - 1880, 125, 1880, 1880, 125, 1933, 1934, 255, - 1935, 257, 258, 259, 260, 261, 262, 263, - 151, 1936, 265, 1937, 267, 1938, 269, 125, - 1626, 1880, 1626, 1880, 1485, 125, 1626, 125, - 148, 148, 125, 125, 1880, 125, 1485, 1880, - 125, 125, 1880, 125, 148, 1880, 125, 125, - 148, 148, 148, 148, 148, 1880, 125, 1939, - 1940, 272, 151, 273, 125, 148, 1880, 148, - 125, 1880, 125, 153, 274, 275, 153, 1549, - 1941, 1942, 1943, 280, 281, 282, 1944, 284, - 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, - 1953, 1954, 295, 296, 152, 1955, 153, 151, - 125, 148, 148, 1880, 1880, 125, 148, 1880, - 148, 125, 1880, 125, 148, 1880, 1880, 1880, - 1880, 125, 148, 1880, 148, 1880, 125, 148, - 148, 125, 126, 125, 148, 125, 1880, 126, - 148, 1880, 148, 125, 1880, 125, 125, 148, - 1880, 148, 1880, 125, 148, 125, 126, 125, - 125, 126, 125, 1880, 148, 1880, 125, 1880, - 148, 1880, 126, 1880, 125, 1880, 1880, 1880, - 1880, 125, 1880, 148, 1880, 148, 1880, 125, - 148, 1880, 1880, 126, 125, 1956, 674, 302, - 303, 304, 305, 306, 307, 1957, 1704, 1958, - 1706, 312, 1959, 1960, 151, 125, 1880, 572, - 148, 148, 572, 572, 572, 125, 1626, 1626, - 1880, 1880, 1485, 125, 1880, 125, 148, 1880, - 148, 125, 148, 148, 148, 148, 1880, 125, - 1961, 1962, 317, 318, 319, 1963, 1964, 1965, - 1966, 324, 125, 325, 326, 153, 327, 328, - 1967, 330, 1968, 332, 1969, 334, 335, 153, - 151, 1581, 337, 338, 153, 339, 340, 341, - 342, 343, 344, 345, 346, 1970, 348, 349, - 1971, 351, 352, 353, 153, 259, 151, 354, - 125, 1880, 125, 1880, 125, 148, 125, 1880, - 125, 148, 148, 1880, 1880, 1880, 1880, 148, - 148, 148, 1880, 125, 148, 148, 1880, 125, - 1972, 1973, 1974, 1587, 1975, 1976, 1977, 1978, - 1979, 364, 1980, 1981, 1982, 1983, 1984, 1985, - 1986, 1983, 1987, 1988, 1602, 1989, 375, 1604, - 377, 125, 1880, 148, 1880, 125, 125, 126, - 125, 1880, 148, 125, 125, 1880, 1880, 148, - 1880, 126, 125, 1880, 148, 148, 125, 1880, - 148, 1880, 125, 125, 148, 125, 125, 126, - 148, 125, 1880, 148, 148, 1880, 125, 1880, - 125, 126, 125, 148, 148, 1880, 148, 148, - 148, 148, 148, 148, 1880, 125, 148, 1880, - 1880, 1880, 1880, 148, 1880, 1880, 1880, 125, - 148, 1880, 125, 125, 148, 125, 126, 125, - 1880, 148, 1880, 1880, 125, 125, 148, 125, - 1880, 148, 125, 126, 125, 1880, 148, 1880, - 125, 1880, 126, 125, 153, 382, 1605, 1990, - 1991, 1608, 386, 153, 1992, 1993, 151, 125, - 148, 1880, 125, 148, 1880, 125, 125, 1880, - 125, 148, 1880, 148, 125, 153, 389, 1994, - 125, 148, 148, 1880, 1880, 125, 1995, 1996, - 1997, 153, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 1615, 1998, 1999, 2000, - 151, 125, 1880, 1880, 125, 125, 125, 125, - 1880, 1880, 125, 1880, 1880, 125, 125, 125, - 1880, 1880, 1880, 1880, 125, 153, 2001, 409, - 410, 411, 151, 125, 125, 1880, 125, 148, - 2002, 125, 2003, 2004, 2005, 2007, 2006, 125, - 1880, 1880, 125, 125, 1880, 1880, 125, 1880, - 148, 2008, 148, 181, 148, 420, 2008, 420, - 420, 420, 148, 420, 148, 420, 2008, 420, - 2008, 148, 420, 420, 2008, 420, 148, 2008, - 148, 181, 2008, 2008, 572, 572, 420, 2008, - 2008, 2008, 148, 420, 421, 2008, 148, 2008, - 421, 148, 420, 420, 420, 420, 2008, 2008, - 421, 420, 420, 148, 148, 2008, 148, 2008, - 420, 420, 148, 2008, 2008, 420, 148, 148, - 421, 148, 2008, 148, 420, 2009, 2010, 184, - 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, - 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, - 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, - 2035, 2036, 2037, 2038, 2039, 420, 148, 148, - 148, 148, 2008, 420, 148, 2008, 420, 2008, - 420, 148, 148, 2008, 148, 420, 148, 420, - 421, 148, 2008, 420, 420, 420, 2008, 2008, - 420, 420, 420, 420, 2008, 148, 148, 420, - 420, 420, 420, 420, 148, 420, 421, 148, - 420, 2008, 2008, 2008, 148, 148, 148, 148, - 148, 148, 148, 2008, 420, 420, 420, 420, - 420, 420, 148, 420, 421, 148, 420, 2008, - 148, 2008, 148, 148, 148, 148, 148, 148, - 2008, 420, 420, 420, 148, 148, 420, 148, - 420, 421, 420, 2008, 148, 2008, 148, 148, - 148, 148, 148, 148, 2008, 420, 148, 2008, - 2008, 2008, 2008, 148, 148, 2008, 421, 420, - 2008, 148, 148, 148, 148, 148, 148, 148, - 148, 148, 148, 2008, 420, 148, 2008, 2008, - 2008, 2008, 421, 420, 148, 2008, 148, 148, - 148, 148, 2008, 420, 420, 420, 420, 420, - 148, 420, 148, 420, 421, 420, 2008, 148, - 2008, 148, 148, 148, 148, 148, 2008, 420, - 148, 2008, 2008, 2008, 2008, 148, 2008, 421, - 148, 420, 148, 2008, 148, 148, 148, 2008, - 420, 420, 420, 148, 420, 420, 148, 420, - 421, 420, 148, 420, 2008, 148, 2008, 148, - 148, 148, 420, 2008, 2008, 148, 2008, 2008, - 421, 2008, 420, 2008, 2008, 420, 2008, 421, - 420, 2008, 2008, 2008, 420, 2008, 421, 420, - 148, 2008, 2008, 2008, 2008, 421, 2008, 420, - 148, 148, 2008, 420, 2008, 2008, 148, 2008, - 2008, 420, 2008, 420, 2040, 2041, 2042, 217, - 218, 219, 220, 221, 2043, 223, 224, 225, - 226, 227, 228, 2044, 2045, 2046, 2047, 2048, - 234, 2049, 236, 2050, 483, 484, 2051, 2052, - 2053, 2054, 2055, 2056, 2057, 2058, 646, 2059, - 151, 152, 2060, 249, 250, 251, 252, 151, - 153, 151, 420, 2008, 420, 421, 2008, 2008, - 2008, 2008, 2008, 420, 2008, 2008, 421, 2008, - 148, 420, 420, 2008, 420, 148, 148, 148, - 2008, 148, 2008, 420, 148, 2008, 148, 148, - 2008, 420, 2008, 420, 420, 420, 421, 420, - 2008, 2008, 421, 148, 420, 2008, 148, 148, - 420, 148, 2008, 2008, 420, 148, 2008, 420, - 2008, 2008, 2008, 420, 421, 421, 2008, 420, - 2008, 148, 2008, 420, 148, 420, 421, 420, - 420, 2008, 2008, 148, 2008, 148, 421, 148, - 420, 2008, 420, 148, 148, 2008, 420, 2008, - 2008, 2008, 148, 2008, 148, 2008, 420, 2008, - 2008, 420, 2061, 2062, 255, 2063, 257, 258, - 259, 260, 261, 262, 263, 151, 2064, 265, - 2065, 267, 2066, 269, 420, 181, 181, 2008, - 181, 2008, 571, 420, 420, 148, 148, 420, - 420, 2008, 420, 571, 2008, 420, 420, 2008, - 420, 148, 2008, 420, 420, 148, 148, 148, - 148, 148, 2008, 420, 2067, 2068, 272, 151, - 273, 420, 148, 2008, 148, 420, 2008, 420, - 153, 274, 275, 153, 657, 2069, 2070, 2071, - 280, 281, 282, 2072, 284, 2073, 2074, 2075, - 2076, 2077, 2078, 2079, 2080, 2081, 2082, 295, - 296, 152, 2083, 153, 151, 420, 148, 148, - 2008, 2008, 420, 148, 2008, 148, 420, 2008, - 420, 148, 2008, 2008, 2008, 2008, 420, 148, - 2008, 148, 2008, 420, 148, 148, 420, 421, - 420, 148, 420, 2008, 421, 148, 2008, 148, - 420, 2008, 420, 420, 148, 2008, 148, 2008, - 420, 148, 420, 421, 420, 420, 421, 420, - 2008, 148, 2008, 420, 2008, 148, 2008, 421, - 2008, 420, 2008, 2008, 2008, 2008, 420, 2008, - 148, 2008, 148, 2008, 420, 148, 2008, 2008, - 421, 420, 2084, 674, 302, 303, 304, 305, - 306, 307, 2085, 932, 2086, 934, 312, 2087, - 2088, 151, 420, 2008, 572, 148, 148, 572, - 572, 572, 420, 181, 2008, 2008, 571, 420, - 2008, 420, 148, 2008, 148, 420, 148, 148, - 148, 148, 2008, 420, 2089, 2090, 317, 318, - 319, 2091, 2092, 2093, 2094, 324, 420, 325, - 326, 153, 327, 328, 2095, 330, 2096, 332, - 2097, 334, 335, 153, 151, 690, 337, 338, - 153, 339, 340, 341, 342, 343, 344, 345, - 346, 2098, 348, 349, 2099, 351, 352, 353, - 153, 259, 151, 354, 420, 2008, 420, 2008, - 420, 148, 420, 2008, 420, 148, 148, 2008, - 2008, 2008, 2008, 148, 148, 148, 2008, 420, - 148, 148, 2008, 420, 2100, 2101, 2102, 696, - 2103, 2104, 2105, 2106, 2107, 364, 2108, 2109, - 2110, 2111, 2112, 2113, 2114, 2111, 2115, 2116, - 552, 2117, 375, 712, 377, 420, 2008, 148, - 2008, 420, 420, 421, 420, 2008, 148, 420, - 420, 2008, 2008, 148, 2008, 421, 420, 2008, - 148, 148, 420, 2008, 148, 2008, 420, 420, - 148, 420, 420, 421, 148, 420, 2008, 148, - 148, 2008, 420, 2008, 420, 421, 420, 148, - 148, 2008, 148, 148, 148, 148, 148, 148, - 2008, 420, 148, 2008, 2008, 2008, 2008, 148, - 2008, 2008, 2008, 420, 148, 2008, 420, 420, - 148, 420, 421, 420, 2008, 148, 2008, 2008, - 420, 420, 148, 420, 2008, 148, 420, 421, - 420, 2008, 148, 2008, 420, 2008, 421, 420, - 153, 382, 713, 2118, 2119, 716, 386, 153, - 2120, 2121, 151, 420, 148, 2008, 420, 148, - 2008, 420, 420, 2008, 420, 148, 2008, 148, - 420, 153, 389, 2122, 420, 148, 148, 2008, - 2008, 420, 2123, 2124, 2125, 153, 394, 395, - 396, 397, 398, 399, 400, 401, 402, 403, - 723, 2126, 2127, 2128, 151, 420, 2008, 2008, - 420, 420, 420, 420, 2008, 2008, 420, 2008, - 2008, 420, 420, 420, 2008, 2008, 2008, 2008, - 420, 153, 2129, 409, 410, 411, 151, 420, - 420, 2008, 420, 148, 2130, 420, 2131, 2132, - 2133, 2135, 2134, 420, 2008, 2008, 420, 420, - 2008, 2008, 420, 2008, 148, 2136, 148, 148, - 420, 2136, 420, 420, 420, 148, 420, 148, - 420, 2136, 420, 2136, 148, 420, 420, 2136, - 420, 148, 2136, 148, 2136, 2136, 572, 572, - 420, 2136, 2136, 2136, 148, 420, 126, 2136, - 148, 2136, 126, 148, 420, 420, 420, 420, - 2136, 2136, 126, 420, 420, 148, 148, 2136, - 148, 2136, 420, 420, 148, 2136, 2136, 420, - 148, 148, 126, 148, 2136, 148, 420, 2137, - 2138, 184, 2139, 2140, 2141, 2142, 2143, 2144, - 2145, 2146, 2147, 2148, 2149, 2150, 2151, 2152, - 2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160, - 2161, 2162, 2163, 2164, 2165, 2166, 2167, 420, - 148, 148, 148, 148, 2136, 420, 148, 2136, - 420, 2136, 420, 148, 148, 2136, 148, 420, - 148, 420, 126, 148, 2136, 420, 420, 420, - 2136, 2136, 420, 420, 420, 420, 2136, 148, - 148, 420, 420, 420, 420, 420, 148, 420, - 126, 148, 420, 2136, 2136, 2136, 148, 148, - 148, 148, 148, 148, 148, 2136, 420, 420, - 420, 420, 420, 420, 148, 420, 126, 148, - 420, 2136, 148, 2136, 148, 148, 148, 148, - 148, 148, 2136, 420, 420, 420, 148, 148, - 420, 148, 420, 126, 420, 2136, 148, 2136, - 148, 148, 148, 148, 148, 148, 2136, 420, - 148, 2136, 2136, 2136, 2136, 148, 148, 2136, - 126, 420, 2136, 148, 148, 148, 148, 148, - 148, 148, 148, 148, 148, 2136, 420, 148, - 2136, 2136, 2136, 2136, 126, 420, 148, 2136, - 148, 148, 148, 148, 2136, 420, 420, 420, - 420, 420, 148, 420, 148, 420, 126, 420, - 2136, 148, 2136, 148, 148, 148, 148, 148, - 2136, 420, 148, 2136, 2136, 2136, 2136, 148, - 2136, 126, 148, 420, 148, 2136, 148, 148, - 148, 2136, 420, 420, 420, 148, 420, 420, - 148, 420, 126, 420, 148, 420, 2136, 148, - 2136, 148, 148, 148, 420, 2136, 2136, 148, - 2136, 2136, 126, 2136, 420, 2136, 2136, 420, - 2136, 126, 420, 2136, 2136, 2136, 420, 2136, - 126, 420, 148, 2136, 2136, 2136, 2136, 126, - 2136, 420, 148, 148, 2136, 420, 2136, 2136, - 148, 2136, 2136, 420, 2136, 420, 2168, 2169, - 2170, 217, 218, 219, 220, 221, 2171, 223, - 224, 225, 226, 227, 228, 2172, 2173, 2174, - 2175, 2176, 234, 2177, 236, 2178, 1528, 1529, - 2179, 2180, 2181, 2182, 2183, 2184, 2185, 2186, - 1538, 2187, 151, 152, 2188, 249, 250, 251, - 252, 151, 153, 151, 420, 2136, 420, 126, - 2136, 2136, 2136, 2136, 2136, 420, 2136, 2136, - 126, 2136, 148, 420, 420, 2136, 420, 148, - 148, 148, 2136, 148, 2136, 420, 148, 2136, - 148, 148, 2136, 420, 2136, 420, 420, 420, - 126, 420, 2136, 2136, 126, 148, 420, 2136, - 148, 148, 420, 148, 2136, 2136, 420, 148, - 2136, 420, 2136, 2136, 2136, 420, 126, 126, - 2136, 420, 2136, 148, 2136, 420, 148, 420, - 126, 420, 420, 2136, 2136, 148, 2136, 148, - 126, 148, 420, 2136, 420, 148, 148, 2136, - 420, 2136, 2136, 2136, 148, 2136, 148, 2136, - 420, 2136, 2136, 420, 2189, 2190, 255, 2191, - 257, 258, 259, 260, 261, 262, 263, 151, - 2192, 265, 2193, 267, 2194, 269, 420, 2136, - 2136, 2136, 420, 420, 148, 148, 420, 420, - 420, 2136, 2136, 420, 420, 2136, 420, 148, - 2136, 420, 420, 148, 148, 148, 148, 148, - 2136, 420, 2195, 2196, 1044, 272, 151, 273, - 1045, 1046, 1047, 1048, 420, 148, 2136, 1049, - 148, 420, 2136, 1049, 1049, 420, 153, 274, - 275, 153, 1549, 2197, 2198, 2199, 280, 281, - 282, 2200, 284, 2201, 2202, 2203, 2204, 2205, - 2206, 2207, 2208, 2209, 2210, 295, 296, 152, - 2211, 153, 151, 420, 148, 148, 2136, 2136, - 420, 148, 2136, 148, 420, 2136, 420, 148, - 2136, 2136, 2136, 2136, 420, 148, 2136, 148, - 2136, 420, 148, 148, 420, 126, 420, 148, - 420, 2136, 126, 148, 2136, 148, 420, 2136, - 420, 420, 148, 2136, 148, 2136, 420, 148, - 420, 126, 420, 420, 126, 420, 2136, 148, - 2136, 420, 2136, 148, 2136, 126, 2136, 420, - 2136, 2136, 2136, 2136, 420, 2136, 148, 2136, - 148, 2136, 420, 148, 2136, 2136, 126, 420, - 2212, 674, 302, 303, 304, 305, 306, 307, - 2213, 2214, 2215, 2216, 1194, 2217, 2218, 151, - 420, 2136, 572, 148, 148, 572, 572, 572, - 420, 2136, 2136, 2136, 420, 2136, 148, 148, - 2, 2136, 420, 148, 2136, 148, 2, 2136, - 148, 420, 1049, 148, 148, 148, 148, 2136, - 420, 2219, 2220, 317, 318, 319, 2221, 2222, - 2223, 2224, 324, 420, 325, 326, 153, 327, - 328, 2225, 330, 2226, 332, 2227, 334, 335, - 153, 151, 1581, 337, 338, 153, 339, 340, - 341, 342, 343, 344, 345, 346, 2228, 348, - 349, 2229, 351, 352, 353, 153, 259, 151, - 354, 420, 2136, 420, 2136, 420, 148, 420, - 2136, 420, 148, 148, 2136, 2136, 2136, 2136, - 148, 148, 148, 2136, 420, 148, 148, 2136, - 420, 2230, 2231, 2232, 1587, 2233, 2234, 2235, - 2236, 2237, 364, 2238, 2239, 2240, 2241, 2242, - 2243, 2244, 2241, 2245, 2246, 1602, 2247, 375, - 1604, 377, 420, 2136, 148, 2136, 420, 420, - 126, 420, 2136, 148, 420, 420, 2136, 2136, - 148, 2136, 126, 420, 2136, 148, 148, 420, - 2136, 148, 2136, 420, 420, 148, 420, 420, - 126, 148, 420, 2136, 148, 148, 2136, 420, - 2136, 420, 126, 420, 148, 148, 2136, 148, - 148, 148, 148, 148, 148, 2136, 420, 148, - 2136, 2136, 2136, 2136, 148, 2136, 2136, 2136, - 420, 148, 2136, 420, 420, 148, 420, 126, - 420, 2136, 148, 2136, 2136, 420, 420, 148, - 420, 2136, 148, 420, 126, 420, 2136, 148, - 2136, 420, 2136, 126, 420, 153, 382, 1605, - 2248, 2249, 1608, 386, 153, 2250, 2251, 151, - 420, 148, 2136, 420, 148, 2136, 420, 420, - 2136, 420, 148, 2136, 148, 420, 1162, 153, - 389, 2252, 420, 148, 148, 2136, 2136, 420, - 2253, 2254, 2255, 153, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 1615, 2256, - 2257, 2258, 151, 420, 2136, 2136, 420, 420, - 420, 420, 2136, 2136, 420, 2136, 2136, 420, - 420, 420, 2136, 2136, 2136, 2136, 420, 153, - 2259, 409, 410, 411, 151, 420, 420, 2136, - 420, 148, 2260, 420, 2261, 2262, 2263, 2265, - 2264, 420, 2136, 2136, 420, 420, 2136, 2136, - 420, 2136, 148, 2266, 148, 148, 420, 420, - 2266, 420, 420, 148, 420, 148, 420, 2266, - 420, 2266, 148, 420, 420, 2266, 420, 148, - 2266, 148, 2266, 2266, 572, 572, 420, 2266, - 2266, 2266, 148, 420, 126, 2266, 148, 2266, - 126, 148, 420, 420, 420, 420, 2266, 2266, - 126, 420, 420, 148, 148, 2266, 148, 2266, - 420, 420, 148, 2266, 2266, 420, 148, 148, - 126, 148, 2266, 148, 420, 2267, 2268, 184, - 2269, 2270, 2271, 2272, 2273, 2274, 2275, 2276, - 2277, 2278, 2279, 2280, 2281, 2282, 2283, 2284, - 2285, 2286, 2287, 2288, 2289, 2290, 2291, 2292, - 2293, 2294, 2295, 2296, 2297, 420, 148, 148, - 148, 148, 2266, 420, 148, 2266, 420, 2266, - 420, 148, 148, 2266, 148, 420, 148, 420, - 126, 148, 2266, 420, 420, 420, 2266, 2266, - 420, 420, 420, 420, 2266, 148, 148, 420, - 420, 420, 420, 420, 148, 420, 126, 148, - 420, 2266, 2266, 2266, 148, 148, 148, 148, - 148, 148, 148, 2266, 420, 420, 420, 420, - 420, 420, 148, 420, 126, 148, 420, 2266, - 148, 2266, 148, 148, 148, 148, 148, 148, - 2266, 420, 420, 420, 148, 148, 420, 148, - 420, 126, 420, 2266, 148, 2266, 148, 148, - 148, 148, 148, 148, 2266, 420, 148, 2266, - 2266, 2266, 2266, 148, 148, 2266, 126, 420, - 2266, 148, 148, 148, 148, 148, 148, 148, - 148, 148, 148, 2266, 420, 148, 2266, 2266, - 2266, 2266, 126, 420, 148, 2266, 148, 148, - 148, 148, 2266, 420, 420, 420, 420, 420, - 148, 420, 148, 420, 126, 420, 2266, 148, - 2266, 148, 148, 148, 148, 148, 2266, 420, - 148, 2266, 2266, 2266, 2266, 148, 2266, 126, - 148, 420, 148, 2266, 148, 148, 148, 2266, - 420, 420, 420, 148, 420, 420, 148, 420, - 126, 420, 148, 420, 2266, 148, 2266, 148, - 148, 148, 420, 2266, 2266, 148, 2266, 2266, - 126, 2266, 420, 2266, 2266, 420, 2266, 126, - 420, 2266, 2266, 2266, 420, 2266, 126, 420, - 148, 2266, 2266, 2266, 2266, 126, 2266, 420, - 148, 148, 2266, 420, 2266, 2266, 148, 2266, - 2266, 420, 2266, 420, 2298, 2299, 2300, 217, - 218, 219, 220, 221, 2301, 223, 224, 225, - 226, 227, 228, 2302, 2303, 2304, 2305, 2306, - 234, 2307, 236, 2308, 1528, 1529, 2309, 2310, - 2311, 2312, 2313, 2314, 2315, 2316, 1538, 2317, - 151, 152, 2318, 249, 250, 251, 252, 151, - 153, 151, 420, 2266, 420, 126, 2266, 2266, - 2266, 2266, 2266, 420, 2266, 2266, 126, 2266, - 148, 420, 420, 2266, 420, 148, 148, 148, - 2266, 148, 2266, 420, 148, 2266, 148, 148, - 2266, 420, 2266, 420, 420, 420, 126, 420, - 2266, 2266, 126, 148, 420, 2266, 148, 148, - 420, 148, 2266, 2266, 420, 148, 2266, 420, - 2266, 2266, 2266, 420, 126, 126, 2266, 420, - 2266, 148, 2266, 420, 148, 420, 126, 420, - 420, 2266, 2266, 148, 2266, 148, 126, 148, - 420, 2266, 420, 148, 148, 2266, 420, 2266, - 2266, 2266, 148, 2266, 148, 2266, 420, 2266, - 2266, 420, 2319, 2320, 255, 2321, 257, 258, - 259, 260, 261, 262, 263, 151, 2322, 265, - 2323, 267, 2324, 269, 420, 2266, 2266, 2136, - 420, 420, 148, 148, 420, 420, 2266, 420, - 2136, 2266, 420, 420, 2266, 420, 148, 2266, - 420, 420, 148, 148, 148, 148, 148, 2266, - 420, 2325, 2326, 1044, 272, 151, 273, 1045, - 1046, 1047, 1048, 420, 148, 2266, 1049, 148, - 420, 2266, 1049, 1049, 420, 153, 274, 275, - 153, 1549, 2327, 2328, 2329, 280, 281, 282, - 2330, 284, 2331, 2332, 2333, 2334, 2335, 2336, - 2337, 2338, 2339, 2340, 295, 296, 152, 2341, - 153, 151, 420, 148, 148, 2266, 2266, 420, - 148, 2266, 148, 420, 2266, 420, 148, 2266, - 2266, 2266, 2266, 420, 148, 2266, 148, 2266, - 420, 148, 148, 420, 126, 420, 148, 420, - 2266, 126, 148, 2266, 148, 420, 2266, 420, - 420, 148, 2266, 148, 2266, 420, 148, 420, - 126, 420, 420, 126, 420, 2266, 148, 2266, - 420, 2266, 148, 2266, 126, 2266, 420, 2266, - 2266, 2266, 2266, 420, 2266, 148, 2266, 148, - 2266, 420, 148, 2266, 2266, 126, 420, 2342, - 674, 302, 303, 304, 305, 306, 307, 2343, - 2214, 2344, 2216, 1194, 2345, 2346, 151, 420, - 2266, 572, 148, 148, 572, 572, 572, 420, - 2266, 2266, 2136, 420, 2266, 420, 148, 2266, - 148, 420, 1049, 148, 148, 148, 148, 2266, - 420, 2347, 2348, 317, 318, 319, 2349, 2350, - 2351, 2352, 324, 420, 325, 326, 153, 327, - 328, 2353, 330, 2354, 332, 2355, 334, 335, - 153, 151, 1581, 337, 338, 153, 339, 340, - 341, 342, 343, 344, 345, 346, 2356, 348, - 349, 2357, 351, 352, 353, 153, 259, 151, - 354, 420, 2266, 420, 2266, 420, 148, 420, - 2266, 420, 148, 148, 2266, 2266, 2266, 2266, - 148, 148, 148, 2266, 420, 148, 148, 2266, - 420, 2358, 2359, 2360, 1587, 2361, 2362, 2363, - 2364, 2365, 364, 2366, 2367, 2368, 2369, 2370, - 2371, 2372, 2369, 2373, 2374, 1602, 2375, 375, - 1604, 377, 420, 2266, 148, 2266, 420, 420, - 126, 420, 2266, 148, 420, 420, 2266, 2266, - 148, 2266, 126, 420, 2266, 148, 148, 420, - 2266, 148, 2266, 420, 420, 148, 420, 420, - 126, 148, 420, 2266, 148, 148, 2266, 420, - 2266, 420, 126, 420, 148, 148, 2266, 148, - 148, 148, 148, 148, 148, 2266, 420, 148, - 2266, 2266, 2266, 2266, 148, 2266, 2266, 2266, - 420, 148, 2266, 420, 420, 148, 420, 126, - 420, 2266, 148, 2266, 2266, 420, 420, 148, - 420, 2266, 148, 420, 126, 420, 2266, 148, - 2266, 420, 2266, 126, 420, 153, 382, 1605, - 2376, 2377, 1608, 386, 153, 2378, 2379, 151, - 420, 148, 2266, 420, 148, 2266, 420, 420, - 2266, 420, 148, 2266, 148, 420, 1162, 153, - 389, 2380, 420, 148, 148, 2266, 2266, 420, - 2381, 2382, 2383, 153, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 1615, 2384, - 2385, 2386, 151, 420, 2266, 2266, 420, 420, - 420, 420, 2266, 2266, 420, 2266, 2266, 420, - 420, 420, 2266, 2266, 2266, 2266, 420, 153, - 2387, 409, 410, 411, 151, 420, 420, 2266, - 420, 148, 2388, 420, 2389, 2390, 2391, 2393, - 2392, 420, 2266, 2266, 420, 420, 2266, 2266, - 420, 2266, 2395, 2394, 2, 2395, 2, 2395, - 2395, 2394, 2395, 2395, 2394, 2395, 2395, 2395, - 2394, 2395, 2395, 2395, 2394, 2395, 2395, 2394, - 2395, 2395, 2395, 2395, 2394, 2395, 2395, 2395, - 2394, 2394, 2395, 2395, 2394, 2395, 2394, 2396, - 2397, 2398, 2399, 2400, 2402, 2403, 2404, 2406, - 2407, 2408, 2409, 2410, 2411, 2412, 2413, 2414, - 2415, 2416, 2417, 2418, 2419, 2420, 2421, 2422, - 2423, 2401, 2405, 2394, 2395, 2395, 2395, 2395, - 2, 2395, 2, 2395, 2, 2, 2, 2395, - 2, 2, 2, 2395, 2395, 2395, 2395, 2, - 2, 2, 2, 2, 2, 2395, 2, 2, - 2, 2, 2, 2, 2395, 2, 2, 2, - 2, 2395, 2395, 2395, 2395, 2, 2395, 2395, - 2395, 2395, 2395, 2, 2395, 2395, 2, 2395, - 2395, 2395, 2395, 2, 2395, 2395, 2, 2, - 2, 2, 2, 2, 2395, 2395, 2395, 2395, - 2395, 2395, 2, 2395, 2395, 2, 2, 2, - 2, 2, 2, 2395, 2395, 2, 2395, 2395, - 2395, 2395, 2395, 2, 2395, 2395, 2, 2395, - 2, 2395, 2395, 2395, 2, 2395, 2, 2395, - 2395, 2395, 2395, 2395, 2, 2395, 2, 2395, - 2395, 2395, 2395, 2, 2395, 2, 2424, 2425, - 2426, 2427, 2428, 2429, 2430, 2431, 2432, 2433, - 2434, 2435, 2436, 2437, 2438, 2439, 2440, 2441, - 2442, 2443, 2444, 2394, 2395, 2, 2395, 2395, - 2395, 2395, 2395, 2, 2395, 2395, 2395, 2, - 2395, 2, 2395, 2395, 2, 2395, 2395, 2, - 2395, 2, 2, 2, 2395, 2395, 2, 2395, - 2, 2395, 2395, 2, 2395, 2, 2395, 2395, - 2395, 2, 2395, 2, 2395, 2395, 2, 2, - 2, 2395, 2395, 2395, 2, 2395, 2, 2395, - 2, 2395, 2395, 2395, 2395, 2395, 2, 2395, - 2395, 2, 2445, 2446, 2447, 2448, 2449, 2450, - 2394, 2395, 2395, 2, 2395, 2395, 2, 2395, - 2, 2395, 2, 2395, 2, 2395, 2, 2451, - 2452, 2394, 2395, 2, 2395, 2, 2453, 2454, - 2455, 2456, 2457, 2458, 2459, 2460, 2461, 2462, - 2463, 2464, 2465, 2466, 2467, 2394, 2395, 2395, - 2, 2395, 2, 2395, 2, 2395, 2395, 2395, - 2395, 2, 2395, 2395, 2, 2, 2, 2395, - 2395, 2, 2395, 2, 2395, 2395, 2, 2, - 2, 2395, 2395, 2, 2395, 2395, 2395, 2, - 2395, 2395, 2395, 2395, 2, 2395, 2395, 2395, - 2, 2395, 2395, 2, 2468, 2469, 2449, 2454, - 2470, 2394, 2395, 2, 2395, 2395, 2, 2395, - 2, 2471, 2472, 2473, 2474, 2475, 2476, 2394, - 2477, 2478, 2479, 2480, 2481, 2, 2395, 2, - 2395, 2, 2395, 2, 2395, 2395, 2395, 2395, - 2395, 2, 2395, 2, 2482, 2483, 2484, 2485, - 2486, 2487, 2488, 2489, 2490, 2491, 2492, 2493, - 2494, 2495, 2496, 2493, 2497, 2498, 2499, 2, - 2395, 2395, 2, 2, 2395, 2, 2, 2, - 2395, 2395, 2395, 2, 2395, 2, 2395, 2395, - 2, 2, 2, 2395, 2395, 2, 2395, 2, - 2395, 2395, 2395, 2, 2395, 2395, 2395, 2395, - 2395, 2395, 2395, 2, 2395, 2, 2, 2395, - 2395, 2395, 2, 2, 2, 2395, 2, 2395, - 2395, 2, 2395, 2, 2500, 2501, 2502, 2503, - 2, 2395, 2, 2395, 2, 2395, 2, 2395, - 2, 2504, 2, 2395, 2395, 2, 2505, 2506, - 2507, 2508, 2509, 2510, 2, 2395, 2395, 2, - 2, 2, 2, 2395, 2395, 2, 2395, 2395, - 2, 2, 2, 2395, 2395, 2395, 2395, 2, - 2511, 2, 2395, 2, 2512, 2394, 2513, 2514, - 2515, 2517, 2516, 2, 2395, 2395, 2, 2, - 2395, 2395, 148, 2518, 148, 148, 0, 0, - 2518, 0, 0, 148, 0, 148, 0, 2518, - 0, 2518, 148, 0, 0, 2518, 0, 148, - 2518, 2518, 2518, 148, 148, 0, 2518, 2518, - 2518, 148, 0, 2518, 148, 2518, 148, 0, - 0, 0, 0, 2518, 2518, 0, 0, 0, - 148, 148, 2518, 148, 2518, 0, 0, 148, - 2518, 2518, 0, 148, 148, 148, 2518, 148, - 0, 2519, 2520, 184, 2521, 2522, 2523, 2524, - 2525, 2526, 2527, 2528, 2529, 2530, 2531, 2532, - 2533, 2534, 2535, 2536, 2537, 2538, 2539, 2540, - 2541, 2542, 2543, 2544, 2545, 2546, 2547, 2548, - 2549, 0, 148, 148, 148, 148, 2518, 0, - 148, 2518, 0, 2518, 0, 148, 148, 2518, - 148, 148, 0, 148, 2518, 0, 0, 0, - 2518, 2518, 0, 0, 0, 0, 2518, 148, - 148, 0, 0, 0, 0, 0, 148, 0, - 148, 0, 2518, 2518, 2518, 148, 148, 148, - 148, 148, 148, 148, 2518, 0, 0, 0, - 0, 0, 0, 148, 0, 148, 0, 2518, - 148, 2518, 148, 148, 148, 148, 148, 148, - 2518, 0, 0, 0, 148, 148, 0, 148, - 0, 2518, 148, 2518, 148, 148, 148, 148, - 148, 148, 2518, 0, 148, 2518, 2518, 2518, - 2518, 148, 148, 2518, 0, 2518, 148, 148, - 148, 148, 148, 148, 148, 148, 148, 148, - 2518, 0, 148, 2518, 2518, 2518, 2518, 0, - 148, 2518, 148, 148, 148, 148, 2518, 0, - 0, 0, 0, 0, 148, 0, 148, 0, - 2518, 148, 2518, 148, 148, 148, 148, 148, - 2518, 0, 148, 2518, 2518, 2518, 2518, 148, - 2518, 148, 0, 148, 2518, 148, 148, 148, - 2518, 0, 0, 0, 148, 0, 0, 148, - 0, 148, 0, 2518, 148, 2518, 148, 148, - 148, 0, 2518, 2518, 148, 2518, 2518, 2518, - 0, 2518, 2518, 0, 2518, 0, 2518, 2518, - 2518, 0, 2518, 0, 148, 2518, 2518, 2518, - 2518, 2518, 0, 148, 148, 2518, 0, 2518, - 2518, 148, 2518, 2518, 0, 2518, 0, 2550, - 2551, 2552, 217, 218, 219, 220, 221, 2553, - 223, 224, 225, 226, 227, 228, 2554, 2555, - 2556, 2557, 2558, 234, 2559, 236, 2560, 2561, - 2562, 2563, 2564, 2565, 2566, 2567, 2568, 246, - 2569, 151, 152, 2570, 249, 250, 251, 252, - 151, 153, 151, 0, 2518, 0, 2518, 2518, - 2518, 2518, 2518, 0, 2518, 2518, 2518, 148, - 0, 0, 2518, 0, 148, 148, 148, 2518, - 148, 2518, 0, 148, 2518, 148, 148, 2518, - 0, 2518, 0, 0, 0, 2518, 2518, 148, - 0, 2518, 148, 148, 0, 148, 2518, 2518, - 0, 148, 2518, 0, 2518, 2518, 2518, 0, - 2518, 0, 2518, 148, 2518, 0, 148, 0, - 0, 2518, 2518, 148, 2518, 148, 148, 0, - 2518, 0, 148, 148, 2518, 0, 2518, 2518, - 2518, 148, 2518, 148, 2518, 0, 2518, 2518, - 0, 2571, 2572, 255, 2573, 257, 258, 259, - 260, 261, 262, 263, 151, 2574, 265, 2575, - 267, 2576, 269, 0, 2518, 2518, 0, 148, - 148, 2518, 2518, 0, 2518, 0, 0, 2518, - 0, 148, 2518, 0, 0, 148, 148, 148, - 148, 148, 2518, 0, 2577, 2578, 272, 151, - 273, 0, 148, 2518, 148, 0, 2518, 0, - 153, 274, 275, 153, 276, 2579, 2580, 2581, - 280, 281, 282, 2582, 284, 2583, 2584, 2585, - 2586, 2587, 2588, 2589, 2590, 2591, 2592, 295, - 296, 152, 2593, 153, 151, 0, 148, 148, - 2518, 2518, 0, 148, 2518, 148, 0, 2518, - 0, 148, 2518, 2518, 2518, 2518, 0, 148, - 2518, 148, 2518, 0, 148, 148, 0, 148, - 0, 2518, 148, 2518, 148, 0, 2518, 0, - 0, 148, 2518, 148, 2518, 0, 148, 0, - 0, 2518, 148, 2518, 0, 2518, 148, 2518, - 2518, 0, 2518, 2518, 2518, 2518, 0, 2518, - 148, 2518, 148, 2518, 0, 148, 2518, 2518, - 0, 2594, 301, 302, 303, 304, 305, 306, - 307, 2595, 309, 2596, 311, 312, 2597, 2598, - 151, 0, 2518, 148, 148, 148, 148, 148, - 148, 0, 2518, 2518, 0, 2518, 0, 148, - 2518, 148, 0, 148, 148, 148, 148, 2518, - 0, 2599, 2600, 317, 318, 319, 2601, 2602, - 2603, 2604, 324, 0, 325, 326, 153, 327, - 328, 2605, 330, 2606, 332, 2607, 334, 335, - 153, 151, 336, 337, 338, 153, 339, 340, - 341, 342, 343, 344, 345, 346, 2608, 348, - 349, 2609, 351, 352, 353, 153, 259, 151, - 354, 0, 2518, 0, 2518, 0, 148, 0, - 2518, 0, 148, 148, 2518, 2518, 2518, 2518, - 148, 148, 148, 2518, 0, 148, 148, 2518, - 0, 2610, 2611, 2612, 358, 2613, 2614, 2615, - 2616, 2617, 364, 2618, 2619, 2620, 2621, 2622, - 2623, 2624, 2621, 2625, 2626, 2627, 375, 376, - 377, 0, 2518, 148, 2518, 0, 0, 2518, - 148, 0, 0, 2518, 2518, 148, 2518, 0, - 2518, 148, 148, 0, 2518, 148, 2518, 0, - 148, 148, 148, 0, 0, 2518, 148, 148, - 2518, 0, 2518, 0, 148, 148, 2518, 148, - 148, 148, 148, 148, 148, 2518, 0, 148, - 2518, 2518, 2518, 2518, 148, 2518, 2518, 2518, - 0, 148, 2518, 0, 0, 148, 0, 2518, - 148, 2518, 2518, 0, 0, 148, 0, 2518, - 148, 0, 2518, 148, 2518, 0, 2518, 0, - 153, 382, 343, 2628, 2629, 385, 386, 153, - 2630, 2631, 151, 0, 148, 2518, 0, 148, - 2518, 0, 0, 2518, 0, 148, 2518, 148, - 0, 153, 389, 2632, 0, 148, 148, 2518, - 2518, 0, 2633, 2634, 2635, 153, 394, 395, - 396, 397, 398, 399, 400, 401, 402, 403, - 404, 2636, 2637, 2638, 151, 0, 2518, 2518, - 0, 0, 0, 0, 2518, 2518, 0, 2518, - 2518, 0, 0, 0, 2518, 2518, 2518, 2518, - 0, 153, 2639, 409, 410, 411, 151, 0, - 0, 2518, 0, 148, 2640, 0, 2641, 2642, - 2643, 2645, 2644, 0, 2518, 2518, 0, 0, - 2518, 2518, 0, 2518, 148, 2646, 148, 148, - 420, 420, 2646, 420, 443, 148, 420, 148, - 420, 2646, 420, 2646, 148, 443, 420, 420, - 2646, 420, 148, 2646, 148, 2646, 2646, 572, - 572, 420, 2646, 2646, 443, 2646, 148, 420, - 421, 443, 2646, 148, 2646, 421, 148, 420, - 420, 420, 420, 2646, 2646, 421, 420, 420, - 148, 148, 2646, 148, 2646, 420, 420, 148, - 2646, 2646, 420, 148, 443, 148, 421, 148, - 2646, 148, 420, 2647, 2648, 184, 2649, 2650, - 2651, 2652, 2653, 2654, 2655, 2656, 2657, 2658, - 2659, 2660, 2661, 2662, 2663, 2664, 2665, 2666, - 2667, 2668, 2669, 2670, 2671, 2672, 2673, 2674, - 2675, 2676, 2677, 420, 148, 148, 148, 148, - 2646, 420, 148, 2646, 420, 2646, 420, 148, - 148, 2646, 148, 420, 148, 420, 421, 148, - 2646, 420, 420, 420, 2646, 2646, 420, 420, - 420, 420, 2646, 148, 148, 420, 420, 420, - 420, 420, 148, 420, 421, 148, 420, 2646, - 2646, 2646, 148, 148, 148, 148, 148, 148, - 148, 2646, 420, 420, 420, 420, 420, 420, - 148, 420, 421, 148, 420, 2646, 148, 2646, - 148, 148, 148, 148, 148, 148, 2646, 420, - 420, 420, 148, 148, 420, 148, 420, 421, - 420, 2646, 148, 2646, 148, 148, 148, 148, - 148, 148, 2646, 420, 148, 2646, 2646, 2646, - 2646, 148, 148, 2646, 421, 420, 2646, 148, - 148, 148, 148, 148, 148, 148, 148, 148, - 148, 2646, 420, 148, 2646, 2646, 2646, 2646, - 421, 420, 148, 2646, 148, 148, 148, 148, - 2646, 420, 420, 420, 420, 420, 148, 420, - 148, 420, 421, 420, 2646, 148, 2646, 148, - 148, 148, 148, 148, 2646, 420, 148, 2646, - 2646, 2646, 2646, 148, 2646, 421, 148, 420, - 148, 2646, 148, 148, 148, 2646, 420, 420, - 420, 148, 420, 420, 148, 420, 421, 420, - 148, 420, 2646, 148, 2646, 148, 148, 148, - 420, 2646, 2646, 148, 2646, 2646, 421, 2646, - 420, 2646, 2646, 420, 2646, 421, 420, 2646, - 2646, 2646, 420, 2646, 421, 420, 148, 2646, - 2646, 2646, 2646, 421, 2646, 420, 148, 148, - 2646, 420, 2646, 2646, 148, 2646, 2646, 420, - 2646, 420, 2678, 2679, 2680, 217, 218, 219, - 220, 221, 2681, 223, 224, 225, 226, 227, - 228, 2682, 2683, 2684, 2685, 2686, 234, 2687, - 236, 2688, 483, 484, 2689, 2690, 2691, 2692, - 2693, 2694, 2695, 2696, 646, 2697, 151, 152, - 2698, 249, 250, 251, 252, 151, 153, 151, - 420, 2646, 420, 421, 2646, 2646, 2646, 2646, - 2646, 420, 2646, 2646, 421, 2646, 148, 420, - 420, 2646, 420, 148, 148, 148, 2646, 148, - 2646, 420, 148, 2646, 148, 148, 2646, 420, - 2646, 420, 420, 420, 421, 420, 2646, 2646, - 421, 148, 420, 2646, 148, 148, 420, 148, - 2646, 2646, 420, 148, 2646, 420, 2646, 2646, - 2646, 420, 421, 421, 2646, 420, 2646, 148, - 2646, 420, 148, 420, 421, 420, 420, 2646, - 2646, 148, 2646, 148, 421, 148, 420, 2646, - 420, 148, 148, 2646, 420, 2646, 2646, 2646, - 148, 2646, 148, 2646, 420, 2646, 2646, 420, - 2699, 2700, 255, 2701, 257, 258, 259, 260, - 261, 262, 263, 151, 2702, 265, 2703, 267, - 2704, 269, 420, 443, 2646, 443, 2646, 571, - 420, 443, 420, 148, 148, 420, 420, 2646, - 420, 571, 2646, 420, 420, 2646, 420, 148, - 2646, 420, 420, 148, 148, 148, 148, 148, - 2646, 420, 2705, 2706, 272, 151, 273, 420, - 148, 2646, 148, 420, 2646, 420, 153, 274, - 275, 153, 657, 2707, 2708, 2709, 280, 281, - 282, 2710, 284, 2711, 2712, 2713, 2714, 2715, - 2716, 2717, 2718, 2719, 2720, 295, 296, 152, - 2721, 153, 151, 420, 148, 148, 2646, 2646, - 420, 148, 2646, 148, 420, 2646, 420, 148, - 2646, 2646, 2646, 2646, 420, 148, 2646, 148, - 2646, 420, 148, 148, 420, 421, 420, 148, - 420, 2646, 421, 148, 2646, 148, 420, 2646, - 420, 420, 148, 2646, 148, 2646, 420, 148, - 420, 421, 420, 420, 421, 420, 2646, 148, - 2646, 420, 2646, 148, 2646, 421, 2646, 420, - 2646, 2646, 2646, 2646, 420, 2646, 148, 2646, - 148, 2646, 420, 148, 2646, 2646, 421, 420, - 2722, 674, 302, 303, 304, 305, 306, 307, - 2723, 1321, 2724, 1323, 312, 2725, 2726, 151, - 420, 2646, 572, 148, 148, 572, 572, 572, - 420, 443, 443, 2646, 2646, 571, 420, 2646, - 420, 148, 2646, 148, 420, 148, 148, 148, - 148, 2646, 420, 2727, 2728, 317, 318, 319, - 2729, 2730, 2731, 2732, 324, 420, 325, 326, - 153, 327, 328, 2733, 330, 2734, 332, 2735, - 334, 335, 153, 151, 690, 337, 338, 153, - 339, 340, 341, 342, 343, 344, 345, 346, - 2736, 348, 349, 2737, 351, 352, 353, 153, - 259, 151, 354, 420, 2646, 420, 2646, 420, - 148, 420, 2646, 420, 148, 148, 2646, 2646, - 2646, 2646, 148, 148, 148, 2646, 420, 148, - 148, 2646, 420, 2738, 2739, 2740, 696, 2741, - 2742, 2743, 2744, 2745, 364, 2746, 2747, 2748, - 2749, 2750, 2751, 2752, 2749, 2753, 2754, 552, - 2755, 375, 712, 377, 420, 2646, 148, 2646, - 420, 420, 421, 420, 2646, 148, 420, 420, - 2646, 2646, 148, 2646, 421, 420, 2646, 148, - 148, 420, 2646, 148, 2646, 420, 420, 148, - 420, 420, 421, 148, 420, 2646, 148, 148, - 2646, 420, 2646, 420, 421, 420, 148, 148, - 2646, 148, 148, 148, 148, 148, 148, 2646, - 420, 148, 2646, 2646, 2646, 2646, 148, 2646, - 2646, 2646, 420, 148, 2646, 420, 420, 148, - 420, 421, 420, 2646, 148, 2646, 2646, 420, - 420, 148, 420, 2646, 148, 420, 421, 420, - 2646, 148, 2646, 420, 2646, 421, 420, 153, - 382, 713, 2756, 2757, 716, 386, 153, 2758, - 2759, 151, 420, 148, 2646, 420, 148, 2646, - 420, 420, 2646, 420, 148, 2646, 148, 420, - 153, 389, 2760, 420, 148, 148, 2646, 2646, - 420, 2761, 2762, 2763, 153, 394, 395, 396, - 397, 398, 399, 400, 401, 402, 403, 723, - 2764, 2765, 2766, 151, 420, 2646, 2646, 420, - 420, 420, 420, 2646, 2646, 420, 2646, 2646, - 420, 420, 420, 2646, 2646, 2646, 2646, 420, - 153, 2767, 409, 410, 411, 151, 420, 420, - 2646, 420, 148, 2768, 420, 2769, 2770, 2771, - 2773, 2772, 420, 2646, 2646, 420, 420, 2646, - 2646, 420, 2646, 148, 2774, 148, 148, 420, - 420, 2774, 420, 420, 148, 420, 148, 420, - 2774, 420, 2774, 148, 420, 420, 2774, 420, - 148, 2774, 148, 2774, 2774, 572, 572, 420, - 2774, 2774, 2774, 148, 420, 421, 2774, 148, - 2774, 421, 148, 420, 420, 420, 420, 2774, - 2774, 421, 420, 420, 148, 148, 2774, 148, - 2774, 420, 420, 148, 2774, 2774, 420, 148, - 148, 421, 148, 2774, 148, 420, 2775, 2776, - 184, 2777, 2778, 2779, 2780, 2781, 2782, 2783, - 2784, 2785, 2786, 2787, 2788, 2789, 2790, 2791, - 2792, 2793, 2794, 2795, 2796, 2797, 2798, 2799, - 2800, 2801, 2802, 2803, 2804, 2805, 420, 148, - 148, 148, 148, 2774, 420, 148, 2774, 420, - 2774, 420, 148, 148, 2774, 148, 420, 148, - 420, 421, 148, 2774, 420, 420, 420, 2774, - 2774, 420, 420, 420, 420, 2774, 148, 148, - 420, 420, 420, 420, 420, 148, 420, 421, - 148, 420, 2774, 2774, 2774, 148, 148, 148, - 148, 148, 148, 148, 2774, 420, 420, 420, - 420, 420, 420, 148, 420, 421, 148, 420, - 2774, 148, 2774, 148, 148, 148, 148, 148, - 148, 2774, 420, 420, 420, 148, 148, 420, - 148, 420, 421, 420, 2774, 148, 2774, 148, - 148, 148, 148, 148, 148, 2774, 420, 148, - 2774, 2774, 2774, 2774, 148, 148, 2774, 421, - 420, 2774, 148, 148, 148, 148, 148, 148, - 148, 148, 148, 148, 2774, 420, 148, 2774, - 2774, 2774, 2774, 421, 420, 148, 2774, 148, - 148, 148, 148, 2774, 420, 420, 420, 420, - 420, 148, 420, 148, 420, 421, 420, 2774, - 148, 2774, 148, 148, 148, 148, 148, 2774, - 420, 148, 2774, 2774, 2774, 2774, 148, 2774, - 421, 148, 420, 148, 2774, 148, 148, 148, - 2774, 420, 420, 420, 148, 420, 420, 148, - 420, 421, 420, 148, 420, 2774, 148, 2774, - 148, 148, 148, 420, 2774, 2774, 148, 2774, - 2774, 421, 2774, 420, 2774, 2774, 420, 2774, - 421, 420, 2774, 2774, 2774, 420, 2774, 421, - 420, 148, 2774, 2774, 2774, 2774, 421, 2774, - 420, 148, 148, 2774, 420, 2774, 2774, 148, - 2774, 2774, 420, 2774, 420, 2806, 2807, 2808, - 217, 218, 219, 220, 221, 2809, 223, 224, - 225, 226, 227, 228, 2810, 2811, 2812, 2813, - 2814, 234, 2815, 236, 2816, 483, 484, 2817, - 2818, 2819, 2820, 2821, 2822, 2823, 2824, 646, - 2825, 151, 152, 2826, 249, 250, 251, 252, - 151, 153, 151, 420, 2774, 420, 421, 2774, - 2774, 2774, 2774, 2774, 420, 2774, 2774, 421, - 2774, 148, 420, 420, 2774, 420, 148, 148, - 148, 2774, 148, 2774, 420, 148, 2774, 148, - 148, 2774, 420, 2774, 420, 420, 420, 421, - 420, 2774, 2774, 421, 148, 420, 2774, 148, - 148, 420, 148, 2774, 2774, 420, 148, 2774, - 420, 2774, 2774, 2774, 420, 421, 421, 2774, - 420, 2774, 148, 2774, 420, 148, 420, 421, - 420, 420, 2774, 2774, 148, 2774, 148, 421, - 148, 420, 2774, 420, 148, 148, 2774, 420, - 2774, 2774, 2774, 148, 2774, 148, 2774, 420, - 2774, 2774, 420, 2827, 2828, 255, 2829, 257, - 258, 259, 260, 261, 262, 263, 151, 2830, - 265, 2831, 267, 2832, 269, 420, 2774, 2774, - 571, 420, 420, 148, 148, 420, 420, 2774, - 420, 571, 2774, 420, 420, 2774, 420, 148, - 2774, 420, 420, 148, 148, 148, 148, 148, - 2774, 420, 2833, 2834, 1044, 272, 151, 273, - 1045, 1046, 1047, 1048, 420, 148, 2774, 1049, - 148, 420, 2774, 1049, 1049, 420, 153, 274, - 275, 153, 657, 2835, 2836, 2837, 280, 281, - 282, 2838, 284, 2839, 2840, 2841, 2842, 2843, - 2844, 2845, 2846, 2847, 2848, 295, 296, 152, - 2849, 153, 151, 420, 148, 148, 2774, 2774, - 420, 148, 2774, 148, 420, 2774, 420, 148, - 2774, 2774, 2774, 2774, 420, 148, 2774, 148, - 2774, 420, 148, 148, 420, 421, 420, 148, - 420, 2774, 421, 148, 2774, 148, 420, 2774, - 420, 420, 148, 2774, 148, 2774, 420, 148, - 420, 421, 420, 420, 421, 420, 2774, 148, - 2774, 420, 2774, 148, 2774, 421, 2774, 420, - 2774, 2774, 2774, 2774, 420, 2774, 148, 2774, - 148, 2774, 420, 148, 2774, 2774, 421, 420, - 2850, 674, 302, 303, 304, 305, 306, 307, - 2851, 676, 2852, 678, 1194, 2853, 2854, 151, - 420, 2774, 572, 148, 148, 572, 572, 572, - 420, 2774, 2774, 571, 420, 2774, 420, 148, - 2774, 148, 420, 1049, 148, 148, 148, 148, - 2774, 420, 2855, 2856, 317, 318, 319, 2857, - 2858, 2859, 2860, 324, 420, 325, 326, 153, - 327, 328, 2861, 330, 2862, 332, 2863, 334, - 335, 153, 151, 690, 337, 338, 153, 339, - 340, 341, 342, 343, 344, 345, 346, 2864, - 348, 349, 2865, 351, 352, 353, 153, 259, - 151, 354, 420, 2774, 420, 2774, 420, 148, - 420, 2774, 420, 148, 148, 2774, 2774, 2774, - 2774, 148, 148, 148, 2774, 420, 148, 148, - 2774, 420, 2866, 2867, 2868, 696, 2869, 2870, - 2871, 2872, 2873, 364, 2874, 2875, 2876, 2877, - 2878, 2879, 2880, 2877, 2881, 2882, 552, 2883, - 375, 712, 377, 420, 2774, 148, 2774, 420, - 420, 421, 420, 2774, 148, 420, 420, 2774, - 2774, 148, 2774, 421, 420, 2774, 148, 148, - 420, 2774, 148, 2774, 420, 420, 148, 420, - 420, 421, 148, 420, 2774, 148, 148, 2774, - 420, 2774, 420, 421, 420, 148, 148, 2774, - 148, 148, 148, 148, 148, 148, 2774, 420, - 148, 2774, 2774, 2774, 2774, 148, 2774, 2774, - 2774, 420, 148, 2774, 420, 420, 148, 420, - 421, 420, 2774, 148, 2774, 2774, 420, 420, - 148, 420, 2774, 148, 420, 421, 420, 2774, - 148, 2774, 420, 2774, 421, 420, 153, 382, - 713, 2884, 2885, 716, 386, 153, 2886, 2887, - 151, 420, 148, 2774, 420, 148, 2774, 420, - 420, 2774, 420, 148, 2774, 148, 420, 1162, - 153, 389, 2888, 420, 148, 148, 2774, 2774, - 420, 2889, 2890, 2891, 153, 394, 395, 396, - 397, 398, 399, 400, 401, 402, 403, 723, - 2892, 2893, 2894, 151, 420, 2774, 2774, 420, - 420, 420, 420, 2774, 2774, 420, 2774, 2774, - 420, 420, 420, 2774, 2774, 2774, 2774, 420, - 153, 2895, 409, 410, 411, 151, 420, 420, - 2774, 420, 148, 2896, 420, 2897, 2898, 2899, - 2901, 2900, 420, 2774, 2774, 420, 420, 2774, - 2774, 420, 2774, 2008, 148, 148, 2008, 148, - 2008, 2008, 148, 2008, 2008, 148, 2008, 2008, - 2008, 148, 2008, 2008, 2008, 148, 2008, 2008, - 148, 2008, 2008, 2008, 2008, 148, 2008, 2008, - 2008, 148, 148, 2008, 2008, 148, 2008, 148, - 2902, 2903, 2904, 2905, 2906, 2908, 2909, 2910, - 2912, 2913, 2914, 2915, 2916, 2917, 2918, 2919, - 2920, 2921, 2922, 2923, 2924, 2925, 2926, 2927, - 2928, 2929, 2907, 2911, 148, 2930, 2931, 2932, - 2933, 2934, 2935, 2936, 2937, 2938, 2939, 2940, - 2941, 2942, 2943, 2944, 2945, 2946, 2947, 2948, - 2949, 2950, 148, 2951, 2952, 2953, 2954, 2955, - 2956, 148, 2957, 2958, 148, 2959, 2960, 2961, - 2962, 2963, 2964, 2965, 2966, 2967, 2968, 2969, - 2970, 2971, 2972, 2973, 148, 2974, 2975, 2955, - 2960, 2976, 148, 2977, 2978, 2979, 2980, 2981, - 2982, 148, 2983, 148, 148, 148, 148, 148, - 2395, 0, 148, 2395, 0, 148, 148, 2395, - 148, 0, 148, 0, 126, 148, 2395, 0, - 0, 0, 2395, 2395, 0, 0, 0, 0, - 2395, 148, 148, 0, 0, 0, 0, 0, - 148, 0, 126, 148, 0, 2395, 2395, 2395, - 148, 148, 148, 148, 148, 148, 148, 2395, - 0, 0, 0, 0, 0, 0, 148, 0, - 126, 148, 0, 2395, 148, 2395, 148, 148, - 148, 148, 148, 148, 2395, 0, 0, 0, - 148, 148, 0, 148, 0, 126, 0, 2395, - 148, 2395, 148, 148, 148, 148, 148, 148, - 2395, 0, 148, 2395, 2395, 2395, 2395, 148, - 148, 2395, 126, 0, 2395, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 148, 2395, - 0, 148, 2395, 2395, 2395, 2395, 126, 0, - 148, 2395, 148, 148, 148, 148, 2395, 0, - 0, 0, 0, 0, 148, 0, 148, 0, - 126, 0, 2395, 148, 2395, 148, 148, 148, - 148, 148, 2395, 0, 148, 2395, 2395, 2395, - 2395, 148, 2395, 126, 148, 0, 148, 2395, - 148, 148, 148, 2395, 0, 0, 0, 148, - 0, 0, 148, 0, 126, 0, 148, 0, - 2395, 148, 2395, 148, 148, 148, 0, 2395, - 2395, 148, 2395, 2395, 126, 2395, 0, 2395, - 126, 0, 2395, 126, 0, 148, 2395, 2395, - 2395, 2395, 126, 2395, 0, 148, 148, 2395, - 0, 2395, 2395, 148, 2395, 2395, 0, 126, - 2395, 2395, 2395, 2395, 2395, 0, 2395, 2395, - 126, 2395, 148, 0, 148, 2984, 148, 2984, - 148, 181, 148, 2985, 2, 2984, 2985, 2985, - 148, 2985, 148, 2985, 2984, 2985, 2984, 148, - 2985, 2985, 2984, 2985, 148, 2984, 148, 181, - 2984, 2984, 572, 572, 2985, 2984, 2984, 2984, - 148, 2985, 421, 2984, 148, 2984, 421, 148, - 2985, 2985, 2985, 2985, 2984, 2984, 421, 2985, - 2985, 148, 148, 2984, 148, 2984, 2985, 2985, - 148, 2984, 2984, 2985, 148, 148, 421, 148, - 2984, 148, 2985, 2986, 2987, 184, 2988, 2989, - 2990, 2991, 2992, 2993, 2994, 2995, 2996, 2997, - 2998, 2999, 3000, 3001, 3002, 3003, 3004, 3005, - 3006, 3007, 3008, 3009, 3010, 3011, 3012, 3013, - 3014, 3015, 3016, 2985, 148, 148, 148, 148, - 2984, 2, 148, 2984, 2, 2984, 2, 148, - 148, 2984, 148, 2, 148, 2, 421, 148, - 2984, 2, 2, 2, 2984, 2984, 2, 2, - 2, 2, 2984, 148, 148, 2, 2, 2, - 2, 2, 148, 2, 421, 148, 2, 2984, - 2984, 2984, 148, 148, 148, 148, 148, 148, - 148, 2984, 2, 2, 2, 2, 2, 2, - 148, 2, 421, 148, 2, 2984, 148, 2984, - 148, 148, 148, 148, 148, 148, 2984, 2, - 2, 2, 148, 148, 2, 148, 2, 421, - 2, 2984, 148, 2984, 148, 148, 148, 148, - 148, 148, 2984, 2, 148, 2984, 2984, 2984, - 2984, 148, 148, 2984, 421, 2, 2984, 148, - 148, 148, 148, 148, 148, 148, 148, 148, - 148, 2984, 2, 148, 2984, 2984, 2984, 2984, - 421, 2, 148, 2984, 148, 148, 148, 148, - 2984, 2, 2, 2, 2, 2, 148, 2, - 148, 2, 421, 2, 2984, 148, 2984, 148, - 148, 148, 148, 148, 2984, 2, 148, 2984, - 2984, 2984, 2984, 148, 2984, 421, 148, 2, - 148, 2984, 148, 148, 148, 2984, 2, 2, - 2, 148, 2, 2, 148, 2, 421, 2, - 148, 2, 2984, 148, 2984, 148, 148, 148, - 2, 2984, 2984, 148, 2984, 2984, 421, 2984, - 2, 2984, 2984, 2, 2984, 421, 2, 2984, - 2984, 2984, 2, 2984, 421, 2, 148, 2984, - 2984, 2984, 2984, 421, 2984, 2, 148, 148, - 2984, 2, 2984, 2984, 148, 2984, 2984, 2, - 2984, 2, 3017, 3018, 3019, 217, 3020, 3022, - 218, 219, 220, 221, 3023, 223, 224, 225, - 226, 227, 228, 3024, 3025, 3026, 3027, 3028, - 234, 3029, 236, 3030, 483, 484, 3031, 3032, - 3033, 3034, 3035, 3036, 3037, 3038, 646, 3039, - 151, 152, 3040, 249, 250, 251, 252, 3021, - 151, 153, 151, 2985, 2984, 2, 421, 2984, - 2984, 2984, 2984, 2984, 2, 2984, 2984, 421, - 2984, 148, 2, 2984, 148, 2984, 2, 2984, - 2, 148, 148, 148, 2984, 148, 2984, 2, - 148, 2984, 148, 148, 2984, 2, 2984, 2, - 2, 2, 421, 2, 2984, 2984, 421, 148, - 2, 2984, 148, 148, 2, 148, 2984, 2984, - 2, 148, 2984, 2, 2984, 2984, 2984, 2, - 421, 421, 2984, 2, 2984, 148, 2984, 2, - 148, 2, 421, 2, 2, 2984, 2984, 148, - 2984, 148, 421, 148, 2, 2984, 2, 148, - 148, 2984, 2, 2984, 2984, 2984, 148, 2984, - 148, 2984, 2, 2984, 2984, 2, 3041, 3042, - 255, 3043, 257, 258, 259, 260, 261, 262, - 263, 151, 3044, 265, 3045, 267, 3046, 269, - 2985, 181, 181, 2984, 181, 2984, 571, 2, - 2, 148, 148, 2, 2, 2984, 2, 571, - 2984, 2, 2, 2984, 2, 148, 2984, 2, - 2, 148, 148, 148, 148, 148, 2984, 2, - 3047, 3048, 3049, 3021, 3050, 3051, 3052, 2985, - 148, 2984, 148, 2, 2984, 2, 148, 2984, - 2, 2, 148, 2, 2984, 3053, 2, 3053, - 2985, 2985, 3053, 2985, 3053, 3053, 2985, 3053, - 3053, 2985, 3053, 3053, 3053, 2985, 3053, 3053, - 3053, 2985, 3053, 3053, 2985, 3053, 3053, 3053, - 3053, 2985, 3053, 3053, 3053, 2985, 2985, 3053, - 3053, 2985, 3053, 2985, 3054, 3055, 3056, 3057, - 3058, 3060, 3061, 3062, 3064, 3065, 3066, 3067, - 3068, 3069, 3070, 3071, 3072, 3073, 3074, 3075, - 3076, 3077, 3078, 3079, 3080, 3081, 3059, 3063, - 2985, 3053, 3053, 3053, 3053, 2985, 3053, 2985, - 3053, 2985, 2985, 2985, 3053, 2985, 2985, 2985, - 3053, 3053, 3053, 3053, 2985, 2985, 2985, 2985, - 2985, 2985, 3053, 2985, 2985, 2985, 2985, 2985, - 2985, 3053, 2985, 2985, 2985, 2985, 3053, 3053, - 3053, 3053, 2985, 3053, 3053, 3053, 3053, 3053, - 2985, 3053, 3053, 2985, 3053, 3053, 3053, 3053, - 2985, 3053, 3053, 2985, 2985, 2985, 2985, 2985, - 2985, 3053, 3053, 3053, 3053, 3053, 3053, 2985, - 3053, 3053, 2985, 2985, 2985, 2985, 2985, 2985, - 3053, 3053, 2985, 3053, 3053, 3053, 3053, 3053, - 2985, 3053, 3053, 2985, 3053, 2985, 3053, 3053, - 3053, 2985, 3053, 2985, 3053, 3053, 3053, 3053, - 3053, 2985, 3053, 2985, 3053, 3053, 3053, 3053, - 2985, 3053, 2985, 3082, 3083, 3084, 3085, 3087, - 3088, 3089, 3090, 3091, 3092, 3093, 3094, 3095, - 3096, 3097, 3098, 3099, 3100, 3101, 3102, 3103, - 3104, 3105, 3086, 2985, 3053, 2985, 3053, 3053, - 3053, 3053, 3053, 2985, 3053, 3053, 3053, 2985, - 3053, 2985, 3053, 3053, 2985, 3053, 3053, 2985, - 3053, 3053, 2985, 3053, 2985, 2985, 2985, 3053, - 3053, 2985, 3053, 2985, 3053, 3053, 2985, 3053, - 2985, 3053, 3053, 3053, 2985, 3053, 2985, 3053, - 3053, 2985, 2985, 2985, 3053, 3053, 3053, 2985, - 3053, 2985, 3053, 2985, 3053, 3053, 3053, 3053, - 3053, 2985, 3053, 3053, 2985, 3106, 3107, 3108, - 3109, 3110, 3111, 2985, 3053, 3053, 2985, 3053, - 3053, 2985, 3053, 2985, 3053, 2985, 3053, 2985, - 3053, 2985, 3112, 3113, 3114, 3086, 3115, 3051, - 3052, 2985, 3053, 2985, 3053, 2985, 3053, 2985, - 2985, 3053, 3053, 2, 3116, 3117, 3118, 3119, - 3120, 3121, 3122, 3123, 3124, 3125, 3126, 3127, - 3128, 3129, 3130, 3085, 3086, 2985, 3053, 3053, - 2985, 3053, 2985, 3053, 2985, 3053, 3053, 3053, - 3053, 2985, 3053, 3053, 2985, 2985, 2985, 3053, - 3053, 2985, 3053, 3053, 2985, 3053, 3053, 2985, - 2985, 2985, 3053, 3053, 2985, 3053, 3053, 3053, - 2985, 3053, 3053, 3053, 3053, 2985, 3053, 3053, - 3053, 2985, 3053, 3053, 2985, 3086, 3131, 3132, - 2985, 3086, 2985, 3053, 2985, 2985, 3053, 3133, - 3134, 3110, 3135, 3136, 2985, 3053, 2985, 3053, - 3053, 2985, 3053, 2985, 3053, 3053, 3053, 3053, - 3053, 2985, 3137, 3138, 3139, 3140, 3141, 3142, - 2985, 3143, 3144, 3145, 3146, 3147, 2985, 3053, - 2985, 3053, 2985, 3053, 2985, 3053, 3053, 3053, - 3053, 3053, 2985, 3053, 2985, 3148, 3149, 3150, - 3151, 3152, 3153, 3154, 3155, 3156, 3157, 3158, - 3159, 3160, 3161, 3162, 3159, 3163, 3164, 3165, - 2985, 3053, 3053, 2985, 2985, 3053, 2985, 2985, - 2985, 3053, 3053, 3053, 2985, 3053, 2985, 3053, - 3053, 2985, 2985, 2985, 3053, 3053, 2985, 3053, - 2985, 3053, 3053, 3053, 2985, 3053, 3053, 3053, - 3053, 3053, 3053, 3053, 2985, 3053, 2985, 2985, - 3053, 3053, 3053, 2985, 2985, 2985, 3053, 2985, - 3053, 3053, 2985, 3053, 2985, 3166, 3167, 3168, - 3169, 2985, 3053, 2985, 3053, 2985, 3053, 2985, - 3053, 2985, 3170, 2985, 3053, 3053, 2985, 3171, - 3172, 3173, 3174, 3175, 3176, 2985, 3053, 3053, - 2985, 2985, 2985, 2985, 3053, 3053, 2985, 3053, - 3053, 2985, 2985, 2985, 3053, 3053, 3053, 3053, - 2985, 3177, 2985, 3053, 2985, 3178, 2985, 3179, - 3087, 3085, 3180, 3086, 2985, 3053, 3053, 2985, - 153, 274, 275, 153, 657, 3181, 3182, 3183, - 280, 281, 282, 3184, 284, 3185, 3186, 3187, - 3188, 3189, 3190, 3191, 3192, 3193, 3194, 295, - 296, 152, 3195, 3196, 151, 3021, 2985, 148, - 148, 2984, 2984, 2, 148, 2984, 148, 2, - 2984, 2, 148, 2984, 2984, 2984, 2984, 2, - 148, 2984, 148, 2984, 2, 148, 148, 2, - 421, 2, 148, 2, 2984, 421, 148, 2984, - 148, 2, 2984, 2, 2984, 2, 148, 2984, - 148, 2984, 2, 148, 2, 421, 2, 2, - 421, 2, 2984, 148, 2984, 2, 2984, 148, - 2984, 421, 2984, 2, 2984, 2984, 2984, 2984, - 2, 2984, 148, 2984, 148, 2984, 2, 148, - 2984, 2984, 421, 2, 3021, 3197, 3198, 2985, - 3021, 2, 2984, 2, 2, 2984, 3199, 674, - 302, 303, 304, 305, 306, 307, 3200, 932, - 3201, 934, 312, 3202, 3203, 151, 2985, 2984, - 572, 148, 148, 572, 572, 572, 2, 181, - 2984, 2984, 571, 2, 2984, 2, 148, 2984, - 2, 2984, 2984, 2984, 2984, 2984, 2, 3204, - 3205, 317, 318, 319, 3206, 3207, 3208, 3209, - 324, 2985, 325, 326, 153, 327, 328, 3210, - 330, 3211, 332, 3212, 334, 335, 153, 151, - 690, 337, 338, 153, 339, 340, 341, 342, - 343, 344, 345, 346, 3213, 348, 349, 3214, - 351, 352, 353, 153, 259, 151, 354, 2, - 2984, 2, 2984, 2, 148, 2, 2984, 2, - 148, 148, 2984, 2984, 2984, 2984, 148, 148, - 148, 2984, 2, 148, 148, 2984, 2, 3215, - 3216, 3217, 696, 3218, 3219, 3220, 3221, 3222, - 364, 3223, 3224, 3225, 3226, 3227, 3228, 3229, - 3226, 3230, 3231, 552, 3232, 375, 712, 377, - 2, 2984, 148, 2984, 2, 2, 421, 2, - 2984, 148, 2, 2, 2984, 2984, 148, 2984, - 421, 2, 2984, 148, 148, 2, 2984, 148, - 2984, 2, 2, 148, 2, 2, 421, 148, - 2, 2984, 148, 148, 2984, 2, 2984, 2, - 421, 2, 148, 148, 2984, 148, 148, 148, - 148, 148, 148, 2984, 2, 148, 2984, 2984, - 2984, 2984, 148, 2984, 2984, 2984, 2, 148, - 2984, 2, 2, 148, 2, 421, 2, 2984, - 148, 2984, 2984, 2, 2, 148, 2, 2984, - 148, 2, 421, 2, 2984, 148, 2984, 2, - 2984, 421, 2, 153, 382, 713, 3233, 3234, - 716, 386, 153, 3235, 3236, 151, 2, 148, - 2984, 2, 148, 2984, 2, 2, 2984, 2, - 148, 2984, 148, 2, 153, 389, 3237, 2, - 148, 148, 2984, 2984, 2, 3238, 3239, 3240, - 153, 394, 395, 396, 397, 398, 399, 400, - 401, 402, 403, 723, 3241, 3242, 3243, 151, - 2, 2984, 2984, 2, 2, 2, 2, 2984, - 2984, 2, 2984, 2984, 2, 2, 2, 2984, - 2984, 2984, 2984, 2, 153, 3244, 409, 410, - 411, 151, 2, 2, 2984, 2, 148, 3245, - 2985, 3246, 3247, 3196, 3248, 3021, 2, 2984, - 2984, 2, 2, 2984, 2, 2984, 0, 2395, - 0, 148, 148, 148, 2395, 148, 2395, 0, - 148, 2395, 148, 148, 2395, 0, 0, 0, - 126, 0, 2395, 2395, 126, 148, 0, 2395, - 148, 148, 0, 148, 2395, 2395, 0, 148, - 2395, 0, 126, 126, 2395, 0, 2395, 148, - 2395, 0, 148, 0, 126, 0, 0, 2395, - 2395, 148, 2395, 148, 126, 148, 0, 2395, - 0, 148, 148, 2395, 0, 2395, 2395, 2395, - 148, 2395, 148, 2395, 0, 2395, 3249, 2395, - 2136, 0, 0, 148, 148, 0, 0, 2395, - 0, 2136, 0, 2395, 0, 148, 2395, 0, - 0, 148, 148, 148, 148, 148, 2395, 0, - 3250, 3250, 0, 3250, 3251, 2, 3250, 2, - 3250, 3250, 3251, 3250, 3250, 3251, 3250, 3250, - 3250, 3251, 3250, 3250, 3250, 3251, 3250, 3250, - 3251, 3250, 3250, 3250, 3250, 3251, 3250, 3250, - 3250, 3251, 3251, 3250, 3250, 3251, 3250, 3251, - 3252, 3253, 3254, 3255, 3256, 3258, 3259, 3260, - 3262, 3263, 3264, 3265, 3266, 3267, 3268, 3269, - 3270, 3271, 3272, 3273, 3274, 3275, 3276, 3277, - 3278, 3279, 3257, 3261, 3251, 3250, 3250, 3250, - 3250, 2, 3250, 2, 3250, 2, 2, 2, - 3250, 2, 2, 2, 3250, 3250, 3250, 3250, - 2, 2, 2, 2, 2, 2, 3250, 2, - 2, 2, 2, 2, 2, 3250, 2, 2, - 2, 2, 3250, 3250, 3250, 3250, 2, 3250, - 3250, 3250, 3250, 3250, 2, 3250, 3250, 2, - 3250, 3250, 3250, 3250, 2, 3250, 3250, 2, - 2, 2, 2, 2, 2, 3250, 3250, 3250, - 3250, 3250, 3250, 2, 3250, 3250, 2, 2, - 2, 2, 2, 2, 3250, 3250, 2, 3250, - 3250, 3250, 3250, 3250, 2, 3250, 3250, 2, - 3250, 2, 3250, 3250, 3250, 2, 3250, 2, - 3250, 3250, 3250, 3250, 3250, 2, 3250, 2, - 3250, 3250, 3250, 3250, 2, 3250, 2, 3280, - 3281, 3282, 3283, 3284, 3285, 3286, 3287, 3288, - 3289, 3290, 3291, 3292, 3293, 3294, 3295, 3296, - 3297, 3298, 3299, 3300, 3251, 3250, 2, 3250, - 3250, 3250, 3250, 3250, 2, 3250, 3250, 3250, - 2, 3250, 2, 3250, 3250, 2, 3250, 3250, - 2, 3250, 2, 2, 2, 3250, 3250, 2, - 3250, 2, 3250, 3250, 2, 3250, 2, 3250, - 3250, 3250, 2, 3250, 2, 3250, 3250, 2, - 2, 2, 3250, 3250, 3250, 2, 3250, 2, - 3250, 2, 3250, 3250, 3250, 3250, 3250, 2, - 3250, 3250, 2, 3301, 3302, 3303, 3304, 3305, - 3306, 3251, 3250, 3250, 2, 3250, 3250, 2, - 3250, 2, 3250, 2, 3250, 2, 3250, 2, - 3307, 3308, 3251, 3250, 2, 3250, 2, 3309, - 3310, 3311, 3312, 3313, 3314, 3315, 3316, 3317, - 3318, 3319, 3320, 3321, 3322, 3323, 3251, 3250, - 3250, 2, 3250, 2, 3250, 2, 3250, 3250, - 3250, 3250, 2, 3250, 3250, 2, 2, 2, - 3250, 3250, 2, 3250, 2, 3250, 3250, 2, - 2, 2, 3250, 3250, 2, 3250, 3250, 3250, - 2, 3250, 3250, 3250, 3250, 2, 3250, 3250, - 3250, 2, 3250, 3250, 2, 3324, 3325, 3305, - 3310, 3326, 3251, 3250, 2, 3250, 3250, 2, - 3250, 2, 3327, 3328, 3329, 3330, 3331, 3332, - 3251, 3333, 3334, 3335, 3336, 3337, 2, 3250, - 2, 3250, 2, 3250, 2, 3250, 3250, 3250, - 3250, 3250, 2, 3250, 2, 3338, 3339, 3340, - 3341, 3342, 3343, 3344, 3345, 3346, 3347, 3348, - 3349, 3350, 3351, 3352, 3349, 3353, 3354, 3355, - 2, 3250, 3250, 2, 2, 3250, 2, 2, - 2, 3250, 3250, 3250, 2, 3250, 2, 3250, - 3250, 2, 2, 2, 3250, 3250, 2, 3250, - 2, 3250, 3250, 3250, 2, 3250, 3250, 3250, - 3250, 3250, 3250, 3250, 2, 3250, 2, 2, - 3250, 3250, 3250, 2, 2, 2, 3250, 2, - 3250, 3250, 2, 3250, 2, 3356, 3357, 3358, - 3359, 2, 3250, 2, 3250, 2, 3250, 2, - 3250, 2, 3360, 2, 3250, 3250, 2, 3361, - 3362, 3363, 3364, 3365, 3366, 2, 3250, 3250, - 2, 2, 2, 2, 3250, 3250, 2, 3250, - 3250, 2, 2, 2, 3250, 3250, 3250, 3250, - 2, 3367, 2, 3250, 2, 3368, 3251, 3369, - 3370, 3371, 3373, 3372, 2, 3250, 3250, 2, - 2, 3250, 3250, 0, 3250, 0, 3250, 3374, - 3250, 3374, 148, 3250, 2395, 3375, 3376, 3250, - 0, 148, 3374, 148, 181, 148, 420, 420, - 3374, 420, 420, 148, 420, 148, 420, 3374, - 420, 3374, 148, 420, 420, 3374, 420, 148, - 3374, 148, 181, 3374, 3374, 572, 572, 420, - 3374, 3374, 3374, 148, 420, 421, 3374, 148, - 3374, 421, 148, 420, 420, 420, 420, 3374, - 3374, 421, 420, 420, 148, 148, 3374, 148, - 3374, 420, 420, 148, 3374, 3374, 420, 148, - 148, 421, 148, 3374, 148, 420, 3377, 3378, - 184, 3379, 3380, 3381, 3382, 3383, 3384, 3385, - 3386, 3387, 3388, 3389, 3390, 3391, 3392, 3393, - 3394, 3395, 3396, 3397, 3398, 3399, 3400, 3401, - 3402, 3403, 3404, 3405, 3406, 3407, 420, 148, - 148, 148, 148, 3374, 420, 148, 3374, 420, - 3374, 420, 148, 148, 3374, 148, 420, 148, - 420, 421, 148, 3374, 420, 420, 420, 3374, - 3374, 420, 420, 420, 420, 3374, 148, 148, - 420, 420, 420, 420, 420, 148, 420, 421, - 148, 420, 3374, 3374, 3374, 148, 148, 148, - 148, 148, 148, 148, 3374, 420, 420, 420, - 420, 420, 420, 148, 420, 421, 148, 420, - 3374, 148, 3374, 148, 148, 148, 148, 148, - 148, 3374, 420, 420, 420, 148, 148, 420, - 148, 420, 421, 420, 3374, 148, 3374, 148, - 148, 148, 148, 148, 148, 3374, 420, 148, - 3374, 3374, 3374, 3374, 148, 148, 3374, 421, - 420, 3374, 148, 148, 148, 148, 148, 148, - 148, 148, 148, 148, 3374, 420, 148, 3374, - 3374, 3374, 3374, 421, 420, 148, 3374, 148, - 148, 148, 148, 3374, 420, 420, 420, 420, - 420, 148, 420, 148, 420, 421, 420, 3374, - 148, 3374, 148, 148, 148, 148, 148, 3374, - 420, 148, 3374, 3374, 3374, 3374, 148, 3374, - 421, 148, 420, 148, 3374, 148, 148, 148, - 3374, 420, 420, 420, 148, 420, 420, 148, - 420, 421, 420, 148, 420, 3374, 148, 3374, - 148, 148, 148, 420, 3374, 3374, 148, 3374, - 3374, 421, 3374, 420, 3374, 3374, 420, 3374, - 421, 420, 3374, 3374, 3374, 420, 3374, 421, - 420, 148, 3374, 3374, 3374, 3374, 421, 3374, - 420, 148, 148, 3374, 420, 3374, 3374, 148, - 3374, 3374, 420, 3374, 420, 3408, 3409, 3410, - 217, 218, 219, 220, 221, 3411, 223, 224, - 225, 226, 227, 228, 3412, 3413, 3414, 3415, - 3416, 234, 3417, 236, 3418, 483, 484, 3419, - 3420, 3421, 3422, 3423, 3424, 3425, 3426, 646, - 3427, 151, 152, 3428, 249, 250, 251, 252, - 151, 153, 151, 420, 3374, 420, 421, 3374, - 3374, 3374, 3374, 3374, 420, 3374, 3374, 421, - 3374, 148, 420, 420, 3374, 420, 148, 148, - 148, 3374, 148, 3374, 420, 148, 3374, 148, - 148, 3374, 420, 3374, 420, 420, 420, 421, - 420, 3374, 3374, 421, 148, 420, 3374, 148, - 148, 420, 148, 3374, 3374, 420, 148, 3374, - 420, 3374, 3374, 3374, 420, 421, 421, 3374, - 420, 3374, 148, 3374, 420, 148, 420, 421, - 420, 420, 3374, 3374, 148, 3374, 148, 421, - 148, 420, 3374, 420, 148, 148, 3374, 420, - 3374, 3374, 3374, 148, 3374, 148, 3374, 420, - 3374, 3374, 420, 3429, 3430, 255, 3431, 257, - 258, 259, 260, 261, 262, 263, 151, 3432, - 265, 3433, 267, 3434, 269, 420, 181, 181, - 3374, 181, 3374, 571, 420, 420, 148, 148, - 420, 420, 3374, 420, 571, 3374, 420, 420, - 3374, 420, 148, 3374, 420, 420, 148, 148, - 148, 148, 148, 3374, 420, 3435, 3436, 272, - 151, 273, 420, 148, 3374, 148, 420, 3374, - 420, 153, 274, 275, 153, 657, 3437, 3438, - 3439, 280, 281, 282, 3440, 284, 3441, 3442, - 3443, 3444, 3445, 3446, 3447, 3448, 3449, 3450, - 295, 296, 152, 3451, 153, 151, 420, 148, - 148, 3374, 3374, 420, 148, 3374, 148, 420, - 3374, 420, 148, 3374, 3374, 3374, 3374, 420, - 148, 3374, 148, 3374, 420, 148, 148, 420, - 421, 420, 148, 420, 3374, 421, 148, 3374, - 148, 420, 3374, 420, 420, 148, 3374, 148, - 3374, 420, 148, 420, 421, 420, 420, 421, - 420, 3374, 148, 3374, 420, 3374, 148, 3374, - 421, 3374, 420, 3374, 3374, 3374, 3374, 420, - 3374, 148, 3374, 148, 3374, 420, 148, 3374, - 3374, 421, 420, 3452, 674, 302, 303, 304, - 305, 306, 307, 3453, 932, 3454, 934, 312, - 3455, 3456, 151, 420, 3374, 572, 148, 148, - 572, 572, 572, 420, 181, 3374, 3374, 571, - 420, 3374, 420, 148, 3374, 148, 420, 148, - 148, 148, 148, 3374, 420, 3457, 3458, 317, - 318, 319, 3459, 3460, 3461, 3462, 324, 420, - 325, 326, 153, 327, 328, 3463, 330, 3464, - 332, 3465, 334, 335, 153, 151, 690, 337, - 338, 153, 339, 340, 341, 342, 343, 344, - 345, 346, 3466, 348, 349, 3467, 351, 352, - 353, 153, 259, 151, 354, 420, 3374, 420, - 3374, 420, 148, 420, 3374, 420, 148, 148, - 3374, 3374, 3374, 3374, 148, 148, 148, 3374, - 420, 148, 148, 3374, 420, 3468, 3469, 3470, - 696, 3471, 3472, 3473, 3474, 3475, 364, 3476, - 3477, 3478, 3479, 3480, 3481, 3482, 3479, 3483, - 3484, 552, 3485, 375, 712, 377, 420, 3374, - 148, 3374, 420, 420, 421, 420, 3374, 148, - 420, 420, 3374, 3374, 148, 3374, 421, 420, - 3374, 148, 148, 420, 3374, 148, 3374, 420, - 420, 148, 420, 420, 421, 148, 420, 3374, - 148, 148, 3374, 420, 3374, 420, 421, 420, - 148, 148, 3374, 148, 148, 148, 148, 148, - 148, 3374, 420, 148, 3374, 3374, 3374, 3374, - 148, 3374, 3374, 3374, 420, 148, 3374, 420, - 420, 148, 420, 421, 420, 3374, 148, 3374, - 3374, 420, 420, 148, 420, 3374, 148, 420, - 421, 420, 3374, 148, 3374, 420, 3374, 421, - 420, 153, 382, 713, 3486, 3487, 716, 386, - 153, 3488, 3489, 151, 420, 148, 3374, 420, - 148, 3374, 420, 420, 3374, 420, 148, 3374, - 148, 420, 153, 389, 3490, 420, 148, 148, - 3374, 3374, 420, 3491, 3492, 3493, 153, 394, - 395, 396, 397, 398, 399, 400, 401, 402, - 403, 723, 3494, 3495, 3496, 151, 420, 3374, - 3374, 420, 420, 420, 420, 3374, 3374, 420, - 3374, 3374, 420, 420, 420, 3374, 3374, 3374, - 3374, 420, 153, 3497, 409, 410, 411, 151, - 420, 420, 3374, 420, 148, 3498, 420, 3499, - 3500, 3501, 3503, 3502, 420, 3374, 3374, 420, - 420, 3374, 3374, 420, 3374, 3375, 2985, 2985, - 3375, 2985, 3375, 3375, 2985, 3375, 3375, 2985, - 3375, 3375, 3375, 2985, 3375, 3375, 3375, 2985, - 3375, 3375, 2985, 3375, 3375, 3375, 3375, 2985, - 3375, 3375, 3375, 2985, 2985, 3375, 3375, 2985, - 3375, 2985, 3504, 3505, 3506, 3507, 3508, 3510, - 3511, 3512, 3514, 3515, 3516, 3517, 3518, 3519, - 3520, 3521, 3522, 3523, 3524, 3525, 3526, 3527, - 3528, 3529, 3530, 3531, 3509, 3513, 2985, 3375, - 3375, 3375, 3375, 2985, 3375, 2985, 3375, 2985, - 2985, 2985, 3375, 2985, 2985, 2985, 3375, 3375, - 3375, 3375, 2985, 2985, 2985, 2985, 2985, 2985, - 3375, 2985, 2985, 2985, 2985, 2985, 2985, 3375, - 2985, 2985, 2985, 2985, 3375, 3375, 3375, 3375, - 2985, 3375, 3375, 3375, 3375, 3375, 2985, 3375, - 3375, 2985, 3375, 3375, 3375, 3375, 2985, 3375, - 3375, 2985, 2985, 2985, 2985, 2985, 2985, 3375, - 3375, 3375, 3375, 3375, 3375, 2985, 3375, 3375, - 2985, 2985, 2985, 2985, 2985, 2985, 3375, 3375, - 2985, 3375, 3375, 3375, 3375, 3375, 2985, 3375, - 3375, 2985, 3375, 2985, 3375, 3375, 3375, 2985, - 3375, 2985, 3375, 3375, 3375, 3375, 3375, 2985, - 3375, 2985, 3375, 3375, 3375, 3375, 2985, 3375, - 2985, 3532, 3533, 3534, 3085, 3087, 3535, 3536, - 3537, 3538, 3539, 3540, 3541, 3542, 3543, 3544, - 3545, 3546, 3547, 3548, 3549, 3550, 3551, 3552, - 3086, 2985, 3375, 2985, 3375, 3375, 3375, 3375, - 3375, 2985, 3375, 3375, 3375, 2985, 3375, 2985, - 3375, 3375, 2985, 3375, 3375, 2985, 3375, 2985, - 2985, 2985, 3375, 3375, 2985, 3375, 2985, 3375, - 3375, 2985, 3375, 2985, 3375, 3375, 3375, 2985, - 3375, 2985, 3375, 3375, 2985, 2985, 2985, 3375, - 3375, 3375, 2985, 3375, 2985, 3375, 2985, 3375, - 3375, 3375, 3375, 3375, 2985, 3375, 3375, 2985, - 3553, 3554, 3555, 3556, 3557, 3558, 2985, 3375, - 3375, 2985, 3375, 3375, 2985, 3375, 2985, 3375, - 2985, 3375, 2985, 3375, 2985, 3559, 3560, 3114, - 3086, 3115, 3051, 3052, 2985, 3375, 2985, 3375, - 2985, 3561, 3562, 3563, 3564, 3565, 3566, 3567, - 3568, 3569, 3570, 3571, 3572, 3573, 3574, 3575, - 3085, 3086, 2985, 3375, 3375, 2985, 3375, 2985, - 3375, 2985, 3375, 3375, 3375, 3375, 2985, 3375, - 3375, 2985, 2985, 2985, 3375, 3375, 2985, 3375, - 3053, 2985, 3375, 3375, 2985, 2985, 2985, 3375, - 3375, 2985, 3375, 3375, 3375, 2985, 3375, 3375, - 3375, 3375, 2985, 3375, 3375, 3375, 2985, 3375, - 3375, 2985, 3576, 3577, 3557, 3578, 3579, 2985, - 3375, 2985, 3375, 3375, 2985, 3375, 3053, 2985, - 3053, 3053, 3053, 3053, 3375, 2985, 3580, 3581, - 3582, 3583, 3584, 3585, 2985, 3586, 3587, 3588, - 3589, 3590, 2985, 3375, 2985, 3375, 2985, 3375, - 2985, 3375, 3375, 3375, 3375, 3375, 2985, 3375, - 2985, 3591, 3592, 3593, 3594, 3595, 3596, 3597, - 3598, 3599, 3600, 3601, 3602, 3603, 3604, 3605, - 3602, 3606, 3607, 3608, 2985, 3375, 3375, 2985, - 2985, 3375, 2985, 2985, 2985, 3375, 3375, 3375, - 2985, 3375, 2985, 3375, 3375, 2985, 2985, 2985, - 3375, 3375, 2985, 3375, 2985, 3375, 3375, 3375, - 2985, 3375, 3375, 3375, 3375, 3375, 3375, 3375, - 2985, 3375, 2985, 2985, 3375, 3375, 3375, 2985, - 2985, 2985, 3375, 2985, 3375, 3375, 2985, 3375, - 2985, 3609, 3610, 3611, 3612, 2985, 3375, 2985, - 3375, 2985, 3375, 2985, 3375, 2985, 3613, 2985, - 3375, 3375, 2985, 3614, 3615, 3616, 3617, 3618, - 3619, 2985, 3375, 3375, 2985, 2985, 2985, 2985, - 3375, 3375, 2985, 3375, 3375, 2985, 2985, 2985, - 3375, 3375, 3375, 3375, 2985, 3620, 2985, 3375, - 2985, 3621, 2985, 3622, 3623, 3624, 3626, 3625, - 2985, 3375, 3375, 2985, 2985, 3375, 3375, 3376, - 3627, 2, 3376, 3627, 3376, 3376, 3627, 3376, - 3376, 3627, 3376, 3376, 3376, 3627, 3376, 3376, - 3376, 3627, 3376, 3376, 3627, 3376, 3376, 3376, - 3376, 3627, 3376, 3376, 3376, 3627, 3627, 3376, - 3376, 3627, 3376, 3627, 3628, 3629, 3630, 3631, - 3632, 3634, 3635, 3636, 3638, 3639, 3640, 3641, - 3642, 3643, 3644, 3645, 3646, 3647, 3648, 3649, - 3650, 3651, 3652, 3653, 3654, 3655, 3633, 3637, - 3627, 3376, 3376, 3376, 3376, 3627, 3376, 3627, - 3376, 3627, 3627, 3627, 3376, 3627, 3627, 3627, - 3376, 3376, 3376, 3376, 3627, 3627, 3627, 3627, - 3627, 3627, 3376, 3627, 3627, 3627, 3627, 3627, - 3627, 3376, 3627, 3627, 3627, 3627, 3376, 3376, - 3376, 3376, 3627, 3376, 3376, 3376, 3376, 3376, - 3627, 3376, 3376, 3627, 3376, 3376, 3376, 3376, - 3627, 3376, 3376, 3627, 3627, 3627, 3627, 3627, - 3627, 3376, 3376, 3376, 3376, 3376, 3376, 3627, - 3376, 3376, 3627, 3627, 3627, 3627, 3627, 3627, - 3376, 3376, 3627, 3376, 3376, 3376, 3376, 3376, - 3627, 3376, 3376, 3627, 3376, 3627, 3376, 3376, - 3376, 3627, 3376, 3627, 3376, 3376, 3376, 3376, - 3376, 3627, 3376, 3627, 3376, 3376, 3376, 3376, - 3627, 3376, 3627, 3656, 3657, 3658, 3659, 3660, - 3661, 3662, 3663, 3664, 3665, 3666, 3667, 3668, - 3669, 3670, 3671, 3672, 3673, 3674, 3675, 3676, - 3627, 3376, 3627, 3376, 3376, 3376, 3376, 3376, - 3627, 3376, 3376, 3376, 3627, 3376, 3627, 3376, - 3376, 3627, 3376, 3376, 3627, 3376, 3627, 3627, - 3627, 3376, 3376, 3627, 3376, 3627, 3376, 3376, - 3627, 3376, 3627, 3376, 3376, 3376, 3627, 3376, - 3627, 3376, 3376, 3627, 3627, 3627, 3376, 3376, - 3376, 3627, 3376, 3627, 3376, 3627, 3376, 3376, - 3376, 3376, 3376, 3627, 3376, 3376, 3627, 3677, - 3678, 3679, 3680, 3681, 3682, 3627, 3376, 3376, - 571, 3627, 3627, 3627, 3627, 3376, 3627, 571, - 3376, 3627, 3376, 3627, 3376, 3627, 3376, 3627, - 3683, 3684, 3685, 3686, 3687, 3688, 3689, 3627, - 3376, 3376, 3627, 3376, 3376, 3627, 2, 2, - 3376, 3376, 2, 3376, 2, 2, 3376, 3690, - 3691, 3692, 3693, 3694, 3695, 3696, 3697, 3698, - 3699, 3700, 3701, 3702, 3703, 3704, 3627, 3376, - 3376, 3627, 3376, 3627, 3376, 3627, 3376, 3376, - 3376, 3376, 3627, 3376, 3376, 3627, 3627, 3627, - 3376, 3376, 3627, 3376, 3627, 3376, 3376, 3627, - 3627, 3627, 3376, 3376, 3627, 3376, 3376, 3376, - 3627, 3376, 3376, 3376, 3376, 3627, 3376, 3376, - 3376, 3627, 3376, 3376, 3627, 3705, 3706, 1124, - 3681, 1125, 3707, 3708, 3709, 3627, 3376, 3627, - 3376, 3376, 571, 3627, 3376, 3627, 3627, 3376, - 3376, 3627, 3710, 3711, 3712, 3713, 3714, 3715, - 3627, 3716, 3717, 3718, 3719, 3720, 3627, 3376, - 3627, 3376, 3627, 3376, 3627, 3376, 3376, 3376, - 3376, 3376, 3627, 3376, 3627, 3721, 3722, 3723, - 3724, 3725, 3726, 3727, 3728, 3729, 3730, 3731, - 3732, 3733, 3734, 3735, 3732, 3736, 3737, 3738, - 3627, 3376, 3376, 3627, 3627, 3376, 3627, 3627, - 3627, 3376, 3376, 3376, 3627, 3376, 3627, 3376, - 3376, 3627, 3627, 3627, 3376, 3376, 3627, 3376, - 3627, 3376, 3376, 3376, 3627, 3376, 3376, 3376, - 3376, 3376, 3376, 3376, 3627, 3376, 3627, 3627, - 3376, 3376, 3376, 3627, 3627, 3627, 3376, 3627, - 3376, 3376, 3627, 3376, 3627, 3739, 3740, 3741, - 3742, 3627, 3376, 3627, 3376, 3627, 3376, 3627, - 3376, 3627, 3743, 3744, 3627, 3376, 3627, 3376, - 3376, 3627, 3745, 3746, 3747, 3748, 3749, 3750, - 3627, 3376, 3376, 3627, 3627, 3627, 3627, 3376, - 3376, 3627, 3376, 3376, 3627, 3627, 3627, 3376, - 3376, 3376, 3376, 3627, 3751, 3627, 3376, 3627, - 3752, 3627, 3753, 3754, 3688, 3756, 3755, 3627, - 3376, 3376, 3627, 3627, 3376, 3376, 3757, 0, - 3757, 3758, 3757, 3758, 3758, 3757, 3757, 3758, - 3757, 3757, 3758, 3757, 3757, 3757, 3758, 3757, - 3757, 3757, 3758, 3757, 3757, 3758, 3757, 3757, - 3757, 3757, 3758, 3757, 3757, 3757, 3758, 3758, - 3757, 3757, 3758, 3757, 3758, 3759, 3760, 3761, - 3762, 3763, 3765, 3766, 3767, 3769, 3770, 3771, - 3772, 3773, 3774, 3775, 3776, 3777, 3778, 3779, - 3780, 3781, 3782, 3783, 3784, 3785, 3786, 3764, - 3768, 3758, 3757, 3757, 3757, 3757, 3758, 3757, - 3758, 3757, 3758, 3758, 3758, 3757, 3758, 3758, - 3758, 3757, 3757, 3757, 3757, 3758, 3758, 3758, - 3758, 3758, 3758, 3757, 3758, 3758, 3758, 3758, - 3758, 3758, 3757, 3758, 3758, 3758, 3758, 3757, - 3757, 3757, 3757, 3758, 3757, 3757, 3757, 3757, - 3757, 3758, 3757, 3757, 3758, 3757, 3757, 3757, - 3757, 3758, 3757, 3757, 3758, 3758, 3758, 3758, - 3758, 3758, 3757, 3757, 3757, 3757, 3757, 3757, - 3758, 3757, 3757, 3758, 3758, 3758, 3758, 3758, - 3758, 3757, 3757, 3758, 3757, 3757, 3757, 3757, - 3757, 3758, 3757, 3757, 3758, 3757, 3758, 3757, - 3757, 3757, 3758, 3757, 3758, 3757, 3757, 3757, - 3757, 3757, 3758, 3757, 3758, 3757, 3757, 3757, - 3757, 3758, 3757, 3758, 3787, 3788, 3789, 3790, - 3791, 3792, 3793, 3794, 3795, 3796, 3797, 3798, - 3799, 3800, 3801, 3802, 3803, 3804, 3805, 3806, - 3807, 3758, 3757, 3758, 3757, 3757, 3757, 3757, - 3757, 3758, 3757, 3757, 3757, 3758, 3757, 3758, - 3757, 3757, 3758, 3757, 3757, 3758, 3757, 3758, - 3758, 3758, 3757, 3757, 3758, 3757, 3758, 3757, - 3757, 3758, 3757, 3758, 3757, 3757, 3757, 3758, - 3757, 3758, 3757, 3757, 3758, 3758, 3758, 3757, - 3757, 3757, 3758, 3757, 3758, 3757, 3758, 3757, - 3757, 3757, 3757, 3757, 3758, 3757, 3757, 3758, - 3808, 3809, 3810, 3811, 3812, 3813, 3758, 3757, - 3757, 3758, 3757, 3757, 3758, 3757, 3758, 3757, - 3758, 3757, 3758, 3757, 3758, 3814, 3815, 3758, - 3757, 3758, 3757, 3758, 3816, 3817, 3818, 3819, - 3820, 3821, 3822, 3823, 3824, 3825, 3826, 3827, - 3828, 3829, 3830, 3758, 3757, 3757, 3758, 3757, - 3758, 3757, 3758, 3757, 3757, 3757, 3757, 3758, - 3757, 3757, 3758, 3758, 3758, 3757, 3757, 3758, - 3757, 3758, 3757, 3757, 3758, 3758, 3758, 3757, - 3757, 3758, 3757, 3757, 3757, 3758, 3757, 3757, - 3757, 3757, 3758, 3757, 3757, 3757, 3758, 3757, - 3757, 3758, 3831, 3832, 3812, 3817, 3833, 3758, - 3757, 3758, 3757, 3757, 3758, 3757, 3758, 3834, - 3835, 3836, 3837, 3838, 3839, 3758, 3840, 3841, - 3842, 3843, 3844, 3758, 3757, 3758, 3757, 3758, - 3757, 3758, 3757, 3757, 3757, 3757, 3757, 3758, - 3757, 3758, 3845, 3846, 3847, 3848, 3849, 3850, - 3851, 3852, 3853, 3854, 3855, 3856, 3857, 3858, - 3859, 3856, 3860, 3861, 3862, 3758, 3757, 3757, - 3758, 3758, 3757, 3758, 3758, 3758, 3757, 3757, - 3757, 3758, 3757, 3758, 3757, 3757, 3758, 3758, - 3758, 3757, 3757, 3758, 3757, 3758, 3757, 3757, - 3757, 3758, 3757, 3757, 3757, 3757, 3757, 3757, - 3757, 3758, 3757, 3758, 3758, 3757, 3757, 3757, - 3758, 3758, 3758, 3757, 3758, 3757, 3757, 3758, - 3757, 3758, 3863, 3864, 3865, 3866, 3758, 3757, - 3758, 3757, 3758, 3757, 3758, 3757, 3758, 3867, - 3758, 3757, 3757, 3758, 3868, 3869, 3870, 3871, - 3872, 3873, 3758, 3757, 3757, 3758, 3758, 3758, - 3758, 3757, 3757, 3758, 3757, 3757, 3758, 3758, - 3758, 3757, 3757, 3757, 3757, 3758, 3874, 3758, - 3757, 3758, 3875, 3758, 3876, 3877, 3878, 3880, - 3879, 3758, 3757, 3757, 3758, 3758, 3757, 3757, - 0, 2395, 3376, 3376, 3757, 3881, 3250, 3881, - 3251, 3881, 3251, 3251, 3881, 3881, 3251, 3881, - 3881, 3251, 3881, 3881, 3881, 3251, 3881, 3881, - 3881, 3251, 3881, 3881, 3251, 3881, 3881, 3881, - 3881, 3251, 3881, 3881, 3881, 3251, 3251, 3881, - 3881, 3251, 3881, 3251, 3882, 3883, 3884, 3885, - 3886, 3888, 3889, 3890, 3892, 3893, 3894, 3895, - 3896, 3897, 3898, 3899, 3900, 3901, 3902, 3903, - 3904, 3905, 3906, 3907, 3908, 3909, 3887, 3891, - 3251, 3881, 3881, 3881, 3881, 3251, 3881, 3251, - 3881, 3251, 3251, 3251, 3881, 3251, 3251, 3251, - 3881, 3881, 3881, 3881, 3251, 3251, 3251, 3251, - 3251, 3251, 3881, 3251, 3251, 3251, 3251, 3251, - 3251, 3881, 3251, 3251, 3251, 3251, 3881, 3881, - 3881, 3881, 3251, 3881, 3881, 3881, 3881, 3881, - 3251, 3881, 3881, 3251, 3881, 3881, 3881, 3881, - 3251, 3881, 3881, 3251, 3251, 3251, 3251, 3251, - 3251, 3881, 3881, 3881, 3881, 3881, 3881, 3251, - 3881, 3881, 3251, 3251, 3251, 3251, 3251, 3251, - 3881, 3881, 3251, 3881, 3881, 3881, 3881, 3881, - 3251, 3881, 3881, 3251, 3881, 3251, 3881, 3881, - 3881, 3251, 3881, 3251, 3881, 3881, 3881, 3881, - 3881, 3251, 3881, 3251, 3881, 3881, 3881, 3881, - 3251, 3881, 3251, 3910, 3911, 3912, 3913, 3914, - 3915, 3916, 3917, 3918, 3919, 3920, 3921, 3922, - 3923, 3924, 3925, 3926, 3927, 3928, 3929, 3930, - 3251, 3881, 3251, 3881, 3881, 3881, 3881, 3881, - 3251, 3881, 3881, 3881, 3251, 3881, 3251, 3881, - 3881, 3251, 3881, 3881, 3251, 3881, 3251, 3251, - 3251, 3881, 3881, 3251, 3881, 3251, 3881, 3881, - 3251, 3881, 3251, 3881, 3881, 3881, 3251, 3881, - 3251, 3881, 3881, 3251, 3251, 3251, 3881, 3881, - 3881, 3251, 3881, 3251, 3881, 3251, 3881, 3881, - 3881, 3881, 3881, 3251, 3881, 3881, 3251, 3931, - 3932, 3933, 3934, 3935, 3936, 3251, 3881, 3881, - 3251, 3881, 3881, 3251, 3881, 3251, 3881, 3251, - 3881, 3251, 3881, 3251, 3937, 3938, 3251, 3881, - 3251, 3881, 3251, 3939, 3940, 3941, 3942, 3943, - 3944, 3945, 3946, 3947, 3948, 3949, 3950, 3951, - 3952, 3953, 3251, 3881, 3881, 3251, 3881, 3251, - 3881, 3251, 3881, 3881, 3881, 3881, 3251, 3881, - 3881, 3251, 3251, 3251, 3881, 3881, 3251, 3881, - 3251, 3881, 3881, 3251, 3251, 3251, 3881, 3881, - 3251, 3881, 3881, 3881, 3251, 3881, 3881, 3881, - 3881, 3251, 3881, 3881, 3881, 3251, 3881, 3881, - 3251, 3954, 3955, 3935, 3940, 3956, 3251, 3881, - 3251, 3881, 3881, 3251, 3881, 3251, 3957, 3958, - 3959, 3960, 3961, 3962, 3251, 3963, 3964, 3965, - 3966, 3967, 3251, 3881, 3251, 3881, 3251, 3881, - 3251, 3881, 3881, 3881, 3881, 3881, 3251, 3881, - 3251, 3968, 3969, 3970, 3971, 3972, 3973, 3974, - 3975, 3976, 3977, 3978, 3979, 3980, 3981, 3982, - 3979, 3983, 3984, 3985, 3251, 3881, 3881, 3251, - 3251, 3881, 3251, 3251, 3251, 3881, 3881, 3881, - 3251, 3881, 3251, 3881, 3881, 3251, 3251, 3251, - 3881, 3881, 3251, 3881, 3251, 3881, 3881, 3881, - 3251, 3881, 3881, 3881, 3881, 3881, 3881, 3881, - 3251, 3881, 3251, 3251, 3881, 3881, 3881, 3251, - 3251, 3251, 3881, 3251, 3881, 3881, 3251, 3881, - 3251, 3986, 3987, 3988, 3989, 3251, 3881, 3251, - 3881, 3251, 3881, 3251, 3881, 3251, 3990, 3251, - 3881, 3881, 3251, 3991, 3992, 3993, 3994, 3995, - 3996, 3251, 3881, 3881, 3251, 3251, 3251, 3251, - 3881, 3881, 3251, 3881, 3881, 3251, 3251, 3251, - 3881, 3881, 3881, 3881, 3251, 3997, 3251, 3881, - 3251, 3998, 3251, 3999, 4000, 4001, 4003, 4002, - 3251, 3881, 3881, 3251, 3251, 3881, 3881, 3881, - 3250, 3250, 3881, 3881, 3250, 3881, 3881, 3250, - 3881, 3881, 3881, 3250, 3881, 3881, 3881, 3250, - 3881, 3881, 3250, 3881, 3881, 3881, 3881, 3250, - 3881, 3881, 3881, 3250, 3250, 3881, 3881, 3250, - 3881, 3250, 4004, 4005, 4006, 4007, 4008, 4010, - 4011, 4012, 4014, 4015, 4016, 4017, 4018, 4019, - 4020, 4021, 4022, 4023, 4024, 4025, 4026, 4027, - 4028, 4029, 4030, 4031, 4009, 4013, 3250, 4032, - 4033, 4034, 4035, 4036, 4037, 4038, 4039, 4040, - 4041, 4042, 4043, 4044, 4045, 4046, 4047, 4048, - 4049, 4050, 4051, 4052, 3250, 4053, 4054, 4055, - 4056, 4057, 4058, 3250, 4059, 4060, 3250, 4061, - 4062, 4063, 4064, 4065, 4066, 4067, 4068, 4069, - 4070, 4071, 4072, 4073, 4074, 4075, 3250, 4076, - 4077, 4057, 4062, 4078, 3250, 4079, 4080, 4081, - 4082, 4083, 4084, 3250, 4085, 3250, 0, 3250, - 148, 148, 2395, 2395, 0, 148, 2395, 148, - 0, 2395, 0, 148, 2395, 2395, 2395, 2395, - 0, 148, 2395, 148, 2395, 0, 148, 148, - 0, 126, 0, 148, 0, 2395, 126, 148, - 2395, 148, 0, 2395, 0, 2984, 0, 148, - 2395, 148, 2395, 0, 148, 0, 126, 0, - 0, 126, 0, 2395, 148, 2395, 0, 2395, - 148, 2395, 126, 2395, 0, 2395, 148, 2395, - 148, 2395, 0, 148, 2395, 2395, 126, 0, - 4086, 2984, 148, 4086, 148, 181, 148, 2985, - 4086, 2985, 2985, 2985, 148, 2985, 148, 2985, - 4086, 2985, 4086, 148, 2985, 2985, 4086, 2985, - 148, 4086, 148, 181, 4086, 4086, 572, 572, - 2985, 4086, 4086, 4086, 148, 2985, 421, 4086, - 148, 4086, 421, 148, 2985, 2985, 2985, 2985, - 4086, 4086, 421, 2985, 2985, 148, 148, 4086, - 148, 4086, 2985, 2985, 148, 4086, 4086, 2985, - 148, 148, 421, 148, 4086, 148, 2985, 4087, - 4088, 184, 4089, 4090, 4091, 4092, 4093, 4094, - 4095, 4096, 4097, 4098, 4099, 4100, 4101, 4102, - 4103, 4104, 4105, 4106, 4107, 4108, 4109, 4110, - 4111, 4112, 4113, 4114, 4115, 4116, 4117, 2985, - 148, 148, 148, 148, 4086, 2985, 148, 4086, - 2985, 4086, 2985, 148, 148, 4086, 148, 2985, - 148, 2985, 421, 148, 4086, 2985, 2985, 2985, - 4086, 4086, 2985, 2985, 2985, 2985, 4086, 148, - 148, 2985, 2985, 2985, 2985, 2985, 148, 2985, - 421, 148, 2985, 4086, 4086, 4086, 148, 148, - 148, 148, 148, 148, 148, 4086, 2985, 2985, - 2985, 2985, 2985, 2985, 148, 2985, 421, 148, - 2985, 4086, 148, 4086, 148, 148, 148, 148, - 148, 148, 4086, 2985, 2985, 2985, 148, 148, - 2985, 148, 2985, 421, 2985, 4086, 148, 4086, - 148, 148, 148, 148, 148, 148, 4086, 2985, - 148, 4086, 4086, 4086, 4086, 148, 148, 4086, - 421, 2985, 4086, 148, 148, 148, 148, 148, - 148, 148, 148, 148, 148, 4086, 2985, 148, - 4086, 4086, 4086, 4086, 421, 2985, 148, 4086, - 148, 148, 148, 148, 4086, 2985, 2985, 2985, - 2985, 2985, 148, 2985, 148, 2985, 421, 2985, - 4086, 148, 4086, 148, 148, 148, 148, 148, - 4086, 2985, 148, 4086, 4086, 4086, 4086, 148, - 4086, 421, 148, 2985, 148, 4086, 148, 148, - 148, 4086, 2985, 2985, 2985, 148, 2985, 2985, - 148, 2985, 421, 2985, 148, 2985, 4086, 148, - 4086, 148, 148, 148, 2985, 4086, 4086, 148, - 4086, 4086, 421, 4086, 2985, 4086, 4086, 2985, - 4086, 421, 2985, 4086, 4086, 4086, 2985, 4086, - 421, 2985, 148, 4086, 4086, 4086, 4086, 421, - 4086, 2985, 148, 148, 4086, 2985, 4086, 4086, - 148, 4086, 4086, 2985, 4086, 2985, 4118, 4119, - 4120, 217, 3020, 3022, 218, 219, 220, 221, - 4121, 223, 224, 225, 226, 227, 228, 4122, - 4123, 4124, 4125, 4126, 234, 4127, 236, 4128, - 483, 484, 4129, 4130, 4131, 4132, 4133, 4134, - 4135, 4136, 646, 4137, 151, 152, 4138, 249, - 250, 251, 252, 3021, 151, 153, 151, 2985, - 4086, 2985, 421, 4086, 4086, 4086, 4086, 4086, - 2985, 4086, 4086, 421, 4086, 148, 2985, 2985, - 4086, 2985, 148, 148, 148, 4086, 148, 4086, - 2985, 148, 4086, 148, 148, 4086, 2985, 4086, - 2985, 2985, 2985, 421, 2985, 4086, 4086, 421, - 148, 2985, 4086, 148, 148, 2985, 148, 4086, - 4086, 2985, 148, 4086, 2985, 4086, 4086, 4086, - 2985, 421, 421, 4086, 2985, 4086, 148, 4086, - 2985, 148, 2985, 421, 2985, 2985, 4086, 4086, - 148, 4086, 148, 421, 148, 2985, 4086, 2985, - 148, 148, 4086, 2985, 4086, 4086, 4086, 148, - 4086, 148, 4086, 2985, 4086, 4086, 2985, 4139, - 4140, 255, 4141, 257, 258, 259, 260, 261, - 262, 263, 151, 4142, 265, 4143, 267, 4144, - 269, 2985, 181, 181, 4086, 181, 4086, 571, - 2985, 2985, 148, 148, 2985, 2985, 4086, 2985, - 571, 4086, 2985, 2985, 4086, 2985, 148, 4086, - 2985, 2985, 148, 148, 148, 148, 148, 4086, - 2985, 4145, 4146, 3049, 3021, 3050, 3051, 3052, - 2985, 148, 4086, 148, 2985, 4086, 2985, 153, - 274, 275, 153, 657, 4147, 4148, 4149, 280, - 281, 282, 4150, 284, 4151, 4152, 4153, 4154, - 4155, 4156, 4157, 4158, 4159, 4160, 295, 296, - 152, 4161, 3196, 151, 3021, 2985, 148, 148, - 4086, 4086, 2985, 148, 4086, 148, 2985, 4086, - 2985, 148, 4086, 4086, 4086, 4086, 2985, 148, - 4086, 148, 4086, 2985, 148, 148, 2985, 421, - 2985, 148, 2985, 4086, 421, 148, 4086, 148, - 2985, 4086, 2985, 2984, 2985, 148, 4086, 148, - 4086, 2985, 148, 2985, 421, 2985, 2985, 421, - 2985, 4086, 148, 4086, 2985, 4086, 148, 4086, - 421, 4086, 2985, 4086, 4086, 4086, 4086, 2985, - 4086, 148, 4086, 148, 4086, 2985, 148, 4086, - 4086, 421, 2985, 4162, 674, 302, 303, 304, - 305, 306, 307, 4163, 932, 4164, 934, 312, - 4165, 4166, 151, 2985, 4086, 572, 148, 148, - 572, 572, 572, 2985, 181, 4086, 4086, 571, - 2985, 4086, 2985, 148, 4086, 2984, 2985, 2984, - 2984, 2984, 2984, 4086, 2985, 4167, 4168, 317, - 318, 319, 4169, 4170, 4171, 4172, 324, 2985, - 325, 326, 153, 327, 328, 4173, 330, 4174, - 332, 4175, 334, 335, 153, 151, 690, 337, - 338, 153, 339, 340, 341, 342, 343, 344, - 345, 346, 4176, 348, 349, 4177, 351, 352, - 353, 153, 259, 151, 354, 2985, 4086, 2985, - 4086, 2985, 148, 2985, 4086, 2985, 148, 148, - 4086, 4086, 4086, 4086, 148, 148, 148, 4086, - 2985, 148, 148, 4086, 2985, 4178, 4179, 4180, - 696, 4181, 4182, 4183, 4184, 4185, 364, 4186, - 4187, 4188, 4189, 4190, 4191, 4192, 4189, 4193, - 4194, 552, 4195, 375, 712, 377, 2985, 4086, - 148, 4086, 2985, 2985, 421, 2985, 4086, 148, - 2985, 2985, 4086, 4086, 148, 4086, 421, 2985, - 4086, 148, 148, 2985, 4086, 148, 4086, 2985, - 2985, 148, 2985, 2985, 421, 148, 2985, 4086, - 148, 148, 4086, 2985, 4086, 2985, 421, 2985, - 148, 148, 4086, 148, 148, 148, 148, 148, - 148, 4086, 2985, 148, 4086, 4086, 4086, 4086, - 148, 4086, 4086, 4086, 2985, 148, 4086, 2985, - 2985, 148, 2985, 421, 2985, 4086, 148, 4086, - 4086, 2985, 2985, 148, 2985, 4086, 148, 2985, - 421, 2985, 4086, 148, 4086, 2985, 4086, 421, - 2985, 153, 382, 713, 4196, 4197, 716, 386, - 153, 4198, 4199, 151, 2985, 148, 4086, 2985, - 148, 4086, 2985, 2985, 4086, 2985, 148, 4086, - 148, 2985, 153, 389, 4200, 2985, 148, 148, - 4086, 4086, 2985, 4201, 4202, 4203, 153, 394, - 395, 396, 397, 398, 399, 400, 401, 402, - 403, 723, 4204, 4205, 4206, 151, 2985, 4086, - 4086, 2985, 2985, 2985, 2985, 4086, 4086, 2985, - 4086, 4086, 2985, 2985, 2985, 4086, 4086, 4086, - 4086, 2985, 153, 4207, 409, 410, 411, 151, - 2985, 2985, 4086, 2985, 148, 4208, 2985, 4209, - 4210, 4211, 4213, 4212, 2985, 4086, 4086, 2985, - 2985, 4086, 4086, 2985, 4086, 4086, 2984, 2984, - 4086, 4086, 2984, 4086, 4086, 2984, 4086, 4086, - 4086, 2984, 4086, 4086, 4086, 2984, 4086, 4086, - 2984, 4086, 4086, 4086, 4086, 2984, 4086, 4086, - 4086, 2984, 2984, 4086, 4086, 2984, 4086, 2984, - 4214, 4215, 4216, 4217, 4218, 4220, 4221, 4222, - 4224, 4225, 4226, 4227, 4228, 4229, 4230, 4231, - 4232, 4233, 4234, 4235, 4236, 4237, 4238, 4239, - 4240, 4241, 4219, 4223, 2984, 4242, 4243, 4244, - 4245, 4246, 4247, 4248, 4249, 4250, 4251, 4252, - 4253, 4254, 4255, 4256, 4257, 4258, 4259, 4260, - 4261, 4262, 2984, 4263, 4264, 4265, 4266, 4267, - 4268, 2984, 4269, 4270, 2984, 4271, 4272, 4273, - 4274, 4275, 4276, 4277, 4278, 4279, 4280, 4281, - 4282, 4283, 4284, 4285, 2984, 4286, 4287, 4267, - 4272, 4288, 2984, 4289, 4290, 4291, 4292, 4293, - 4294, 2984, 4295, 2984, 0, 3250, 0, 3250, - 2395, 572, 148, 148, 572, 572, 572, 0, - 2395, 2395, 2136, 0, 2395, 0, 148, 148, - 3376, 0, 2395, 2984, 0, 3376, 2984, 2984, - 2984, 2984, 2395, 0, 325, 326, 153, 327, - 328, 2477, 330, 4296, 332, 4297, 334, 335, - 153, 151, 1581, 337, 338, 153, 339, 340, - 341, 342, 343, 344, 345, 346, 4298, 348, - 349, 4299, 351, 352, 353, 153, 259, 151, - 354, 0, 2395, 0, 148, 0, 2395, 0, - 148, 148, 2395, 2395, 2395, 2395, 148, 148, - 148, 2395, 0, 148, 148, 2395, 0, 4300, - 4301, 4302, 1587, 4303, 4304, 4305, 4306, 4307, - 364, 4308, 4309, 4310, 4311, 4312, 4313, 4314, - 4311, 4315, 4316, 1602, 4317, 375, 1604, 377, - 0, 2395, 148, 2395, 0, 0, 126, 0, - 2395, 148, 0, 0, 2395, 2395, 148, 2395, - 126, 0, 2395, 148, 148, 0, 2395, 148, - 2395, 0, 0, 148, 0, 0, 126, 148, - 0, 2395, 148, 148, 2395, 0, 2395, 0, - 126, 0, 148, 148, 2395, 148, 148, 148, - 148, 148, 148, 2395, 0, 148, 2395, 2395, - 2395, 2395, 148, 2395, 2395, 2395, 0, 148, - 2395, 0, 0, 148, 0, 126, 0, 2395, - 148, 2395, 2395, 0, 0, 148, 0, 2395, - 148, 0, 126, 0, 2395, 148, 2395, 0, - 2395, 126, 0, 153, 382, 1605, 4318, 4319, - 1608, 386, 153, 4320, 4321, 151, 0, 148, - 2395, 0, 148, 2395, 0, 0, 2395, 0, - 148, 2395, 148, 0, 4322, 153, 389, 4323, - 0, 3376, 3757, 0, 148, 148, 2395, 2395, - 0, 2505, 2506, 2507, 153, 394, 395, 396, - 397, 398, 399, 400, 401, 402, 403, 1615, - 2508, 2509, 2510, 151, 0, 153, 4324, 409, - 410, 411, 151, 0, 0, 2395, 0, 148, - 412, 413, 414, 4325, 4326, 0, 4327, 2, - 4327, 4328, 4328, 4327, 4328, 4327, 4327, 4328, - 4327, 4327, 4328, 4327, 4327, 4327, 4328, 4327, - 4327, 4327, 4328, 4327, 4327, 4328, 4327, 4327, - 4327, 4327, 4328, 4327, 4327, 4327, 4328, 4328, - 4327, 4327, 4328, 4327, 4328, 4329, 4330, 4331, - 4332, 4333, 4335, 4336, 4337, 4339, 4340, 4341, - 4342, 4343, 4344, 4345, 4346, 4347, 4348, 4349, - 4350, 4351, 4352, 4353, 4354, 4355, 4356, 4334, - 4338, 4328, 4327, 4327, 4327, 4327, 4328, 4327, - 4328, 4327, 4328, 4328, 4328, 4327, 4328, 4328, - 4328, 4327, 4327, 4327, 4327, 4328, 4328, 4328, - 4328, 4328, 4328, 4327, 4328, 4328, 4328, 4328, - 4328, 4328, 4327, 4328, 4328, 4328, 4328, 4327, - 4327, 4327, 4327, 4328, 4327, 4327, 4327, 4327, - 4327, 4328, 4327, 4327, 4328, 4327, 4327, 4327, - 4327, 4328, 4327, 4327, 4328, 4328, 4328, 4328, - 4328, 4328, 4327, 4327, 4327, 4327, 4327, 4327, - 4328, 4327, 4327, 4328, 4328, 4328, 4328, 4328, - 4328, 4327, 4327, 4328, 4327, 4327, 4327, 4327, - 4327, 4328, 4327, 4327, 4328, 4327, 4328, 4327, - 4327, 4327, 4328, 4327, 4328, 4327, 4327, 4327, - 4327, 4327, 4328, 4327, 4328, 4327, 4327, 4327, - 4327, 4328, 4327, 4328, 4357, 4358, 4359, 4360, - 4361, 4362, 4363, 4364, 4365, 4366, 4367, 4368, - 4369, 4370, 4371, 4372, 4373, 4374, 4375, 4376, - 4377, 4328, 4327, 4328, 4327, 4327, 4327, 4327, - 4327, 4328, 4327, 4327, 4327, 4328, 4327, 4328, - 4327, 4327, 4328, 4327, 4327, 4328, 4327, 4328, - 4328, 4328, 4327, 4327, 4328, 4327, 4328, 4327, - 4327, 4328, 4327, 4328, 4327, 4327, 4327, 4328, - 4327, 4328, 4327, 4327, 4328, 4328, 4328, 4327, - 4327, 4327, 4328, 4327, 4328, 4327, 4328, 4327, - 4327, 4327, 4327, 4327, 4328, 4327, 4327, 4328, - 4378, 4379, 4380, 4381, 4382, 4383, 4328, 4327, - 4327, 4328, 4327, 4327, 4328, 4327, 4328, 4327, - 4328, 4327, 4328, 4327, 4328, 4384, 4385, 4328, - 4327, 4328, 4327, 4328, 4386, 4387, 4388, 4389, - 4390, 4391, 4392, 4393, 4394, 4395, 4396, 4397, - 4398, 4399, 4400, 4328, 4327, 4327, 4328, 4327, - 4328, 4327, 4328, 4327, 4327, 4327, 4327, 4328, - 4327, 4327, 4328, 4328, 4328, 4327, 4327, 4328, - 4327, 4328, 4327, 4327, 4328, 4328, 4328, 4327, - 4327, 4328, 4327, 4327, 4327, 4328, 4327, 4327, - 4327, 4327, 4328, 4327, 4327, 4327, 4328, 4327, - 4327, 4328, 4401, 4402, 4382, 4387, 4403, 4328, - 4327, 4328, 4327, 4327, 4328, 4327, 4328, 4404, - 4405, 4406, 4407, 4408, 4409, 4410, 4328, 4411, - 4412, 4413, 4414, 4415, 4328, 4327, 4328, 4327, - 4328, 4327, 4328, 4327, 4327, 4327, 4327, 4327, - 4328, 4327, 4328, 4416, 4417, 4418, 4419, 4420, - 4421, 4422, 4423, 4424, 4425, 4426, 4427, 4428, - 4429, 4430, 4427, 4431, 4432, 4433, 4328, 4327, - 4327, 4328, 4328, 4327, 4328, 4328, 4328, 4327, - 4327, 4327, 4328, 4327, 4328, 4327, 4327, 4328, - 4328, 4328, 4327, 4327, 4328, 4327, 4328, 4327, - 4327, 4327, 4328, 4327, 4327, 4327, 4327, 4327, - 4327, 4327, 4328, 4327, 4328, 4328, 4327, 4327, - 4327, 4328, 4328, 4328, 4327, 4328, 4327, 4327, - 4328, 4327, 4328, 4434, 4435, 4436, 4437, 4328, - 4327, 4328, 4327, 4328, 4327, 4328, 4327, 4328, - 4438, 4328, 4327, 4327, 4328, 4439, 4440, 4441, - 4442, 4443, 4444, 4328, 4327, 4327, 4328, 4328, - 4328, 4328, 4327, 4327, 4328, 4327, 4327, 4328, - 4328, 4328, 4327, 4327, 4327, 4327, 4328, 4445, - 4328, 4327, 4328, 4325, 4328, 4446, 4328, 4447, - 4448, 4449, 4451, 4450, 4328, 4327, 4327, 4328, - 4328, 4327, 4327, 3757, 0, 3371, 3372, 0, - 3372, 4452, 3371, 3372, 0, 3250, 4453, 3371, - 4454, 3372, 0, 3250, 0, 3250, 4455, 0, - 3372, 0, 3250, 3371, 4456, 3372, 0, 0, - 3250, 4458, 4460, 4463, 4464, 4465, 4467, 4468, - 4469, 4470, 4471, 4472, 4473, 4474, 4475, 4476, - 4477, 4478, 4479, 4480, 4481, 4482, 4483, 4484, - 4485, 4486, 4487, 4488, 4489, 4490, 4492, 4493, - 4495, 4496, 4497, 4498, 4459, 4461, 4462, 4462, - 4466, 4491, 4494, 4457, 4500, 122, 124, 4501, - 4502, 4503, 4504, 4505, 4506, 4507, 4508, 4509, - 4510, 4511, 4512, 4513, 4514, 4515, 4516, 4517, - 4518, 4499, 4520, 4519, 1626, 1626, 1626, 1626, - 1485, 4522, 150, 152, 153, 154, 2005, 4523, - 157, 158, 4524, 160, 161, 4525, 4526, 4527, - 4528, 4529, 4530, 4531, 4532, 4533, 4534, 4535, - 4536, 4537, 4538, 177, 4539, 4540, 4541, 126, - 148, 148, 151, 176, 4521, 1626, 1626, 1626, - 1626, 1485, 4542, 150, 152, 153, 154, 1753, - 4543, 157, 158, 4544, 160, 161, 4545, 4546, - 4547, 4548, 4549, 4550, 4551, 4552, 4553, 4554, - 4555, 4556, 4557, 4558, 177, 4559, 4560, 4561, - 126, 148, 148, 151, 176, 4521, 181, 181, - 181, 571, 4563, 150, 152, 153, 4564, 153, - 4565, 4566, 158, 4567, 160, 161, 4568, 4569, - 4570, 4571, 4572, 4573, 4574, 302, 4575, 4576, - 4577, 4578, 4579, 4580, 177, 4581, 4582, 4583, - 421, 148, 148, 151, 176, 4562, 443, 443, - 443, 443, 571, 4584, 150, 152, 153, 154, - 1370, 4585, 157, 158, 4586, 160, 161, 4587, - 4588, 4589, 4590, 4591, 4592, 4593, 4594, 4595, - 4596, 4597, 4598, 4599, 4600, 177, 4601, 4602, - 4603, 421, 148, 148, 151, 176, 4562, 571, - 4604, 150, 152, 153, 154, 1241, 4605, 157, - 158, 4606, 160, 161, 4607, 4608, 4609, 4610, - 4611, 4612, 4613, 4614, 4615, 4616, 4617, 4618, - 4619, 4620, 177, 4621, 4622, 4623, 421, 148, - 148, 151, 176, 4562, 594, 595, 181, 181, - 571, 4624, 150, 152, 153, 4564, 981, 4625, - 4566, 158, 4626, 160, 161, 4627, 4628, 4629, - 4630, 4631, 4632, 4633, 4634, 4635, 4636, 4637, - 4638, 4639, 4640, 177, 4641, 4642, 4643, 421, - 148, 148, 151, 176, 4562, 571, 4644, 150, - 152, 153, 154, 731, 4645, 157, 158, 4646, - 160, 161, 4647, 4648, 4649, 4650, 4651, 4652, - 4653, 4654, 4655, 4656, 4657, 4658, 4659, 4660, - 177, 4661, 4662, 4663, 421, 148, 148, 151, - 176, 4562, 571, 4664, 1047, 1175, 4665, 4666, - 4667, 4668, 4669, 4670, 4671, 4672, 4673, 4674, - 4675, 4676, 4677, 4678, 4679, 4680, 4681, 4682, - 4562, 1485, 4683, 150, 152, 153, 154, 1623, - 4684, 157, 158, 4685, 160, 161, 4686, 4687, - 4688, 4689, 4690, 4691, 4692, 4693, 4694, 4695, - 4696, 4697, 4698, 4699, 177, 4700, 4701, 4702, - 126, 148, 148, 151, 176, 4521, 181, 181, - 181, 571, 4703, 150, 152, 153, 4564, 2133, - 4704, 4566, 158, 4705, 160, 161, 4706, 4707, - 4708, 4709, 4710, 4711, 4712, 4713, 4714, 4715, - 4716, 4717, 4718, 4719, 177, 4720, 4721, 4722, - 421, 148, 148, 151, 176, 4562, 2136, 4723, - 150, 152, 153, 154, 2391, 4724, 157, 158, - 4725, 160, 161, 4726, 4727, 4728, 4729, 4730, - 4731, 4732, 4733, 4734, 4735, 4736, 4737, 4738, - 4739, 177, 4740, 4741, 4742, 126, 148, 148, - 151, 176, 4562, 2136, 4743, 150, 152, 153, - 154, 2263, 4744, 157, 158, 4745, 160, 161, - 4746, 4747, 4748, 4749, 4750, 4751, 4752, 4753, - 4754, 4755, 4756, 4757, 4758, 4759, 177, 4760, - 4761, 4762, 126, 148, 148, 151, 176, 4562, - 3249, 148, 2395, 148, 148, 4500, 122, 124, - 4501, 4502, 4503, 4504, 4505, 4506, 4507, 4508, - 4509, 4510, 4511, 4512, 4513, 4514, 4515, 4516, - 4517, 4518, 4499, 4764, 2515, 2517, 4765, 4766, - 4767, 4768, 4769, 4770, 4771, 4772, 4773, 4774, - 4775, 4776, 4777, 4778, 4779, 4780, 4781, 4782, - 4763, 4783, 4784, 4785, 4786, 4787, 4788, 4789, - 4790, 4791, 4792, 4793, 4794, 4795, 4796, 4797, - 4798, 4799, 4800, 4801, 4802, 4803, 148, 148, - 148, 4499, 181, 181, 181, 571, 1, 4563, - 150, 152, 153, 4564, 153, 4565, 4566, 158, - 4567, 160, 161, 4568, 4569, 4570, 4571, 4572, - 4573, 4574, 302, 4575, 4576, 4577, 4578, 4579, - 4580, 177, 4581, 4582, 4583, 421, 148, 148, - 151, 176, 4562, 181, 181, 181, 571, 4804, - 4805, 4807, 4808, 4809, 4808, 4810, 4811, 4812, - 4813, 4814, 4815, 4816, 4817, 4818, 4819, 4820, - 4821, 4822, 4823, 4824, 4825, 4826, 4827, 4828, - 4829, 4831, 4832, 4833, 4834, 4562, 421, 4562, - 148, 4562, 148, 4562, 4806, 4830, 1, 148, - 148, 148, 181, 148, 4500, 122, 124, 4501, - 4502, 4503, 4504, 4505, 4506, 4507, 4508, 4509, - 4510, 4511, 4512, 4513, 4514, 4515, 4516, 4517, - 4518, 4499, 4783, 4784, 4785, 4786, 4787, 4788, - 4789, 4790, 4791, 4792, 4793, 4794, 4795, 4796, - 4797, 4798, 4799, 4800, 4801, 4802, 4803, 148, - 2518, 2518, 2518, 2774, 4563, 150, 152, 153, - 4564, 153, 4565, 4566, 158, 4567, 160, 161, - 4568, 4569, 4570, 4571, 4572, 4573, 4574, 302, - 4575, 4576, 4577, 4578, 4579, 4580, 177, 4581, - 4582, 4583, 2646, 2008, 2008, 4562, 151, 4562, - 176, 4562, 1, 4835, 150, 152, 153, 154, - 2643, 4836, 157, 158, 4837, 160, 161, 4838, - 4839, 4840, 4841, 4842, 4843, 4844, 4845, 4846, - 4847, 4848, 4849, 4850, 4851, 177, 4852, 4853, - 4854, 148, 148, 151, 176, 4499, 443, 443, - 443, 443, 571, 4855, 150, 152, 153, 154, - 2771, 4856, 157, 158, 4857, 160, 161, 4858, - 4859, 4860, 4861, 4862, 4863, 4864, 4865, 4866, - 4867, 4868, 4869, 4870, 4871, 177, 4872, 4873, - 4874, 421, 148, 148, 151, 176, 4562, 571, - 4875, 150, 152, 153, 154, 2899, 4876, 157, - 158, 4877, 160, 161, 4878, 4879, 4880, 4881, - 4882, 4883, 4884, 4885, 4886, 4887, 4888, 4889, - 4890, 4891, 177, 4892, 4893, 4894, 421, 148, - 148, 151, 176, 4562, 181, 181, 181, 571, - 4563, 150, 152, 153, 4564, 153, 4565, 4566, - 158, 4567, 160, 161, 4568, 4569, 4570, 4571, - 4572, 4573, 4574, 302, 4575, 4576, 4577, 4578, - 4579, 4580, 177, 4581, 4582, 4583, 421, 148, - 148, 1, 151, 176, 4562, 181, 181, 181, - 571, 1, 4563, 150, 152, 153, 4564, 153, - 4565, 4566, 158, 4567, 160, 161, 4568, 4569, - 4570, 4571, 4572, 4573, 4574, 302, 4575, 4576, - 4577, 4578, 4579, 4580, 177, 4581, 4582, 4583, - 421, 148, 148, 1, 151, 176, 4562, 181, - 181, 181, 571, 1, 4563, 150, 152, 153, - 4564, 153, 4565, 4566, 158, 4567, 160, 161, - 4568, 4569, 4570, 4571, 4572, 4573, 4574, 302, - 4575, 4576, 4577, 4578, 4579, 4580, 177, 4581, - 4582, 4583, 421, 148, 148, 1, 1, 151, - 176, 4562, 181, 181, 181, 571, 1, 4563, - 150, 152, 153, 4564, 153, 4565, 4566, 158, - 4567, 160, 161, 4568, 4569, 4570, 4571, 4572, - 4573, 4574, 302, 4575, 4576, 4577, 4578, 4579, - 4580, 177, 4581, 4582, 4583, 421, 148, 148, - 1, 1, 151, 176, 4562, 181, 181, 181, - 571, 1, 4563, 150, 152, 153, 4564, 153, - 4565, 4566, 158, 4567, 160, 161, 4568, 4569, - 4570, 4571, 4572, 4573, 4574, 302, 4575, 4576, - 4577, 4578, 4579, 4580, 177, 4581, 4582, 4583, - 421, 148, 148, 1, 151, 176, 4562, 181, - 181, 181, 571, 4563, 150, 152, 153, 4564, - 153, 4565, 4566, 158, 4567, 160, 161, 4568, - 4569, 4570, 4571, 4572, 4573, 4574, 302, 4575, - 4576, 4577, 4578, 4579, 4580, 177, 4581, 4582, - 4583, 421, 148, 148, 1, 1, 1, 1, - 151, 176, 4562, 181, 181, 181, 571, 1, - 1, 4804, 4805, 4807, 4808, 4809, 4808, 4810, - 4811, 4812, 4813, 4814, 4815, 4816, 4817, 4818, - 4819, 4820, 4821, 4822, 4823, 4824, 4825, 4826, - 4827, 4828, 4829, 4831, 4832, 4833, 4834, 421, - 148, 148, 1, 4806, 1, 4830, 1, 4562, - 4500, 122, 124, 4501, 4502, 4503, 4504, 4505, - 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, - 4514, 4515, 4516, 4517, 4518, 4499, 148, 4783, - 4784, 4785, 4786, 4787, 4788, 4789, 4790, 4791, - 4792, 4793, 4794, 4795, 4796, 4797, 4798, 4799, - 4800, 4801, 4802, 4803, 148, 4499, 2518, 2518, - 2518, 2774, 4563, 150, 152, 153, 4564, 153, - 4565, 4566, 158, 4567, 160, 161, 4568, 4569, - 4570, 4571, 4572, 4573, 4574, 302, 4575, 4576, - 4577, 4578, 4579, 4580, 177, 4581, 4582, 4583, - 1, 2646, 1, 2008, 1, 2008, 1, 151, - 176, 4562, 181, 181, 181, 571, 4563, 150, - 152, 153, 4564, 153, 4565, 4566, 158, 4567, - 160, 161, 4568, 4569, 4570, 4571, 4572, 4573, - 4574, 302, 4575, 4576, 4577, 4578, 4579, 4580, - 177, 4581, 4582, 4583, 421, 148, 148, 1, - 151, 176, 4562, 181, 181, 181, 571, 4563, - 150, 152, 153, 4564, 153, 4565, 4566, 158, - 4567, 160, 161, 4568, 4569, 4570, 4571, 4572, - 4573, 4574, 302, 4575, 4576, 4577, 4578, 4579, - 4580, 177, 4581, 4582, 4583, 421, 148, 148, - 1, 151, 176, 4562, 181, 181, 181, 571, - 3, 4, 5, 6, 7, 9, 10, 11, - 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 4563, 150, 152, 153, 4564, 153, - 4565, 4566, 158, 4567, 160, 161, 4568, 4569, - 4570, 4571, 4572, 4573, 4574, 302, 4575, 4576, - 4577, 4578, 4579, 4580, 177, 4581, 4582, 4583, - 421, 148, 148, 8, 12, 151, 176, 4562, - 181, 181, 181, 571, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, - 51, 4563, 150, 152, 153, 4564, 153, 4565, - 4566, 158, 4567, 160, 161, 4568, 4569, 4570, - 4571, 4572, 4573, 4574, 302, 4575, 4576, 4577, - 4578, 4579, 4580, 177, 4581, 4582, 4583, 421, - 148, 148, 151, 176, 4562, 181, 181, 181, - 571, 52, 53, 54, 55, 56, 57, 4563, - 150, 152, 153, 4564, 153, 4565, 4566, 158, - 4567, 160, 161, 4568, 4569, 4570, 4571, 4572, - 4573, 4574, 302, 4575, 4576, 4577, 4578, 4579, - 4580, 177, 4581, 4582, 4583, 421, 148, 148, - 151, 176, 4562, 181, 181, 181, 571, 58, - 59, 4563, 150, 152, 153, 4564, 153, 4565, - 4566, 158, 4567, 160, 161, 4568, 4569, 4570, - 4571, 4572, 4573, 4574, 302, 4575, 4576, 4577, - 4578, 4579, 4580, 177, 4581, 4582, 4583, 421, - 148, 148, 151, 176, 4562, 181, 181, 181, - 571, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, - 4563, 150, 152, 153, 4564, 153, 4565, 4566, - 158, 4567, 160, 161, 4568, 4569, 4570, 4571, - 4572, 4573, 4574, 302, 4575, 4576, 4577, 4578, - 4579, 4580, 177, 4581, 4582, 4583, 421, 148, - 148, 151, 176, 4562, 181, 181, 181, 571, - 75, 76, 56, 61, 77, 4563, 150, 152, - 153, 4564, 153, 4565, 4566, 158, 4567, 160, - 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, - 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, - 4581, 4582, 4583, 421, 148, 148, 151, 176, - 4562, 181, 181, 181, 571, 78, 79, 80, - 81, 82, 83, 4563, 150, 152, 153, 4564, - 153, 4565, 4566, 158, 4567, 160, 161, 4568, - 4569, 4570, 4571, 4572, 4573, 4574, 302, 4575, - 4576, 4577, 4578, 4579, 4580, 177, 4581, 4582, - 4583, 421, 148, 148, 151, 176, 4562, 181, - 181, 181, 571, 119, 4563, 150, 152, 153, - 4564, 153, 4565, 4566, 158, 4567, 160, 161, - 4568, 4569, 4570, 4571, 4572, 4573, 4574, 302, - 4575, 4576, 4577, 4578, 4579, 4580, 177, 4581, - 4582, 4583, 421, 148, 148, 151, 176, 4562, - 181, 4499, 4500, 122, 124, 4501, 4502, 4503, - 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, - 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4499, - 4499, 4499, 4499, 148, 4499, 4499, 4500, 122, - 124, 4501, 4502, 4503, 4504, 4505, 4506, 4507, - 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, - 4516, 4517, 4518, 4499, 4499, 148, 181, 148, - 4783, 4784, 4785, 4786, 4787, 4788, 4789, 4790, - 4791, 4792, 4793, 4794, 4795, 4796, 4797, 4798, - 4799, 4800, 4801, 4802, 4803, 148, 148, 148, - 4499, 4499, 4783, 4784, 4785, 4786, 4787, 4788, - 4789, 4790, 4791, 4792, 4793, 4794, 4795, 4796, - 4797, 4798, 4799, 4800, 4801, 4802, 4803, 148, - 4499, 4783, 4784, 4785, 4786, 4787, 4788, 4789, - 4790, 4791, 4792, 4793, 4794, 4795, 4796, 4797, - 4798, 4799, 4800, 4801, 4802, 4803, 148, 4499, - 4783, 4784, 4785, 4786, 4787, 4788, 4789, 4790, - 4791, 4792, 4793, 4794, 4795, 4796, 4797, 4798, - 4799, 4800, 4801, 4802, 4803, 148, 4783, 4784, - 4785, 4786, 4787, 4788, 4789, 4790, 4791, 4792, - 4793, 4794, 4795, 4796, 4797, 4798, 4799, 4800, - 4801, 4802, 4803, 4499, 4499, 148, 4499, 4500, - 122, 124, 4501, 4502, 4503, 4504, 4505, 4506, - 4507, 4508, 4509, 4510, 4511, 4512, 4513, 4514, - 4515, 4516, 4517, 4518, 4499, 4499, 148, 148, - 148, 181, 4500, 122, 124, 4501, 4502, 4503, - 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, - 4512, 4513, 4514, 4515, 4516, 4517, 4518, 148, - 148, 572, 572, 4499, 148, 4500, 122, 124, - 4501, 4502, 4503, 4504, 4505, 4506, 4507, 4508, - 4509, 4510, 4511, 4512, 4513, 4514, 4515, 4516, - 4517, 4518, 148, 148, 148, 4499, 421, 4783, - 4784, 4785, 4786, 4787, 4788, 4789, 4790, 4791, - 4792, 4793, 4794, 4795, 4796, 4797, 4798, 4799, - 4800, 4801, 4802, 4803, 148, 421, 148, 4499, - 4499, 4499, 4499, 4500, 122, 124, 4501, 4502, - 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, - 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, - 421, 4499, 4499, 148, 4783, 4784, 4785, 4786, - 4787, 4788, 4789, 4790, 4791, 4792, 4793, 4794, - 4795, 4796, 4797, 4798, 4799, 4800, 4801, 4802, - 4803, 148, 4499, 4783, 4784, 4785, 4786, 4787, - 4788, 4789, 4790, 4791, 4792, 4793, 4794, 4795, - 4796, 4797, 4798, 4799, 4800, 4801, 4802, 4803, - 4499, 148, 4500, 122, 124, 4501, 4502, 4503, - 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, - 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4499, - 148, 148, 4500, 122, 124, 4501, 4502, 4503, - 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, - 4512, 4513, 4514, 4515, 4516, 4517, 4518, 421, - 148, 4499, 1373, 1374, 184, 1375, 151, 1376, - 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, - 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, - 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, - 1401, 1402, 4500, 122, 124, 4501, 4502, 4503, - 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, - 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4499, - 1403, 1404, 1405, 217, 218, 219, 220, 221, - 1406, 223, 224, 225, 226, 227, 228, 1407, - 1408, 1409, 1410, 1411, 234, 1412, 236, 1413, - 483, 484, 1374, 1414, 1415, 153, 1416, 1417, - 1418, 1419, 646, 1420, 151, 152, 1421, 249, - 250, 251, 252, 4500, 122, 124, 4501, 4502, - 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, - 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, - 151, 153, 151, 4499, 1422, 1423, 255, 1424, - 257, 258, 259, 260, 261, 262, 263, 151, - 1425, 265, 1426, 267, 1427, 269, 4500, 122, - 124, 4501, 4502, 4503, 4504, 4505, 4506, 4507, - 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, - 4516, 4517, 4518, 4499, 1428, 1429, 272, 151, - 273, 4500, 122, 124, 4501, 4502, 4503, 4504, - 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, - 4513, 4514, 4515, 4516, 4517, 4518, 4499, 153, - 274, 275, 153, 657, 1430, 153, 302, 280, - 281, 282, 1431, 284, 153, 1432, 1433, 1434, - 153, 1435, 1436, 1437, 1438, 1439, 295, 296, - 152, 1440, 153, 4895, 4896, 4897, 4898, 4899, - 4900, 4901, 4902, 4903, 4904, 4905, 4906, 4907, - 4908, 4909, 4910, 4911, 4912, 4913, 4914, 4915, - 151, 4499, 181, 181, 181, 571, 4563, 150, - 152, 153, 4564, 153, 4565, 4566, 158, 4567, - 160, 161, 4568, 4569, 4570, 4571, 4572, 4573, - 4574, 302, 4575, 4576, 4577, 4578, 4579, 4580, - 177, 4581, 4582, 4583, 421, 148, 148, 1, - 1, 1, 1, 151, 176, 4562, 181, 181, - 181, 571, 4563, 150, 152, 153, 4564, 153, - 4565, 4566, 158, 4567, 160, 161, 4568, 4569, - 4570, 4571, 4572, 4573, 4574, 302, 4575, 4576, - 4577, 4578, 4579, 4580, 177, 4581, 4582, 4583, - 421, 148, 148, 1, 151, 176, 4562, 181, - 181, 181, 571, 4804, 4805, 4807, 4808, 4809, - 4808, 4810, 4811, 4812, 4813, 4814, 4815, 4816, - 4817, 4818, 4819, 4820, 4821, 4822, 4823, 4824, - 4825, 4826, 4827, 4828, 4829, 4831, 4832, 4833, - 4834, 421, 148, 148, 1, 4806, 1, 4830, - 1, 4562, 4895, 4896, 4897, 4898, 4899, 4900, - 4901, 4902, 4903, 4904, 4905, 4906, 4907, 4908, - 4909, 4910, 4911, 4912, 4913, 4914, 4915, 151, - 181, 181, 181, 571, 4563, 150, 152, 153, - 4564, 153, 4565, 4566, 158, 4567, 160, 161, - 4568, 4569, 4570, 4571, 4572, 4573, 4574, 302, - 4575, 4576, 4577, 4578, 4579, 4580, 177, 4581, - 4582, 4583, 421, 148, 148, 1, 151, 176, - 4562, 181, 181, 181, 571, 4563, 150, 152, - 153, 4564, 153, 4565, 4566, 158, 4567, 160, - 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, - 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, - 4581, 4582, 4583, 421, 148, 148, 1, 1, - 1, 1, 1, 151, 176, 4562, 181, 181, - 181, 571, 1, 4563, 150, 152, 153, 4564, - 153, 4565, 4566, 158, 4567, 160, 161, 4568, - 4569, 4570, 4571, 4572, 4573, 4574, 302, 4575, - 4576, 4577, 4578, 4579, 4580, 177, 4581, 4582, - 4583, 421, 148, 148, 1, 1, 151, 176, - 4562, 181, 181, 181, 571, 4563, 150, 152, - 153, 4564, 153, 4565, 4566, 158, 4567, 160, - 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, - 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, - 4581, 4582, 4583, 421, 148, 148, 1, 151, - 176, 4562, 181, 181, 181, 571, 4563, 150, - 152, 153, 4564, 153, 4565, 4566, 158, 4567, - 160, 161, 4568, 4569, 4570, 4571, 4572, 4573, - 4574, 302, 4575, 4576, 4577, 4578, 4579, 4580, - 177, 4581, 4582, 4583, 421, 148, 148, 1, - 1, 151, 176, 4562, 181, 181, 181, 571, - 4563, 150, 152, 153, 4564, 153, 4565, 4566, - 158, 4567, 160, 161, 4568, 4569, 4570, 4571, - 4572, 4573, 4574, 302, 4575, 4576, 4577, 4578, - 4579, 4580, 177, 4581, 4582, 4583, 421, 148, - 148, 1, 1, 151, 176, 4562, 181, 181, - 181, 571, 4804, 4805, 4807, 4808, 4809, 4808, - 4810, 4811, 4812, 4813, 4814, 4815, 4816, 4817, - 4818, 4819, 4820, 4821, 4822, 4823, 4824, 4825, - 4826, 4827, 4828, 4829, 4831, 4832, 4833, 4834, - 421, 148, 148, 1, 4806, 1, 4830, 1, - 4562, 298, 299, 4500, 122, 124, 4501, 4502, - 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, - 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, - 4499, 151, 1441, 674, 302, 303, 304, 305, - 306, 307, 1442, 932, 1443, 934, 312, 1444, - 1445, 4500, 122, 124, 4501, 4502, 4503, 4504, - 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, - 4513, 4514, 4515, 4516, 4517, 4518, 151, 4499, - 1446, 1447, 317, 318, 319, 1448, 1449, 1450, - 1451, 324, 4500, 122, 124, 4501, 4502, 4503, - 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, - 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4499, - 1482, 4500, 122, 124, 4501, 4502, 4503, 4504, - 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, - 4513, 4514, 4515, 4516, 4517, 4518, 4499, 2518, - 2518, 2518, 2774, 4563, 150, 152, 153, 4564, - 153, 4565, 4566, 158, 4567, 160, 161, 4568, - 4569, 4570, 4571, 4572, 4573, 4574, 302, 4575, - 4576, 4577, 4578, 4579, 4580, 177, 4581, 4582, - 4583, 2646, 2008, 2008, 4562, 4562, 151, 4562, - 176, 4562, 1, 181, 181, 181, 571, 4563, - 150, 152, 153, 4564, 153, 4565, 4566, 158, - 4567, 160, 161, 4568, 4569, 4570, 4571, 4572, - 4573, 4574, 302, 4575, 4576, 4577, 4578, 4579, - 4580, 177, 4581, 4582, 4583, 421, 148, 148, - 1, 151, 176, 4562, 181, 181, 181, 571, - 1, 4563, 150, 152, 153, 4564, 153, 4565, - 4566, 158, 4567, 160, 161, 4568, 4569, 4570, - 4571, 4572, 4573, 4574, 302, 4575, 4576, 4577, - 4578, 4579, 4580, 177, 4581, 4582, 4583, 421, - 148, 148, 151, 176, 4562, 181, 181, 181, - 571, 4563, 150, 152, 153, 4564, 153, 4565, - 4566, 158, 4567, 160, 161, 4568, 4569, 4570, - 4571, 4572, 4573, 4574, 302, 4575, 4576, 4577, - 4578, 4579, 4580, 177, 4581, 4582, 4583, 421, - 148, 148, 1, 1, 151, 176, 4562, 181, - 181, 181, 571, 4563, 150, 152, 153, 4564, - 153, 4565, 4566, 158, 4567, 160, 161, 4568, - 4569, 4570, 4571, 4572, 4573, 4574, 302, 4575, - 4576, 4577, 4578, 4579, 4580, 177, 4581, 4582, - 4583, 421, 148, 148, 1, 151, 176, 4562, - 181, 181, 181, 571, 1, 4563, 150, 152, - 153, 4564, 153, 4565, 4566, 158, 4567, 160, - 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, - 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, - 4581, 4582, 4583, 421, 148, 148, 1, 1, - 151, 176, 4562, 181, 181, 181, 571, 4563, - 150, 152, 153, 4564, 153, 4565, 4566, 158, - 4567, 160, 161, 4568, 4569, 4570, 4571, 4572, - 4573, 4574, 302, 4575, 4576, 4577, 4578, 4579, - 4580, 177, 4581, 4582, 4583, 421, 148, 148, - 1, 151, 176, 4562, 181, 181, 181, 571, - 4804, 4805, 4807, 4808, 4809, 4808, 4810, 4811, - 4812, 4813, 4814, 4815, 4816, 4817, 4818, 4819, - 4820, 4821, 4822, 4823, 4824, 4825, 4826, 4827, - 4828, 4829, 4831, 4832, 4833, 4834, 421, 148, - 148, 1, 1, 4806, 1, 4830, 1, 4562, - 2518, 2518, 2518, 2774, 4563, 150, 152, 153, - 4564, 153, 4565, 4566, 158, 4567, 160, 161, - 4568, 4569, 4570, 4571, 4572, 4573, 4574, 302, - 4575, 4576, 4577, 4578, 4579, 4580, 177, 4581, - 4582, 4583, 2646, 2008, 2008, 4562, 4562, 151, - 4562, 176, 4562, 1, 181, 181, 181, 571, - 4563, 150, 152, 153, 4564, 153, 4565, 4566, - 158, 4567, 160, 161, 4568, 4569, 4570, 4571, - 4572, 4573, 4574, 302, 4575, 4576, 4577, 4578, - 4579, 4580, 177, 4581, 4582, 4583, 421, 148, - 148, 1, 1, 151, 176, 4562, 181, 181, - 181, 571, 4563, 150, 152, 153, 4564, 153, - 4565, 4566, 158, 4567, 160, 161, 4568, 4569, - 4570, 4571, 4572, 4573, 4574, 302, 4575, 4576, - 4577, 4578, 4579, 4580, 177, 4581, 4582, 4583, - 421, 148, 148, 1, 151, 176, 4562, 181, - 181, 181, 571, 4563, 150, 152, 153, 4564, - 153, 4565, 4566, 158, 4567, 160, 161, 4568, - 4569, 4570, 4571, 4572, 4573, 4574, 302, 4575, - 4576, 4577, 4578, 4579, 4580, 177, 4581, 4582, - 4583, 421, 148, 148, 1, 151, 176, 4562, - 181, 181, 181, 571, 1, 4563, 150, 152, - 153, 4564, 153, 4565, 4566, 158, 4567, 160, - 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, - 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, - 4581, 4582, 4583, 421, 148, 148, 1, 1, - 1, 1, 151, 176, 4562, 181, 181, 181, - 571, 4563, 150, 152, 153, 4564, 153, 4565, - 4566, 158, 4567, 160, 161, 4568, 4569, 4570, - 4571, 4572, 4573, 4574, 302, 4575, 4576, 4577, - 4578, 4579, 4580, 177, 4581, 4582, 4583, 421, - 148, 148, 1, 1, 151, 176, 4562, 181, - 181, 181, 571, 4563, 150, 152, 153, 4564, - 153, 4565, 4566, 158, 4567, 160, 161, 4568, - 4569, 4570, 4571, 4572, 4573, 4574, 302, 4575, - 4576, 4577, 4578, 4579, 4580, 177, 4581, 4582, - 4583, 421, 148, 148, 1, 1, 151, 176, - 4562, 181, 181, 181, 571, 4563, 150, 152, - 153, 4564, 153, 4565, 4566, 158, 4567, 160, - 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, - 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, - 4581, 4582, 4583, 421, 148, 148, 1, 1, - 151, 176, 4562, 181, 181, 181, 571, 4563, - 150, 152, 153, 4564, 153, 4565, 4566, 158, - 4567, 160, 161, 4568, 4569, 4570, 4571, 4572, - 4573, 4574, 302, 4575, 4576, 4577, 4578, 4579, - 4580, 177, 4581, 4582, 4583, 421, 148, 148, - 1, 151, 176, 4562, 181, 181, 181, 571, - 4563, 150, 152, 153, 4564, 153, 4565, 4566, - 158, 4567, 160, 161, 4568, 4569, 4570, 4571, - 4572, 4573, 4574, 302, 4575, 4576, 4577, 4578, - 4579, 4580, 177, 4581, 4582, 4583, 421, 148, - 148, 1, 151, 176, 4562, 181, 181, 181, - 571, 1, 4563, 150, 152, 153, 4564, 153, - 4565, 4566, 158, 4567, 160, 161, 4568, 4569, - 4570, 4571, 4572, 4573, 4574, 302, 4575, 4576, - 4577, 4578, 4579, 4580, 177, 4581, 4582, 4583, - 421, 148, 148, 151, 176, 4562, 181, 181, - 181, 571, 4563, 150, 152, 153, 4564, 153, - 4565, 4566, 158, 4567, 160, 161, 4568, 4569, - 4570, 4571, 4572, 4573, 4574, 302, 4575, 4576, - 4577, 4578, 4579, 4580, 177, 4581, 4582, 4583, - 421, 148, 148, 1, 151, 176, 4562, 181, - 181, 181, 571, 4563, 150, 152, 153, 4564, - 153, 4565, 4566, 158, 4567, 160, 161, 4568, - 4569, 4570, 4571, 4572, 4573, 4574, 302, 4575, - 4576, 4577, 4578, 4579, 4580, 177, 4581, 4582, - 4583, 421, 148, 148, 1, 151, 176, 4562, - 181, 181, 181, 571, 4563, 150, 152, 153, - 4564, 153, 4565, 4566, 158, 4567, 160, 161, - 4568, 4569, 4570, 4571, 4572, 4573, 4574, 302, - 4575, 4576, 4577, 4578, 4579, 4580, 177, 4581, - 4582, 4583, 421, 148, 148, 1, 151, 176, - 4562, 181, 181, 181, 571, 4563, 150, 152, - 153, 4564, 153, 4565, 4566, 158, 4567, 160, - 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, - 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, - 4581, 4582, 4583, 421, 148, 148, 1, 1, - 151, 176, 4562, 181, 181, 181, 571, 4563, - 150, 152, 153, 4564, 153, 4565, 4566, 158, - 4567, 160, 161, 4568, 4569, 4570, 4571, 4572, - 4573, 4574, 302, 4575, 4576, 4577, 4578, 4579, - 4580, 177, 4581, 4582, 4583, 421, 148, 148, - 1, 151, 176, 4562, 181, 181, 181, 571, - 4563, 150, 152, 153, 4564, 153, 4565, 4566, - 158, 4567, 160, 161, 4568, 4569, 4570, 4571, - 4572, 4573, 4574, 302, 4575, 4576, 4577, 4578, - 4579, 4580, 177, 4581, 4582, 4583, 421, 148, - 148, 1, 151, 176, 4562, 181, 181, 181, - 571, 1, 1, 1, 4563, 150, 152, 153, - 4564, 153, 4565, 4566, 158, 4567, 160, 161, - 4568, 4569, 4570, 4571, 4572, 4573, 4574, 302, - 4575, 4576, 4577, 4578, 4579, 4580, 177, 4581, - 4582, 4583, 421, 148, 148, 1, 151, 176, - 4562, 181, 181, 181, 571, 4804, 4805, 4807, - 4808, 4809, 4808, 4810, 4811, 4812, 4813, 4814, - 4815, 4816, 4817, 4818, 4819, 4820, 4821, 4822, - 4823, 4824, 4825, 4826, 4827, 4828, 4829, 4831, - 4832, 4833, 4834, 421, 148, 148, 1, 1, - 4806, 1, 4830, 1, 4562, 2518, 2518, 2518, - 2774, 4563, 150, 152, 153, 4564, 153, 4565, - 4566, 158, 4567, 160, 161, 4568, 4569, 4570, - 4571, 4572, 4573, 4574, 302, 4575, 4576, 4577, - 4578, 4579, 4580, 177, 4581, 4582, 4583, 2646, - 2008, 2008, 4562, 4562, 151, 4562, 176, 4562, - 1, 181, 181, 181, 571, 4563, 150, 152, - 153, 4564, 153, 4565, 4566, 158, 4567, 160, - 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, - 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, - 4581, 4582, 4583, 421, 148, 148, 1, 151, - 176, 4562, 181, 181, 181, 571, 4563, 150, - 152, 153, 4564, 153, 4565, 4566, 158, 4567, - 160, 161, 4568, 4569, 4570, 4571, 4572, 4573, - 4574, 302, 4575, 4576, 4577, 4578, 4579, 4580, - 177, 4581, 4582, 4583, 421, 148, 148, 1, - 151, 176, 4562, 181, 181, 181, 571, 4804, - 4805, 4807, 4808, 4809, 4808, 4810, 4811, 4812, - 4813, 4814, 4815, 4816, 4817, 4818, 4819, 4820, - 4821, 4822, 4823, 4824, 4825, 4826, 4827, 4828, - 4829, 4831, 4832, 4833, 4834, 421, 148, 148, - 1, 1, 4806, 1, 4830, 1, 4562, 2518, - 2518, 2518, 2774, 1, 4563, 150, 152, 153, - 4564, 153, 4565, 4566, 158, 4567, 160, 161, - 4568, 4569, 4570, 4571, 4572, 4573, 4574, 302, - 4575, 4576, 4577, 4578, 4579, 4580, 177, 4581, - 4582, 4583, 1, 2646, 1, 2008, 1, 2008, - 1, 151, 176, 4562, 181, 181, 181, 571, - 4563, 150, 152, 153, 4564, 153, 4565, 4566, - 158, 4567, 160, 161, 4568, 4569, 4570, 4571, - 4572, 4573, 4574, 302, 4575, 4576, 4577, 4578, - 4579, 4580, 177, 4581, 4582, 4583, 421, 148, - 148, 1, 151, 176, 4562, 181, 181, 181, - 571, 1, 4563, 150, 152, 153, 4564, 153, - 4565, 4566, 158, 4567, 160, 161, 4568, 4569, - 4570, 4571, 4572, 4573, 4574, 302, 4575, 4576, - 4577, 4578, 4579, 4580, 177, 4581, 4582, 4583, - 421, 148, 148, 1, 1, 151, 176, 4562, - 181, 181, 181, 571, 1, 4563, 150, 152, - 153, 4564, 153, 4565, 4566, 158, 4567, 160, - 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, - 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, - 4581, 4582, 4583, 421, 148, 148, 1, 1, - 1, 151, 176, 4562, 181, 181, 181, 571, - 1, 4563, 150, 152, 153, 4564, 153, 4565, - 4566, 158, 4567, 160, 161, 4568, 4569, 4570, - 4571, 4572, 4573, 4574, 302, 4575, 4576, 4577, - 4578, 4579, 4580, 177, 4581, 4582, 4583, 421, - 148, 148, 1, 1, 151, 176, 4562, 181, - 181, 181, 571, 4563, 150, 152, 153, 4564, - 153, 4565, 4566, 158, 4567, 160, 161, 4568, - 4569, 4570, 4571, 4572, 4573, 4574, 302, 4575, - 4576, 4577, 4578, 4579, 4580, 177, 4581, 4582, - 4583, 421, 148, 148, 1, 1, 151, 176, - 4562, 181, 181, 181, 571, 1, 4563, 150, - 152, 153, 4564, 153, 4565, 4566, 158, 4567, - 160, 161, 4568, 4569, 4570, 4571, 4572, 4573, - 4574, 302, 4575, 4576, 4577, 4578, 4579, 4580, - 177, 4581, 4582, 4583, 421, 148, 148, 151, - 176, 4562, 181, 181, 181, 571, 4563, 150, - 152, 153, 4564, 153, 4565, 4566, 158, 4567, - 160, 161, 4568, 4569, 4570, 4571, 4572, 4573, - 4574, 302, 4575, 4576, 4577, 4578, 4579, 4580, - 177, 4581, 4582, 4583, 421, 148, 148, 1, - 1, 151, 176, 4562, 181, 181, 181, 571, - 4563, 150, 152, 153, 4564, 153, 4565, 4566, - 158, 4567, 160, 161, 4568, 4569, 4570, 4571, - 4572, 4573, 4574, 302, 4575, 4576, 4577, 4578, - 4579, 4580, 177, 4581, 4582, 4583, 421, 148, - 148, 1, 151, 176, 4562, 181, 181, 181, - 571, 84, 85, 86, 87, 88, 4563, 150, - 152, 153, 4564, 153, 4565, 4566, 158, 4567, - 160, 161, 4568, 4569, 4570, 4571, 4572, 4573, - 4574, 302, 4575, 4576, 4577, 4578, 4579, 4580, - 177, 4581, 4582, 4583, 421, 148, 148, 151, - 176, 4562, 181, 181, 181, 571, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 100, 104, 105, - 106, 4563, 150, 152, 153, 4564, 153, 4565, - 4566, 158, 4567, 160, 161, 4568, 4569, 4570, - 4571, 4572, 4573, 4574, 302, 4575, 4576, 4577, - 4578, 4579, 4580, 177, 4581, 4582, 4583, 421, - 148, 148, 151, 176, 4562, 181, 181, 181, - 571, 107, 108, 109, 110, 4563, 150, 152, - 153, 4564, 153, 4565, 4566, 158, 4567, 160, - 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, - 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, - 4581, 4582, 4583, 421, 148, 148, 151, 176, - 4562, 181, 181, 181, 571, 111, 4563, 150, - 152, 153, 4564, 153, 4565, 4566, 158, 4567, - 160, 161, 4568, 4569, 4570, 4571, 4572, 4573, - 4574, 302, 4575, 4576, 4577, 4578, 4579, 4580, - 177, 4581, 4582, 4583, 421, 148, 148, 151, - 176, 4562, 181, 181, 181, 571, 112, 113, - 114, 115, 116, 117, 4563, 150, 152, 153, - 4564, 153, 4565, 4566, 158, 4567, 160, 161, - 4568, 4569, 4570, 4571, 4572, 4573, 4574, 302, - 4575, 4576, 4577, 4578, 4579, 4580, 177, 4581, - 4582, 4583, 421, 148, 148, 151, 176, 4562, - 181, 181, 181, 571, 118, 4563, 150, 152, - 153, 4564, 153, 4565, 4566, 158, 4567, 160, - 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, - 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, - 4581, 4582, 4583, 421, 148, 148, 151, 176, - 4562, 181, 181, 181, 571, 120, 121, 122, - 124, 4563, 150, 152, 153, 4564, 153, 4565, - 4566, 158, 4567, 160, 161, 4568, 4569, 4570, - 4571, 4572, 4573, 4574, 302, 4575, 4576, 4577, - 4578, 4579, 4580, 177, 4581, 4582, 4583, 421, - 148, 148, 123, 151, 176, 4562, 2518, 2518, - 2518, 2774, 4562, 4804, 4805, 4807, 4808, 4809, - 4808, 4810, 4811, 4812, 4813, 4814, 4815, 4816, - 4817, 4818, 4819, 4820, 4821, 4822, 4823, 4824, - 4825, 4826, 4827, 4828, 4829, 4831, 4832, 4833, - 4834, 2646, 2008, 2008, 4562, 4806, 4830, 1, - 2518, 2518, 2518, 2774, 4562, 4563, 150, 152, - 153, 4564, 153, 4565, 4566, 158, 4567, 160, - 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, - 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, - 4581, 4582, 4583, 2646, 2008, 2008, 4562, 4562, - 151, 4562, 176, 4562, 1, 181, 181, 181, - 571, 1, 4804, 4805, 4807, 4808, 4809, 4808, - 4810, 4811, 4812, 4813, 4814, 4815, 4816, 4817, - 4818, 4819, 4820, 4821, 4822, 4823, 4824, 4825, - 4826, 4827, 4828, 4829, 4831, 4832, 4833, 4834, - 421, 148, 148, 1, 1, 4806, 1, 4830, - 1, 4562, 2518, 2518, 2518, 2774, 4563, 150, - 152, 153, 4564, 153, 4565, 4566, 158, 4567, - 160, 161, 4568, 4569, 4570, 4571, 4572, 4573, - 4574, 302, 4575, 4576, 4577, 4578, 4579, 4580, - 177, 4581, 4582, 4583, 2646, 2008, 2008, 4562, - 4562, 4562, 4562, 4562, 151, 4562, 176, 4562, - 1, 2518, 2518, 2518, 2774, 1, 1, 4563, - 150, 152, 153, 4564, 153, 4565, 4566, 158, - 4567, 160, 161, 4568, 4569, 4570, 4571, 4572, - 4573, 4574, 302, 4575, 4576, 4577, 4578, 4579, - 4580, 177, 4581, 4582, 4583, 1, 2646, 1, - 2008, 1, 2008, 1, 1, 1, 1, 151, - 176, 4562, 2518, 2518, 2518, 2774, 4562, 4562, - 4563, 150, 152, 153, 4564, 153, 4565, 4566, - 158, 4567, 160, 161, 4568, 4569, 4570, 4571, - 4572, 4573, 4574, 302, 4575, 4576, 4577, 4578, - 4579, 4580, 177, 4581, 4582, 4583, 2646, 2008, - 2008, 4562, 4562, 151, 4562, 176, 4562, 1, - 181, 181, 181, 571, 1, 4563, 150, 152, - 153, 4564, 153, 4565, 4566, 158, 4567, 160, - 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, - 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, - 4581, 4582, 4583, 421, 148, 148, 1, 1, - 151, 176, 4562, 181, 181, 181, 571, 4563, - 150, 152, 153, 4564, 153, 4565, 4566, 158, - 4567, 160, 161, 4568, 4569, 4570, 4571, 4572, - 4573, 4574, 302, 4575, 4576, 4577, 4578, 4579, - 4580, 177, 4581, 4582, 4583, 421, 148, 148, - 1, 1, 1, 1, 1, 151, 176, 4562, - 181, 181, 181, 571, 1, 4563, 150, 152, - 153, 4564, 153, 4565, 4566, 158, 4567, 160, - 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, - 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, - 4581, 4582, 4583, 421, 148, 148, 1, 151, - 176, 4562, 181, 181, 181, 571, 1, 4563, - 150, 152, 153, 4564, 153, 4565, 4566, 158, - 4567, 160, 161, 4568, 4569, 4570, 4571, 4572, - 4573, 4574, 302, 4575, 4576, 4577, 4578, 4579, - 4580, 177, 4581, 4582, 4583, 421, 148, 148, - 1, 1, 1, 151, 176, 4562, 181, 181, - 181, 571, 4804, 4805, 4807, 4808, 4809, 4808, - 4810, 4811, 4812, 4813, 4814, 4815, 4816, 4817, - 4818, 4819, 4820, 4821, 4822, 4823, 4824, 4825, - 4826, 4827, 4828, 4829, 4831, 4832, 4833, 4834, - 421, 148, 148, 1, 1, 4806, 1, 4830, - 1, 4562, 2518, 2518, 2518, 2774, 4562, 4562, - 4563, 150, 152, 153, 4564, 153, 4565, 4566, - 158, 4567, 160, 161, 4568, 4569, 4570, 4571, - 4572, 4573, 4574, 302, 4575, 4576, 4577, 4578, - 4579, 4580, 177, 4581, 4582, 4583, 2646, 2008, - 2008, 4562, 4562, 4562, 151, 4562, 176, 4562, - 1, 181, 181, 181, 571, 4563, 150, 152, - 153, 4564, 153, 4565, 4566, 158, 4567, 160, - 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, - 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, - 4581, 4582, 4583, 421, 148, 148, 1, 1, - 1, 1, 1, 151, 176, 4562, 181, 181, - 181, 571, 4804, 4805, 4807, 4808, 4809, 4808, - 4810, 4811, 4812, 4813, 4814, 4815, 4816, 4817, - 4818, 4819, 4820, 4821, 4822, 4823, 4824, 4825, - 4826, 4827, 4828, 4829, 4831, 4832, 4833, 4834, - 421, 148, 148, 1, 1, 4806, 1, 4830, - 1, 4562, 2518, 2518, 2518, 2774, 4562, 4562, - 4563, 150, 152, 153, 4564, 153, 4565, 4566, - 158, 4567, 160, 161, 4568, 4569, 4570, 4571, - 4572, 4573, 4574, 302, 4575, 4576, 4577, 4578, - 4579, 4580, 177, 4581, 4582, 4583, 2646, 2008, - 2008, 4562, 4562, 4562, 151, 4562, 176, 4562, - 1, 181, 181, 181, 571, 4563, 150, 152, - 153, 4564, 153, 4565, 4566, 158, 4567, 160, - 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, - 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, - 4581, 4582, 4583, 421, 148, 148, 1, 151, - 176, 4562, 181, 181, 181, 571, 1, 1, - 4563, 150, 152, 153, 4564, 153, 4565, 4566, - 158, 4567, 160, 161, 4568, 4569, 4570, 4571, - 4572, 4573, 4574, 302, 4575, 4576, 4577, 4578, - 4579, 4580, 177, 4581, 4582, 4583, 421, 148, - 148, 1, 1, 1, 151, 176, 4562, 181, - 181, 181, 571, 1, 4563, 150, 152, 153, - 4564, 153, 4565, 4566, 158, 4567, 160, 161, - 4568, 4569, 4570, 4571, 4572, 4573, 4574, 302, - 4575, 4576, 4577, 4578, 4579, 4580, 177, 4581, - 4582, 4583, 421, 148, 148, 1, 151, 176, - 4562, 181, 181, 181, 571, 4563, 150, 152, - 153, 4564, 153, 4565, 4566, 158, 4567, 160, - 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, - 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, - 4581, 4582, 4583, 421, 148, 148, 1, 151, - 176, 4562, 181, 181, 181, 571, 1, 4563, - 150, 152, 153, 4564, 153, 4565, 4566, 158, - 4567, 160, 161, 4568, 4569, 4570, 4571, 4572, - 4573, 4574, 302, 4575, 4576, 4577, 4578, 4579, - 4580, 177, 4581, 4582, 4583, 421, 148, 148, - 1, 1, 151, 176, 4562, 181, 181, 181, - 571, 4563, 150, 152, 153, 4564, 153, 4565, - 4566, 158, 4567, 160, 161, 4568, 4569, 4570, - 4571, 4572, 4573, 4574, 302, 4575, 4576, 4577, - 4578, 4579, 4580, 177, 4581, 4582, 4583, 421, - 148, 148, 1, 151, 176, 4562, 181, 181, - 181, 571, 1, 1, 1, 4563, 150, 152, - 153, 4564, 153, 4565, 4566, 158, 4567, 160, - 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, - 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, - 4581, 4582, 4583, 421, 148, 148, 1, 1, - 151, 176, 4562, 181, 181, 181, 571, 4563, - 150, 152, 153, 4564, 153, 4565, 4566, 158, - 4567, 160, 161, 4568, 4569, 4570, 4571, 4572, - 4573, 4574, 302, 4575, 4576, 4577, 4578, 4579, - 4580, 177, 4581, 4582, 4583, 421, 148, 148, - 1, 151, 176, 4562, 181, 181, 181, 571, - 4563, 150, 152, 153, 4564, 153, 4565, 4566, - 158, 4567, 160, 161, 4568, 4569, 4570, 4571, - 4572, 4573, 4574, 302, 4575, 4576, 4577, 4578, - 4579, 4580, 177, 4581, 4582, 4583, 421, 148, - 148, 1, 1, 1, 1, 151, 176, 4562, - 181, 181, 181, 571, 1, 4563, 150, 152, - 153, 4564, 153, 4565, 4566, 158, 4567, 160, - 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, - 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, - 4581, 4582, 4583, 421, 148, 148, 151, 176, - 4562, 4499, 4500, 122, 124, 4501, 4502, 4503, - 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, - 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4499, - 4499, 4499, 4499, 148, 4916, 4917, 4918, 4919, - 4920, 4921, 4922, 4923, 4924, 4925, 4926, 4927, - 4928, 4929, 4930, 4931, 4932, 4933, 4934, 4935, - 4936, 2395, 4499, 1, 4764, 2515, 2517, 4765, - 4766, 4767, 4768, 4769, 4770, 4771, 4772, 4773, - 4774, 4775, 4776, 4777, 4778, 4779, 4780, 4781, - 4782, 4763, 4937, 4938, 4939, 4940, 4941, 4942, - 4943, 4944, 4945, 4946, 4947, 4948, 4949, 4950, - 4951, 4952, 4953, 4954, 4955, 4956, 4957, 1, - 4763, 2395, 4500, 122, 124, 4501, 4502, 4503, - 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, - 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4499, - 4500, 122, 124, 4501, 4502, 4503, 4504, 4505, - 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, - 4514, 4515, 4516, 4517, 4518, 4499, 2395, 4500, - 122, 124, 4501, 4502, 4503, 4504, 4505, 4506, - 4507, 4508, 4509, 4510, 4511, 4512, 4513, 4514, - 4515, 4516, 4517, 4518, 2395, 4499, 2395, 4500, - 122, 124, 4501, 4502, 4503, 4504, 4505, 4506, - 4507, 4508, 4509, 4510, 4511, 4512, 4513, 4514, - 4515, 4516, 4517, 4518, 2395, 4499, 2395, 4500, - 122, 124, 4501, 4502, 4503, 4504, 4505, 4506, - 4507, 4508, 4509, 4510, 4511, 4512, 4513, 4514, - 4515, 4516, 4517, 4518, 2395, 2395, 4499, 2395, - 4500, 122, 124, 4501, 4502, 4503, 4504, 4505, - 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, - 4514, 4515, 4516, 4517, 4518, 2395, 2395, 4499, - 2395, 4500, 122, 124, 4501, 4502, 4503, 4504, - 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, - 4513, 4514, 4515, 4516, 4517, 4518, 2395, 4499, - 4500, 122, 124, 4501, 4502, 4503, 4504, 4505, - 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, - 4514, 4515, 4516, 4517, 4518, 2395, 2395, 2395, - 2395, 4499, 2395, 2395, 4916, 4917, 4918, 4919, - 4920, 4921, 4922, 4923, 4924, 4925, 4926, 4927, - 4928, 4929, 4930, 4931, 4932, 4933, 4934, 4935, - 4936, 2395, 4499, 4764, 2515, 2517, 4765, 4766, - 4767, 4768, 4769, 4770, 4771, 4772, 4773, 4774, - 4775, 4776, 4777, 4778, 4779, 4780, 4781, 4782, - 4763, 1, 4764, 2515, 2517, 4765, 4766, 4767, - 4768, 4769, 4770, 4771, 4772, 4773, 4774, 4775, - 4776, 4777, 4778, 4779, 4780, 4781, 4782, 1, - 4763, 1, 4764, 2515, 2517, 4765, 4766, 4767, - 4768, 4769, 4770, 4771, 4772, 4773, 4774, 4775, - 4776, 4777, 4778, 4779, 4780, 4781, 4782, 1, - 4763, 1, 4764, 2515, 2517, 4765, 4766, 4767, - 4768, 4769, 4770, 4771, 4772, 4773, 4774, 4775, - 4776, 4777, 4778, 4779, 4780, 4781, 4782, 1, - 1, 4763, 1, 4764, 2515, 2517, 4765, 4766, - 4767, 4768, 4769, 4770, 4771, 4772, 4773, 4774, - 4775, 4776, 4777, 4778, 4779, 4780, 4781, 4782, - 1, 1, 4763, 1, 4764, 2515, 2517, 4765, - 4766, 4767, 4768, 4769, 4770, 4771, 4772, 4773, - 4774, 4775, 4776, 4777, 4778, 4779, 4780, 4781, - 4782, 1, 4763, 4764, 2515, 2517, 4765, 4766, - 4767, 4768, 4769, 4770, 4771, 4772, 4773, 4774, - 4775, 4776, 4777, 4778, 4779, 4780, 4781, 4782, - 1, 1, 1, 1, 4763, 1, 1, 4937, - 4938, 4939, 4940, 4941, 4942, 4943, 4944, 4945, - 4946, 4947, 4948, 4949, 4950, 4951, 4952, 4953, - 4954, 4955, 4956, 4957, 1, 4763, 4500, 122, - 124, 4501, 4502, 4503, 4504, 4505, 4506, 4507, - 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, - 4516, 4517, 4518, 4499, 2395, 4500, 122, 124, - 4501, 4502, 4503, 4504, 4505, 4506, 4507, 4508, - 4509, 4510, 4511, 4512, 4513, 4514, 4515, 4516, - 4517, 4518, 2395, 4499, 4500, 122, 124, 4501, - 4502, 4503, 4504, 4505, 4506, 4507, 4508, 4509, - 4510, 4511, 4512, 4513, 4514, 4515, 4516, 4517, - 4518, 2395, 4499, 2396, 2397, 2398, 2399, 2400, - 2402, 2403, 2404, 2406, 2407, 2408, 2409, 2410, - 2411, 2412, 2413, 2414, 2415, 2416, 2417, 2418, - 2419, 2420, 2421, 2422, 2423, 4500, 122, 124, - 4501, 4502, 4503, 4504, 4505, 4506, 4507, 4508, - 4509, 4510, 4511, 4512, 4513, 4514, 4515, 4516, - 4517, 4518, 2401, 2405, 4499, 2424, 2425, 2426, - 2427, 2428, 2429, 2430, 2431, 2432, 2433, 2434, - 2435, 2436, 2437, 2438, 2439, 2440, 2441, 2442, - 2443, 2444, 4500, 122, 124, 4501, 4502, 4503, - 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, - 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4499, - 2445, 2446, 2447, 2448, 2449, 2450, 4500, 122, - 124, 4501, 4502, 4503, 4504, 4505, 4506, 4507, - 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, - 4516, 4517, 4518, 4499, 2451, 2452, 4500, 122, - 124, 4501, 4502, 4503, 4504, 4505, 4506, 4507, - 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, - 4516, 4517, 4518, 4499, 2453, 2454, 2455, 2456, - 2457, 2458, 2459, 2460, 2461, 2462, 2463, 2464, - 2465, 2466, 2467, 4500, 122, 124, 4501, 4502, - 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, - 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, - 4499, 2468, 2469, 2449, 2454, 2470, 4500, 122, - 124, 4501, 4502, 4503, 4504, 4505, 4506, 4507, - 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, - 4516, 4517, 4518, 4499, 2471, 2472, 2473, 2474, - 2475, 2476, 4500, 122, 124, 4501, 4502, 4503, - 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, - 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4499, - 2512, 4500, 122, 124, 4501, 4502, 4503, 4504, - 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, - 4513, 4514, 4515, 4516, 4517, 4518, 4499, 4764, - 2515, 2517, 4765, 4766, 4767, 4768, 4769, 4770, - 4771, 4772, 4773, 4774, 4775, 4776, 4777, 4778, - 4779, 4780, 4781, 4782, 4763, 1, 4764, 2515, - 2517, 4765, 4766, 4767, 4768, 4769, 4770, 4771, - 4772, 4773, 4774, 4775, 4776, 4777, 4778, 4779, - 4780, 4781, 4782, 1, 4763, 4764, 2515, 2517, - 4765, 4766, 4767, 4768, 4769, 4770, 4771, 4772, - 4773, 4774, 4775, 4776, 4777, 4778, 4779, 4780, - 4781, 4782, 1, 4763, 3, 4, 5, 6, - 7, 9, 10, 11, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 4764, 2515, - 2517, 4765, 4766, 4767, 4768, 4769, 4770, 4771, - 4772, 4773, 4774, 4775, 4776, 4777, 4778, 4779, - 4780, 4781, 4782, 8, 12, 4763, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 4764, 2515, 2517, 4765, 4766, - 4767, 4768, 4769, 4770, 4771, 4772, 4773, 4774, - 4775, 4776, 4777, 4778, 4779, 4780, 4781, 4782, - 4763, 52, 53, 54, 55, 56, 57, 4764, - 2515, 2517, 4765, 4766, 4767, 4768, 4769, 4770, - 4771, 4772, 4773, 4774, 4775, 4776, 4777, 4778, - 4779, 4780, 4781, 4782, 4763, 58, 59, 4764, - 2515, 2517, 4765, 4766, 4767, 4768, 4769, 4770, - 4771, 4772, 4773, 4774, 4775, 4776, 4777, 4778, - 4779, 4780, 4781, 4782, 4763, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 4764, 2515, 2517, 4765, - 4766, 4767, 4768, 4769, 4770, 4771, 4772, 4773, - 4774, 4775, 4776, 4777, 4778, 4779, 4780, 4781, - 4782, 4763, 75, 76, 56, 61, 77, 4764, - 2515, 2517, 4765, 4766, 4767, 4768, 4769, 4770, - 4771, 4772, 4773, 4774, 4775, 4776, 4777, 4778, - 4779, 4780, 4781, 4782, 4763, 78, 79, 80, - 81, 82, 83, 4764, 2515, 2517, 4765, 4766, - 4767, 4768, 4769, 4770, 4771, 4772, 4773, 4774, - 4775, 4776, 4777, 4778, 4779, 4780, 4781, 4782, - 4763, 119, 4764, 2515, 2517, 4765, 4766, 4767, - 4768, 4769, 4770, 4771, 4772, 4773, 4774, 4775, - 4776, 4777, 4778, 4779, 4780, 4781, 4782, 4763, - 4499, 4499, 4500, 122, 124, 4501, 4502, 4503, - 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, - 4512, 4513, 4514, 4515, 4516, 4517, 4518, 148, - 4499, 148, 4499, 2395, 148, 148, 4783, 4784, - 4785, 4786, 4787, 4788, 4789, 4790, 4791, 4792, - 4793, 4794, 4795, 4796, 4797, 4798, 4799, 4800, - 4801, 4802, 4803, 148, 148, 148, 4499, 4499, - 4783, 4784, 4785, 4786, 4787, 4788, 4789, 4790, - 4791, 4792, 4793, 4794, 4795, 4796, 4797, 4798, - 4799, 4800, 4801, 4802, 4803, 2395, 148, 4499, - 4500, 122, 124, 4501, 4502, 4503, 4504, 4505, - 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, - 4514, 4515, 4516, 4517, 4518, 4499, 2395, 4499, - 148, 2395, 148, 4500, 122, 124, 4501, 4502, - 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, - 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, - 2395, 2395, 572, 572, 4499, 2395, 4500, 122, - 124, 4501, 4502, 4503, 4504, 4505, 4506, 4507, - 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, - 4516, 4517, 4518, 2395, 2395, 148, 4499, 126, - 2395, 4783, 4784, 4785, 4786, 4787, 4788, 4789, - 4790, 4791, 4792, 4793, 4794, 4795, 4796, 4797, - 4798, 4799, 4800, 4801, 4802, 4803, 148, 2395, - 126, 148, 4499, 4499, 4499, 4499, 4500, 122, - 124, 4501, 4502, 4503, 4504, 4505, 4506, 4507, - 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, - 4516, 4517, 4518, 2395, 2395, 126, 4499, 4499, - 148, 148, 4916, 4917, 4918, 4919, 4920, 4921, - 4922, 4923, 4924, 4925, 4926, 4927, 4928, 4929, - 4930, 4931, 4932, 4933, 4934, 4935, 4936, 2395, - 148, 2395, 4499, 4783, 4784, 4785, 4786, 4787, - 4788, 4789, 4790, 4791, 4792, 4793, 4794, 4795, - 4796, 4797, 4798, 4799, 4800, 4801, 4802, 4803, - 4499, 148, 2395, 4500, 122, 124, 4501, 4502, - 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, - 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, - 2395, 4499, 148, 148, 4500, 122, 124, 4501, - 4502, 4503, 4504, 4505, 4506, 4507, 4508, 4509, - 4510, 4511, 4512, 4513, 4514, 4515, 4516, 4517, - 4518, 126, 148, 2395, 148, 4499, 4958, 4959, - 184, 2398, 4960, 4961, 4962, 4963, 4964, 4965, - 4966, 4967, 4968, 4969, 4970, 4971, 4972, 4973, - 4974, 4975, 4976, 4977, 4978, 4979, 2416, 4980, - 2418, 4981, 4982, 4983, 4984, 2423, 4500, 122, - 124, 4501, 4502, 4503, 4504, 4505, 4506, 4507, - 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, - 4516, 4517, 4518, 4499, 2424, 4985, 4986, 217, - 3020, 3022, 218, 219, 220, 221, 4987, 223, - 224, 225, 226, 227, 228, 4988, 4989, 2430, - 4990, 4991, 234, 4992, 236, 4993, 1528, 1529, - 4994, 2436, 4995, 4996, 4997, 4998, 4999, 5000, - 1538, 5001, 151, 152, 2444, 249, 250, 251, - 252, 4500, 122, 124, 4501, 4502, 4503, 4504, - 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, - 4513, 4514, 4515, 4516, 4517, 4518, 3021, 151, - 153, 151, 4499, 181, 181, 181, 571, 5003, - 150, 152, 153, 4564, 3196, 5004, 4566, 158, - 5005, 160, 161, 5006, 5007, 5008, 5009, 5010, - 5011, 5012, 5013, 5014, 5015, 5016, 5017, 5018, - 5019, 5021, 5022, 5023, 5024, 421, 148, 148, - 151, 5020, 5002, 5025, 3085, 3180, 5026, 5027, - 5028, 5029, 5030, 5031, 5032, 5033, 5034, 5035, - 5036, 5037, 5038, 5039, 5040, 5042, 5043, 5044, - 5045, 5041, 5002, 5046, 5047, 255, 2447, 257, - 258, 259, 260, 261, 262, 263, 151, 5048, - 265, 5049, 267, 5050, 269, 5051, 5052, 3371, - 5053, 4500, 122, 124, 4501, 4502, 4503, 4504, - 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, - 4513, 4514, 4515, 4516, 4517, 4518, 3372, 4499, - 5055, 3371, 3373, 5056, 5057, 5058, 5059, 5060, - 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, - 5069, 5070, 5071, 5072, 5073, 5054, 5074, 5075, - 5076, 3685, 3049, 3021, 3050, 3686, 3051, 3052, - 3687, 3688, 3689, 3371, 5077, 5078, 5079, 5080, - 5081, 5082, 5083, 5084, 5085, 5086, 5087, 5088, - 5089, 5090, 5091, 5092, 5093, 5094, 5095, 5096, - 5097, 3372, 4499, 181, 181, 181, 571, 5098, - 150, 152, 153, 4564, 3501, 5099, 4566, 158, - 5100, 160, 161, 5101, 5102, 5103, 5104, 5105, - 5106, 5107, 5108, 5109, 5110, 5111, 5112, 5113, - 5114, 177, 5115, 5116, 5117, 421, 148, 148, - 151, 176, 4562, 5118, 3624, 3626, 5119, 5120, - 5121, 5122, 5123, 5124, 5125, 5126, 5127, 5128, - 5129, 5130, 5131, 5132, 5133, 5042, 5134, 5135, - 5136, 5041, 5002, 571, 5138, 3688, 3756, 5139, - 5140, 5141, 5142, 5143, 5144, 5145, 5146, 5147, - 5148, 5149, 5150, 5151, 5152, 5153, 5154, 5155, - 5156, 5137, 5158, 3878, 3880, 5159, 5160, 5161, - 5162, 5163, 5164, 5165, 5166, 5167, 5168, 5169, - 5170, 5171, 5172, 5173, 5174, 5175, 5176, 5157, - 5177, 4001, 4003, 5178, 5179, 5180, 5181, 5182, - 5183, 5184, 5185, 5186, 5187, 5188, 5189, 5190, - 5191, 5192, 5193, 5194, 5195, 5054, 5055, 3371, - 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, - 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, - 5071, 5072, 5073, 1, 1, 1, 1, 5054, - 5055, 3371, 3373, 5056, 5057, 5058, 5059, 5060, - 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, - 5069, 5070, 5071, 5072, 5073, 1, 5054, 5196, - 5197, 5198, 5199, 5200, 5201, 5202, 5203, 5204, - 5205, 5206, 5207, 5208, 5209, 5210, 5211, 5212, - 5213, 5214, 5215, 5216, 1, 5054, 3250, 4500, - 122, 124, 4501, 4502, 4503, 4504, 4505, 4506, - 4507, 4508, 4509, 4510, 4511, 4512, 4513, 4514, - 4515, 4516, 4517, 4518, 4499, 5217, 5218, 5219, - 5220, 5221, 5222, 5223, 5224, 5225, 5226, 5227, - 5228, 5229, 5230, 5231, 5232, 5233, 5234, 5235, - 5236, 5237, 3250, 4499, 1, 5055, 3371, 3373, - 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, - 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, - 5072, 5073, 5054, 5196, 5197, 5198, 5199, 5200, - 5201, 5202, 5203, 5204, 5205, 5206, 5207, 5208, - 5209, 5210, 5211, 5212, 5213, 5214, 5215, 5216, - 1, 5054, 4500, 122, 124, 4501, 4502, 4503, - 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, - 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4499, - 3250, 4500, 122, 124, 4501, 4502, 4503, 4504, - 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, - 4513, 4514, 4515, 4516, 4517, 4518, 3250, 4499, - 3250, 4500, 122, 124, 4501, 4502, 4503, 4504, - 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, - 4513, 4514, 4515, 4516, 4517, 4518, 3250, 4499, - 3250, 4500, 122, 124, 4501, 4502, 4503, 4504, - 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, - 4513, 4514, 4515, 4516, 4517, 4518, 3250, 3250, - 4499, 3250, 4500, 122, 124, 4501, 4502, 4503, - 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, - 4512, 4513, 4514, 4515, 4516, 4517, 4518, 3250, - 3250, 4499, 3250, 4500, 122, 124, 4501, 4502, - 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, - 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, - 3250, 4499, 4500, 122, 124, 4501, 4502, 4503, - 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, - 4512, 4513, 4514, 4515, 4516, 4517, 4518, 3250, - 3250, 3250, 3250, 4499, 3250, 3250, 5217, 5218, - 5219, 5220, 5221, 5222, 5223, 5224, 5225, 5226, - 5227, 5228, 5229, 5230, 5231, 5232, 5233, 5234, - 5235, 5236, 5237, 3250, 4499, 5055, 3371, 3373, - 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, - 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, - 5072, 5073, 5054, 1, 5055, 3371, 3373, 5056, - 5057, 5058, 5059, 5060, 5061, 5062, 5063, 5064, - 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, - 5073, 1, 5054, 1, 5055, 3371, 3373, 5056, - 5057, 5058, 5059, 5060, 5061, 5062, 5063, 5064, - 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, - 5073, 1, 5054, 1, 5055, 3371, 3373, 5056, - 5057, 5058, 5059, 5060, 5061, 5062, 5063, 5064, - 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, - 5073, 1, 1, 5054, 1, 5055, 3371, 3373, - 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, - 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, - 5072, 5073, 1, 1, 5054, 1, 5055, 3371, - 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, - 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, - 5071, 5072, 5073, 1, 5054, 5055, 3371, 3373, - 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, - 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, - 5072, 5073, 1, 1, 1, 1, 5054, 1, - 1, 5196, 5197, 5198, 5199, 5200, 5201, 5202, - 5203, 5204, 5205, 5206, 5207, 5208, 5209, 5210, - 5211, 5212, 5213, 5214, 5215, 5216, 1, 5054, - 4500, 122, 124, 4501, 4502, 4503, 4504, 4505, - 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, - 4514, 4515, 4516, 4517, 4518, 4499, 3250, 4500, - 122, 124, 4501, 4502, 4503, 4504, 4505, 4506, - 4507, 4508, 4509, 4510, 4511, 4512, 4513, 4514, - 4515, 4516, 4517, 4518, 3250, 4499, 4500, 122, - 124, 4501, 4502, 4503, 4504, 4505, 4506, 4507, - 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, - 4516, 4517, 4518, 3250, 4499, 3252, 3253, 3254, - 3255, 3256, 3258, 3259, 3260, 3262, 3263, 3264, - 3265, 3266, 3267, 3268, 3269, 3270, 3271, 3272, - 3273, 3274, 3275, 3276, 3277, 3278, 3279, 4500, - 122, 124, 4501, 4502, 4503, 4504, 4505, 4506, - 4507, 4508, 4509, 4510, 4511, 4512, 4513, 4514, - 4515, 4516, 4517, 4518, 3257, 3261, 4499, 3280, - 3281, 3282, 3283, 3284, 3285, 3286, 3287, 3288, - 3289, 3290, 3291, 3292, 3293, 3294, 3295, 3296, - 3297, 3298, 3299, 3300, 4500, 122, 124, 4501, - 4502, 4503, 4504, 4505, 4506, 4507, 4508, 4509, - 4510, 4511, 4512, 4513, 4514, 4515, 4516, 4517, - 4518, 4499, 3301, 3302, 3303, 3304, 3305, 3306, - 4500, 122, 124, 4501, 4502, 4503, 4504, 4505, - 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, - 4514, 4515, 4516, 4517, 4518, 4499, 3307, 3308, - 4500, 122, 124, 4501, 4502, 4503, 4504, 4505, - 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, - 4514, 4515, 4516, 4517, 4518, 4499, 3309, 3310, - 3311, 3312, 3313, 3314, 3315, 3316, 3317, 3318, - 3319, 3320, 3321, 3322, 3323, 4500, 122, 124, - 4501, 4502, 4503, 4504, 4505, 4506, 4507, 4508, - 4509, 4510, 4511, 4512, 4513, 4514, 4515, 4516, - 4517, 4518, 4499, 3324, 3325, 3305, 3310, 3326, - 4500, 122, 124, 4501, 4502, 4503, 4504, 4505, - 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, - 4514, 4515, 4516, 4517, 4518, 4499, 3327, 3328, - 3329, 3330, 3331, 3332, 4500, 122, 124, 4501, - 4502, 4503, 4504, 4505, 4506, 4507, 4508, 4509, - 4510, 4511, 4512, 4513, 4514, 4515, 4516, 4517, - 4518, 4499, 3368, 4500, 122, 124, 4501, 4502, - 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, - 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, - 4499, 5055, 3371, 3373, 5056, 5057, 5058, 5059, - 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, - 5068, 5069, 5070, 5071, 5072, 5073, 5054, 1, - 5055, 3371, 3373, 5056, 5057, 5058, 5059, 5060, - 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, - 5069, 5070, 5071, 5072, 5073, 1, 5054, 5055, - 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, - 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, - 5070, 5071, 5072, 5073, 1, 5054, 3, 4, - 5, 6, 7, 9, 10, 11, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, - 5055, 3371, 3373, 5056, 5057, 5058, 5059, 5060, - 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, - 5069, 5070, 5071, 5072, 5073, 8, 12, 5054, - 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 5055, 3371, 3373, - 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, - 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, - 5072, 5073, 5054, 52, 53, 54, 55, 56, - 57, 5055, 3371, 3373, 5056, 5057, 5058, 5059, - 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, - 5068, 5069, 5070, 5071, 5072, 5073, 5054, 58, - 59, 5055, 3371, 3373, 5056, 5057, 5058, 5059, - 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, - 5068, 5069, 5070, 5071, 5072, 5073, 5054, 60, - 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 5055, 3371, - 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, - 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, - 5071, 5072, 5073, 5054, 75, 76, 56, 61, - 77, 5055, 3371, 3373, 5056, 5057, 5058, 5059, - 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, - 5068, 5069, 5070, 5071, 5072, 5073, 5054, 78, - 79, 80, 81, 82, 83, 5055, 3371, 3373, - 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, - 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, - 5072, 5073, 5054, 119, 5055, 3371, 3373, 5056, - 5057, 5058, 5059, 5060, 5061, 5062, 5063, 5064, - 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, - 5073, 5054, 5054, 5196, 5197, 5198, 5199, 5200, - 5201, 5202, 5203, 5204, 5205, 5206, 5207, 5208, - 5209, 5210, 5211, 5212, 5213, 5214, 5215, 5216, - 5054, 1, 5054, 5055, 3371, 3373, 5056, 5057, - 5058, 5059, 5060, 5061, 5062, 5063, 5064, 5065, - 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5073, - 5054, 5054, 1, 1, 5196, 5197, 5198, 5199, - 5200, 5201, 5202, 5203, 5204, 5205, 5206, 5207, - 5208, 5209, 5210, 5211, 5212, 5213, 5214, 5215, - 5216, 1, 1, 5054, 5055, 3371, 3373, 5056, - 5057, 5058, 5059, 5060, 5061, 5062, 5063, 5064, - 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, - 5073, 5054, 5054, 5054, 5054, 5054, 1, 5055, - 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, - 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, - 5070, 5071, 5072, 5073, 5054, 5054, 5054, 5054, - 5054, 5054, 1, 5054, 5054, 5055, 3371, 3373, - 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, - 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, - 5072, 5073, 5054, 5054, 1, 1, 5055, 3371, - 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, - 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, - 5071, 5072, 5073, 1, 1, 5054, 5055, 3371, - 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, - 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, - 5071, 5072, 5073, 1, 1, 1, 1, 1, - 5054, 1, 5055, 3371, 3373, 5056, 5057, 5058, - 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, - 5067, 5068, 5069, 5070, 5071, 5072, 5073, 1, - 5054, 1, 5055, 3371, 3373, 5056, 5057, 5058, - 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, - 5067, 5068, 5069, 5070, 5071, 5072, 5073, 1, - 1, 1, 5054, 5196, 5197, 5198, 5199, 5200, - 5201, 5202, 5203, 5204, 5205, 5206, 5207, 5208, - 5209, 5210, 5211, 5212, 5213, 5214, 5215, 5216, - 1, 1, 5054, 5054, 5054, 5055, 3371, 3373, - 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, - 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, - 5072, 5073, 5054, 5054, 5054, 1, 5055, 3371, - 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, - 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, - 5071, 5072, 5073, 1, 1, 1, 1, 1, - 5054, 5196, 5197, 5198, 5199, 5200, 5201, 5202, - 5203, 5204, 5205, 5206, 5207, 5208, 5209, 5210, - 5211, 5212, 5213, 5214, 5215, 5216, 1, 1, - 5054, 5054, 5054, 5055, 3371, 3373, 5056, 5057, - 5058, 5059, 5060, 5061, 5062, 5063, 5064, 5065, - 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5073, - 5054, 5054, 5054, 1, 5055, 3371, 3373, 5056, - 5057, 5058, 5059, 5060, 5061, 5062, 5063, 5064, - 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, - 5073, 1, 5054, 1, 1, 5055, 3371, 3373, - 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, - 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, - 5072, 5073, 1, 1, 1, 5054, 1, 5055, - 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, - 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, - 5070, 5071, 5072, 5073, 1, 5054, 5055, 3371, - 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, - 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, - 5071, 5072, 5073, 1, 5054, 1, 5055, 3371, - 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, - 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, - 5071, 5072, 5073, 1, 1, 5054, 5055, 3371, - 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, - 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, - 5071, 5072, 5073, 1, 5054, 1, 1, 1, - 5055, 3371, 3373, 5056, 5057, 5058, 5059, 5060, - 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, - 5069, 5070, 5071, 5072, 5073, 1, 1, 5054, - 5055, 3371, 3373, 5056, 5057, 5058, 5059, 5060, - 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, - 5069, 5070, 5071, 5072, 5073, 1, 5054, 5055, - 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, - 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, - 5070, 5071, 5072, 5073, 1, 1, 1, 1, - 5054, 1, 5055, 3371, 3373, 5056, 5057, 5058, - 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, - 5067, 5068, 5069, 5070, 5071, 5072, 5073, 5054, - 5055, 3371, 3373, 5056, 5057, 5058, 5059, 5060, - 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, - 5069, 5070, 5071, 5072, 5073, 1, 5054, 5055, - 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, - 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, - 5070, 5071, 5072, 5073, 1, 1, 1, 1, - 1, 5054, 1, 5055, 3371, 3373, 5056, 5057, - 5058, 5059, 5060, 5061, 5062, 5063, 5064, 5065, - 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5073, - 1, 1, 5054, 5055, 3371, 3373, 5056, 5057, - 5058, 5059, 5060, 5061, 5062, 5063, 5064, 5065, - 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5073, - 1, 5054, 5055, 3371, 3373, 5056, 5057, 5058, - 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, - 5067, 5068, 5069, 5070, 5071, 5072, 5073, 1, - 1, 5054, 5055, 3371, 3373, 5056, 5057, 5058, - 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, - 5067, 5068, 5069, 5070, 5071, 5072, 5073, 1, - 1, 5054, 5196, 5197, 5198, 5199, 5200, 5201, - 5202, 5203, 5204, 5205, 5206, 5207, 5208, 5209, - 5210, 5211, 5212, 5213, 5214, 5215, 5216, 1, - 5054, 5055, 3371, 3373, 5056, 5057, 5058, 5059, - 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, - 5068, 5069, 5070, 5071, 5072, 5073, 5054, 5054, - 1, 5055, 3371, 3373, 5056, 5057, 5058, 5059, - 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, - 5068, 5069, 5070, 5071, 5072, 5073, 1, 5054, - 1, 5055, 3371, 3373, 5056, 5057, 5058, 5059, - 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, - 5068, 5069, 5070, 5071, 5072, 5073, 5054, 5055, - 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, - 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, - 5070, 5071, 5072, 5073, 1, 1, 5054, 5055, - 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, - 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, - 5070, 5071, 5072, 5073, 1, 5054, 1, 5055, - 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, - 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, - 5070, 5071, 5072, 5073, 1, 1, 5054, 5055, - 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, - 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, - 5070, 5071, 5072, 5073, 1, 5054, 5196, 5197, - 5198, 5199, 5200, 5201, 5202, 5203, 5204, 5205, - 5206, 5207, 5208, 5209, 5210, 5211, 5212, 5213, - 5214, 5215, 5216, 1, 1, 5054, 5055, 3371, - 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, - 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, - 5071, 5072, 5073, 5054, 5054, 1, 5055, 3371, - 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, - 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, - 5071, 5072, 5073, 1, 1, 5054, 5055, 3371, - 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, - 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, - 5071, 5072, 5073, 1, 5054, 5055, 3371, 3373, - 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, - 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, - 5072, 5073, 1, 5054, 1, 5055, 3371, 3373, - 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, - 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, - 5072, 5073, 1, 1, 1, 1, 5054, 5055, - 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, - 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, - 5070, 5071, 5072, 5073, 1, 1, 5054, 5055, - 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, - 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, - 5070, 5071, 5072, 5073, 1, 1, 5054, 5055, - 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, - 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, - 5070, 5071, 5072, 5073, 1, 1, 5054, 5055, - 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, - 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, - 5070, 5071, 5072, 5073, 1, 5054, 5055, 3371, - 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, - 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, - 5071, 5072, 5073, 1, 5054, 1, 5055, 3371, - 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, - 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, - 5071, 5072, 5073, 5054, 5055, 3371, 3373, 5056, - 5057, 5058, 5059, 5060, 5061, 5062, 5063, 5064, - 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, - 5073, 1, 5054, 5055, 3371, 3373, 5056, 5057, - 5058, 5059, 5060, 5061, 5062, 5063, 5064, 5065, - 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5073, - 1, 5054, 5055, 3371, 3373, 5056, 5057, 5058, - 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, - 5067, 5068, 5069, 5070, 5071, 5072, 5073, 1, - 5054, 5055, 3371, 3373, 5056, 5057, 5058, 5059, - 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, - 5068, 5069, 5070, 5071, 5072, 5073, 1, 1, - 5054, 5055, 3371, 3373, 5056, 5057, 5058, 5059, - 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, - 5068, 5069, 5070, 5071, 5072, 5073, 1, 5054, - 5055, 3371, 3373, 5056, 5057, 5058, 5059, 5060, - 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, - 5069, 5070, 5071, 5072, 5073, 1, 5054, 1, - 1, 1, 5055, 3371, 3373, 5056, 5057, 5058, - 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, - 5067, 5068, 5069, 5070, 5071, 5072, 5073, 1, - 5054, 5196, 5197, 5198, 5199, 5200, 5201, 5202, - 5203, 5204, 5205, 5206, 5207, 5208, 5209, 5210, - 5211, 5212, 5213, 5214, 5215, 5216, 1, 1, - 5054, 5055, 3371, 3373, 5056, 5057, 5058, 5059, - 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, - 5068, 5069, 5070, 5071, 5072, 5073, 5054, 5054, - 1, 5055, 3371, 3373, 5056, 5057, 5058, 5059, - 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, - 5068, 5069, 5070, 5071, 5072, 5073, 1, 5054, - 5055, 3371, 3373, 5056, 5057, 5058, 5059, 5060, - 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, - 5069, 5070, 5071, 5072, 5073, 1, 5054, 5196, - 5197, 5198, 5199, 5200, 5201, 5202, 5203, 5204, - 5205, 5206, 5207, 5208, 5209, 5210, 5211, 5212, - 5213, 5214, 5215, 5216, 1, 1, 5054, 5055, - 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, - 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, - 5070, 5071, 5072, 5073, 5054, 5054, 1, 5055, - 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, - 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, - 5070, 5071, 5072, 5073, 1, 5054, 1, 5055, - 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, - 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, - 5070, 5071, 5072, 5073, 1, 1, 5054, 1, - 5055, 3371, 3373, 5056, 5057, 5058, 5059, 5060, - 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, - 5069, 5070, 5071, 5072, 5073, 1, 1, 1, - 5054, 1, 5055, 3371, 3373, 5056, 5057, 5058, - 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, - 5067, 5068, 5069, 5070, 5071, 5072, 5073, 1, - 1, 5054, 5055, 3371, 3373, 5056, 5057, 5058, - 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, - 5067, 5068, 5069, 5070, 5071, 5072, 5073, 1, - 1, 5054, 1, 5055, 3371, 3373, 5056, 5057, - 5058, 5059, 5060, 5061, 5062, 5063, 5064, 5065, - 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5073, - 5054, 5055, 3371, 3373, 5056, 5057, 5058, 5059, - 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, - 5068, 5069, 5070, 5071, 5072, 5073, 1, 1, - 5054, 5055, 3371, 3373, 5056, 5057, 5058, 5059, - 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, - 5068, 5069, 5070, 5071, 5072, 5073, 1, 5054, - 84, 85, 86, 87, 88, 5055, 3371, 3373, - 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, - 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, - 5072, 5073, 5054, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 100, 104, 105, 106, 5055, 3371, - 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, - 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, - 5071, 5072, 5073, 5054, 107, 108, 109, 110, - 5055, 3371, 3373, 5056, 5057, 5058, 5059, 5060, - 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, - 5069, 5070, 5071, 5072, 5073, 5054, 111, 5055, - 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, - 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, - 5070, 5071, 5072, 5073, 5054, 112, 113, 114, - 115, 116, 117, 5055, 3371, 3373, 5056, 5057, - 5058, 5059, 5060, 5061, 5062, 5063, 5064, 5065, - 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5073, - 5054, 118, 5055, 3371, 3373, 5056, 5057, 5058, - 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, - 5067, 5068, 5069, 5070, 5071, 5072, 5073, 5054, - 120, 121, 122, 124, 5055, 3371, 3373, 5056, - 5057, 5058, 5059, 5060, 5061, 5062, 5063, 5064, - 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, - 5073, 123, 5054, 5238, 4499, 3371, 5077, 5078, - 5079, 5080, 5081, 5082, 5083, 5084, 5085, 5086, - 5087, 5088, 5089, 5090, 5091, 5092, 5093, 5094, - 5095, 5096, 5097, 3372, 5077, 5078, 5079, 5080, - 5081, 5082, 5083, 5084, 5085, 5086, 5087, 5088, - 5089, 5090, 5091, 5092, 5093, 5094, 5095, 5096, - 5097, 3372, 5053, 4500, 122, 124, 4501, 4502, - 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, - 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, - 4499, 3372, 153, 274, 275, 153, 1549, 5239, - 5240, 5241, 280, 281, 282, 5242, 284, 5243, - 5244, 5245, 5246, 5247, 5248, 5249, 5250, 2465, - 5251, 295, 296, 152, 5252, 3196, 5253, 5254, - 5255, 5256, 5257, 5258, 5259, 5260, 5261, 5262, - 5263, 5264, 5265, 5266, 5267, 5268, 5269, 5270, - 5271, 5272, 5273, 151, 3021, 4499, 181, 181, - 181, 571, 5274, 150, 152, 153, 4564, 4211, - 5275, 4566, 158, 5276, 160, 161, 5277, 5278, - 5279, 5280, 5281, 5282, 5283, 5284, 5285, 5286, - 5287, 5288, 5289, 5290, 5021, 5291, 5292, 5293, - 421, 148, 148, 151, 5020, 5002, 181, 181, - 181, 571, 5003, 150, 152, 153, 4564, 3196, - 5004, 4566, 158, 5005, 160, 161, 5006, 5007, - 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, - 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, - 421, 148, 148, 1, 1, 1, 1, 151, - 5020, 5002, 181, 181, 181, 571, 5003, 150, - 152, 153, 4564, 3196, 5004, 4566, 158, 5005, - 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, - 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, - 5021, 5022, 5023, 5024, 421, 148, 148, 1, - 151, 5020, 5002, 181, 181, 181, 571, 5294, - 4805, 4807, 4808, 4809, 5295, 5296, 4811, 4812, - 5297, 4814, 4815, 5298, 5299, 5300, 5301, 5302, - 5303, 5304, 5305, 5306, 5307, 5308, 5309, 5310, - 5311, 5313, 5314, 5315, 5316, 421, 148, 148, - 1, 4806, 1, 5312, 1, 5002, 148, 2984, - 148, 181, 148, 4500, 122, 124, 4501, 4502, - 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, - 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, - 4499, 5317, 5318, 5319, 5320, 5321, 5322, 5323, - 5324, 5325, 5326, 5327, 5328, 5329, 5330, 5331, - 5332, 5333, 5334, 5335, 5336, 5337, 2984, 4499, - 181, 181, 181, 571, 1, 5003, 150, 152, - 153, 4564, 3196, 5004, 4566, 158, 5005, 160, - 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, - 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, - 5022, 5023, 5024, 421, 148, 148, 151, 5020, - 5002, 181, 181, 181, 571, 5294, 4805, 4807, - 4808, 4809, 5295, 5296, 4811, 4812, 5297, 4814, - 4815, 5298, 5299, 5300, 5301, 5302, 5303, 5304, - 5305, 5306, 5307, 5308, 5309, 5310, 5311, 5313, - 5314, 5315, 5316, 5002, 421, 5002, 148, 5002, - 148, 5002, 4806, 5312, 1, 4499, 4499, 4500, - 122, 124, 4501, 4502, 4503, 4504, 4505, 4506, - 4507, 4508, 4509, 4510, 4511, 4512, 4513, 4514, - 4515, 4516, 4517, 4518, 148, 4499, 148, 4499, - 2984, 4499, 4783, 4784, 4785, 4786, 4787, 4788, - 4789, 4790, 4791, 4792, 4793, 4794, 4795, 4796, - 4797, 4798, 4799, 4800, 4801, 4802, 4803, 2984, - 148, 4499, 4500, 122, 124, 4501, 4502, 4503, - 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, - 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4499, - 2984, 4499, 148, 2984, 148, 181, 4500, 122, - 124, 4501, 4502, 4503, 4504, 4505, 4506, 4507, - 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, - 4516, 4517, 4518, 2984, 2984, 572, 572, 4499, - 2984, 4500, 122, 124, 4501, 4502, 4503, 4504, - 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, - 4513, 4514, 4515, 4516, 4517, 4518, 2984, 2984, - 148, 4499, 421, 2984, 4783, 4784, 4785, 4786, - 4787, 4788, 4789, 4790, 4791, 4792, 4793, 4794, - 4795, 4796, 4797, 4798, 4799, 4800, 4801, 4802, - 4803, 148, 2984, 421, 148, 4499, 4499, 4499, - 4499, 4500, 122, 124, 4501, 4502, 4503, 4504, - 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, - 4513, 4514, 4515, 4516, 4517, 4518, 2984, 2984, - 421, 4499, 4499, 148, 148, 5317, 5318, 5319, - 5320, 5321, 5322, 5323, 5324, 5325, 5326, 5327, - 5328, 5329, 5330, 5331, 5332, 5333, 5334, 5335, - 5336, 5337, 2984, 148, 2984, 4499, 2518, 2518, - 2518, 2774, 5003, 150, 152, 153, 4564, 3196, - 5004, 4566, 158, 5005, 160, 161, 5006, 5007, - 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, - 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, - 2646, 2008, 2008, 5002, 151, 5002, 5020, 5002, - 1, 181, 181, 181, 571, 5003, 150, 152, - 153, 4564, 3196, 5004, 4566, 158, 5005, 160, - 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, - 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, - 5022, 5023, 5024, 421, 148, 148, 1, 151, - 5020, 5002, 181, 181, 181, 571, 1, 5003, - 150, 152, 153, 4564, 3196, 5004, 4566, 158, - 5005, 160, 161, 5006, 5007, 5008, 5009, 5010, - 5011, 5012, 5013, 5014, 5015, 5016, 5017, 5018, - 5019, 5021, 5022, 5023, 5024, 421, 148, 148, - 1, 151, 5020, 5002, 181, 181, 181, 571, - 1, 5003, 150, 152, 153, 4564, 3196, 5004, - 4566, 158, 5005, 160, 161, 5006, 5007, 5008, - 5009, 5010, 5011, 5012, 5013, 5014, 5015, 5016, - 5017, 5018, 5019, 5021, 5022, 5023, 5024, 421, - 148, 148, 1, 1, 151, 5020, 5002, 181, - 181, 181, 571, 1, 5003, 150, 152, 153, - 4564, 3196, 5004, 4566, 158, 5005, 160, 161, - 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, - 5014, 5015, 5016, 5017, 5018, 5019, 5021, 5022, - 5023, 5024, 421, 148, 148, 1, 1, 151, - 5020, 5002, 181, 181, 181, 571, 1, 5003, - 150, 152, 153, 4564, 3196, 5004, 4566, 158, - 5005, 160, 161, 5006, 5007, 5008, 5009, 5010, - 5011, 5012, 5013, 5014, 5015, 5016, 5017, 5018, - 5019, 5021, 5022, 5023, 5024, 421, 148, 148, - 1, 151, 5020, 5002, 181, 181, 181, 571, - 5003, 150, 152, 153, 4564, 3196, 5004, 4566, - 158, 5005, 160, 161, 5006, 5007, 5008, 5009, - 5010, 5011, 5012, 5013, 5014, 5015, 5016, 5017, - 5018, 5019, 5021, 5022, 5023, 5024, 421, 148, - 148, 1, 1, 1, 1, 151, 5020, 5002, - 181, 181, 181, 571, 1, 1, 5294, 4805, - 4807, 4808, 4809, 5295, 5296, 4811, 4812, 5297, - 4814, 4815, 5298, 5299, 5300, 5301, 5302, 5303, - 5304, 5305, 5306, 5307, 5308, 5309, 5310, 5311, - 5313, 5314, 5315, 5316, 421, 148, 148, 1, - 4806, 1, 5312, 1, 5002, 4783, 4784, 4785, - 4786, 4787, 4788, 4789, 4790, 4791, 4792, 4793, - 4794, 4795, 4796, 4797, 4798, 4799, 4800, 4801, - 4802, 4803, 4499, 148, 2984, 4500, 122, 124, - 4501, 4502, 4503, 4504, 4505, 4506, 4507, 4508, - 4509, 4510, 4511, 4512, 4513, 4514, 4515, 4516, - 4517, 4518, 2984, 4499, 148, 148, 4500, 122, - 124, 4501, 4502, 4503, 4504, 4505, 4506, 4507, - 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, - 4516, 4517, 4518, 421, 148, 2984, 148, 4499, - 2986, 2987, 184, 2988, 2989, 2990, 2991, 2992, - 2993, 2994, 2995, 2996, 2997, 2998, 2999, 3000, - 3001, 3002, 3003, 3004, 3005, 3006, 3007, 3008, - 3009, 3010, 3011, 3012, 3013, 3014, 3015, 3016, - 4500, 122, 124, 4501, 4502, 4503, 4504, 4505, - 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, - 4514, 4515, 4516, 4517, 4518, 4499, 3017, 3018, - 3019, 217, 3020, 3022, 218, 219, 220, 221, - 3023, 223, 224, 225, 226, 227, 228, 3024, - 3025, 3026, 3027, 3028, 234, 3029, 236, 3030, - 483, 484, 3031, 3032, 3033, 3034, 3035, 3036, - 3037, 3038, 646, 3039, 151, 152, 3040, 249, - 250, 251, 252, 4500, 122, 124, 4501, 4502, - 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, - 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, - 3021, 151, 153, 151, 4499, 3041, 3042, 255, - 3043, 257, 258, 259, 260, 261, 262, 263, - 151, 3044, 265, 3045, 267, 3046, 269, 4500, - 122, 124, 4501, 4502, 4503, 4504, 4505, 4506, - 4507, 4508, 4509, 4510, 4511, 4512, 4513, 4514, - 4515, 4516, 4517, 4518, 4499, 3047, 3048, 3049, - 3021, 3050, 3051, 3052, 4500, 122, 124, 4501, - 4502, 4503, 4504, 4505, 4506, 4507, 4508, 4509, - 4510, 4511, 4512, 4513, 4514, 4515, 4516, 4517, - 4518, 4499, 153, 274, 275, 153, 657, 3181, - 3182, 3183, 280, 281, 282, 3184, 284, 3185, - 3186, 3187, 3188, 3189, 3190, 3191, 3192, 3193, - 3194, 295, 296, 152, 3195, 3196, 5253, 5254, - 5255, 5256, 5257, 5258, 5259, 5260, 5261, 5262, - 5263, 5264, 5265, 5266, 5267, 5268, 5269, 5270, - 5271, 5272, 5273, 151, 3021, 4499, 181, 181, - 181, 571, 5003, 150, 152, 153, 4564, 3196, - 5004, 4566, 158, 5005, 160, 161, 5006, 5007, - 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, - 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, - 421, 148, 148, 1, 151, 5020, 5002, 181, - 181, 181, 571, 5003, 150, 152, 153, 4564, - 3196, 5004, 4566, 158, 5005, 160, 161, 5006, - 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, - 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, - 5024, 421, 148, 148, 1, 1, 1, 1, - 1, 151, 5020, 5002, 181, 181, 181, 571, - 1, 5003, 150, 152, 153, 4564, 3196, 5004, - 4566, 158, 5005, 160, 161, 5006, 5007, 5008, - 5009, 5010, 5011, 5012, 5013, 5014, 5015, 5016, - 5017, 5018, 5019, 5021, 5022, 5023, 5024, 421, - 148, 148, 1, 1, 151, 5020, 5002, 181, - 181, 181, 571, 5003, 150, 152, 153, 4564, - 3196, 5004, 4566, 158, 5005, 160, 161, 5006, - 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, - 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, - 5024, 421, 148, 148, 1, 151, 5020, 5002, - 181, 181, 181, 571, 5003, 150, 152, 153, - 4564, 3196, 5004, 4566, 158, 5005, 160, 161, - 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, - 5014, 5015, 5016, 5017, 5018, 5019, 5021, 5022, - 5023, 5024, 421, 148, 148, 1, 1, 151, - 5020, 5002, 181, 181, 181, 571, 5003, 150, - 152, 153, 4564, 3196, 5004, 4566, 158, 5005, - 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, - 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, - 5021, 5022, 5023, 5024, 421, 148, 148, 1, - 1, 151, 5020, 5002, 181, 181, 181, 571, - 5294, 4805, 4807, 4808, 4809, 5295, 5296, 4811, - 4812, 5297, 4814, 4815, 5298, 5299, 5300, 5301, - 5302, 5303, 5304, 5305, 5306, 5307, 5308, 5309, - 5310, 5311, 5313, 5314, 5315, 5316, 421, 148, - 148, 1, 4806, 1, 5312, 1, 5002, 5253, - 5254, 5255, 5256, 5257, 5258, 5259, 5260, 5261, - 5262, 5263, 5264, 5265, 5266, 5267, 5268, 5269, - 5270, 5271, 5272, 5273, 3021, 181, 181, 181, - 571, 5003, 150, 152, 153, 4564, 3196, 5004, - 4566, 158, 5005, 160, 161, 5006, 5007, 5008, - 5009, 5010, 5011, 5012, 5013, 5014, 5015, 5016, - 5017, 5018, 5019, 5021, 5022, 5023, 5024, 421, - 148, 148, 1, 1, 151, 5020, 5002, 181, - 181, 181, 571, 5003, 150, 152, 153, 4564, - 3196, 5004, 4566, 158, 5005, 160, 161, 5006, - 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, - 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, - 5024, 421, 148, 148, 1, 1, 151, 5020, - 5002, 181, 181, 181, 571, 5003, 150, 152, - 153, 4564, 3196, 5004, 4566, 158, 5005, 160, - 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, - 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, - 5022, 5023, 5024, 421, 148, 148, 1, 151, - 5020, 5002, 181, 181, 181, 571, 5003, 150, - 152, 153, 4564, 3196, 5004, 4566, 158, 5005, - 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, - 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, - 5021, 5022, 5023, 5024, 421, 148, 148, 1, - 151, 5020, 5002, 181, 181, 181, 571, 1, - 5003, 150, 152, 153, 4564, 3196, 5004, 4566, - 158, 5005, 160, 161, 5006, 5007, 5008, 5009, - 5010, 5011, 5012, 5013, 5014, 5015, 5016, 5017, - 5018, 5019, 5021, 5022, 5023, 5024, 421, 148, - 148, 151, 5020, 5002, 181, 181, 181, 571, - 5003, 150, 152, 153, 4564, 3196, 5004, 4566, - 158, 5005, 160, 161, 5006, 5007, 5008, 5009, - 5010, 5011, 5012, 5013, 5014, 5015, 5016, 5017, - 5018, 5019, 5021, 5022, 5023, 5024, 421, 148, - 148, 1, 151, 5020, 5002, 181, 181, 181, - 571, 5003, 150, 152, 153, 4564, 3196, 5004, - 4566, 158, 5005, 160, 161, 5006, 5007, 5008, - 5009, 5010, 5011, 5012, 5013, 5014, 5015, 5016, - 5017, 5018, 5019, 5021, 5022, 5023, 5024, 421, - 148, 148, 1, 151, 5020, 5002, 181, 181, - 181, 571, 5003, 150, 152, 153, 4564, 3196, - 5004, 4566, 158, 5005, 160, 161, 5006, 5007, - 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, - 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, - 421, 148, 148, 1, 151, 5020, 5002, 181, - 181, 181, 571, 5003, 150, 152, 153, 4564, - 3196, 5004, 4566, 158, 5005, 160, 161, 5006, - 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, - 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, - 5024, 421, 148, 148, 1, 1, 151, 5020, - 5002, 181, 181, 181, 571, 5003, 150, 152, - 153, 4564, 3196, 5004, 4566, 158, 5005, 160, - 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, - 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, - 5022, 5023, 5024, 421, 148, 148, 1, 151, - 5020, 5002, 181, 181, 181, 571, 5003, 150, - 152, 153, 4564, 3196, 5004, 4566, 158, 5005, - 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, - 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, - 5021, 5022, 5023, 5024, 421, 148, 148, 1, - 151, 5020, 5002, 181, 181, 181, 571, 1, - 1, 1, 5003, 150, 152, 153, 4564, 3196, - 5004, 4566, 158, 5005, 160, 161, 5006, 5007, - 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, - 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, - 421, 148, 148, 1, 151, 5020, 5002, 181, - 181, 181, 571, 5294, 4805, 4807, 4808, 4809, - 5295, 5296, 4811, 4812, 5297, 4814, 4815, 5298, - 5299, 5300, 5301, 5302, 5303, 5304, 5305, 5306, - 5307, 5308, 5309, 5310, 5311, 5313, 5314, 5315, - 5316, 421, 148, 148, 1, 1, 4806, 1, - 5312, 1, 5002, 3197, 3198, 4500, 122, 124, - 4501, 4502, 4503, 4504, 4505, 4506, 4507, 4508, - 4509, 4510, 4511, 4512, 4513, 4514, 4515, 4516, - 4517, 4518, 4499, 3021, 3199, 674, 302, 303, - 304, 305, 306, 307, 3200, 932, 3201, 934, - 312, 3202, 3203, 4500, 122, 124, 4501, 4502, - 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, - 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, - 151, 4499, 3204, 3205, 317, 318, 319, 3206, - 3207, 3208, 3209, 324, 4500, 122, 124, 4501, - 4502, 4503, 4504, 4505, 4506, 4507, 4508, 4509, - 4510, 4511, 4512, 4513, 4514, 4515, 4516, 4517, - 4518, 4499, 3245, 4500, 122, 124, 4501, 4502, - 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, - 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, - 4499, 2518, 2518, 2518, 2774, 5003, 150, 152, - 153, 4564, 3196, 5004, 4566, 158, 5005, 160, - 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, - 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, - 5022, 5023, 5024, 2646, 2008, 2008, 5002, 5002, - 151, 5002, 5020, 5002, 1, 181, 181, 181, - 571, 5003, 150, 152, 153, 4564, 3196, 5004, - 4566, 158, 5005, 160, 161, 5006, 5007, 5008, - 5009, 5010, 5011, 5012, 5013, 5014, 5015, 5016, - 5017, 5018, 5019, 5021, 5022, 5023, 5024, 421, - 148, 148, 1, 151, 5020, 5002, 181, 181, - 181, 571, 5003, 150, 152, 153, 4564, 3196, - 5004, 4566, 158, 5005, 160, 161, 5006, 5007, - 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, - 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, - 421, 148, 148, 1, 151, 5020, 5002, 181, - 181, 181, 571, 5294, 4805, 4807, 4808, 4809, - 5295, 5296, 4811, 4812, 5297, 4814, 4815, 5298, - 5299, 5300, 5301, 5302, 5303, 5304, 5305, 5306, - 5307, 5308, 5309, 5310, 5311, 5313, 5314, 5315, - 5316, 421, 148, 148, 1, 1, 4806, 1, - 5312, 1, 5002, 2518, 2518, 2518, 2774, 1, - 5003, 150, 152, 153, 4564, 3196, 5004, 4566, - 158, 5005, 160, 161, 5006, 5007, 5008, 5009, - 5010, 5011, 5012, 5013, 5014, 5015, 5016, 5017, - 5018, 5019, 5021, 5022, 5023, 5024, 1, 2646, - 1, 2008, 1, 2008, 1, 151, 5020, 5002, - 181, 181, 181, 571, 5003, 150, 152, 153, - 4564, 3196, 5004, 4566, 158, 5005, 160, 161, - 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, - 5014, 5015, 5016, 5017, 5018, 5019, 5021, 5022, - 5023, 5024, 421, 148, 148, 1, 151, 5020, - 5002, 181, 181, 181, 571, 1, 5003, 150, - 152, 153, 4564, 3196, 5004, 4566, 158, 5005, - 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, - 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, - 5021, 5022, 5023, 5024, 421, 148, 148, 1, - 1, 151, 5020, 5002, 181, 181, 181, 571, - 1, 5003, 150, 152, 153, 4564, 3196, 5004, - 4566, 158, 5005, 160, 161, 5006, 5007, 5008, - 5009, 5010, 5011, 5012, 5013, 5014, 5015, 5016, - 5017, 5018, 5019, 5021, 5022, 5023, 5024, 421, - 148, 148, 1, 1, 1, 151, 5020, 5002, - 181, 181, 181, 571, 1, 5003, 150, 152, - 153, 4564, 3196, 5004, 4566, 158, 5005, 160, - 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, - 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, - 5022, 5023, 5024, 421, 148, 148, 1, 1, - 151, 5020, 5002, 181, 181, 181, 571, 5003, - 150, 152, 153, 4564, 3196, 5004, 4566, 158, - 5005, 160, 161, 5006, 5007, 5008, 5009, 5010, - 5011, 5012, 5013, 5014, 5015, 5016, 5017, 5018, - 5019, 5021, 5022, 5023, 5024, 421, 148, 148, - 1, 1, 151, 5020, 5002, 181, 181, 181, - 571, 1, 5003, 150, 152, 153, 4564, 3196, - 5004, 4566, 158, 5005, 160, 161, 5006, 5007, - 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, - 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, - 421, 148, 148, 151, 5020, 5002, 181, 181, - 181, 571, 5003, 150, 152, 153, 4564, 3196, - 5004, 4566, 158, 5005, 160, 161, 5006, 5007, - 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, - 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, - 421, 148, 148, 1, 1, 151, 5020, 5002, - 181, 181, 181, 571, 5003, 150, 152, 153, - 4564, 3196, 5004, 4566, 158, 5005, 160, 161, - 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, - 5014, 5015, 5016, 5017, 5018, 5019, 5021, 5022, - 5023, 5024, 421, 148, 148, 1, 151, 5020, - 5002, 181, 181, 181, 571, 84, 85, 86, - 87, 88, 5003, 150, 152, 153, 4564, 3196, - 5004, 4566, 158, 5005, 160, 161, 5006, 5007, - 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, - 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, - 421, 148, 148, 151, 5020, 5002, 181, 181, - 181, 571, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, - 103, 100, 104, 105, 106, 5003, 150, 152, - 153, 4564, 3196, 5004, 4566, 158, 5005, 160, - 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, - 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, - 5022, 5023, 5024, 421, 148, 148, 151, 5020, - 5002, 181, 181, 181, 571, 107, 108, 109, - 110, 5003, 150, 152, 153, 4564, 3196, 5004, - 4566, 158, 5005, 160, 161, 5006, 5007, 5008, - 5009, 5010, 5011, 5012, 5013, 5014, 5015, 5016, - 5017, 5018, 5019, 5021, 5022, 5023, 5024, 421, - 148, 148, 151, 5020, 5002, 181, 181, 181, - 571, 111, 5003, 150, 152, 153, 4564, 3196, - 5004, 4566, 158, 5005, 160, 161, 5006, 5007, - 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, - 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, - 421, 148, 148, 151, 5020, 5002, 181, 181, - 181, 571, 112, 113, 114, 115, 116, 117, - 5003, 150, 152, 153, 4564, 3196, 5004, 4566, - 158, 5005, 160, 161, 5006, 5007, 5008, 5009, - 5010, 5011, 5012, 5013, 5014, 5015, 5016, 5017, - 5018, 5019, 5021, 5022, 5023, 5024, 421, 148, - 148, 151, 5020, 5002, 181, 181, 181, 571, - 118, 5003, 150, 152, 153, 4564, 3196, 5004, - 4566, 158, 5005, 160, 161, 5006, 5007, 5008, - 5009, 5010, 5011, 5012, 5013, 5014, 5015, 5016, - 5017, 5018, 5019, 5021, 5022, 5023, 5024, 421, - 148, 148, 151, 5020, 5002, 181, 181, 181, - 571, 120, 121, 122, 124, 5003, 150, 152, - 153, 4564, 3196, 5004, 4566, 158, 5005, 160, - 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, - 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, - 5022, 5023, 5024, 421, 148, 148, 123, 151, - 5020, 5002, 2518, 2518, 2518, 2774, 5003, 150, - 152, 153, 4564, 3196, 5004, 4566, 158, 5005, - 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, - 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, - 5021, 5022, 5023, 5024, 2646, 2008, 2008, 5002, - 5002, 151, 5002, 5020, 5002, 1, 181, 181, - 181, 571, 5003, 150, 152, 153, 4564, 3196, - 5004, 4566, 158, 5005, 160, 161, 5006, 5007, - 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, - 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, - 421, 148, 148, 1, 151, 5020, 5002, 181, - 181, 181, 571, 1, 5003, 150, 152, 153, - 4564, 3196, 5004, 4566, 158, 5005, 160, 161, - 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, - 5014, 5015, 5016, 5017, 5018, 5019, 5021, 5022, - 5023, 5024, 421, 148, 148, 151, 5020, 5002, - 181, 181, 181, 571, 5003, 150, 152, 153, - 4564, 3196, 5004, 4566, 158, 5005, 160, 161, - 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, - 5014, 5015, 5016, 5017, 5018, 5019, 5021, 5022, - 5023, 5024, 421, 148, 148, 1, 1, 151, - 5020, 5002, 181, 181, 181, 571, 5003, 150, - 152, 153, 4564, 3196, 5004, 4566, 158, 5005, - 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, - 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, - 5021, 5022, 5023, 5024, 421, 148, 148, 1, - 151, 5020, 5002, 181, 181, 181, 571, 1, - 5003, 150, 152, 153, 4564, 3196, 5004, 4566, - 158, 5005, 160, 161, 5006, 5007, 5008, 5009, - 5010, 5011, 5012, 5013, 5014, 5015, 5016, 5017, - 5018, 5019, 5021, 5022, 5023, 5024, 421, 148, - 148, 1, 1, 151, 5020, 5002, 181, 181, - 181, 571, 5003, 150, 152, 153, 4564, 3196, - 5004, 4566, 158, 5005, 160, 161, 5006, 5007, - 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, - 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, - 421, 148, 148, 1, 151, 5020, 5002, 181, - 181, 181, 571, 5294, 4805, 4807, 4808, 4809, - 5295, 5296, 4811, 4812, 5297, 4814, 4815, 5298, - 5299, 5300, 5301, 5302, 5303, 5304, 5305, 5306, - 5307, 5308, 5309, 5310, 5311, 5313, 5314, 5315, - 5316, 421, 148, 148, 1, 1, 4806, 1, - 5312, 1, 5002, 2518, 2518, 2518, 2774, 5003, - 150, 152, 153, 4564, 3196, 5004, 4566, 158, - 5005, 160, 161, 5006, 5007, 5008, 5009, 5010, - 5011, 5012, 5013, 5014, 5015, 5016, 5017, 5018, - 5019, 5021, 5022, 5023, 5024, 2646, 2008, 2008, - 5002, 5002, 151, 5002, 5020, 5002, 1, 181, - 181, 181, 571, 5003, 150, 152, 153, 4564, - 3196, 5004, 4566, 158, 5005, 160, 161, 5006, - 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, - 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, - 5024, 421, 148, 148, 1, 1, 151, 5020, - 5002, 181, 181, 181, 571, 5003, 150, 152, - 153, 4564, 3196, 5004, 4566, 158, 5005, 160, - 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, - 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, - 5022, 5023, 5024, 421, 148, 148, 1, 151, - 5020, 5002, 181, 181, 181, 571, 5003, 150, - 152, 153, 4564, 3196, 5004, 4566, 158, 5005, - 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, - 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, - 5021, 5022, 5023, 5024, 421, 148, 148, 1, - 151, 5020, 5002, 181, 181, 181, 571, 1, - 5003, 150, 152, 153, 4564, 3196, 5004, 4566, - 158, 5005, 160, 161, 5006, 5007, 5008, 5009, - 5010, 5011, 5012, 5013, 5014, 5015, 5016, 5017, - 5018, 5019, 5021, 5022, 5023, 5024, 421, 148, - 148, 1, 1, 1, 1, 151, 5020, 5002, - 181, 181, 181, 571, 5003, 150, 152, 153, - 4564, 3196, 5004, 4566, 158, 5005, 160, 161, - 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, - 5014, 5015, 5016, 5017, 5018, 5019, 5021, 5022, - 5023, 5024, 421, 148, 148, 1, 1, 151, - 5020, 5002, 2518, 2518, 2518, 2774, 5003, 150, - 152, 153, 4564, 3196, 5004, 4566, 158, 5005, - 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, - 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, - 5021, 5022, 5023, 5024, 1, 2646, 1, 2008, - 1, 2008, 1, 151, 5020, 5002, 181, 181, - 181, 571, 5003, 150, 152, 153, 4564, 3196, - 5004, 4566, 158, 5005, 160, 161, 5006, 5007, - 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, - 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, - 421, 148, 148, 1, 151, 5020, 5002, 181, - 181, 181, 571, 5003, 150, 152, 153, 4564, - 3196, 5004, 4566, 158, 5005, 160, 161, 5006, - 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, - 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, - 5024, 421, 148, 148, 1, 151, 5020, 5002, - 181, 181, 181, 571, 3, 4, 5, 6, - 7, 9, 10, 11, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 5003, 150, - 152, 153, 4564, 3196, 5004, 4566, 158, 5005, - 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, - 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, - 5021, 5022, 5023, 5024, 421, 148, 148, 8, - 12, 151, 5020, 5002, 181, 181, 181, 571, - 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 5003, 150, 152, - 153, 4564, 3196, 5004, 4566, 158, 5005, 160, - 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, - 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, - 5022, 5023, 5024, 421, 148, 148, 151, 5020, - 5002, 181, 181, 181, 571, 52, 53, 54, - 55, 56, 57, 5003, 150, 152, 153, 4564, - 3196, 5004, 4566, 158, 5005, 160, 161, 5006, - 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, - 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, - 5024, 421, 148, 148, 151, 5020, 5002, 181, - 181, 181, 571, 58, 59, 5003, 150, 152, - 153, 4564, 3196, 5004, 4566, 158, 5005, 160, - 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, - 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, - 5022, 5023, 5024, 421, 148, 148, 151, 5020, - 5002, 181, 181, 181, 571, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 5003, 150, 152, 153, - 4564, 3196, 5004, 4566, 158, 5005, 160, 161, - 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, - 5014, 5015, 5016, 5017, 5018, 5019, 5021, 5022, - 5023, 5024, 421, 148, 148, 151, 5020, 5002, - 181, 181, 181, 571, 75, 76, 56, 61, - 77, 5003, 150, 152, 153, 4564, 3196, 5004, - 4566, 158, 5005, 160, 161, 5006, 5007, 5008, - 5009, 5010, 5011, 5012, 5013, 5014, 5015, 5016, - 5017, 5018, 5019, 5021, 5022, 5023, 5024, 421, - 148, 148, 151, 5020, 5002, 181, 181, 181, - 571, 78, 79, 80, 81, 82, 83, 5003, - 150, 152, 153, 4564, 3196, 5004, 4566, 158, - 5005, 160, 161, 5006, 5007, 5008, 5009, 5010, - 5011, 5012, 5013, 5014, 5015, 5016, 5017, 5018, - 5019, 5021, 5022, 5023, 5024, 421, 148, 148, - 151, 5020, 5002, 181, 181, 181, 571, 119, - 5003, 150, 152, 153, 4564, 3196, 5004, 4566, - 158, 5005, 160, 161, 5006, 5007, 5008, 5009, - 5010, 5011, 5012, 5013, 5014, 5015, 5016, 5017, - 5018, 5019, 5021, 5022, 5023, 5024, 421, 148, - 148, 151, 5020, 5002, 2518, 2518, 2518, 2774, - 5002, 5294, 4805, 4807, 4808, 4809, 5295, 5296, - 4811, 4812, 5297, 4814, 4815, 5298, 5299, 5300, - 5301, 5302, 5303, 5304, 5305, 5306, 5307, 5308, - 5309, 5310, 5311, 5313, 5314, 5315, 5316, 2646, - 2008, 2008, 5002, 4806, 5312, 1, 2518, 2518, - 2518, 2774, 5002, 5003, 150, 152, 153, 4564, - 3196, 5004, 4566, 158, 5005, 160, 161, 5006, - 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, - 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, - 5024, 2646, 2008, 2008, 5002, 5002, 151, 5002, - 5020, 5002, 1, 181, 181, 181, 571, 1, - 5294, 4805, 4807, 4808, 4809, 5295, 5296, 4811, - 4812, 5297, 4814, 4815, 5298, 5299, 5300, 5301, - 5302, 5303, 5304, 5305, 5306, 5307, 5308, 5309, - 5310, 5311, 5313, 5314, 5315, 5316, 421, 148, - 148, 1, 1, 4806, 1, 5312, 1, 5002, - 2518, 2518, 2518, 2774, 5003, 150, 152, 153, - 4564, 3196, 5004, 4566, 158, 5005, 160, 161, - 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, - 5014, 5015, 5016, 5017, 5018, 5019, 5021, 5022, - 5023, 5024, 2646, 2008, 2008, 5002, 5002, 5002, - 5002, 5002, 151, 5002, 5020, 5002, 1, 2518, - 2518, 2518, 2774, 1, 1, 5003, 150, 152, - 153, 4564, 3196, 5004, 4566, 158, 5005, 160, - 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, - 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, - 5022, 5023, 5024, 1, 2646, 1, 2008, 1, - 2008, 1, 1, 1, 1, 151, 5020, 5002, - 2518, 2518, 2518, 2774, 5002, 5002, 5003, 150, - 152, 153, 4564, 3196, 5004, 4566, 158, 5005, - 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, - 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, - 5021, 5022, 5023, 5024, 2646, 2008, 2008, 5002, - 5002, 151, 5002, 5020, 5002, 1, 181, 181, - 181, 571, 1, 5003, 150, 152, 153, 4564, - 3196, 5004, 4566, 158, 5005, 160, 161, 5006, - 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, - 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, - 5024, 421, 148, 148, 1, 1, 151, 5020, - 5002, 181, 181, 181, 571, 5003, 150, 152, - 153, 4564, 3196, 5004, 4566, 158, 5005, 160, - 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, - 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, - 5022, 5023, 5024, 421, 148, 148, 1, 1, - 1, 1, 1, 151, 5020, 5002, 181, 181, - 181, 571, 1, 5003, 150, 152, 153, 4564, - 3196, 5004, 4566, 158, 5005, 160, 161, 5006, - 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, - 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, - 5024, 421, 148, 148, 1, 151, 5020, 5002, - 181, 181, 181, 571, 1, 5003, 150, 152, - 153, 4564, 3196, 5004, 4566, 158, 5005, 160, - 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, - 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, - 5022, 5023, 5024, 421, 148, 148, 1, 1, - 1, 151, 5020, 5002, 181, 181, 181, 571, - 5294, 4805, 4807, 4808, 4809, 5295, 5296, 4811, - 4812, 5297, 4814, 4815, 5298, 5299, 5300, 5301, - 5302, 5303, 5304, 5305, 5306, 5307, 5308, 5309, - 5310, 5311, 5313, 5314, 5315, 5316, 421, 148, - 148, 1, 1, 4806, 1, 5312, 1, 5002, - 2518, 2518, 2518, 2774, 5002, 5002, 5003, 150, - 152, 153, 4564, 3196, 5004, 4566, 158, 5005, - 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, - 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, - 5021, 5022, 5023, 5024, 2646, 2008, 2008, 5002, - 5002, 5002, 151, 5002, 5020, 5002, 1, 181, - 181, 181, 571, 5003, 150, 152, 153, 4564, - 3196, 5004, 4566, 158, 5005, 160, 161, 5006, - 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, - 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, - 5024, 421, 148, 148, 1, 1, 1, 1, - 1, 151, 5020, 5002, 181, 181, 181, 571, - 5294, 4805, 4807, 4808, 4809, 5295, 5296, 4811, - 4812, 5297, 4814, 4815, 5298, 5299, 5300, 5301, - 5302, 5303, 5304, 5305, 5306, 5307, 5308, 5309, - 5310, 5311, 5313, 5314, 5315, 5316, 421, 148, - 148, 1, 1, 4806, 1, 5312, 1, 5002, - 2518, 2518, 2518, 2774, 5002, 5002, 5003, 150, - 152, 153, 4564, 3196, 5004, 4566, 158, 5005, - 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, - 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, - 5021, 5022, 5023, 5024, 2646, 2008, 2008, 5002, - 5002, 5002, 151, 5002, 5020, 5002, 1, 181, - 181, 181, 571, 5003, 150, 152, 153, 4564, - 3196, 5004, 4566, 158, 5005, 160, 161, 5006, - 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, - 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, - 5024, 421, 148, 148, 1, 151, 5020, 5002, - 181, 181, 181, 571, 1, 1, 5003, 150, - 152, 153, 4564, 3196, 5004, 4566, 158, 5005, - 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, - 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, - 5021, 5022, 5023, 5024, 421, 148, 148, 1, - 1, 1, 151, 5020, 5002, 181, 181, 181, - 571, 1, 5003, 150, 152, 153, 4564, 3196, - 5004, 4566, 158, 5005, 160, 161, 5006, 5007, - 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, - 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, - 421, 148, 148, 1, 151, 5020, 5002, 181, - 181, 181, 571, 5003, 150, 152, 153, 4564, - 3196, 5004, 4566, 158, 5005, 160, 161, 5006, - 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, - 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, - 5024, 421, 148, 148, 1, 151, 5020, 5002, - 181, 181, 181, 571, 1, 5003, 150, 152, - 153, 4564, 3196, 5004, 4566, 158, 5005, 160, - 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, - 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, - 5022, 5023, 5024, 421, 148, 148, 1, 1, - 151, 5020, 5002, 181, 181, 181, 571, 5003, - 150, 152, 153, 4564, 3196, 5004, 4566, 158, - 5005, 160, 161, 5006, 5007, 5008, 5009, 5010, - 5011, 5012, 5013, 5014, 5015, 5016, 5017, 5018, - 5019, 5021, 5022, 5023, 5024, 421, 148, 148, - 1, 151, 5020, 5002, 181, 181, 181, 571, - 1, 1, 1, 5003, 150, 152, 153, 4564, - 3196, 5004, 4566, 158, 5005, 160, 161, 5006, - 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, - 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, - 5024, 421, 148, 148, 1, 1, 151, 5020, - 5002, 181, 181, 181, 571, 5003, 150, 152, - 153, 4564, 3196, 5004, 4566, 158, 5005, 160, - 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, - 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, - 5022, 5023, 5024, 421, 148, 148, 1, 151, - 5020, 5002, 181, 181, 181, 571, 5003, 150, - 152, 153, 4564, 3196, 5004, 4566, 158, 5005, - 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, - 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, - 5021, 5022, 5023, 5024, 421, 148, 148, 1, - 1, 1, 1, 151, 5020, 5002, 181, 181, - 181, 571, 1, 5003, 150, 152, 153, 4564, - 3196, 5004, 4566, 158, 5005, 160, 161, 5006, - 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, - 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, - 5024, 421, 148, 148, 151, 5020, 5002, 3371, - 5338, 5339, 5340, 674, 302, 303, 304, 305, - 306, 307, 5341, 2214, 5342, 2216, 5343, 5344, - 5345, 4500, 122, 124, 4501, 4502, 4503, 4504, - 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, - 4513, 4514, 4515, 4516, 4517, 4518, 3372, 151, - 4499, 5346, 5347, 317, 318, 319, 5348, 5349, - 5350, 5351, 5352, 5353, 5355, 5356, 5357, 5358, - 4500, 122, 124, 4501, 4502, 4503, 4504, 4505, - 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, - 4514, 4515, 4516, 4517, 4518, 5354, 4499, 5360, - 4449, 4451, 5361, 5362, 5363, 5364, 5365, 5366, - 5367, 5368, 5369, 5370, 5371, 5372, 5373, 5374, - 5375, 5376, 5377, 5378, 5359, + 1, 0, 2, 1, 2, 1, 1, 0, + 1, 1, 0, 1, 1, 1, 0, 1, + 1, 1, 0, 1, 1, 0, 1, 1, + 1, 1, 0, 1, 1, 1, 0, 0, + 1, 1, 0, 1, 0, 3, 4, 5, + 6, 7, 9, 10, 11, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 8, + 12, 0, 1, 1, 1, 1, 2, 1, + 2, 1, 2, 2, 2, 1, 2, 2, + 2, 1, 1, 1, 1, 2, 2, 2, + 2, 2, 2, 1, 2, 2, 2, 2, + 2, 2, 1, 2, 2, 2, 2, 1, + 1, 1, 1, 2, 1, 1, 1, 1, + 1, 2, 1, 1, 2, 1, 1, 1, + 1, 2, 1, 1, 2, 2, 2, 2, + 2, 2, 1, 1, 1, 1, 1, 1, + 2, 1, 1, 2, 2, 2, 2, 2, + 2, 1, 1, 2, 1, 1, 1, 1, + 1, 2, 1, 1, 2, 1, 2, 1, + 1, 1, 2, 1, 2, 1, 1, 1, + 1, 1, 2, 1, 2, 1, 1, 1, + 1, 2, 1, 2, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, + 51, 0, 1, 2, 1, 1, 1, 1, + 1, 2, 1, 1, 1, 2, 1, 2, + 1, 1, 2, 1, 1, 2, 1, 2, + 2, 2, 1, 1, 2, 1, 2, 1, + 1, 2, 1, 2, 1, 1, 1, 2, + 1, 2, 1, 1, 2, 2, 2, 1, + 1, 1, 2, 1, 2, 1, 2, 1, + 1, 1, 1, 1, 2, 1, 1, 2, + 52, 53, 54, 55, 56, 57, 0, 1, + 1, 2, 1, 1, 2, 1, 2, 1, + 2, 1, 2, 1, 2, 58, 59, 0, + 1, 2, 1, 2, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 0, 1, 1, 2, 1, + 2, 1, 2, 1, 1, 1, 1, 2, + 1, 1, 2, 2, 2, 1, 1, 2, + 1, 2, 1, 1, 2, 2, 2, 1, + 1, 2, 1, 1, 1, 2, 1, 1, + 1, 1, 2, 1, 1, 1, 2, 1, + 1, 2, 75, 76, 56, 61, 77, 0, + 1, 2, 1, 1, 2, 1, 2, 78, + 79, 80, 81, 82, 83, 0, 84, 85, + 86, 87, 88, 2, 1, 2, 1, 2, + 1, 2, 1, 1, 1, 1, 1, 2, + 1, 2, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, + 103, 100, 104, 105, 106, 2, 1, 1, + 2, 2, 1, 2, 2, 2, 1, 1, + 1, 2, 1, 2, 1, 1, 2, 2, + 2, 1, 1, 2, 1, 2, 1, 1, + 1, 2, 1, 1, 1, 1, 1, 1, + 1, 2, 1, 2, 2, 1, 1, 1, + 2, 2, 2, 1, 2, 1, 1, 2, + 1, 2, 107, 108, 109, 110, 2, 1, + 2, 1, 2, 1, 2, 1, 2, 111, + 2, 1, 1, 2, 112, 113, 114, 115, + 116, 117, 2, 1, 1, 2, 2, 2, + 2, 1, 1, 2, 1, 1, 2, 2, + 2, 1, 1, 1, 1, 2, 118, 2, + 1, 2, 119, 0, 120, 121, 122, 124, + 123, 2, 1, 1, 2, 2, 1, 1, + 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 126, 125, 149, + 150, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, + 175, 177, 178, 179, 180, 148, 148, 151, + 176, 2, 148, 181, 148, 148, 2, 148, + 148, 148, 2, 148, 2, 148, 148, 2, + 2, 2, 2, 2, 2, 148, 2, 181, + 2, 2, 148, 2, 148, 2, 181, 148, + 148, 148, 148, 148, 2, 2, 148, 2, + 181, 148, 2, 148, 2, 2, 148, 2, + 2, 181, 2, 148, 181, 181, 181, 148, + 148, 2, 181, 181, 181, 148, 2, 181, + 148, 181, 148, 2, 2, 2, 2, 181, + 181, 2, 2, 2, 148, 148, 181, 148, + 181, 2, 2, 148, 181, 181, 2, 148, + 148, 148, 181, 148, 2, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 2, 148, 148, + 148, 148, 181, 2, 148, 181, 2, 148, + 2, 181, 2, 148, 148, 181, 148, 148, + 2, 148, 181, 2, 2, 2, 181, 181, + 2, 2, 2, 2, 181, 148, 148, 2, + 2, 2, 2, 2, 148, 2, 148, 2, + 181, 181, 181, 148, 148, 148, 148, 148, + 148, 148, 181, 2, 2, 2, 2, 2, + 2, 148, 2, 148, 2, 181, 148, 181, + 148, 148, 148, 148, 148, 148, 181, 2, + 2, 2, 148, 148, 2, 148, 2, 181, + 148, 181, 148, 148, 148, 148, 148, 148, + 181, 2, 148, 181, 181, 181, 181, 148, + 148, 181, 2, 181, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 181, 2, + 148, 181, 181, 181, 181, 2, 148, 181, + 148, 148, 148, 148, 181, 2, 2, 2, + 2, 2, 148, 2, 148, 2, 181, 148, + 181, 148, 148, 148, 148, 148, 181, 2, + 148, 181, 181, 181, 181, 148, 181, 148, + 2, 148, 181, 148, 148, 148, 181, 2, + 2, 2, 148, 2, 2, 148, 2, 148, + 2, 181, 148, 181, 148, 148, 148, 2, + 181, 181, 148, 181, 181, 181, 2, 181, + 181, 2, 181, 2, 181, 181, 181, 2, + 181, 2, 148, 181, 181, 181, 181, 181, + 2, 148, 148, 181, 2, 181, 181, 148, + 181, 181, 2, 181, 2, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 151, + 152, 248, 249, 250, 251, 252, 151, 153, + 151, 2, 181, 2, 181, 181, 181, 181, + 181, 2, 181, 181, 181, 148, 2, 2, + 2, 2, 2, 148, 2, 2, 2, 2, + 2, 148, 2, 2, 2, 2, 2, 148, + 148, 148, 148, 148, 2, 2, 2, 148, + 2, 181, 2, 148, 148, 148, 2, 2, + 2, 148, 148, 2, 2, 2, 148, 148, + 148, 2, 2, 2, 148, 148, 148, 181, + 148, 181, 2, 148, 181, 148, 148, 181, + 2, 181, 2, 2, 2, 181, 181, 148, + 2, 2, 148, 181, 148, 148, 2, 2, + 148, 148, 181, 181, 2, 148, 181, 2, + 181, 181, 181, 2, 181, 2, 181, 148, + 181, 2, 148, 2, 2, 181, 181, 148, + 181, 148, 148, 2, 181, 2, 148, 148, + 181, 2, 148, 148, 2, 181, 181, 181, + 148, 181, 148, 181, 2, 181, 181, 2, + 2, 2, 148, 2, 2, 2, 2, 2, + 2, 2, 148, 148, 148, 148, 2, 148, + 148, 148, 148, 148, 148, 148, 2, 253, + 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 151, 264, 265, 266, 267, 268, + 269, 2, 181, 181, 2, 148, 148, 181, + 181, 2, 148, 2, 181, 2, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, + 148, 2, 148, 148, 148, 2, 2, 148, + 148, 2, 2, 148, 148, 148, 2, 2, + 148, 2, 181, 2, 148, 148, 148, 148, + 148, 2, 181, 2, 2, 148, 148, 148, + 148, 148, 148, 2, 148, 148, 148, 148, + 181, 2, 148, 2, 270, 271, 272, 151, + 273, 2, 148, 181, 148, 2, 181, 2, + 148, 148, 2, 2, 2, 148, 153, 274, + 275, 153, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 152, + 297, 153, 151, 2, 2, 148, 148, 2, + 2, 2, 2, 148, 148, 148, 181, 181, + 2, 148, 181, 148, 2, 181, 2, 148, + 148, 148, 2, 2, 2, 2, 148, 148, + 2, 181, 181, 181, 181, 2, 148, 148, + 2, 181, 148, 181, 2, 148, 148, 2, + 148, 2, 181, 148, 181, 148, 2, 181, + 2, 2, 148, 181, 148, 181, 2, 148, + 2, 2, 181, 148, 181, 2, 181, 148, + 181, 181, 2, 181, 181, 181, 181, 2, + 181, 148, 181, 148, 181, 2, 148, 148, + 148, 148, 148, 148, 2, 2, 2, 148, + 148, 181, 181, 2, 151, 298, 299, 2, + 151, 2, 148, 2, 2, 148, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 151, 2, 181, + 148, 148, 148, 148, 148, 148, 2, 148, + 148, 148, 2, 2, 148, 148, 2, 2, + 148, 148, 2, 2, 148, 2, 2, 148, + 181, 181, 2, 148, 148, 2, 181, 2, + 148, 148, 2, 148, 2, 181, 148, 2, + 148, 148, 148, 148, 181, 2, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, + 2, 325, 326, 153, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 153, 151, 336, + 337, 338, 153, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 153, 259, 151, 354, 2, 148, + 148, 148, 148, 148, 2, 2, 2, 148, + 2, 148, 148, 2, 181, 2, 148, 148, + 2, 181, 2, 148, 148, 148, 2, 2, + 181, 2, 148, 148, 148, 2, 2, 2, + 2, 148, 2, 148, 148, 148, 2, 2, + 148, 2, 148, 148, 148, 2, 148, 148, + 148, 148, 148, 148, 2, 2, 2, 148, + 148, 2, 148, 148, 2, 148, 148, 2, + 148, 148, 2, 148, 181, 181, 181, 181, + 148, 148, 148, 181, 2, 148, 2, 148, + 2, 148, 148, 181, 2, 148, 2, 148, + 148, 2, 148, 2, 148, 2, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 368, + 372, 373, 374, 375, 376, 377, 2, 181, + 148, 181, 2, 2, 181, 148, 2, 2, + 181, 148, 2, 181, 148, 181, 2, 181, + 148, 148, 2, 181, 148, 181, 2, 148, + 148, 148, 2, 2, 181, 148, 148, 181, + 2, 148, 148, 148, 148, 148, 148, 2, + 181, 2, 148, 148, 181, 148, 148, 148, + 148, 148, 148, 181, 2, 148, 181, 181, + 181, 181, 148, 181, 181, 181, 2, 148, + 181, 2, 2, 148, 2, 181, 148, 181, + 181, 2, 2, 148, 2, 181, 148, 2, + 181, 148, 181, 2, 181, 2, 148, 2, + 2, 2, 148, 148, 2, 153, 378, 379, + 380, 151, 153, 151, 2, 2, 148, 2, + 148, 2, 148, 153, 379, 151, 2, 153, + 381, 151, 2, 2, 148, 153, 382, 343, + 383, 384, 385, 386, 153, 387, 388, 151, + 2, 2, 148, 148, 181, 2, 148, 181, + 2, 148, 148, 148, 2, 2, 148, 2, + 181, 2, 148, 181, 148, 2, 153, 389, + 390, 2, 2, 2, 148, 148, 148, 181, + 181, 2, 391, 392, 393, 153, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 151, 2, 181, 181, + 2, 2, 2, 2, 181, 181, 2, 2, + 148, 2, 2, 2, 2, 2, 2, 2, + 148, 2, 148, 2, 2, 2, 2, 2, + 2, 148, 148, 148, 148, 148, 2, 2, + 148, 2, 2, 2, 148, 2, 2, 148, + 2, 2, 148, 2, 2, 148, 2, 2, + 148, 181, 181, 2, 2, 2, 181, 181, + 181, 181, 2, 153, 408, 409, 410, 411, + 151, 2, 2, 181, 2, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 2, + 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 2, 148, 148, 148, 148, + 148, 2, 412, 413, 414, 2, 148, 2, + 2, 2, 148, 2, 148, 415, 2, 416, + 417, 155, 419, 418, 2, 181, 181, 2, + 2, 181, 181, 2, 181, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 421, 420, 443, 420, 443, 420, + 420, 443, 443, 420, 443, 443, 420, 443, + 443, 443, 420, 443, 443, 443, 420, 421, + 443, 443, 421, 420, 443, 443, 443, 443, + 421, 420, 443, 443, 443, 420, 420, 443, + 443, 420, 421, 443, 420, 444, 445, 446, + 447, 448, 450, 451, 452, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 449, + 453, 420, 443, 443, 443, 443, 420, 443, + 420, 443, 420, 420, 420, 443, 420, 420, + 420, 421, 420, 443, 443, 443, 443, 420, + 420, 420, 420, 420, 420, 421, 420, 443, + 420, 420, 420, 420, 421, 420, 420, 443, + 420, 420, 420, 420, 421, 420, 443, 443, + 443, 443, 420, 443, 443, 443, 443, 443, + 421, 420, 443, 443, 420, 443, 443, 443, + 443, 421, 420, 443, 443, 420, 420, 420, + 420, 420, 420, 421, 420, 443, 443, 443, + 443, 443, 443, 421, 420, 443, 443, 420, + 420, 420, 420, 420, 420, 421, 420, 443, + 443, 420, 443, 443, 443, 443, 421, 443, + 420, 443, 443, 420, 443, 421, 420, 443, + 443, 443, 420, 443, 421, 420, 443, 443, + 443, 443, 421, 443, 420, 443, 420, 443, + 443, 443, 443, 420, 443, 420, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 420, 443, + 420, 421, 443, 443, 443, 443, 443, 420, + 443, 443, 421, 443, 420, 443, 420, 443, + 443, 420, 443, 443, 420, 443, 420, 420, + 420, 421, 420, 443, 443, 421, 420, 443, + 420, 443, 443, 420, 421, 2, 421, 2, + 443, 420, 443, 443, 443, 420, 421, 421, + 443, 420, 443, 443, 420, 420, 421, 420, + 420, 443, 443, 443, 421, 420, 443, 420, + 443, 420, 421, 421, 420, 443, 443, 443, + 443, 443, 420, 443, 443, 420, 496, 497, + 498, 499, 500, 501, 420, 443, 443, 420, + 443, 443, 420, 443, 420, 443, 420, 443, + 420, 443, 420, 502, 503, 420, 443, 420, + 443, 420, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 420, 421, 420, 443, 443, 420, + 443, 420, 443, 420, 443, 443, 443, 443, + 420, 443, 443, 420, 420, 421, 420, 420, + 443, 421, 443, 420, 443, 420, 443, 443, + 420, 420, 421, 420, 420, 421, 420, 443, + 443, 420, 443, 443, 421, 443, 420, 443, + 443, 443, 443, 420, 443, 443, 443, 420, + 443, 443, 421, 420, 520, 521, 500, 506, + 522, 420, 443, 420, 443, 443, 420, 443, + 420, 523, 524, 525, 526, 527, 528, 420, + 529, 530, 531, 504, 532, 533, 420, 443, + 420, 443, 420, 443, 420, 443, 443, 443, + 443, 443, 420, 443, 420, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 546, 550, 551, + 552, 553, 504, 420, 443, 443, 420, 420, + 421, 420, 443, 420, 420, 420, 443, 421, + 420, 443, 443, 421, 420, 443, 420, 443, + 443, 420, 420, 420, 421, 420, 443, 443, + 420, 443, 421, 420, 443, 443, 443, 420, + 443, 443, 443, 443, 443, 443, 443, 420, + 443, 420, 420, 421, 420, 443, 443, 443, + 420, 420, 420, 443, 420, 421, 420, 443, + 443, 420, 421, 2, 443, 421, 420, 504, + 554, 555, 484, 556, 557, 420, 443, 420, + 443, 420, 443, 420, 443, 420, 558, 420, + 443, 443, 420, 559, 560, 561, 562, 563, + 564, 565, 420, 443, 443, 420, 420, 420, + 420, 443, 443, 420, 421, 420, 443, 443, + 420, 420, 420, 443, 443, 443, 443, 420, + 566, 420, 443, 420, 567, 420, 568, 569, + 423, 424, 570, 420, 443, 443, 420, 420, + 443, 443, 148, 571, 148, 148, 420, 571, + 420, 420, 420, 148, 420, 148, 420, 571, + 420, 571, 148, 420, 420, 571, 420, 148, + 571, 148, 571, 571, 572, 572, 420, 573, + 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 420, 594, 420, 594, + 420, 420, 594, 594, 420, 594, 594, 420, + 594, 594, 594, 595, 595, 420, 148, 595, + 148, 148, 420, 420, 595, 420, 420, 148, + 420, 148, 420, 595, 420, 595, 148, 420, + 420, 595, 420, 148, 595, 148, 595, 595, + 572, 572, 420, 595, 595, 595, 148, 420, + 421, 595, 148, 595, 421, 148, 420, 420, + 420, 420, 595, 595, 421, 420, 420, 148, + 148, 595, 148, 595, 420, 420, 148, 595, + 595, 420, 148, 148, 421, 148, 595, 148, + 420, 596, 597, 184, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, + 626, 420, 148, 148, 148, 148, 595, 420, + 148, 595, 420, 595, 420, 148, 148, 595, + 148, 420, 148, 420, 421, 148, 595, 420, + 420, 420, 595, 595, 420, 420, 420, 420, + 595, 148, 148, 420, 420, 420, 420, 420, + 148, 420, 421, 148, 420, 595, 595, 595, + 148, 148, 148, 148, 148, 148, 148, 595, + 420, 420, 420, 420, 420, 420, 148, 420, + 421, 148, 420, 595, 148, 595, 148, 148, + 148, 148, 148, 148, 595, 420, 420, 420, + 148, 148, 420, 148, 420, 421, 420, 595, + 148, 595, 148, 148, 148, 148, 148, 148, + 595, 420, 148, 595, 595, 595, 595, 148, + 148, 595, 421, 420, 595, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 595, + 420, 148, 595, 595, 595, 595, 421, 420, + 148, 595, 148, 148, 148, 148, 595, 420, + 420, 420, 420, 420, 148, 420, 148, 420, + 421, 420, 595, 148, 595, 148, 148, 148, + 148, 148, 595, 420, 148, 595, 595, 595, + 595, 148, 595, 421, 148, 420, 148, 595, + 148, 148, 148, 595, 420, 420, 420, 148, + 420, 420, 148, 420, 421, 420, 148, 420, + 595, 148, 595, 148, 148, 148, 420, 595, + 595, 148, 595, 595, 421, 595, 420, 595, + 595, 420, 595, 421, 420, 595, 595, 595, + 420, 595, 421, 420, 148, 595, 595, 595, + 595, 421, 595, 420, 148, 148, 595, 420, + 595, 595, 148, 595, 595, 420, 595, 420, + 627, 628, 629, 217, 218, 219, 220, 221, + 630, 223, 224, 225, 226, 227, 228, 631, + 632, 633, 634, 635, 234, 636, 236, 637, + 483, 484, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 151, 152, 648, 249, + 250, 251, 252, 151, 153, 151, 420, 595, + 420, 421, 595, 595, 595, 595, 595, 420, + 595, 595, 421, 595, 148, 420, 420, 595, + 420, 148, 148, 148, 595, 148, 595, 420, + 148, 595, 148, 148, 595, 420, 595, 420, + 420, 420, 421, 420, 595, 595, 421, 148, + 420, 595, 148, 148, 420, 148, 595, 595, + 420, 148, 595, 420, 595, 595, 595, 420, + 421, 421, 595, 420, 595, 148, 595, 420, + 148, 420, 421, 420, 420, 595, 595, 148, + 595, 148, 421, 148, 420, 595, 420, 148, + 148, 595, 420, 421, 148, 421, 148, 2, + 595, 595, 595, 148, 595, 148, 595, 420, + 595, 595, 420, 649, 650, 255, 651, 257, + 258, 259, 260, 261, 262, 263, 151, 652, + 265, 653, 267, 654, 269, 420, 595, 595, + 571, 420, 420, 148, 148, 420, 420, 595, + 420, 571, 595, 420, 420, 595, 420, 148, + 595, 420, 420, 148, 148, 148, 148, 148, + 595, 420, 655, 656, 272, 151, 273, 420, + 148, 595, 148, 420, 595, 420, 153, 274, + 275, 153, 657, 658, 659, 660, 280, 281, + 282, 661, 284, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 295, 296, 152, + 672, 153, 151, 420, 2, 421, 2, 148, + 148, 148, 595, 595, 420, 148, 595, 148, + 420, 595, 420, 148, 595, 595, 595, 595, + 420, 148, 595, 148, 595, 420, 148, 148, + 420, 421, 420, 148, 420, 595, 421, 148, + 595, 148, 420, 595, 420, 420, 148, 595, + 148, 595, 420, 148, 420, 421, 420, 420, + 421, 420, 595, 148, 595, 420, 595, 148, + 595, 421, 595, 420, 595, 595, 595, 595, + 420, 595, 148, 595, 148, 595, 420, 148, + 595, 595, 421, 420, 673, 674, 302, 303, + 304, 305, 306, 307, 675, 676, 677, 678, + 312, 679, 680, 151, 420, 595, 572, 148, + 148, 572, 572, 572, 420, 572, 572, 572, + 148, 2, 595, 595, 571, 420, 571, 148, + 148, 420, 595, 420, 148, 571, 148, 420, + 595, 148, 420, 148, 148, 148, 148, 595, + 420, 681, 682, 317, 318, 319, 683, 684, + 685, 686, 324, 420, 325, 326, 153, 327, + 328, 687, 330, 688, 332, 689, 334, 335, + 153, 151, 690, 337, 338, 153, 339, 340, + 341, 342, 343, 344, 345, 346, 691, 348, + 349, 692, 351, 352, 353, 153, 259, 151, + 354, 420, 595, 420, 595, 420, 148, 420, + 595, 420, 148, 2, 421, 2, 148, 148, + 595, 595, 595, 595, 148, 148, 148, 595, + 420, 148, 148, 595, 420, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 364, 702, + 703, 704, 705, 706, 707, 708, 705, 709, + 710, 552, 711, 375, 712, 377, 420, 595, + 148, 595, 420, 420, 421, 420, 595, 148, + 420, 420, 595, 148, 421, 2, 595, 148, + 595, 421, 420, 595, 148, 148, 420, 595, + 148, 595, 420, 420, 148, 420, 420, 421, + 148, 420, 595, 148, 148, 595, 420, 595, + 420, 421, 420, 148, 148, 595, 148, 148, + 148, 148, 148, 148, 595, 420, 148, 595, + 595, 595, 595, 148, 595, 595, 595, 420, + 148, 595, 420, 420, 148, 420, 421, 420, + 595, 148, 595, 595, 420, 420, 148, 420, + 595, 148, 420, 421, 420, 595, 148, 595, + 420, 595, 421, 420, 421, 2, 2, 148, + 153, 382, 713, 714, 715, 716, 386, 153, + 717, 718, 151, 420, 148, 421, 2, 148, + 595, 420, 148, 595, 420, 148, 421, 148, + 148, 2, 420, 595, 420, 148, 595, 148, + 420, 153, 389, 719, 420, 148, 148, 595, + 595, 420, 720, 721, 722, 153, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, + 723, 724, 725, 726, 151, 420, 595, 595, + 420, 420, 420, 420, 595, 595, 420, 2, + 2, 421, 2, 148, 595, 595, 420, 420, + 420, 595, 595, 595, 595, 420, 153, 727, + 409, 410, 411, 151, 420, 420, 595, 420, + 148, 728, 420, 729, 730, 731, 733, 732, + 420, 595, 595, 420, 420, 595, 595, 420, + 595, 594, 594, 594, 420, 594, 594, 420, + 594, 594, 594, 594, 420, 594, 594, 594, + 420, 420, 594, 594, 420, 594, 420, 734, + 735, 736, 737, 738, 740, 741, 742, 744, + 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 757, 758, 759, 760, + 761, 739, 743, 420, 594, 594, 594, 594, + 420, 594, 420, 594, 420, 420, 420, 594, + 420, 420, 420, 594, 594, 594, 594, 420, + 420, 420, 420, 420, 420, 594, 420, 420, + 420, 420, 420, 420, 594, 420, 420, 420, + 420, 594, 594, 594, 594, 420, 594, 594, + 594, 594, 594, 420, 594, 594, 420, 594, + 594, 594, 594, 420, 594, 594, 420, 420, + 420, 420, 420, 420, 594, 594, 594, 594, + 594, 594, 420, 594, 594, 420, 420, 420, + 420, 420, 420, 594, 594, 420, 594, 594, + 594, 594, 594, 420, 594, 594, 420, 594, + 420, 594, 594, 594, 420, 594, 420, 594, + 594, 594, 594, 594, 420, 594, 420, 594, + 594, 594, 594, 420, 594, 420, 762, 763, + 764, 765, 766, 767, 768, 769, 770, 771, + 772, 773, 774, 775, 776, 777, 778, 779, + 780, 781, 782, 420, 594, 420, 594, 594, + 594, 594, 594, 420, 594, 594, 594, 420, + 594, 420, 594, 594, 420, 594, 594, 420, + 594, 420, 420, 420, 594, 594, 420, 594, + 420, 594, 594, 420, 594, 420, 594, 594, + 594, 420, 594, 420, 594, 594, 420, 420, + 420, 594, 594, 594, 420, 594, 420, 594, + 420, 594, 594, 594, 594, 594, 420, 594, + 594, 420, 783, 784, 785, 786, 787, 788, + 420, 594, 594, 420, 594, 594, 420, 594, + 420, 594, 420, 594, 420, 594, 420, 789, + 790, 420, 594, 420, 594, 420, 791, 792, + 793, 794, 795, 796, 797, 798, 799, 800, + 801, 802, 803, 804, 805, 420, 594, 594, + 420, 594, 420, 594, 420, 594, 594, 594, + 594, 420, 594, 594, 420, 420, 420, 594, + 594, 420, 594, 420, 594, 594, 420, 420, + 420, 594, 594, 420, 594, 594, 594, 420, + 594, 594, 594, 594, 420, 594, 594, 594, + 420, 594, 594, 420, 806, 807, 808, 787, + 792, 809, 420, 594, 595, 595, 595, 595, + 420, 595, 595, 595, 420, 594, 594, 420, + 594, 420, 810, 811, 812, 813, 814, 815, + 420, 816, 817, 818, 819, 820, 420, 594, + 420, 594, 420, 594, 420, 594, 594, 594, + 594, 594, 420, 594, 420, 821, 822, 823, + 824, 825, 826, 827, 828, 829, 830, 831, + 832, 833, 834, 835, 832, 836, 837, 838, + 420, 594, 594, 420, 420, 594, 420, 420, + 420, 594, 594, 594, 420, 594, 420, 594, + 594, 420, 420, 420, 594, 594, 420, 594, + 420, 594, 594, 594, 420, 594, 594, 594, + 594, 594, 594, 594, 420, 594, 420, 420, + 594, 594, 594, 420, 420, 420, 594, 420, + 594, 594, 420, 594, 420, 839, 840, 841, + 842, 420, 594, 420, 594, 420, 594, 420, + 594, 420, 843, 420, 594, 594, 420, 844, + 845, 846, 847, 848, 849, 420, 594, 594, + 420, 420, 420, 420, 594, 594, 420, 594, + 594, 420, 420, 420, 594, 594, 594, 594, + 420, 850, 420, 594, 420, 851, 420, 852, + 853, 574, 575, 854, 420, 594, 594, 420, + 420, 594, 594, 148, 572, 148, 181, 148, + 420, 181, 2, 2, 2, 2, 2, 148, + 572, 420, 420, 420, 148, 420, 148, 420, + 572, 181, 148, 148, 148, 148, 2, 420, + 572, 148, 420, 420, 572, 420, 148, 572, + 148, 181, 572, 572, 572, 572, 420, 572, + 572, 572, 148, 420, 421, 572, 148, 572, + 421, 148, 420, 420, 420, 420, 572, 572, + 421, 420, 420, 148, 148, 572, 148, 572, + 420, 420, 148, 572, 572, 420, 148, 148, + 421, 148, 572, 148, 420, 855, 856, 184, + 857, 858, 859, 860, 861, 862, 863, 864, + 865, 866, 867, 868, 869, 870, 871, 872, + 873, 874, 875, 876, 877, 878, 879, 880, + 881, 882, 883, 884, 885, 420, 148, 148, + 148, 148, 572, 420, 148, 572, 420, 572, + 420, 148, 148, 572, 148, 420, 148, 420, + 421, 148, 572, 420, 420, 420, 572, 572, + 420, 420, 420, 420, 572, 148, 148, 420, + 420, 420, 420, 420, 148, 420, 421, 148, + 420, 572, 572, 572, 148, 148, 148, 148, + 148, 148, 148, 572, 420, 420, 420, 420, + 420, 420, 148, 420, 421, 148, 420, 572, + 148, 572, 148, 148, 148, 148, 148, 148, + 572, 420, 420, 420, 148, 148, 420, 148, + 420, 421, 420, 572, 148, 572, 148, 148, + 148, 148, 148, 148, 572, 420, 148, 572, + 572, 572, 572, 148, 148, 572, 421, 420, + 572, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 572, 420, 148, 572, 572, + 572, 572, 421, 420, 148, 572, 148, 148, + 148, 148, 572, 420, 420, 420, 420, 420, + 148, 420, 148, 420, 421, 420, 572, 148, + 572, 148, 148, 148, 148, 148, 572, 420, + 148, 572, 572, 572, 572, 148, 572, 421, + 148, 420, 148, 572, 148, 148, 148, 572, + 420, 420, 420, 148, 420, 420, 148, 420, + 421, 420, 148, 420, 572, 148, 572, 148, + 148, 148, 420, 572, 572, 148, 572, 572, + 421, 572, 420, 572, 572, 420, 572, 421, + 420, 572, 572, 572, 420, 572, 421, 420, + 148, 572, 572, 572, 572, 421, 572, 420, + 148, 148, 572, 420, 572, 572, 148, 572, + 572, 420, 572, 420, 886, 887, 888, 217, + 218, 219, 220, 221, 889, 223, 224, 225, + 226, 227, 228, 890, 891, 892, 893, 894, + 234, 895, 236, 896, 483, 484, 897, 898, + 899, 900, 901, 902, 903, 904, 646, 905, + 151, 152, 906, 249, 250, 251, 252, 151, + 153, 151, 420, 572, 420, 421, 572, 572, + 572, 572, 572, 420, 572, 572, 421, 572, + 148, 420, 420, 572, 420, 148, 148, 148, + 572, 148, 572, 420, 148, 572, 148, 148, + 572, 420, 572, 420, 420, 420, 421, 420, + 572, 572, 421, 148, 420, 572, 148, 148, + 420, 148, 572, 572, 420, 148, 572, 420, + 572, 572, 572, 420, 421, 421, 572, 420, + 572, 148, 572, 420, 148, 420, 421, 420, + 420, 572, 572, 148, 572, 148, 421, 148, + 420, 572, 420, 148, 148, 572, 420, 572, + 572, 572, 148, 572, 148, 572, 420, 572, + 572, 420, 907, 908, 255, 909, 257, 258, + 259, 260, 261, 262, 263, 151, 910, 265, + 911, 267, 912, 269, 420, 181, 181, 572, + 181, 572, 571, 420, 420, 148, 148, 420, + 420, 572, 420, 571, 572, 420, 420, 572, + 420, 148, 572, 420, 420, 148, 148, 148, + 148, 148, 572, 420, 913, 914, 272, 151, + 273, 420, 148, 572, 148, 420, 572, 420, + 153, 274, 275, 153, 657, 915, 916, 917, + 280, 281, 282, 918, 284, 919, 920, 921, + 922, 923, 924, 925, 926, 927, 928, 295, + 296, 152, 929, 153, 151, 420, 148, 148, + 572, 572, 420, 148, 572, 148, 420, 572, + 420, 148, 572, 572, 572, 572, 420, 148, + 572, 148, 572, 420, 148, 148, 420, 421, + 420, 148, 420, 572, 421, 148, 572, 148, + 420, 572, 420, 420, 148, 572, 148, 572, + 420, 148, 420, 421, 420, 420, 421, 420, + 572, 148, 572, 420, 572, 148, 572, 421, + 572, 420, 572, 572, 572, 572, 420, 572, + 148, 572, 148, 572, 420, 148, 572, 572, + 421, 420, 930, 674, 302, 303, 304, 305, + 306, 307, 931, 932, 933, 934, 312, 935, + 936, 151, 420, 572, 148, 148, 572, 572, + 572, 420, 181, 572, 572, 571, 420, 181, + 181, 571, 148, 148, 2, 572, 420, 148, + 181, 181, 181, 571, 148, 2, 572, 148, + 420, 148, 148, 148, 148, 572, 420, 937, + 938, 317, 318, 319, 939, 940, 941, 942, + 324, 420, 325, 326, 153, 327, 328, 943, + 330, 944, 332, 945, 334, 335, 153, 151, + 690, 337, 338, 153, 339, 340, 341, 342, + 343, 344, 345, 346, 946, 348, 349, 947, + 351, 352, 353, 153, 259, 151, 354, 420, + 572, 420, 572, 420, 148, 420, 572, 420, + 148, 148, 572, 572, 572, 572, 148, 148, + 148, 572, 420, 148, 148, 572, 420, 948, + 949, 950, 696, 951, 952, 953, 954, 955, + 364, 956, 957, 958, 959, 960, 961, 962, + 959, 963, 964, 552, 965, 375, 712, 377, + 420, 572, 148, 572, 420, 420, 421, 420, + 572, 148, 420, 420, 572, 572, 148, 572, + 421, 420, 572, 148, 148, 420, 572, 148, + 572, 420, 420, 148, 420, 420, 421, 148, + 420, 572, 148, 148, 572, 420, 572, 420, + 421, 420, 148, 148, 572, 148, 148, 148, + 148, 148, 148, 572, 420, 148, 572, 572, + 572, 572, 148, 572, 572, 572, 420, 148, + 572, 420, 420, 148, 420, 421, 420, 572, + 148, 572, 572, 420, 420, 148, 420, 572, + 148, 420, 421, 420, 572, 148, 572, 420, + 572, 421, 420, 153, 382, 713, 966, 967, + 716, 386, 153, 968, 969, 151, 420, 148, + 572, 420, 148, 572, 420, 420, 572, 420, + 148, 572, 148, 420, 153, 389, 970, 420, + 148, 148, 572, 572, 420, 971, 972, 973, + 153, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 723, 974, 975, 976, 151, + 420, 572, 572, 420, 420, 420, 420, 572, + 572, 420, 572, 572, 420, 420, 420, 572, + 572, 572, 572, 420, 153, 977, 409, 410, + 411, 151, 420, 420, 572, 420, 148, 978, + 420, 979, 980, 981, 983, 982, 420, 572, + 572, 420, 420, 572, 572, 420, 572, 571, + 571, 571, 148, 420, 421, 571, 148, 571, + 421, 148, 420, 420, 420, 420, 571, 571, + 421, 420, 420, 148, 148, 571, 148, 571, + 420, 420, 148, 571, 571, 420, 148, 148, + 421, 148, 571, 148, 420, 984, 985, 184, + 986, 987, 988, 989, 990, 991, 992, 993, + 994, 995, 996, 997, 998, 999, 1000, 1001, + 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, + 1010, 1011, 1012, 1013, 1014, 420, 148, 148, + 148, 148, 571, 420, 148, 571, 420, 571, + 420, 148, 148, 571, 148, 420, 148, 420, + 421, 148, 571, 420, 420, 420, 571, 571, + 420, 420, 420, 420, 571, 148, 148, 420, + 420, 420, 420, 420, 148, 420, 421, 148, + 420, 571, 571, 571, 148, 148, 148, 148, + 148, 148, 148, 571, 420, 420, 420, 420, + 420, 420, 148, 420, 421, 148, 420, 571, + 148, 571, 148, 148, 148, 148, 148, 148, + 571, 420, 420, 420, 148, 148, 420, 148, + 420, 421, 420, 571, 148, 571, 148, 148, + 148, 148, 148, 148, 571, 420, 148, 571, + 571, 571, 571, 148, 148, 571, 421, 420, + 571, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 571, 420, 148, 571, 571, + 571, 571, 421, 420, 148, 571, 148, 148, + 148, 148, 571, 420, 420, 420, 420, 420, + 148, 420, 148, 420, 421, 420, 571, 148, + 571, 148, 148, 148, 148, 148, 571, 420, + 148, 571, 571, 571, 571, 148, 571, 421, + 148, 420, 148, 571, 148, 148, 148, 571, + 420, 420, 420, 148, 420, 420, 148, 420, + 421, 420, 148, 420, 571, 148, 571, 148, + 148, 148, 420, 571, 571, 148, 571, 571, + 421, 571, 420, 571, 571, 420, 571, 421, + 420, 571, 571, 571, 420, 571, 421, 420, + 148, 571, 571, 571, 571, 421, 571, 420, + 148, 148, 571, 420, 571, 571, 148, 571, + 571, 420, 571, 420, 1015, 1016, 1017, 217, + 218, 219, 220, 221, 1018, 223, 224, 225, + 226, 227, 228, 1019, 1020, 1021, 1022, 1023, + 234, 1024, 236, 1025, 483, 484, 1026, 1027, + 1028, 1029, 1030, 1031, 1032, 1033, 646, 1034, + 151, 152, 1035, 249, 250, 251, 252, 151, + 153, 151, 420, 571, 420, 421, 571, 571, + 571, 571, 571, 420, 571, 571, 421, 571, + 148, 420, 420, 571, 420, 148, 148, 148, + 571, 148, 571, 420, 148, 571, 148, 148, + 571, 420, 571, 420, 420, 420, 421, 420, + 571, 571, 421, 148, 420, 571, 148, 148, + 420, 148, 571, 571, 420, 148, 571, 420, + 571, 571, 571, 420, 421, 421, 571, 420, + 571, 148, 571, 420, 148, 420, 421, 420, + 420, 571, 571, 148, 571, 148, 421, 148, + 420, 571, 420, 148, 148, 571, 420, 571, + 571, 571, 148, 571, 148, 571, 420, 571, + 571, 420, 1036, 1037, 255, 1038, 257, 258, + 259, 260, 261, 262, 263, 151, 1039, 265, + 1040, 267, 1041, 269, 420, 571, 571, 571, + 420, 420, 148, 148, 420, 420, 420, 571, + 571, 420, 420, 571, 420, 148, 571, 420, + 420, 148, 148, 148, 148, 148, 571, 420, + 1042, 1043, 1044, 272, 151, 273, 1045, 1046, + 1047, 1048, 420, 148, 571, 1049, 148, 420, + 1049, 420, 1049, 2, 420, 1049, 1049, 420, + 1049, 1049, 420, 1049, 1049, 1049, 420, 1049, + 1049, 1049, 420, 1049, 1049, 420, 1049, 1049, + 1049, 1049, 420, 1049, 1049, 1049, 420, 420, + 1049, 1049, 420, 1049, 420, 1050, 1051, 1052, + 1053, 1054, 1056, 1057, 1058, 1060, 1061, 1062, + 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, + 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1055, + 1059, 420, 1049, 1049, 1049, 1049, 420, 1049, + 420, 1049, 420, 420, 420, 1049, 420, 420, + 420, 1049, 1049, 1049, 1049, 420, 420, 420, + 420, 420, 420, 1049, 420, 420, 420, 420, + 420, 420, 1049, 420, 420, 420, 420, 1049, + 1049, 1049, 1049, 420, 1049, 1049, 1049, 1049, + 1049, 420, 1049, 1049, 420, 1049, 1049, 1049, + 1049, 420, 1049, 1049, 420, 420, 420, 420, + 420, 420, 1049, 1049, 1049, 1049, 1049, 1049, + 420, 1049, 1049, 420, 420, 420, 420, 420, + 420, 1049, 1049, 420, 1049, 1049, 1049, 1049, + 1049, 420, 1049, 1049, 420, 1049, 420, 1049, + 1049, 1049, 420, 1049, 420, 1049, 1049, 1049, + 1049, 1049, 420, 1049, 420, 1049, 1049, 1049, + 1049, 420, 1049, 420, 1078, 1079, 1080, 1081, + 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, + 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1097, + 1098, 420, 1049, 420, 1049, 1049, 1049, 1049, + 1049, 420, 1049, 1049, 1049, 420, 1049, 420, + 1049, 1049, 420, 1049, 1049, 420, 1049, 420, + 420, 420, 1049, 1049, 420, 1049, 420, 1049, + 1049, 420, 1049, 420, 1049, 1049, 1049, 420, + 1049, 420, 1049, 1049, 420, 420, 420, 1049, + 1049, 1049, 420, 1049, 420, 1049, 420, 1049, + 1049, 1049, 1049, 1049, 420, 1049, 1049, 420, + 1099, 1100, 1101, 1102, 1103, 1104, 420, 1049, + 1049, 571, 420, 420, 420, 420, 1049, 420, + 571, 1049, 420, 1049, 420, 1049, 420, 1049, + 420, 1105, 1106, 1044, 1045, 1046, 1047, 1048, + 420, 1049, 1049, 420, 1049, 1049, 420, 2, + 2, 1049, 1049, 2, 1049, 2, 2, 1049, + 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, + 1115, 1116, 1117, 1118, 1119, 1120, 1121, 420, + 1049, 1049, 420, 1049, 420, 1049, 420, 1049, + 1049, 1049, 1049, 420, 1049, 1049, 420, 420, + 420, 1049, 1049, 420, 1049, 420, 1049, 1049, + 420, 420, 420, 1049, 1049, 420, 1049, 1049, + 1049, 420, 1049, 1049, 1049, 1049, 420, 1049, + 1049, 1049, 420, 1049, 1049, 420, 1122, 1123, + 1124, 1103, 1125, 1126, 1127, 1128, 420, 1049, + 420, 1049, 1049, 571, 420, 571, 2, 571, + 2, 1049, 420, 420, 1049, 1049, 420, 1129, + 1130, 1131, 1132, 1133, 1134, 420, 1135, 1136, + 1137, 1138, 1139, 420, 1049, 420, 1049, 420, + 1049, 420, 1049, 1049, 1049, 1049, 1049, 420, + 1049, 420, 1140, 1141, 1142, 1143, 1144, 1145, + 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, + 1154, 1151, 1155, 1156, 1157, 420, 1049, 1049, + 420, 420, 1049, 420, 420, 420, 1049, 1049, + 1049, 420, 1049, 420, 1049, 1049, 420, 420, + 420, 1049, 1049, 420, 1049, 420, 1049, 1049, + 1049, 420, 1049, 1049, 1049, 1049, 1049, 1049, + 1049, 420, 1049, 420, 420, 1049, 1049, 1049, + 420, 420, 420, 1049, 420, 1049, 1049, 420, + 1049, 420, 1158, 1159, 1160, 1161, 420, 1049, + 420, 1049, 420, 1049, 420, 1049, 420, 1162, + 1163, 420, 1049, 2, 1049, 1049, 420, 1164, + 1165, 1166, 1167, 1168, 1169, 420, 1049, 1049, + 420, 420, 420, 420, 1049, 1049, 420, 1049, + 1049, 420, 420, 420, 1049, 1049, 1049, 1049, + 420, 1170, 420, 1049, 420, 1171, 420, 1172, + 1173, 1047, 1175, 1174, 420, 1049, 1049, 420, + 420, 1049, 1049, 571, 1049, 1049, 420, 153, + 274, 275, 153, 657, 1176, 1177, 1178, 280, + 281, 282, 1179, 284, 1180, 1181, 1182, 1183, + 1184, 1185, 1186, 1187, 1188, 1189, 295, 296, + 152, 1190, 153, 151, 420, 148, 148, 571, + 571, 420, 148, 571, 148, 420, 571, 420, + 148, 571, 571, 571, 571, 420, 148, 571, + 148, 571, 420, 148, 148, 420, 421, 420, + 148, 420, 571, 421, 148, 571, 148, 420, + 571, 420, 420, 148, 571, 148, 571, 420, + 148, 420, 421, 420, 420, 421, 420, 571, + 148, 571, 420, 571, 148, 571, 421, 571, + 420, 571, 571, 571, 571, 420, 571, 148, + 571, 148, 571, 420, 148, 571, 571, 421, + 420, 1191, 674, 302, 303, 304, 305, 306, + 307, 1192, 676, 1193, 678, 1194, 1195, 1196, + 151, 420, 571, 572, 148, 148, 572, 572, + 572, 420, 571, 571, 571, 420, 571, 420, + 148, 148, 1049, 2, 571, 148, 420, 1049, + 148, 148, 148, 148, 571, 420, 1197, 1198, + 317, 318, 319, 1199, 1200, 1201, 1202, 324, + 420, 325, 326, 153, 327, 328, 1203, 330, + 1204, 332, 1205, 334, 335, 153, 151, 690, + 337, 338, 153, 339, 340, 341, 342, 343, + 344, 345, 346, 1206, 348, 349, 1207, 351, + 352, 353, 153, 259, 151, 354, 420, 571, + 420, 571, 420, 148, 420, 571, 420, 148, + 148, 571, 571, 571, 571, 148, 148, 148, + 571, 420, 148, 148, 571, 420, 1208, 1209, + 1210, 696, 1211, 1212, 1213, 1214, 1215, 364, + 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1219, + 1223, 1224, 552, 1225, 375, 712, 377, 420, + 571, 148, 571, 420, 420, 421, 420, 571, + 148, 420, 420, 571, 571, 148, 571, 421, + 420, 571, 148, 148, 420, 571, 148, 571, + 420, 420, 148, 420, 420, 421, 148, 420, + 571, 148, 148, 571, 420, 571, 420, 421, + 420, 148, 148, 571, 148, 148, 148, 148, + 148, 148, 571, 420, 148, 571, 571, 571, + 571, 148, 571, 571, 571, 420, 148, 571, + 420, 420, 148, 420, 421, 420, 571, 148, + 571, 571, 420, 420, 148, 420, 571, 148, + 420, 421, 420, 571, 148, 571, 420, 571, + 421, 420, 153, 382, 713, 1226, 1227, 716, + 386, 153, 1228, 1229, 151, 420, 148, 571, + 420, 148, 571, 420, 420, 571, 420, 148, + 571, 148, 420, 1162, 153, 389, 1230, 420, + 148, 148, 571, 571, 420, 1231, 1232, 1233, + 153, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 723, 1234, 1235, 1236, 151, + 420, 571, 571, 420, 420, 420, 420, 571, + 571, 420, 571, 571, 420, 420, 420, 571, + 571, 571, 571, 420, 153, 1237, 409, 410, + 411, 151, 420, 420, 571, 420, 148, 1238, + 420, 1239, 1240, 1241, 1243, 1242, 420, 571, + 571, 420, 420, 571, 571, 420, 571, 148, + 421, 148, 148, 420, 420, 421, 420, 443, + 148, 420, 148, 420, 421, 420, 421, 148, + 443, 420, 420, 421, 420, 148, 421, 148, + 421, 421, 572, 572, 420, 421, 421, 443, + 421, 148, 420, 421, 443, 421, 148, 421, + 148, 420, 420, 420, 420, 421, 421, 421, + 420, 420, 148, 148, 421, 148, 421, 420, + 420, 148, 421, 421, 420, 148, 443, 148, + 421, 148, 421, 148, 420, 1244, 1245, 184, + 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, + 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, + 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, + 1270, 1271, 1272, 1273, 1274, 420, 148, 148, + 148, 148, 421, 420, 148, 421, 420, 421, + 420, 148, 148, 421, 148, 420, 148, 420, + 148, 421, 420, 420, 420, 421, 421, 420, + 420, 420, 420, 421, 148, 148, 420, 420, + 420, 420, 420, 148, 420, 148, 420, 421, + 421, 421, 148, 148, 148, 148, 148, 148, + 148, 421, 420, 420, 420, 420, 420, 420, + 148, 420, 148, 420, 421, 148, 421, 148, + 148, 148, 148, 148, 148, 421, 420, 420, + 420, 148, 148, 420, 148, 420, 420, 421, + 148, 421, 148, 148, 148, 148, 148, 148, + 421, 420, 148, 421, 421, 421, 421, 148, + 148, 421, 421, 420, 421, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 421, + 420, 148, 421, 421, 421, 421, 421, 420, + 148, 421, 148, 148, 148, 148, 421, 420, + 420, 420, 420, 420, 148, 420, 148, 420, + 420, 421, 148, 421, 148, 148, 148, 148, + 148, 421, 420, 148, 421, 421, 421, 421, + 148, 421, 421, 148, 420, 148, 421, 148, + 148, 148, 421, 420, 420, 420, 148, 420, + 420, 148, 420, 420, 148, 420, 421, 148, + 421, 148, 148, 148, 420, 421, 421, 148, + 421, 421, 421, 421, 420, 421, 421, 420, + 421, 421, 420, 421, 421, 421, 420, 421, + 421, 420, 148, 421, 421, 421, 421, 421, + 421, 420, 148, 148, 421, 420, 421, 421, + 148, 421, 421, 420, 421, 420, 1275, 1276, + 1277, 217, 218, 219, 220, 221, 1278, 223, + 224, 225, 226, 227, 228, 1279, 1280, 1281, + 1282, 1283, 234, 1284, 236, 1285, 483, 484, + 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, + 646, 1294, 151, 152, 1295, 249, 250, 251, + 252, 151, 153, 151, 420, 421, 420, 421, + 421, 421, 421, 421, 421, 420, 421, 421, + 148, 420, 420, 421, 420, 148, 148, 148, + 421, 148, 421, 420, 148, 421, 148, 148, + 421, 420, 421, 420, 420, 420, 420, 421, + 421, 421, 148, 420, 421, 148, 148, 420, + 148, 421, 421, 420, 148, 421, 420, 421, + 421, 421, 420, 421, 421, 421, 420, 421, + 148, 421, 420, 148, 420, 420, 420, 421, + 421, 148, 421, 148, 421, 148, 420, 421, + 420, 148, 148, 421, 420, 421, 421, 421, + 148, 421, 148, 421, 420, 421, 421, 420, + 1296, 1297, 255, 1298, 257, 258, 259, 260, + 261, 262, 263, 151, 1299, 265, 1300, 267, + 1301, 269, 420, 443, 421, 443, 421, 571, + 420, 443, 420, 148, 148, 420, 420, 421, + 420, 571, 421, 420, 420, 421, 420, 148, + 421, 420, 420, 148, 148, 148, 148, 148, + 421, 420, 1302, 1303, 272, 151, 273, 420, + 148, 421, 148, 420, 421, 420, 153, 274, + 275, 153, 657, 1304, 1305, 1306, 280, 281, + 282, 1307, 284, 1308, 1309, 1310, 1311, 1312, + 1313, 1314, 1315, 1316, 1317, 295, 296, 152, + 1318, 153, 151, 420, 148, 148, 421, 421, + 420, 148, 421, 148, 420, 421, 420, 148, + 421, 421, 421, 421, 420, 148, 421, 148, + 421, 420, 148, 148, 420, 420, 148, 420, + 421, 421, 148, 421, 148, 420, 421, 420, + 420, 148, 421, 148, 421, 420, 148, 420, + 420, 420, 420, 421, 148, 421, 420, 421, + 148, 421, 421, 421, 420, 421, 421, 421, + 421, 420, 421, 148, 421, 148, 421, 420, + 148, 421, 421, 421, 420, 1319, 674, 302, + 303, 304, 305, 306, 307, 1320, 1321, 1322, + 1323, 312, 1324, 1325, 151, 420, 421, 572, + 148, 148, 572, 572, 572, 420, 443, 443, + 421, 421, 571, 420, 443, 443, 443, 571, + 148, 148, 420, 421, 420, 148, 443, 443, + 443, 443, 571, 148, 420, 421, 148, 420, + 148, 148, 148, 148, 421, 420, 1326, 1327, + 317, 318, 319, 1328, 1329, 1330, 1331, 324, + 420, 325, 326, 153, 327, 328, 1332, 330, + 1333, 332, 1334, 334, 335, 153, 151, 690, + 337, 338, 153, 339, 340, 341, 342, 343, + 344, 345, 346, 1335, 348, 349, 1336, 351, + 352, 353, 153, 259, 151, 354, 420, 421, + 420, 421, 420, 148, 420, 421, 420, 148, + 148, 421, 421, 421, 421, 148, 148, 148, + 421, 420, 148, 148, 421, 420, 1337, 1338, + 1339, 696, 1340, 1341, 1342, 1343, 1344, 364, + 1345, 1346, 1347, 1348, 1349, 1350, 1351, 1348, + 1352, 1353, 552, 1354, 375, 712, 377, 420, + 421, 148, 421, 420, 420, 420, 421, 148, + 420, 420, 421, 421, 148, 421, 421, 420, + 421, 148, 148, 420, 421, 148, 421, 420, + 420, 148, 420, 420, 148, 420, 421, 148, + 148, 421, 420, 421, 420, 421, 420, 148, + 148, 421, 148, 148, 148, 148, 148, 148, + 421, 420, 148, 421, 421, 421, 421, 148, + 421, 421, 421, 420, 148, 421, 420, 420, + 148, 420, 420, 421, 148, 421, 421, 420, + 420, 148, 420, 421, 148, 420, 420, 421, + 148, 421, 420, 421, 421, 420, 153, 382, + 713, 1355, 1356, 716, 386, 153, 1357, 1358, + 151, 420, 148, 421, 420, 148, 421, 420, + 420, 421, 420, 148, 421, 148, 420, 153, + 389, 1359, 420, 148, 148, 421, 421, 420, + 1360, 1361, 1362, 153, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 723, 1363, + 1364, 1365, 151, 420, 421, 421, 420, 420, + 420, 420, 421, 421, 420, 421, 421, 420, + 420, 420, 421, 421, 421, 421, 420, 153, + 1366, 409, 410, 411, 151, 420, 420, 421, + 420, 148, 1367, 420, 1368, 1369, 1370, 1372, + 1371, 420, 421, 421, 420, 420, 421, 421, + 420, 421, 148, 148, 148, 181, 148, 420, + 420, 420, 420, 420, 148, 420, 148, 420, + 420, 420, 148, 148, 148, 181, 148, 148, + 572, 572, 420, 148, 148, 148, 148, 420, + 421, 148, 421, 148, 420, 420, 420, 420, + 421, 420, 420, 148, 148, 420, 420, 148, + 148, 421, 148, 420, 1373, 1374, 184, 1375, + 151, 1376, 1377, 1378, 1379, 1380, 1381, 1382, + 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, + 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, + 1399, 1400, 1401, 1402, 420, 148, 2, 148, + 2, 148, 2, 2, 2, 421, 148, 2, + 2, 2, 2, 2, 2, 2, 148, 2, + 2, 2, 2, 2, 2, 421, 2, 148, + 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 2, 2, 2, 2, 2, 2, + 2, 421, 2, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 2, 2, 2, 2, + 2, 2, 421, 2, 2, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 2, 148, + 148, 148, 148, 148, 148, 148, 421, 2, + 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 2, 148, 148, 148, 148, + 148, 421, 2, 148, 148, 148, 148, 148, + 148, 2, 2, 2, 2, 2, 2, 2, + 421, 2, 148, 148, 148, 148, 148, 148, + 148, 148, 2, 148, 148, 148, 148, 148, + 148, 421, 148, 2, 148, 148, 148, 148, + 148, 2, 2, 2, 2, 2, 2, 421, + 2, 2, 148, 148, 148, 148, 148, 148, + 2, 148, 148, 148, 148, 148, 421, 148, + 2, 148, 148, 2, 148, 421, 2, 148, + 148, 148, 2, 148, 421, 2, 148, 148, + 148, 148, 148, 421, 148, 2, 148, 148, + 148, 2, 148, 148, 148, 2, 148, 2, + 1403, 1404, 1405, 217, 218, 219, 220, 221, + 1406, 223, 224, 225, 226, 227, 228, 1407, + 1408, 1409, 1410, 1411, 234, 1412, 236, 1413, + 483, 484, 1374, 1414, 1415, 153, 1416, 1417, + 1418, 1419, 646, 1420, 151, 152, 1421, 249, + 250, 251, 252, 151, 153, 151, 420, 148, + 2, 421, 148, 148, 148, 148, 148, 2, + 148, 148, 421, 148, 148, 2, 2, 2, + 148, 148, 148, 148, 2, 148, 148, 148, + 148, 2, 148, 2, 2, 2, 421, 2, + 148, 148, 421, 148, 2, 148, 148, 2, + 148, 148, 148, 2, 148, 148, 148, 2, + 421, 421, 148, 2, 2, 421, 2, 2, + 148, 148, 421, 148, 2, 2, 148, 148, + 2, 148, 148, 148, 2, 148, 148, 2, + 1422, 1423, 255, 1424, 257, 258, 259, 260, + 261, 262, 263, 151, 1425, 265, 1426, 267, + 1427, 269, 420, 181, 181, 148, 181, 148, + 571, 2, 2, 2, 148, 2, 2, 148, + 2, 571, 148, 2, 2, 2, 148, 2, + 2, 2, 148, 148, 148, 148, 148, 148, + 2, 1428, 1429, 272, 151, 273, 420, 148, + 148, 148, 2, 148, 2, 153, 274, 275, + 153, 657, 1430, 153, 302, 280, 281, 282, + 1431, 284, 153, 1432, 1433, 1434, 153, 1435, + 1436, 1437, 1438, 1439, 295, 296, 152, 1440, + 153, 151, 420, 148, 148, 148, 2, 2, + 148, 2, 2, 421, 2, 2, 2, 148, + 421, 148, 148, 2, 2, 2, 148, 2, + 421, 2, 2, 421, 2, 148, 148, 2, + 148, 421, 148, 2, 148, 148, 148, 148, + 2, 148, 148, 148, 2, 148, 148, 421, + 2, 1441, 674, 302, 303, 304, 305, 306, + 307, 1442, 932, 1443, 934, 312, 1444, 1445, + 151, 420, 148, 572, 148, 148, 572, 572, + 572, 2, 181, 148, 148, 571, 2, 2, + 2, 148, 148, 2, 148, 148, 148, 148, + 148, 2, 1446, 1447, 317, 318, 319, 1448, + 1449, 1450, 1451, 324, 420, 325, 326, 153, + 327, 328, 1452, 330, 1453, 332, 1454, 334, + 335, 153, 151, 690, 337, 338, 153, 339, + 340, 341, 342, 343, 344, 345, 346, 1455, + 348, 349, 1456, 351, 352, 353, 153, 259, + 151, 354, 2, 148, 2, 2, 2, 148, + 2, 2, 148, 148, 148, 148, 148, 148, + 148, 148, 2, 148, 148, 2, 1457, 1458, + 696, 1459, 1460, 1461, 1462, 364, 1463, 1464, + 1465, 153, 1466, 1467, 1468, 153, 1469, 1419, + 552, 1470, 375, 712, 377, 153, 2, 2, + 421, 2, 148, 2, 2, 148, 148, 421, + 2, 148, 148, 2, 2, 2, 2, 421, + 2, 148, 148, 148, 2, 2, 421, 2, + 148, 148, 148, 148, 148, 148, 148, 148, + 148, 2, 148, 148, 148, 148, 148, 148, + 148, 148, 2, 2, 2, 421, 2, 148, + 148, 148, 2, 2, 2, 148, 2, 2, + 421, 2, 148, 148, 421, 2, 153, 382, + 713, 1471, 1436, 716, 386, 153, 1472, 1473, + 151, 2, 148, 148, 2, 2, 2, 148, + 148, 2, 153, 389, 1474, 2, 148, 148, + 148, 148, 2, 1475, 1476, 1477, 153, 394, + 395, 396, 397, 398, 399, 400, 401, 402, + 403, 723, 1478, 1479, 1480, 151, 2, 148, + 148, 2, 2, 2, 2, 148, 148, 2, + 148, 148, 2, 2, 2, 148, 148, 148, + 148, 2, 153, 1481, 409, 410, 411, 151, + 2, 2, 2, 148, 1482, 420, 1483, 152, + 153, 1484, 151, 2, 148, 148, 2, 2, + 148, 148, 1485, 148, 148, 125, 1485, 125, + 125, 125, 148, 125, 148, 125, 1485, 125, + 1485, 148, 125, 125, 1485, 125, 148, 1485, + 148, 1485, 1485, 572, 572, 125, 1485, 1485, + 1485, 148, 125, 126, 1485, 148, 1485, 126, + 148, 125, 125, 125, 125, 1485, 1485, 126, + 125, 125, 148, 148, 1485, 148, 1485, 125, + 125, 148, 1485, 1485, 125, 148, 148, 126, + 148, 1485, 148, 125, 1486, 1487, 184, 1488, + 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, + 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, + 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, + 1513, 1514, 1515, 1516, 125, 148, 148, 148, + 148, 1485, 125, 148, 1485, 125, 1485, 125, + 148, 148, 1485, 148, 125, 148, 125, 126, + 148, 1485, 125, 125, 125, 1485, 1485, 125, + 125, 125, 125, 1485, 148, 148, 125, 125, + 125, 125, 125, 148, 125, 126, 148, 125, + 1485, 1485, 1485, 148, 148, 148, 148, 148, + 148, 148, 1485, 125, 125, 125, 125, 125, + 125, 148, 125, 126, 148, 125, 1485, 148, + 1485, 148, 148, 148, 148, 148, 148, 1485, + 125, 125, 125, 148, 148, 125, 148, 125, + 126, 125, 1485, 148, 1485, 148, 148, 148, + 148, 148, 148, 1485, 125, 148, 1485, 1485, + 1485, 1485, 148, 148, 1485, 126, 125, 1485, + 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 1485, 125, 148, 1485, 1485, 1485, + 1485, 126, 125, 148, 1485, 148, 148, 148, + 148, 1485, 125, 125, 125, 125, 125, 148, + 125, 148, 125, 126, 125, 1485, 148, 1485, + 148, 148, 148, 148, 148, 1485, 125, 148, + 1485, 1485, 1485, 1485, 148, 1485, 126, 148, + 125, 148, 1485, 148, 148, 148, 1485, 125, + 125, 125, 148, 125, 125, 148, 125, 126, + 125, 148, 125, 1485, 148, 1485, 148, 148, + 148, 125, 1485, 1485, 148, 1485, 1485, 126, + 1485, 125, 1485, 1485, 125, 1485, 126, 125, + 1485, 1485, 1485, 125, 1485, 126, 125, 148, + 1485, 1485, 1485, 1485, 126, 1485, 125, 148, + 148, 1485, 125, 1485, 1485, 148, 1485, 1485, + 125, 1485, 125, 1517, 1518, 1519, 217, 218, + 219, 220, 221, 1520, 223, 224, 225, 226, + 227, 228, 1521, 1522, 1523, 1524, 1525, 234, + 1526, 236, 1527, 1528, 1529, 1530, 1531, 1532, + 1533, 1534, 1535, 1536, 1537, 1538, 1539, 151, + 152, 1540, 249, 250, 251, 252, 151, 153, + 151, 125, 1485, 125, 126, 1485, 1485, 1485, + 1485, 1485, 125, 1485, 1485, 126, 1485, 148, + 125, 125, 1485, 125, 148, 148, 148, 1485, + 148, 1485, 125, 148, 1485, 148, 148, 1485, + 125, 1485, 125, 125, 125, 126, 125, 1485, + 1485, 126, 148, 125, 1485, 148, 148, 125, + 148, 1485, 1485, 125, 126, 2, 126, 2, + 148, 1485, 125, 1485, 1485, 1485, 125, 126, + 126, 1485, 125, 1485, 148, 1485, 125, 148, + 125, 126, 125, 125, 1485, 1485, 148, 1485, + 148, 126, 148, 125, 1485, 125, 148, 148, + 1485, 125, 126, 148, 126, 148, 2, 1485, + 1485, 1485, 148, 1485, 148, 1485, 125, 1485, + 1485, 125, 1541, 1542, 255, 1543, 257, 258, + 259, 260, 261, 262, 263, 151, 1544, 265, + 1545, 267, 1546, 269, 125, 1485, 1485, 1485, + 125, 125, 148, 148, 125, 125, 125, 1485, + 1485, 125, 125, 1485, 125, 148, 1485, 125, + 125, 148, 148, 148, 148, 148, 1485, 125, + 1547, 1548, 1044, 272, 151, 273, 1045, 1046, + 1047, 1048, 125, 148, 1485, 1049, 148, 125, + 1485, 1049, 1049, 125, 153, 274, 275, 153, + 1549, 1550, 1551, 1552, 280, 281, 282, 1553, + 284, 1554, 1555, 1556, 1557, 1558, 1559, 1560, + 1561, 1562, 1563, 295, 296, 152, 1564, 153, + 151, 125, 2, 126, 2, 148, 148, 148, + 1485, 1485, 125, 148, 1485, 148, 125, 1485, + 125, 148, 1485, 1485, 1485, 1485, 125, 148, + 1485, 148, 1485, 125, 148, 148, 125, 126, + 125, 148, 125, 1485, 126, 148, 1485, 148, + 125, 1485, 125, 125, 148, 1485, 148, 1485, + 125, 148, 125, 126, 125, 125, 126, 125, + 1485, 148, 1485, 125, 1485, 148, 1485, 126, + 1485, 125, 1485, 1485, 1485, 1485, 125, 1485, + 148, 1485, 148, 1485, 125, 148, 1485, 1485, + 126, 125, 1565, 674, 302, 303, 304, 305, + 306, 307, 1566, 1567, 1568, 1569, 1194, 1570, + 1571, 151, 125, 1485, 572, 148, 148, 572, + 572, 572, 125, 1485, 1485, 1485, 125, 1485, + 148, 148, 125, 1485, 125, 148, 1485, 148, + 125, 1485, 148, 125, 1049, 148, 148, 148, + 148, 1485, 125, 1572, 1573, 317, 318, 319, + 1574, 1575, 1576, 1577, 324, 125, 325, 326, + 153, 327, 328, 1578, 330, 1579, 332, 1580, + 334, 335, 153, 151, 1581, 337, 338, 153, + 339, 340, 341, 342, 343, 344, 345, 346, + 1582, 348, 349, 1583, 351, 352, 353, 153, + 259, 151, 354, 125, 1485, 125, 1485, 125, + 148, 125, 1485, 125, 148, 2, 126, 2, + 148, 148, 1485, 1485, 1485, 1485, 148, 148, + 148, 1485, 125, 148, 148, 1485, 125, 1584, + 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, + 364, 1593, 1594, 1595, 1596, 1597, 1598, 1599, + 1596, 1600, 1601, 1602, 1603, 375, 1604, 377, + 125, 1485, 148, 1485, 125, 125, 126, 125, + 1485, 148, 125, 125, 1485, 148, 126, 2, + 1485, 148, 1485, 126, 125, 1485, 148, 148, + 125, 1485, 148, 1485, 125, 125, 148, 125, + 125, 126, 148, 125, 1485, 148, 148, 1485, + 125, 1485, 125, 126, 125, 148, 148, 1485, + 148, 148, 148, 148, 148, 148, 1485, 125, + 148, 1485, 1485, 1485, 1485, 148, 1485, 1485, + 1485, 125, 148, 1485, 125, 125, 148, 125, + 126, 125, 1485, 148, 1485, 1485, 125, 125, + 148, 125, 1485, 148, 125, 126, 125, 1485, + 148, 1485, 125, 126, 2, 1485, 126, 125, + 126, 2, 2, 148, 153, 382, 1605, 1606, + 1607, 1608, 386, 153, 1609, 1610, 151, 125, + 148, 126, 2, 148, 1485, 125, 148, 1485, + 125, 148, 126, 148, 148, 2, 125, 1485, + 125, 148, 1485, 148, 125, 1162, 153, 389, + 1611, 125, 148, 148, 1485, 1485, 125, 1612, + 1613, 1614, 153, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 1615, 1616, 1617, + 1618, 151, 125, 1485, 1485, 125, 125, 125, + 125, 1485, 1485, 125, 2, 2, 126, 2, + 148, 1485, 1485, 125, 125, 125, 1485, 1485, + 1485, 1485, 125, 153, 1619, 409, 410, 411, + 151, 125, 125, 1485, 125, 148, 1620, 125, + 1621, 1622, 1623, 1625, 1624, 125, 1485, 1485, + 125, 125, 1485, 1485, 125, 1485, 148, 126, + 148, 148, 125, 126, 125, 125, 1626, 148, + 125, 148, 125, 126, 125, 126, 148, 1626, + 125, 125, 126, 125, 148, 126, 148, 126, + 126, 572, 572, 125, 126, 126, 1626, 126, + 148, 125, 126, 1626, 126, 148, 126, 148, + 125, 125, 125, 125, 126, 126, 126, 125, + 125, 148, 148, 126, 148, 126, 125, 125, + 148, 126, 126, 125, 148, 1626, 148, 126, + 148, 126, 148, 125, 1627, 1628, 184, 1629, + 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, + 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, + 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, + 1654, 1655, 1656, 1657, 125, 148, 148, 148, + 148, 126, 125, 148, 126, 125, 126, 125, + 148, 148, 126, 148, 125, 148, 125, 148, + 126, 125, 125, 125, 126, 126, 125, 125, + 125, 125, 126, 148, 148, 125, 125, 125, + 125, 125, 148, 125, 148, 125, 126, 126, + 126, 148, 148, 148, 148, 148, 148, 148, + 126, 125, 125, 125, 125, 125, 125, 148, + 125, 148, 125, 126, 148, 126, 148, 148, + 148, 148, 148, 148, 126, 125, 125, 125, + 148, 148, 125, 148, 125, 125, 126, 148, + 126, 148, 148, 148, 148, 148, 148, 126, + 125, 148, 126, 126, 126, 126, 148, 148, + 126, 126, 125, 126, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 126, 125, + 148, 126, 126, 126, 126, 126, 125, 148, + 126, 148, 148, 148, 148, 126, 125, 125, + 125, 125, 125, 148, 125, 148, 125, 125, + 126, 148, 126, 148, 148, 148, 148, 148, + 126, 125, 148, 126, 126, 126, 126, 148, + 126, 126, 148, 125, 148, 126, 148, 148, + 148, 126, 125, 125, 125, 148, 125, 125, + 148, 125, 125, 148, 125, 126, 148, 126, + 148, 148, 148, 125, 126, 126, 148, 126, + 126, 126, 126, 125, 126, 126, 125, 126, + 126, 125, 126, 126, 126, 125, 126, 126, + 125, 148, 126, 126, 126, 126, 126, 126, + 125, 148, 148, 126, 125, 126, 126, 148, + 126, 126, 125, 126, 125, 1658, 1659, 1660, + 217, 218, 219, 220, 221, 1661, 223, 224, + 225, 226, 227, 228, 1662, 1663, 1664, 1665, + 1666, 234, 1667, 236, 1668, 1528, 1529, 1669, + 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1538, + 1677, 151, 152, 1678, 249, 250, 251, 252, + 151, 153, 151, 125, 126, 125, 126, 126, + 126, 126, 126, 126, 125, 126, 126, 148, + 125, 125, 126, 125, 148, 148, 148, 126, + 148, 126, 125, 148, 126, 148, 148, 126, + 125, 126, 125, 125, 125, 125, 126, 126, + 126, 148, 125, 126, 148, 148, 125, 148, + 126, 126, 125, 148, 126, 125, 126, 126, + 126, 125, 126, 126, 126, 125, 126, 148, + 126, 125, 148, 125, 125, 125, 126, 126, + 148, 126, 148, 126, 148, 125, 126, 125, + 148, 148, 126, 125, 126, 126, 126, 148, + 126, 148, 126, 125, 126, 126, 125, 1679, + 1680, 255, 1681, 257, 258, 259, 260, 261, + 262, 263, 151, 1682, 265, 1683, 267, 1684, + 269, 125, 1626, 126, 1626, 126, 1485, 125, + 1626, 125, 148, 148, 125, 125, 126, 125, + 1485, 126, 125, 125, 126, 125, 148, 126, + 125, 125, 148, 148, 148, 148, 148, 126, + 125, 1685, 1686, 272, 151, 273, 125, 148, + 126, 148, 125, 126, 125, 153, 274, 275, + 153, 1549, 1687, 1688, 1689, 280, 281, 282, + 1690, 284, 1691, 1692, 1693, 1694, 1695, 1696, + 1697, 1698, 1699, 1700, 295, 296, 152, 1701, + 153, 151, 125, 148, 148, 126, 126, 125, + 148, 126, 148, 125, 126, 125, 148, 126, + 126, 126, 126, 125, 148, 126, 148, 126, + 125, 148, 148, 125, 125, 148, 125, 126, + 126, 148, 126, 148, 125, 126, 125, 125, + 148, 126, 148, 126, 125, 148, 125, 125, + 125, 125, 126, 148, 126, 125, 126, 148, + 126, 126, 126, 125, 126, 126, 126, 126, + 125, 126, 148, 126, 148, 126, 125, 148, + 126, 126, 126, 125, 1702, 674, 302, 303, + 304, 305, 306, 307, 1703, 1704, 1705, 1706, + 312, 1707, 1708, 151, 125, 126, 572, 148, + 148, 572, 572, 572, 125, 1626, 1626, 126, + 126, 1485, 125, 1626, 1626, 1626, 1485, 148, + 148, 125, 126, 125, 148, 1626, 1626, 1626, + 1626, 1485, 148, 125, 126, 148, 125, 148, + 148, 148, 148, 126, 125, 1709, 1710, 317, + 318, 319, 1711, 1712, 1713, 1714, 324, 125, + 325, 326, 153, 327, 328, 1715, 330, 1716, + 332, 1717, 334, 335, 153, 151, 1581, 337, + 338, 153, 339, 340, 341, 342, 343, 344, + 345, 346, 1718, 348, 349, 1719, 351, 352, + 353, 153, 259, 151, 354, 125, 126, 125, + 126, 125, 148, 125, 126, 125, 148, 148, + 126, 126, 126, 126, 148, 148, 148, 126, + 125, 148, 148, 126, 125, 1720, 1721, 1722, + 1587, 1723, 1724, 1725, 1726, 1727, 364, 1728, + 1729, 1730, 1731, 1732, 1733, 1734, 1731, 1735, + 1736, 1602, 1737, 375, 1604, 377, 125, 126, + 148, 126, 125, 125, 125, 126, 148, 125, + 125, 126, 126, 148, 126, 126, 125, 126, + 148, 148, 125, 126, 148, 126, 125, 125, + 148, 125, 125, 148, 125, 126, 148, 148, + 126, 125, 126, 125, 126, 125, 148, 148, + 126, 148, 148, 148, 148, 148, 148, 126, + 125, 148, 126, 126, 126, 126, 148, 126, + 126, 126, 125, 148, 126, 125, 125, 148, + 125, 125, 126, 148, 126, 126, 125, 125, + 148, 125, 126, 148, 125, 125, 126, 148, + 126, 125, 126, 126, 125, 153, 382, 1605, + 1738, 1739, 1608, 386, 153, 1740, 1741, 151, + 125, 148, 126, 125, 148, 126, 125, 125, + 126, 125, 148, 126, 148, 125, 153, 389, + 1742, 125, 148, 148, 126, 126, 125, 1743, + 1744, 1745, 153, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 1615, 1746, 1747, + 1748, 151, 125, 126, 126, 125, 125, 125, + 125, 126, 126, 125, 126, 126, 125, 125, + 125, 126, 126, 126, 126, 125, 153, 1749, + 409, 410, 411, 151, 125, 125, 126, 125, + 148, 1750, 125, 1751, 1752, 1753, 1755, 1754, + 125, 126, 126, 125, 125, 126, 126, 125, + 126, 1626, 125, 1626, 125, 125, 1626, 1626, + 125, 1626, 1626, 125, 1626, 1626, 1626, 125, + 1626, 1626, 1626, 125, 126, 1626, 1626, 126, + 125, 1626, 1626, 1626, 1626, 126, 125, 1626, + 1626, 1626, 125, 125, 1626, 1626, 125, 126, + 1626, 125, 1756, 1757, 1758, 1759, 1760, 1762, + 1763, 1764, 1766, 1767, 1768, 1769, 1770, 1771, + 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1779, + 1780, 1781, 1782, 1783, 1761, 1765, 125, 1626, + 1626, 1626, 1626, 125, 1626, 125, 1626, 125, + 125, 125, 1626, 125, 125, 125, 126, 125, + 1626, 1626, 1626, 1626, 125, 125, 125, 125, + 125, 125, 126, 125, 1626, 125, 125, 125, + 125, 126, 125, 125, 1626, 125, 125, 125, + 125, 126, 125, 1626, 1626, 1626, 1626, 125, + 1626, 1626, 1626, 1626, 1626, 126, 125, 1626, + 1626, 125, 1626, 1626, 1626, 1626, 126, 125, + 1626, 1626, 125, 125, 125, 125, 125, 125, + 126, 125, 1626, 1626, 1626, 1626, 1626, 1626, + 126, 125, 1626, 1626, 125, 125, 125, 125, + 125, 125, 126, 125, 1626, 1626, 125, 1626, + 1626, 1626, 1626, 126, 1626, 125, 1626, 1626, + 125, 1626, 126, 125, 1626, 1626, 1626, 125, + 1626, 126, 125, 1626, 1626, 1626, 1626, 126, + 1626, 125, 1626, 125, 1626, 1626, 1626, 1626, + 125, 1626, 125, 1784, 1785, 1786, 1787, 1788, + 1789, 1790, 1791, 1792, 1793, 1794, 1528, 1529, + 1795, 1796, 1797, 1798, 1799, 1800, 1801, 1802, + 1803, 1804, 1805, 125, 1626, 125, 126, 1626, + 1626, 1626, 1626, 1626, 125, 1626, 1626, 126, + 1626, 125, 1626, 125, 1626, 1626, 125, 1626, + 1626, 125, 1626, 125, 125, 125, 126, 125, + 1626, 1626, 126, 125, 1626, 125, 1626, 1626, + 125, 1626, 125, 1626, 1626, 1626, 125, 126, + 126, 1626, 125, 1626, 1626, 125, 125, 126, + 125, 125, 1626, 1626, 1626, 126, 125, 1626, + 125, 1626, 125, 126, 126, 125, 1626, 1626, + 1626, 1626, 1626, 125, 1626, 1626, 125, 1806, + 1807, 1808, 1809, 1810, 1811, 125, 1626, 1626, + 125, 1626, 1626, 125, 1626, 125, 1626, 125, + 1626, 125, 1626, 125, 1812, 1813, 125, 1626, + 125, 1626, 125, 1814, 1815, 1816, 1817, 1818, + 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, + 1827, 1828, 1829, 125, 126, 125, 1626, 1626, + 125, 1626, 125, 1626, 125, 1626, 1626, 1626, + 1626, 125, 1626, 1626, 125, 125, 126, 125, + 125, 1626, 126, 1626, 125, 1626, 125, 1626, + 1626, 125, 125, 126, 125, 125, 126, 125, + 1626, 1626, 125, 1626, 1626, 126, 1626, 125, + 1626, 1626, 1626, 1626, 125, 1626, 1626, 1626, + 125, 1626, 1626, 126, 125, 1830, 1831, 1810, + 1816, 1832, 125, 1626, 125, 1626, 1626, 125, + 1626, 125, 1833, 1834, 1835, 1836, 1837, 1838, + 125, 1839, 1840, 1841, 1814, 1842, 1843, 125, + 1626, 125, 1626, 125, 1626, 125, 1626, 1626, + 1626, 1626, 1626, 125, 1626, 125, 1844, 1845, + 1846, 1847, 1848, 1849, 1850, 1851, 1852, 1853, + 1854, 1855, 1856, 1857, 1858, 1859, 1856, 1860, + 1861, 1602, 1862, 1814, 125, 1626, 1626, 125, + 125, 126, 125, 1626, 125, 125, 125, 1626, + 126, 125, 1626, 1626, 126, 125, 1626, 125, + 1626, 1626, 125, 125, 125, 126, 125, 1626, + 1626, 125, 1626, 126, 125, 1626, 1626, 1626, + 125, 1626, 1626, 1626, 1626, 1626, 1626, 1626, + 125, 1626, 125, 125, 126, 125, 1626, 1626, + 1626, 125, 125, 125, 1626, 125, 126, 125, + 1626, 1626, 125, 1626, 126, 125, 1814, 1863, + 1864, 1529, 1865, 1866, 125, 1626, 125, 1626, + 125, 1626, 125, 1626, 125, 1867, 125, 1626, + 1626, 125, 1868, 1869, 1870, 1871, 1872, 1873, + 1874, 125, 1626, 1626, 125, 125, 125, 125, + 1626, 1626, 125, 126, 125, 1626, 1626, 125, + 125, 125, 1626, 1626, 1626, 1626, 125, 1875, + 125, 1626, 125, 1876, 125, 1877, 1878, 128, + 129, 1879, 125, 1626, 1626, 125, 125, 1626, + 1626, 148, 1880, 148, 148, 125, 1880, 125, + 125, 1626, 148, 125, 148, 125, 1880, 125, + 1880, 148, 1626, 125, 125, 1880, 125, 148, + 1880, 148, 1880, 1880, 572, 572, 125, 1880, + 1880, 1626, 1880, 148, 125, 126, 1626, 1880, + 148, 1880, 126, 148, 125, 125, 125, 125, + 1880, 1880, 126, 125, 125, 148, 148, 1880, + 148, 1880, 125, 125, 148, 1880, 1880, 125, + 148, 1626, 148, 126, 148, 1880, 148, 125, + 1881, 1882, 184, 1883, 1884, 1885, 1886, 1887, + 1888, 1889, 1890, 1891, 1892, 1893, 1894, 1895, + 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, + 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, + 125, 148, 148, 148, 148, 1880, 125, 148, + 1880, 125, 1880, 125, 148, 148, 1880, 148, + 125, 148, 125, 126, 148, 1880, 125, 125, + 125, 1880, 1880, 125, 125, 125, 125, 1880, + 148, 148, 125, 125, 125, 125, 125, 148, + 125, 126, 148, 125, 1880, 1880, 1880, 148, + 148, 148, 148, 148, 148, 148, 1880, 125, + 125, 125, 125, 125, 125, 148, 125, 126, + 148, 125, 1880, 148, 1880, 148, 148, 148, + 148, 148, 148, 1880, 125, 125, 125, 148, + 148, 125, 148, 125, 126, 125, 1880, 148, + 1880, 148, 148, 148, 148, 148, 148, 1880, + 125, 148, 1880, 1880, 1880, 1880, 148, 148, + 1880, 126, 125, 1880, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 1880, 125, + 148, 1880, 1880, 1880, 1880, 126, 125, 148, + 1880, 148, 148, 148, 148, 1880, 125, 125, + 125, 125, 125, 148, 125, 148, 125, 126, + 125, 1880, 148, 1880, 148, 148, 148, 148, + 148, 1880, 125, 148, 1880, 1880, 1880, 1880, + 148, 1880, 126, 148, 125, 148, 1880, 148, + 148, 148, 1880, 125, 125, 125, 148, 125, + 125, 148, 125, 126, 125, 148, 125, 1880, + 148, 1880, 148, 148, 148, 125, 1880, 1880, + 148, 1880, 1880, 126, 1880, 125, 1880, 1880, + 125, 1880, 126, 125, 1880, 1880, 1880, 125, + 1880, 126, 125, 148, 1880, 1880, 1880, 1880, + 126, 1880, 125, 148, 148, 1880, 125, 1880, + 1880, 148, 1880, 1880, 125, 1880, 125, 1912, + 1913, 1914, 217, 218, 219, 220, 221, 1915, + 223, 224, 225, 226, 227, 228, 1916, 1917, + 1918, 1919, 1920, 234, 1921, 236, 1922, 1528, + 1529, 1923, 1924, 1925, 1926, 1927, 1928, 1929, + 1930, 1538, 1931, 151, 152, 1932, 249, 250, + 251, 252, 151, 153, 151, 125, 1880, 125, + 126, 1880, 1880, 1880, 1880, 1880, 125, 1880, + 1880, 126, 1880, 148, 125, 125, 1880, 125, + 148, 148, 148, 1880, 148, 1880, 125, 148, + 1880, 148, 148, 1880, 125, 1880, 125, 125, + 125, 126, 125, 1880, 1880, 126, 148, 125, + 1880, 148, 148, 125, 148, 1880, 1880, 125, + 148, 1880, 125, 1880, 1880, 1880, 125, 126, + 126, 1880, 125, 1880, 148, 1880, 125, 148, + 125, 126, 125, 125, 1880, 1880, 148, 1880, + 148, 126, 148, 125, 1880, 125, 148, 148, + 1880, 125, 1880, 1880, 1880, 148, 1880, 148, + 1880, 125, 1880, 1880, 125, 1933, 1934, 255, + 1935, 257, 258, 259, 260, 261, 262, 263, + 151, 1936, 265, 1937, 267, 1938, 269, 125, + 1626, 1880, 1626, 1880, 1485, 125, 1626, 125, + 148, 148, 125, 125, 1880, 125, 1485, 1880, + 125, 125, 1880, 125, 148, 1880, 125, 125, + 148, 148, 148, 148, 148, 1880, 125, 1939, + 1940, 272, 151, 273, 125, 148, 1880, 148, + 125, 1880, 125, 153, 274, 275, 153, 1549, + 1941, 1942, 1943, 280, 281, 282, 1944, 284, + 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, + 1953, 1954, 295, 296, 152, 1955, 153, 151, + 125, 148, 148, 1880, 1880, 125, 148, 1880, + 148, 125, 1880, 125, 148, 1880, 1880, 1880, + 1880, 125, 148, 1880, 148, 1880, 125, 148, + 148, 125, 126, 125, 148, 125, 1880, 126, + 148, 1880, 148, 125, 1880, 125, 125, 148, + 1880, 148, 1880, 125, 148, 125, 126, 125, + 125, 126, 125, 1880, 148, 1880, 125, 1880, + 148, 1880, 126, 1880, 125, 1880, 1880, 1880, + 1880, 125, 1880, 148, 1880, 148, 1880, 125, + 148, 1880, 1880, 126, 125, 1956, 674, 302, + 303, 304, 305, 306, 307, 1957, 1704, 1958, + 1706, 312, 1959, 1960, 151, 125, 1880, 572, + 148, 148, 572, 572, 572, 125, 1626, 1626, + 1880, 1880, 1485, 125, 1880, 125, 148, 1880, + 148, 125, 148, 148, 148, 148, 1880, 125, + 1961, 1962, 317, 318, 319, 1963, 1964, 1965, + 1966, 324, 125, 325, 326, 153, 327, 328, + 1967, 330, 1968, 332, 1969, 334, 335, 153, + 151, 1581, 337, 338, 153, 339, 340, 341, + 342, 343, 344, 345, 346, 1970, 348, 349, + 1971, 351, 352, 353, 153, 259, 151, 354, + 125, 1880, 125, 1880, 125, 148, 125, 1880, + 125, 148, 148, 1880, 1880, 1880, 1880, 148, + 148, 148, 1880, 125, 148, 148, 1880, 125, + 1972, 1973, 1974, 1587, 1975, 1976, 1977, 1978, + 1979, 364, 1980, 1981, 1982, 1983, 1984, 1985, + 1986, 1983, 1987, 1988, 1602, 1989, 375, 1604, + 377, 125, 1880, 148, 1880, 125, 125, 126, + 125, 1880, 148, 125, 125, 1880, 1880, 148, + 1880, 126, 125, 1880, 148, 148, 125, 1880, + 148, 1880, 125, 125, 148, 125, 125, 126, + 148, 125, 1880, 148, 148, 1880, 125, 1880, + 125, 126, 125, 148, 148, 1880, 148, 148, + 148, 148, 148, 148, 1880, 125, 148, 1880, + 1880, 1880, 1880, 148, 1880, 1880, 1880, 125, + 148, 1880, 125, 125, 148, 125, 126, 125, + 1880, 148, 1880, 1880, 125, 125, 148, 125, + 1880, 148, 125, 126, 125, 1880, 148, 1880, + 125, 1880, 126, 125, 153, 382, 1605, 1990, + 1991, 1608, 386, 153, 1992, 1993, 151, 125, + 148, 1880, 125, 148, 1880, 125, 125, 1880, + 125, 148, 1880, 148, 125, 153, 389, 1994, + 125, 148, 148, 1880, 1880, 125, 1995, 1996, + 1997, 153, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 1615, 1998, 1999, 2000, + 151, 125, 1880, 1880, 125, 125, 125, 125, + 1880, 1880, 125, 1880, 1880, 125, 125, 125, + 1880, 1880, 1880, 1880, 125, 153, 2001, 409, + 410, 411, 151, 125, 125, 1880, 125, 148, + 2002, 125, 2003, 2004, 2005, 2007, 2006, 125, + 1880, 1880, 125, 125, 1880, 1880, 125, 1880, + 148, 2008, 148, 181, 148, 420, 2008, 420, + 420, 420, 148, 420, 148, 420, 2008, 420, + 2008, 148, 420, 420, 2008, 420, 148, 2008, + 148, 181, 2008, 2008, 572, 572, 420, 2008, + 2008, 2008, 148, 420, 421, 2008, 148, 2008, + 421, 148, 420, 420, 420, 420, 2008, 2008, + 421, 420, 420, 148, 148, 2008, 148, 2008, + 420, 420, 148, 2008, 2008, 420, 148, 148, + 421, 148, 2008, 148, 420, 2009, 2010, 184, + 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, + 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, + 2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, + 2035, 2036, 2037, 2038, 2039, 420, 148, 148, + 148, 148, 2008, 420, 148, 2008, 420, 2008, + 420, 148, 148, 2008, 148, 420, 148, 420, + 421, 148, 2008, 420, 420, 420, 2008, 2008, + 420, 420, 420, 420, 2008, 148, 148, 420, + 420, 420, 420, 420, 148, 420, 421, 148, + 420, 2008, 2008, 2008, 148, 148, 148, 148, + 148, 148, 148, 2008, 420, 420, 420, 420, + 420, 420, 148, 420, 421, 148, 420, 2008, + 148, 2008, 148, 148, 148, 148, 148, 148, + 2008, 420, 420, 420, 148, 148, 420, 148, + 420, 421, 420, 2008, 148, 2008, 148, 148, + 148, 148, 148, 148, 2008, 420, 148, 2008, + 2008, 2008, 2008, 148, 148, 2008, 421, 420, + 2008, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 2008, 420, 148, 2008, 2008, + 2008, 2008, 421, 420, 148, 2008, 148, 148, + 148, 148, 2008, 420, 420, 420, 420, 420, + 148, 420, 148, 420, 421, 420, 2008, 148, + 2008, 148, 148, 148, 148, 148, 2008, 420, + 148, 2008, 2008, 2008, 2008, 148, 2008, 421, + 148, 420, 148, 2008, 148, 148, 148, 2008, + 420, 420, 420, 148, 420, 420, 148, 420, + 421, 420, 148, 420, 2008, 148, 2008, 148, + 148, 148, 420, 2008, 2008, 148, 2008, 2008, + 421, 2008, 420, 2008, 2008, 420, 2008, 421, + 420, 2008, 2008, 2008, 420, 2008, 421, 420, + 148, 2008, 2008, 2008, 2008, 421, 2008, 420, + 148, 148, 2008, 420, 2008, 2008, 148, 2008, + 2008, 420, 2008, 420, 2040, 2041, 2042, 217, + 218, 219, 220, 221, 2043, 223, 224, 225, + 226, 227, 228, 2044, 2045, 2046, 2047, 2048, + 234, 2049, 236, 2050, 483, 484, 2051, 2052, + 2053, 2054, 2055, 2056, 2057, 2058, 646, 2059, + 151, 152, 2060, 249, 250, 251, 252, 151, + 153, 151, 420, 2008, 420, 421, 2008, 2008, + 2008, 2008, 2008, 420, 2008, 2008, 421, 2008, + 148, 420, 420, 2008, 420, 148, 148, 148, + 2008, 148, 2008, 420, 148, 2008, 148, 148, + 2008, 420, 2008, 420, 420, 420, 421, 420, + 2008, 2008, 421, 148, 420, 2008, 148, 148, + 420, 148, 2008, 2008, 420, 148, 2008, 420, + 2008, 2008, 2008, 420, 421, 421, 2008, 420, + 2008, 148, 2008, 420, 148, 420, 421, 420, + 420, 2008, 2008, 148, 2008, 148, 421, 148, + 420, 2008, 420, 148, 148, 2008, 420, 2008, + 2008, 2008, 148, 2008, 148, 2008, 420, 2008, + 2008, 420, 2061, 2062, 255, 2063, 257, 258, + 259, 260, 261, 262, 263, 151, 2064, 265, + 2065, 267, 2066, 269, 420, 181, 181, 2008, + 181, 2008, 571, 420, 420, 148, 148, 420, + 420, 2008, 420, 571, 2008, 420, 420, 2008, + 420, 148, 2008, 420, 420, 148, 148, 148, + 148, 148, 2008, 420, 2067, 2068, 272, 151, + 273, 420, 148, 2008, 148, 420, 2008, 420, + 153, 274, 275, 153, 657, 2069, 2070, 2071, + 280, 281, 282, 2072, 284, 2073, 2074, 2075, + 2076, 2077, 2078, 2079, 2080, 2081, 2082, 295, + 296, 152, 2083, 153, 151, 420, 148, 148, + 2008, 2008, 420, 148, 2008, 148, 420, 2008, + 420, 148, 2008, 2008, 2008, 2008, 420, 148, + 2008, 148, 2008, 420, 148, 148, 420, 421, + 420, 148, 420, 2008, 421, 148, 2008, 148, + 420, 2008, 420, 420, 148, 2008, 148, 2008, + 420, 148, 420, 421, 420, 420, 421, 420, + 2008, 148, 2008, 420, 2008, 148, 2008, 421, + 2008, 420, 2008, 2008, 2008, 2008, 420, 2008, + 148, 2008, 148, 2008, 420, 148, 2008, 2008, + 421, 420, 2084, 674, 302, 303, 304, 305, + 306, 307, 2085, 932, 2086, 934, 312, 2087, + 2088, 151, 420, 2008, 572, 148, 148, 572, + 572, 572, 420, 181, 2008, 2008, 571, 420, + 2008, 420, 148, 2008, 148, 420, 148, 148, + 148, 148, 2008, 420, 2089, 2090, 317, 318, + 319, 2091, 2092, 2093, 2094, 324, 420, 325, + 326, 153, 327, 328, 2095, 330, 2096, 332, + 2097, 334, 335, 153, 151, 690, 337, 338, + 153, 339, 340, 341, 342, 343, 344, 345, + 346, 2098, 348, 349, 2099, 351, 352, 353, + 153, 259, 151, 354, 420, 2008, 420, 2008, + 420, 148, 420, 2008, 420, 148, 148, 2008, + 2008, 2008, 2008, 148, 148, 148, 2008, 420, + 148, 148, 2008, 420, 2100, 2101, 2102, 696, + 2103, 2104, 2105, 2106, 2107, 364, 2108, 2109, + 2110, 2111, 2112, 2113, 2114, 2111, 2115, 2116, + 552, 2117, 375, 712, 377, 420, 2008, 148, + 2008, 420, 420, 421, 420, 2008, 148, 420, + 420, 2008, 2008, 148, 2008, 421, 420, 2008, + 148, 148, 420, 2008, 148, 2008, 420, 420, + 148, 420, 420, 421, 148, 420, 2008, 148, + 148, 2008, 420, 2008, 420, 421, 420, 148, + 148, 2008, 148, 148, 148, 148, 148, 148, + 2008, 420, 148, 2008, 2008, 2008, 2008, 148, + 2008, 2008, 2008, 420, 148, 2008, 420, 420, + 148, 420, 421, 420, 2008, 148, 2008, 2008, + 420, 420, 148, 420, 2008, 148, 420, 421, + 420, 2008, 148, 2008, 420, 2008, 421, 420, + 153, 382, 713, 2118, 2119, 716, 386, 153, + 2120, 2121, 151, 420, 148, 2008, 420, 148, + 2008, 420, 420, 2008, 420, 148, 2008, 148, + 420, 153, 389, 2122, 420, 148, 148, 2008, + 2008, 420, 2123, 2124, 2125, 153, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, + 723, 2126, 2127, 2128, 151, 420, 2008, 2008, + 420, 420, 420, 420, 2008, 2008, 420, 2008, + 2008, 420, 420, 420, 2008, 2008, 2008, 2008, + 420, 153, 2129, 409, 410, 411, 151, 420, + 420, 2008, 420, 148, 2130, 420, 2131, 2132, + 2133, 2135, 2134, 420, 2008, 2008, 420, 420, + 2008, 2008, 420, 2008, 148, 2136, 148, 148, + 420, 2136, 420, 420, 420, 148, 420, 148, + 420, 2136, 420, 2136, 148, 420, 420, 2136, + 420, 148, 2136, 148, 2136, 2136, 572, 572, + 420, 2136, 2136, 2136, 148, 420, 126, 2136, + 148, 2136, 126, 148, 420, 420, 420, 420, + 2136, 2136, 126, 420, 420, 148, 148, 2136, + 148, 2136, 420, 420, 148, 2136, 2136, 420, + 148, 148, 126, 148, 2136, 148, 420, 2137, + 2138, 184, 2139, 2140, 2141, 2142, 2143, 2144, + 2145, 2146, 2147, 2148, 2149, 2150, 2151, 2152, + 2153, 2154, 2155, 2156, 2157, 2158, 2159, 2160, + 2161, 2162, 2163, 2164, 2165, 2166, 2167, 420, + 148, 148, 148, 148, 2136, 420, 148, 2136, + 420, 2136, 420, 148, 148, 2136, 148, 420, + 148, 420, 126, 148, 2136, 420, 420, 420, + 2136, 2136, 420, 420, 420, 420, 2136, 148, + 148, 420, 420, 420, 420, 420, 148, 420, + 126, 148, 420, 2136, 2136, 2136, 148, 148, + 148, 148, 148, 148, 148, 2136, 420, 420, + 420, 420, 420, 420, 148, 420, 126, 148, + 420, 2136, 148, 2136, 148, 148, 148, 148, + 148, 148, 2136, 420, 420, 420, 148, 148, + 420, 148, 420, 126, 420, 2136, 148, 2136, + 148, 148, 148, 148, 148, 148, 2136, 420, + 148, 2136, 2136, 2136, 2136, 148, 148, 2136, + 126, 420, 2136, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 2136, 420, 148, + 2136, 2136, 2136, 2136, 126, 420, 148, 2136, + 148, 148, 148, 148, 2136, 420, 420, 420, + 420, 420, 148, 420, 148, 420, 126, 420, + 2136, 148, 2136, 148, 148, 148, 148, 148, + 2136, 420, 148, 2136, 2136, 2136, 2136, 148, + 2136, 126, 148, 420, 148, 2136, 148, 148, + 148, 2136, 420, 420, 420, 148, 420, 420, + 148, 420, 126, 420, 148, 420, 2136, 148, + 2136, 148, 148, 148, 420, 2136, 2136, 148, + 2136, 2136, 126, 2136, 420, 2136, 2136, 420, + 2136, 126, 420, 2136, 2136, 2136, 420, 2136, + 126, 420, 148, 2136, 2136, 2136, 2136, 126, + 2136, 420, 148, 148, 2136, 420, 2136, 2136, + 148, 2136, 2136, 420, 2136, 420, 2168, 2169, + 2170, 217, 218, 219, 220, 221, 2171, 223, + 224, 225, 226, 227, 228, 2172, 2173, 2174, + 2175, 2176, 234, 2177, 236, 2178, 1528, 1529, + 2179, 2180, 2181, 2182, 2183, 2184, 2185, 2186, + 1538, 2187, 151, 152, 2188, 249, 250, 251, + 252, 151, 153, 151, 420, 2136, 420, 126, + 2136, 2136, 2136, 2136, 2136, 420, 2136, 2136, + 126, 2136, 148, 420, 420, 2136, 420, 148, + 148, 148, 2136, 148, 2136, 420, 148, 2136, + 148, 148, 2136, 420, 2136, 420, 420, 420, + 126, 420, 2136, 2136, 126, 148, 420, 2136, + 148, 148, 420, 148, 2136, 2136, 420, 148, + 2136, 420, 2136, 2136, 2136, 420, 126, 126, + 2136, 420, 2136, 148, 2136, 420, 148, 420, + 126, 420, 420, 2136, 2136, 148, 2136, 148, + 126, 148, 420, 2136, 420, 148, 148, 2136, + 420, 2136, 2136, 2136, 148, 2136, 148, 2136, + 420, 2136, 2136, 420, 2189, 2190, 255, 2191, + 257, 258, 259, 260, 261, 262, 263, 151, + 2192, 265, 2193, 267, 2194, 269, 420, 2136, + 2136, 2136, 420, 420, 148, 148, 420, 420, + 420, 2136, 2136, 420, 420, 2136, 420, 148, + 2136, 420, 420, 148, 148, 148, 148, 148, + 2136, 420, 2195, 2196, 1044, 272, 151, 273, + 1045, 1046, 1047, 1048, 420, 148, 2136, 1049, + 148, 420, 2136, 1049, 1049, 420, 153, 274, + 275, 153, 1549, 2197, 2198, 2199, 280, 281, + 282, 2200, 284, 2201, 2202, 2203, 2204, 2205, + 2206, 2207, 2208, 2209, 2210, 295, 296, 152, + 2211, 153, 151, 420, 148, 148, 2136, 2136, + 420, 148, 2136, 148, 420, 2136, 420, 148, + 2136, 2136, 2136, 2136, 420, 148, 2136, 148, + 2136, 420, 148, 148, 420, 126, 420, 148, + 420, 2136, 126, 148, 2136, 148, 420, 2136, + 420, 420, 148, 2136, 148, 2136, 420, 148, + 420, 126, 420, 420, 126, 420, 2136, 148, + 2136, 420, 2136, 148, 2136, 126, 2136, 420, + 2136, 2136, 2136, 2136, 420, 2136, 148, 2136, + 148, 2136, 420, 148, 2136, 2136, 126, 420, + 2212, 674, 302, 303, 304, 305, 306, 307, + 2213, 2214, 2215, 2216, 1194, 2217, 2218, 151, + 420, 2136, 572, 148, 148, 572, 572, 572, + 420, 2136, 2136, 2136, 420, 2136, 148, 148, + 2, 2136, 420, 148, 2136, 148, 2, 2136, + 148, 420, 1049, 148, 148, 148, 148, 2136, + 420, 2219, 2220, 317, 318, 319, 2221, 2222, + 2223, 2224, 324, 420, 325, 326, 153, 327, + 328, 2225, 330, 2226, 332, 2227, 334, 335, + 153, 151, 1581, 337, 338, 153, 339, 340, + 341, 342, 343, 344, 345, 346, 2228, 348, + 349, 2229, 351, 352, 353, 153, 259, 151, + 354, 420, 2136, 420, 2136, 420, 148, 420, + 2136, 420, 148, 148, 2136, 2136, 2136, 2136, + 148, 148, 148, 2136, 420, 148, 148, 2136, + 420, 2230, 2231, 2232, 1587, 2233, 2234, 2235, + 2236, 2237, 364, 2238, 2239, 2240, 2241, 2242, + 2243, 2244, 2241, 2245, 2246, 1602, 2247, 375, + 1604, 377, 420, 2136, 148, 2136, 420, 420, + 126, 420, 2136, 148, 420, 420, 2136, 2136, + 148, 2136, 126, 420, 2136, 148, 148, 420, + 2136, 148, 2136, 420, 420, 148, 420, 420, + 126, 148, 420, 2136, 148, 148, 2136, 420, + 2136, 420, 126, 420, 148, 148, 2136, 148, + 148, 148, 148, 148, 148, 2136, 420, 148, + 2136, 2136, 2136, 2136, 148, 2136, 2136, 2136, + 420, 148, 2136, 420, 420, 148, 420, 126, + 420, 2136, 148, 2136, 2136, 420, 420, 148, + 420, 2136, 148, 420, 126, 420, 2136, 148, + 2136, 420, 2136, 126, 420, 153, 382, 1605, + 2248, 2249, 1608, 386, 153, 2250, 2251, 151, + 420, 148, 2136, 420, 148, 2136, 420, 420, + 2136, 420, 148, 2136, 148, 420, 1162, 153, + 389, 2252, 420, 148, 148, 2136, 2136, 420, + 2253, 2254, 2255, 153, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 1615, 2256, + 2257, 2258, 151, 420, 2136, 2136, 420, 420, + 420, 420, 2136, 2136, 420, 2136, 2136, 420, + 420, 420, 2136, 2136, 2136, 2136, 420, 153, + 2259, 409, 410, 411, 151, 420, 420, 2136, + 420, 148, 2260, 420, 2261, 2262, 2263, 2265, + 2264, 420, 2136, 2136, 420, 420, 2136, 2136, + 420, 2136, 148, 2266, 148, 148, 420, 420, + 2266, 420, 420, 148, 420, 148, 420, 2266, + 420, 2266, 148, 420, 420, 2266, 420, 148, + 2266, 148, 2266, 2266, 572, 572, 420, 2266, + 2266, 2266, 148, 420, 126, 2266, 148, 2266, + 126, 148, 420, 420, 420, 420, 2266, 2266, + 126, 420, 420, 148, 148, 2266, 148, 2266, + 420, 420, 148, 2266, 2266, 420, 148, 148, + 126, 148, 2266, 148, 420, 2267, 2268, 184, + 2269, 2270, 2271, 2272, 2273, 2274, 2275, 2276, + 2277, 2278, 2279, 2280, 2281, 2282, 2283, 2284, + 2285, 2286, 2287, 2288, 2289, 2290, 2291, 2292, + 2293, 2294, 2295, 2296, 2297, 420, 148, 148, + 148, 148, 2266, 420, 148, 2266, 420, 2266, + 420, 148, 148, 2266, 148, 420, 148, 420, + 126, 148, 2266, 420, 420, 420, 2266, 2266, + 420, 420, 420, 420, 2266, 148, 148, 420, + 420, 420, 420, 420, 148, 420, 126, 148, + 420, 2266, 2266, 2266, 148, 148, 148, 148, + 148, 148, 148, 2266, 420, 420, 420, 420, + 420, 420, 148, 420, 126, 148, 420, 2266, + 148, 2266, 148, 148, 148, 148, 148, 148, + 2266, 420, 420, 420, 148, 148, 420, 148, + 420, 126, 420, 2266, 148, 2266, 148, 148, + 148, 148, 148, 148, 2266, 420, 148, 2266, + 2266, 2266, 2266, 148, 148, 2266, 126, 420, + 2266, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 2266, 420, 148, 2266, 2266, + 2266, 2266, 126, 420, 148, 2266, 148, 148, + 148, 148, 2266, 420, 420, 420, 420, 420, + 148, 420, 148, 420, 126, 420, 2266, 148, + 2266, 148, 148, 148, 148, 148, 2266, 420, + 148, 2266, 2266, 2266, 2266, 148, 2266, 126, + 148, 420, 148, 2266, 148, 148, 148, 2266, + 420, 420, 420, 148, 420, 420, 148, 420, + 126, 420, 148, 420, 2266, 148, 2266, 148, + 148, 148, 420, 2266, 2266, 148, 2266, 2266, + 126, 2266, 420, 2266, 2266, 420, 2266, 126, + 420, 2266, 2266, 2266, 420, 2266, 126, 420, + 148, 2266, 2266, 2266, 2266, 126, 2266, 420, + 148, 148, 2266, 420, 2266, 2266, 148, 2266, + 2266, 420, 2266, 420, 2298, 2299, 2300, 217, + 218, 219, 220, 221, 2301, 223, 224, 225, + 226, 227, 228, 2302, 2303, 2304, 2305, 2306, + 234, 2307, 236, 2308, 1528, 1529, 2309, 2310, + 2311, 2312, 2313, 2314, 2315, 2316, 1538, 2317, + 151, 152, 2318, 249, 250, 251, 252, 151, + 153, 151, 420, 2266, 420, 126, 2266, 2266, + 2266, 2266, 2266, 420, 2266, 2266, 126, 2266, + 148, 420, 420, 2266, 420, 148, 148, 148, + 2266, 148, 2266, 420, 148, 2266, 148, 148, + 2266, 420, 2266, 420, 420, 420, 126, 420, + 2266, 2266, 126, 148, 420, 2266, 148, 148, + 420, 148, 2266, 2266, 420, 148, 2266, 420, + 2266, 2266, 2266, 420, 126, 126, 2266, 420, + 2266, 148, 2266, 420, 148, 420, 126, 420, + 420, 2266, 2266, 148, 2266, 148, 126, 148, + 420, 2266, 420, 148, 148, 2266, 420, 2266, + 2266, 2266, 148, 2266, 148, 2266, 420, 2266, + 2266, 420, 2319, 2320, 255, 2321, 257, 258, + 259, 260, 261, 262, 263, 151, 2322, 265, + 2323, 267, 2324, 269, 420, 2266, 2266, 2136, + 420, 420, 148, 148, 420, 420, 2266, 420, + 2136, 2266, 420, 420, 2266, 420, 148, 2266, + 420, 420, 148, 148, 148, 148, 148, 2266, + 420, 2325, 2326, 1044, 272, 151, 273, 1045, + 1046, 1047, 1048, 420, 148, 2266, 1049, 148, + 420, 2266, 1049, 1049, 420, 153, 274, 275, + 153, 1549, 2327, 2328, 2329, 280, 281, 282, + 2330, 284, 2331, 2332, 2333, 2334, 2335, 2336, + 2337, 2338, 2339, 2340, 295, 296, 152, 2341, + 153, 151, 420, 148, 148, 2266, 2266, 420, + 148, 2266, 148, 420, 2266, 420, 148, 2266, + 2266, 2266, 2266, 420, 148, 2266, 148, 2266, + 420, 148, 148, 420, 126, 420, 148, 420, + 2266, 126, 148, 2266, 148, 420, 2266, 420, + 420, 148, 2266, 148, 2266, 420, 148, 420, + 126, 420, 420, 126, 420, 2266, 148, 2266, + 420, 2266, 148, 2266, 126, 2266, 420, 2266, + 2266, 2266, 2266, 420, 2266, 148, 2266, 148, + 2266, 420, 148, 2266, 2266, 126, 420, 2342, + 674, 302, 303, 304, 305, 306, 307, 2343, + 2214, 2344, 2216, 1194, 2345, 2346, 151, 420, + 2266, 572, 148, 148, 572, 572, 572, 420, + 2266, 2266, 2136, 420, 2266, 420, 148, 2266, + 148, 420, 1049, 148, 148, 148, 148, 2266, + 420, 2347, 2348, 317, 318, 319, 2349, 2350, + 2351, 2352, 324, 420, 325, 326, 153, 327, + 328, 2353, 330, 2354, 332, 2355, 334, 335, + 153, 151, 1581, 337, 338, 153, 339, 340, + 341, 342, 343, 344, 345, 346, 2356, 348, + 349, 2357, 351, 352, 353, 153, 259, 151, + 354, 420, 2266, 420, 2266, 420, 148, 420, + 2266, 420, 148, 148, 2266, 2266, 2266, 2266, + 148, 148, 148, 2266, 420, 148, 148, 2266, + 420, 2358, 2359, 2360, 1587, 2361, 2362, 2363, + 2364, 2365, 364, 2366, 2367, 2368, 2369, 2370, + 2371, 2372, 2369, 2373, 2374, 1602, 2375, 375, + 1604, 377, 420, 2266, 148, 2266, 420, 420, + 126, 420, 2266, 148, 420, 420, 2266, 2266, + 148, 2266, 126, 420, 2266, 148, 148, 420, + 2266, 148, 2266, 420, 420, 148, 420, 420, + 126, 148, 420, 2266, 148, 148, 2266, 420, + 2266, 420, 126, 420, 148, 148, 2266, 148, + 148, 148, 148, 148, 148, 2266, 420, 148, + 2266, 2266, 2266, 2266, 148, 2266, 2266, 2266, + 420, 148, 2266, 420, 420, 148, 420, 126, + 420, 2266, 148, 2266, 2266, 420, 420, 148, + 420, 2266, 148, 420, 126, 420, 2266, 148, + 2266, 420, 2266, 126, 420, 153, 382, 1605, + 2376, 2377, 1608, 386, 153, 2378, 2379, 151, + 420, 148, 2266, 420, 148, 2266, 420, 420, + 2266, 420, 148, 2266, 148, 420, 1162, 153, + 389, 2380, 420, 148, 148, 2266, 2266, 420, + 2381, 2382, 2383, 153, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 1615, 2384, + 2385, 2386, 151, 420, 2266, 2266, 420, 420, + 420, 420, 2266, 2266, 420, 2266, 2266, 420, + 420, 420, 2266, 2266, 2266, 2266, 420, 153, + 2387, 409, 410, 411, 151, 420, 420, 2266, + 420, 148, 2388, 420, 2389, 2390, 2391, 2393, + 2392, 420, 2266, 2266, 420, 420, 2266, 2266, + 420, 2266, 2395, 2394, 2, 2395, 2, 2395, + 2395, 2394, 2395, 2395, 2394, 2395, 2395, 2395, + 2394, 2395, 2395, 2395, 2394, 2395, 2395, 2394, + 2395, 2395, 2395, 2395, 2394, 2395, 2395, 2395, + 2394, 2394, 2395, 2395, 2394, 2395, 2394, 2396, + 2397, 2398, 2399, 2400, 2402, 2403, 2404, 2406, + 2407, 2408, 2409, 2410, 2411, 2412, 2413, 2414, + 2415, 2416, 2417, 2418, 2419, 2420, 2421, 2422, + 2423, 2401, 2405, 2394, 2395, 2395, 2395, 2395, + 2, 2395, 2, 2395, 2, 2, 2, 2395, + 2, 2, 2, 2395, 2395, 2395, 2395, 2, + 2, 2, 2, 2, 2, 2395, 2, 2, + 2, 2, 2, 2, 2395, 2, 2, 2, + 2, 2395, 2395, 2395, 2395, 2, 2395, 2395, + 2395, 2395, 2395, 2, 2395, 2395, 2, 2395, + 2395, 2395, 2395, 2, 2395, 2395, 2, 2, + 2, 2, 2, 2, 2395, 2395, 2395, 2395, + 2395, 2395, 2, 2395, 2395, 2, 2, 2, + 2, 2, 2, 2395, 2395, 2, 2395, 2395, + 2395, 2395, 2395, 2, 2395, 2395, 2, 2395, + 2, 2395, 2395, 2395, 2, 2395, 2, 2395, + 2395, 2395, 2395, 2395, 2, 2395, 2, 2395, + 2395, 2395, 2395, 2, 2395, 2, 2424, 2425, + 2426, 2427, 2428, 2429, 2430, 2431, 2432, 2433, + 2434, 2435, 2436, 2437, 2438, 2439, 2440, 2441, + 2442, 2443, 2444, 2394, 2395, 2, 2395, 2395, + 2395, 2395, 2395, 2, 2395, 2395, 2395, 2, + 2395, 2, 2395, 2395, 2, 2395, 2395, 2, + 2395, 2, 2, 2, 2395, 2395, 2, 2395, + 2, 2395, 2395, 2, 2395, 2, 2395, 2395, + 2395, 2, 2395, 2, 2395, 2395, 2, 2, + 2, 2395, 2395, 2395, 2, 2395, 2, 2395, + 2, 2395, 2395, 2395, 2395, 2395, 2, 2395, + 2395, 2, 2445, 2446, 2447, 2448, 2449, 2450, + 2394, 2395, 2395, 2, 2395, 2395, 2, 2395, + 2, 2395, 2, 2395, 2, 2395, 2, 2451, + 2452, 2394, 2395, 2, 2395, 2, 2453, 2454, + 2455, 2456, 2457, 2458, 2459, 2460, 2461, 2462, + 2463, 2464, 2465, 2466, 2467, 2394, 2395, 2395, + 2, 2395, 2, 2395, 2, 2395, 2395, 2395, + 2395, 2, 2395, 2395, 2, 2, 2, 2395, + 2395, 2, 2395, 2, 2395, 2395, 2, 2, + 2, 2395, 2395, 2, 2395, 2395, 2395, 2, + 2395, 2395, 2395, 2395, 2, 2395, 2395, 2395, + 2, 2395, 2395, 2, 2468, 2469, 2449, 2454, + 2470, 2394, 2395, 2, 2395, 2395, 2, 2395, + 2, 2471, 2472, 2473, 2474, 2475, 2476, 2394, + 2477, 2478, 2479, 2480, 2481, 2, 2395, 2, + 2395, 2, 2395, 2, 2395, 2395, 2395, 2395, + 2395, 2, 2395, 2, 2482, 2483, 2484, 2485, + 2486, 2487, 2488, 2489, 2490, 2491, 2492, 2493, + 2494, 2495, 2496, 2493, 2497, 2498, 2499, 2, + 2395, 2395, 2, 2, 2395, 2, 2, 2, + 2395, 2395, 2395, 2, 2395, 2, 2395, 2395, + 2, 2, 2, 2395, 2395, 2, 2395, 2, + 2395, 2395, 2395, 2, 2395, 2395, 2395, 2395, + 2395, 2395, 2395, 2, 2395, 2, 2, 2395, + 2395, 2395, 2, 2, 2, 2395, 2, 2395, + 2395, 2, 2395, 2, 2500, 2501, 2502, 2503, + 2, 2395, 2, 2395, 2, 2395, 2, 2395, + 2, 2504, 2, 2395, 2395, 2, 2505, 2506, + 2507, 2508, 2509, 2510, 2, 2395, 2395, 2, + 2, 2, 2, 2395, 2395, 2, 2395, 2395, + 2, 2, 2, 2395, 2395, 2395, 2395, 2, + 2511, 2, 2395, 2, 2512, 2394, 2513, 2514, + 2515, 2517, 2516, 2, 2395, 2395, 2, 2, + 2395, 2395, 148, 2518, 148, 148, 0, 0, + 2518, 0, 0, 148, 0, 148, 0, 2518, + 0, 2518, 148, 0, 0, 2518, 0, 148, + 2518, 2518, 2518, 148, 148, 0, 2518, 2518, + 2518, 148, 0, 2518, 148, 2518, 148, 0, + 0, 0, 0, 2518, 2518, 0, 0, 0, + 148, 148, 2518, 148, 2518, 0, 0, 148, + 2518, 2518, 0, 148, 148, 148, 2518, 148, + 0, 2519, 2520, 184, 2521, 2522, 2523, 2524, + 2525, 2526, 2527, 2528, 2529, 2530, 2531, 2532, + 2533, 2534, 2535, 2536, 2537, 2538, 2539, 2540, + 2541, 2542, 2543, 2544, 2545, 2546, 2547, 2548, + 2549, 0, 148, 148, 148, 148, 2518, 0, + 148, 2518, 0, 2518, 0, 148, 148, 2518, + 148, 148, 0, 148, 2518, 0, 0, 0, + 2518, 2518, 0, 0, 0, 0, 2518, 148, + 148, 0, 0, 0, 0, 0, 148, 0, + 148, 0, 2518, 2518, 2518, 148, 148, 148, + 148, 148, 148, 148, 2518, 0, 0, 0, + 0, 0, 0, 148, 0, 148, 0, 2518, + 148, 2518, 148, 148, 148, 148, 148, 148, + 2518, 0, 0, 0, 148, 148, 0, 148, + 0, 2518, 148, 2518, 148, 148, 148, 148, + 148, 148, 2518, 0, 148, 2518, 2518, 2518, + 2518, 148, 148, 2518, 0, 2518, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, + 2518, 0, 148, 2518, 2518, 2518, 2518, 0, + 148, 2518, 148, 148, 148, 148, 2518, 0, + 0, 0, 0, 0, 148, 0, 148, 0, + 2518, 148, 2518, 148, 148, 148, 148, 148, + 2518, 0, 148, 2518, 2518, 2518, 2518, 148, + 2518, 148, 0, 148, 2518, 148, 148, 148, + 2518, 0, 0, 0, 148, 0, 0, 148, + 0, 148, 0, 2518, 148, 2518, 148, 148, + 148, 0, 2518, 2518, 148, 2518, 2518, 2518, + 0, 2518, 2518, 0, 2518, 0, 2518, 2518, + 2518, 0, 2518, 0, 148, 2518, 2518, 2518, + 2518, 2518, 0, 148, 148, 2518, 0, 2518, + 2518, 148, 2518, 2518, 0, 2518, 0, 2550, + 2551, 2552, 217, 218, 219, 220, 221, 2553, + 223, 224, 225, 226, 227, 228, 2554, 2555, + 2556, 2557, 2558, 234, 2559, 236, 2560, 2561, + 2562, 2563, 2564, 2565, 2566, 2567, 2568, 246, + 2569, 151, 152, 2570, 249, 250, 251, 252, + 151, 153, 151, 0, 2518, 0, 2518, 2518, + 2518, 2518, 2518, 0, 2518, 2518, 2518, 148, + 0, 0, 2518, 0, 148, 148, 148, 2518, + 148, 2518, 0, 148, 2518, 148, 148, 2518, + 0, 2518, 0, 0, 0, 2518, 2518, 148, + 0, 2518, 148, 148, 0, 148, 2518, 2518, + 0, 148, 2518, 0, 2518, 2518, 2518, 0, + 2518, 0, 2518, 148, 2518, 0, 148, 0, + 0, 2518, 2518, 148, 2518, 148, 148, 0, + 2518, 0, 148, 148, 2518, 0, 2518, 2518, + 2518, 148, 2518, 148, 2518, 0, 2518, 2518, + 0, 2571, 2572, 255, 2573, 257, 258, 259, + 260, 261, 262, 263, 151, 2574, 265, 2575, + 267, 2576, 269, 0, 2518, 2518, 0, 148, + 148, 2518, 2518, 0, 2518, 0, 0, 2518, + 0, 148, 2518, 0, 0, 148, 148, 148, + 148, 148, 2518, 0, 2577, 2578, 272, 151, + 273, 0, 148, 2518, 148, 0, 2518, 0, + 153, 274, 275, 153, 276, 2579, 2580, 2581, + 280, 281, 282, 2582, 284, 2583, 2584, 2585, + 2586, 2587, 2588, 2589, 2590, 2591, 2592, 295, + 296, 152, 2593, 153, 151, 0, 148, 148, + 2518, 2518, 0, 148, 2518, 148, 0, 2518, + 0, 148, 2518, 2518, 2518, 2518, 0, 148, + 2518, 148, 2518, 0, 148, 148, 0, 148, + 0, 2518, 148, 2518, 148, 0, 2518, 0, + 0, 148, 2518, 148, 2518, 0, 148, 0, + 0, 2518, 148, 2518, 0, 2518, 148, 2518, + 2518, 0, 2518, 2518, 2518, 2518, 0, 2518, + 148, 2518, 148, 2518, 0, 148, 2518, 2518, + 0, 2594, 301, 302, 303, 304, 305, 306, + 307, 2595, 309, 2596, 311, 312, 2597, 2598, + 151, 0, 2518, 148, 148, 148, 148, 148, + 148, 0, 2518, 2518, 0, 2518, 0, 148, + 2518, 148, 0, 148, 148, 148, 148, 2518, + 0, 2599, 2600, 317, 318, 319, 2601, 2602, + 2603, 2604, 324, 0, 325, 326, 153, 327, + 328, 2605, 330, 2606, 332, 2607, 334, 335, + 153, 151, 336, 337, 338, 153, 339, 340, + 341, 342, 343, 344, 345, 346, 2608, 348, + 349, 2609, 351, 352, 353, 153, 259, 151, + 354, 0, 2518, 0, 2518, 0, 148, 0, + 2518, 0, 148, 148, 2518, 2518, 2518, 2518, + 148, 148, 148, 2518, 0, 148, 148, 2518, + 0, 2610, 2611, 2612, 358, 2613, 2614, 2615, + 2616, 2617, 364, 2618, 2619, 2620, 2621, 2622, + 2623, 2624, 2621, 2625, 2626, 2627, 375, 376, + 377, 0, 2518, 148, 2518, 0, 0, 2518, + 148, 0, 0, 2518, 2518, 148, 2518, 0, + 2518, 148, 148, 0, 2518, 148, 2518, 0, + 148, 148, 148, 0, 0, 2518, 148, 148, + 2518, 0, 2518, 0, 148, 148, 2518, 148, + 148, 148, 148, 148, 148, 2518, 0, 148, + 2518, 2518, 2518, 2518, 148, 2518, 2518, 2518, + 0, 148, 2518, 0, 0, 148, 0, 2518, + 148, 2518, 2518, 0, 0, 148, 0, 2518, + 148, 0, 2518, 148, 2518, 0, 2518, 0, + 153, 382, 343, 2628, 2629, 385, 386, 153, + 2630, 2631, 151, 0, 148, 2518, 0, 148, + 2518, 0, 0, 2518, 0, 148, 2518, 148, + 0, 153, 389, 2632, 0, 148, 148, 2518, + 2518, 0, 2633, 2634, 2635, 153, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, + 404, 2636, 2637, 2638, 151, 0, 2518, 2518, + 0, 0, 0, 0, 2518, 2518, 0, 2518, + 2518, 0, 0, 0, 2518, 2518, 2518, 2518, + 0, 153, 2639, 409, 410, 411, 151, 0, + 0, 2518, 0, 148, 2640, 0, 2641, 2642, + 2643, 2645, 2644, 0, 2518, 2518, 0, 0, + 2518, 2518, 0, 2518, 148, 2646, 148, 148, + 420, 420, 2646, 420, 443, 148, 420, 148, + 420, 2646, 420, 2646, 148, 443, 420, 420, + 2646, 420, 148, 2646, 148, 2646, 2646, 572, + 572, 420, 2646, 2646, 443, 2646, 148, 420, + 421, 443, 2646, 148, 2646, 421, 148, 420, + 420, 420, 420, 2646, 2646, 421, 420, 420, + 148, 148, 2646, 148, 2646, 420, 420, 148, + 2646, 2646, 420, 148, 443, 148, 421, 148, + 2646, 148, 420, 2647, 2648, 184, 2649, 2650, + 2651, 2652, 2653, 2654, 2655, 2656, 2657, 2658, + 2659, 2660, 2661, 2662, 2663, 2664, 2665, 2666, + 2667, 2668, 2669, 2670, 2671, 2672, 2673, 2674, + 2675, 2676, 2677, 420, 148, 148, 148, 148, + 2646, 420, 148, 2646, 420, 2646, 420, 148, + 148, 2646, 148, 420, 148, 420, 421, 148, + 2646, 420, 420, 420, 2646, 2646, 420, 420, + 420, 420, 2646, 148, 148, 420, 420, 420, + 420, 420, 148, 420, 421, 148, 420, 2646, + 2646, 2646, 148, 148, 148, 148, 148, 148, + 148, 2646, 420, 420, 420, 420, 420, 420, + 148, 420, 421, 148, 420, 2646, 148, 2646, + 148, 148, 148, 148, 148, 148, 2646, 420, + 420, 420, 148, 148, 420, 148, 420, 421, + 420, 2646, 148, 2646, 148, 148, 148, 148, + 148, 148, 2646, 420, 148, 2646, 2646, 2646, + 2646, 148, 148, 2646, 421, 420, 2646, 148, + 148, 148, 148, 148, 148, 148, 148, 148, + 148, 2646, 420, 148, 2646, 2646, 2646, 2646, + 421, 420, 148, 2646, 148, 148, 148, 148, + 2646, 420, 420, 420, 420, 420, 148, 420, + 148, 420, 421, 420, 2646, 148, 2646, 148, + 148, 148, 148, 148, 2646, 420, 148, 2646, + 2646, 2646, 2646, 148, 2646, 421, 148, 420, + 148, 2646, 148, 148, 148, 2646, 420, 420, + 420, 148, 420, 420, 148, 420, 421, 420, + 148, 420, 2646, 148, 2646, 148, 148, 148, + 420, 2646, 2646, 148, 2646, 2646, 421, 2646, + 420, 2646, 2646, 420, 2646, 421, 420, 2646, + 2646, 2646, 420, 2646, 421, 420, 148, 2646, + 2646, 2646, 2646, 421, 2646, 420, 148, 148, + 2646, 420, 2646, 2646, 148, 2646, 2646, 420, + 2646, 420, 2678, 2679, 2680, 217, 218, 219, + 220, 221, 2681, 223, 224, 225, 226, 227, + 228, 2682, 2683, 2684, 2685, 2686, 234, 2687, + 236, 2688, 483, 484, 2689, 2690, 2691, 2692, + 2693, 2694, 2695, 2696, 646, 2697, 151, 152, + 2698, 249, 250, 251, 252, 151, 153, 151, + 420, 2646, 420, 421, 2646, 2646, 2646, 2646, + 2646, 420, 2646, 2646, 421, 2646, 148, 420, + 420, 2646, 420, 148, 148, 148, 2646, 148, + 2646, 420, 148, 2646, 148, 148, 2646, 420, + 2646, 420, 420, 420, 421, 420, 2646, 2646, + 421, 148, 420, 2646, 148, 148, 420, 148, + 2646, 2646, 420, 148, 2646, 420, 2646, 2646, + 2646, 420, 421, 421, 2646, 420, 2646, 148, + 2646, 420, 148, 420, 421, 420, 420, 2646, + 2646, 148, 2646, 148, 421, 148, 420, 2646, + 420, 148, 148, 2646, 420, 2646, 2646, 2646, + 148, 2646, 148, 2646, 420, 2646, 2646, 420, + 2699, 2700, 255, 2701, 257, 258, 259, 260, + 261, 262, 263, 151, 2702, 265, 2703, 267, + 2704, 269, 420, 443, 2646, 443, 2646, 571, + 420, 443, 420, 148, 148, 420, 420, 2646, + 420, 571, 2646, 420, 420, 2646, 420, 148, + 2646, 420, 420, 148, 148, 148, 148, 148, + 2646, 420, 2705, 2706, 272, 151, 273, 420, + 148, 2646, 148, 420, 2646, 420, 153, 274, + 275, 153, 657, 2707, 2708, 2709, 280, 281, + 282, 2710, 284, 2711, 2712, 2713, 2714, 2715, + 2716, 2717, 2718, 2719, 2720, 295, 296, 152, + 2721, 153, 151, 420, 148, 148, 2646, 2646, + 420, 148, 2646, 148, 420, 2646, 420, 148, + 2646, 2646, 2646, 2646, 420, 148, 2646, 148, + 2646, 420, 148, 148, 420, 421, 420, 148, + 420, 2646, 421, 148, 2646, 148, 420, 2646, + 420, 420, 148, 2646, 148, 2646, 420, 148, + 420, 421, 420, 420, 421, 420, 2646, 148, + 2646, 420, 2646, 148, 2646, 421, 2646, 420, + 2646, 2646, 2646, 2646, 420, 2646, 148, 2646, + 148, 2646, 420, 148, 2646, 2646, 421, 420, + 2722, 674, 302, 303, 304, 305, 306, 307, + 2723, 1321, 2724, 1323, 312, 2725, 2726, 151, + 420, 2646, 572, 148, 148, 572, 572, 572, + 420, 443, 443, 2646, 2646, 571, 420, 2646, + 420, 148, 2646, 148, 420, 148, 148, 148, + 148, 2646, 420, 2727, 2728, 317, 318, 319, + 2729, 2730, 2731, 2732, 324, 420, 325, 326, + 153, 327, 328, 2733, 330, 2734, 332, 2735, + 334, 335, 153, 151, 690, 337, 338, 153, + 339, 340, 341, 342, 343, 344, 345, 346, + 2736, 348, 349, 2737, 351, 352, 353, 153, + 259, 151, 354, 420, 2646, 420, 2646, 420, + 148, 420, 2646, 420, 148, 148, 2646, 2646, + 2646, 2646, 148, 148, 148, 2646, 420, 148, + 148, 2646, 420, 2738, 2739, 2740, 696, 2741, + 2742, 2743, 2744, 2745, 364, 2746, 2747, 2748, + 2749, 2750, 2751, 2752, 2749, 2753, 2754, 552, + 2755, 375, 712, 377, 420, 2646, 148, 2646, + 420, 420, 421, 420, 2646, 148, 420, 420, + 2646, 2646, 148, 2646, 421, 420, 2646, 148, + 148, 420, 2646, 148, 2646, 420, 420, 148, + 420, 420, 421, 148, 420, 2646, 148, 148, + 2646, 420, 2646, 420, 421, 420, 148, 148, + 2646, 148, 148, 148, 148, 148, 148, 2646, + 420, 148, 2646, 2646, 2646, 2646, 148, 2646, + 2646, 2646, 420, 148, 2646, 420, 420, 148, + 420, 421, 420, 2646, 148, 2646, 2646, 420, + 420, 148, 420, 2646, 148, 420, 421, 420, + 2646, 148, 2646, 420, 2646, 421, 420, 153, + 382, 713, 2756, 2757, 716, 386, 153, 2758, + 2759, 151, 420, 148, 2646, 420, 148, 2646, + 420, 420, 2646, 420, 148, 2646, 148, 420, + 153, 389, 2760, 420, 148, 148, 2646, 2646, + 420, 2761, 2762, 2763, 153, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 723, + 2764, 2765, 2766, 151, 420, 2646, 2646, 420, + 420, 420, 420, 2646, 2646, 420, 2646, 2646, + 420, 420, 420, 2646, 2646, 2646, 2646, 420, + 153, 2767, 409, 410, 411, 151, 420, 420, + 2646, 420, 148, 2768, 420, 2769, 2770, 2771, + 2773, 2772, 420, 2646, 2646, 420, 420, 2646, + 2646, 420, 2646, 148, 2774, 148, 148, 420, + 420, 2774, 420, 420, 148, 420, 148, 420, + 2774, 420, 2774, 148, 420, 420, 2774, 420, + 148, 2774, 148, 2774, 2774, 572, 572, 420, + 2774, 2774, 2774, 148, 420, 421, 2774, 148, + 2774, 421, 148, 420, 420, 420, 420, 2774, + 2774, 421, 420, 420, 148, 148, 2774, 148, + 2774, 420, 420, 148, 2774, 2774, 420, 148, + 148, 421, 148, 2774, 148, 420, 2775, 2776, + 184, 2777, 2778, 2779, 2780, 2781, 2782, 2783, + 2784, 2785, 2786, 2787, 2788, 2789, 2790, 2791, + 2792, 2793, 2794, 2795, 2796, 2797, 2798, 2799, + 2800, 2801, 2802, 2803, 2804, 2805, 420, 148, + 148, 148, 148, 2774, 420, 148, 2774, 420, + 2774, 420, 148, 148, 2774, 148, 420, 148, + 420, 421, 148, 2774, 420, 420, 420, 2774, + 2774, 420, 420, 420, 420, 2774, 148, 148, + 420, 420, 420, 420, 420, 148, 420, 421, + 148, 420, 2774, 2774, 2774, 148, 148, 148, + 148, 148, 148, 148, 2774, 420, 420, 420, + 420, 420, 420, 148, 420, 421, 148, 420, + 2774, 148, 2774, 148, 148, 148, 148, 148, + 148, 2774, 420, 420, 420, 148, 148, 420, + 148, 420, 421, 420, 2774, 148, 2774, 148, + 148, 148, 148, 148, 148, 2774, 420, 148, + 2774, 2774, 2774, 2774, 148, 148, 2774, 421, + 420, 2774, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 2774, 420, 148, 2774, + 2774, 2774, 2774, 421, 420, 148, 2774, 148, + 148, 148, 148, 2774, 420, 420, 420, 420, + 420, 148, 420, 148, 420, 421, 420, 2774, + 148, 2774, 148, 148, 148, 148, 148, 2774, + 420, 148, 2774, 2774, 2774, 2774, 148, 2774, + 421, 148, 420, 148, 2774, 148, 148, 148, + 2774, 420, 420, 420, 148, 420, 420, 148, + 420, 421, 420, 148, 420, 2774, 148, 2774, + 148, 148, 148, 420, 2774, 2774, 148, 2774, + 2774, 421, 2774, 420, 2774, 2774, 420, 2774, + 421, 420, 2774, 2774, 2774, 420, 2774, 421, + 420, 148, 2774, 2774, 2774, 2774, 421, 2774, + 420, 148, 148, 2774, 420, 2774, 2774, 148, + 2774, 2774, 420, 2774, 420, 2806, 2807, 2808, + 217, 218, 219, 220, 221, 2809, 223, 224, + 225, 226, 227, 228, 2810, 2811, 2812, 2813, + 2814, 234, 2815, 236, 2816, 483, 484, 2817, + 2818, 2819, 2820, 2821, 2822, 2823, 2824, 646, + 2825, 151, 152, 2826, 249, 250, 251, 252, + 151, 153, 151, 420, 2774, 420, 421, 2774, + 2774, 2774, 2774, 2774, 420, 2774, 2774, 421, + 2774, 148, 420, 420, 2774, 420, 148, 148, + 148, 2774, 148, 2774, 420, 148, 2774, 148, + 148, 2774, 420, 2774, 420, 420, 420, 421, + 420, 2774, 2774, 421, 148, 420, 2774, 148, + 148, 420, 148, 2774, 2774, 420, 148, 2774, + 420, 2774, 2774, 2774, 420, 421, 421, 2774, + 420, 2774, 148, 2774, 420, 148, 420, 421, + 420, 420, 2774, 2774, 148, 2774, 148, 421, + 148, 420, 2774, 420, 148, 148, 2774, 420, + 2774, 2774, 2774, 148, 2774, 148, 2774, 420, + 2774, 2774, 420, 2827, 2828, 255, 2829, 257, + 258, 259, 260, 261, 262, 263, 151, 2830, + 265, 2831, 267, 2832, 269, 420, 2774, 2774, + 571, 420, 420, 148, 148, 420, 420, 2774, + 420, 571, 2774, 420, 420, 2774, 420, 148, + 2774, 420, 420, 148, 148, 148, 148, 148, + 2774, 420, 2833, 2834, 1044, 272, 151, 273, + 1045, 1046, 1047, 1048, 420, 148, 2774, 1049, + 148, 420, 2774, 1049, 1049, 420, 153, 274, + 275, 153, 657, 2835, 2836, 2837, 280, 281, + 282, 2838, 284, 2839, 2840, 2841, 2842, 2843, + 2844, 2845, 2846, 2847, 2848, 295, 296, 152, + 2849, 153, 151, 420, 148, 148, 2774, 2774, + 420, 148, 2774, 148, 420, 2774, 420, 148, + 2774, 2774, 2774, 2774, 420, 148, 2774, 148, + 2774, 420, 148, 148, 420, 421, 420, 148, + 420, 2774, 421, 148, 2774, 148, 420, 2774, + 420, 420, 148, 2774, 148, 2774, 420, 148, + 420, 421, 420, 420, 421, 420, 2774, 148, + 2774, 420, 2774, 148, 2774, 421, 2774, 420, + 2774, 2774, 2774, 2774, 420, 2774, 148, 2774, + 148, 2774, 420, 148, 2774, 2774, 421, 420, + 2850, 674, 302, 303, 304, 305, 306, 307, + 2851, 676, 2852, 678, 1194, 2853, 2854, 151, + 420, 2774, 572, 148, 148, 572, 572, 572, + 420, 2774, 2774, 571, 420, 2774, 420, 148, + 2774, 148, 420, 1049, 148, 148, 148, 148, + 2774, 420, 2855, 2856, 317, 318, 319, 2857, + 2858, 2859, 2860, 324, 420, 325, 326, 153, + 327, 328, 2861, 330, 2862, 332, 2863, 334, + 335, 153, 151, 690, 337, 338, 153, 339, + 340, 341, 342, 343, 344, 345, 346, 2864, + 348, 349, 2865, 351, 352, 353, 153, 259, + 151, 354, 420, 2774, 420, 2774, 420, 148, + 420, 2774, 420, 148, 148, 2774, 2774, 2774, + 2774, 148, 148, 148, 2774, 420, 148, 148, + 2774, 420, 2866, 2867, 2868, 696, 2869, 2870, + 2871, 2872, 2873, 364, 2874, 2875, 2876, 2877, + 2878, 2879, 2880, 2877, 2881, 2882, 552, 2883, + 375, 712, 377, 420, 2774, 148, 2774, 420, + 420, 421, 420, 2774, 148, 420, 420, 2774, + 2774, 148, 2774, 421, 420, 2774, 148, 148, + 420, 2774, 148, 2774, 420, 420, 148, 420, + 420, 421, 148, 420, 2774, 148, 148, 2774, + 420, 2774, 420, 421, 420, 148, 148, 2774, + 148, 148, 148, 148, 148, 148, 2774, 420, + 148, 2774, 2774, 2774, 2774, 148, 2774, 2774, + 2774, 420, 148, 2774, 420, 420, 148, 420, + 421, 420, 2774, 148, 2774, 2774, 420, 420, + 148, 420, 2774, 148, 420, 421, 420, 2774, + 148, 2774, 420, 2774, 421, 420, 153, 382, + 713, 2884, 2885, 716, 386, 153, 2886, 2887, + 151, 420, 148, 2774, 420, 148, 2774, 420, + 420, 2774, 420, 148, 2774, 148, 420, 1162, + 153, 389, 2888, 420, 148, 148, 2774, 2774, + 420, 2889, 2890, 2891, 153, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 723, + 2892, 2893, 2894, 151, 420, 2774, 2774, 420, + 420, 420, 420, 2774, 2774, 420, 2774, 2774, + 420, 420, 420, 2774, 2774, 2774, 2774, 420, + 153, 2895, 409, 410, 411, 151, 420, 420, + 2774, 420, 148, 2896, 420, 2897, 2898, 2899, + 2901, 2900, 420, 2774, 2774, 420, 420, 2774, + 2774, 420, 2774, 2008, 148, 148, 2008, 148, + 2008, 2008, 148, 2008, 2008, 148, 2008, 2008, + 2008, 148, 2008, 2008, 2008, 148, 2008, 2008, + 148, 2008, 2008, 2008, 2008, 148, 2008, 2008, + 2008, 148, 148, 2008, 2008, 148, 2008, 148, + 2902, 2903, 2904, 2905, 2906, 2908, 2909, 2910, + 2912, 2913, 2914, 2915, 2916, 2917, 2918, 2919, + 2920, 2921, 2922, 2923, 2924, 2925, 2926, 2927, + 2928, 2929, 2907, 2911, 148, 2930, 2931, 2932, + 2933, 2934, 2935, 2936, 2937, 2938, 2939, 2940, + 2941, 2942, 2943, 2944, 2945, 2946, 2947, 2948, + 2949, 2950, 148, 2951, 2952, 2953, 2954, 2955, + 2956, 148, 2957, 2958, 148, 2959, 2960, 2961, + 2962, 2963, 2964, 2965, 2966, 2967, 2968, 2969, + 2970, 2971, 2972, 2973, 148, 2974, 2975, 2955, + 2960, 2976, 148, 2977, 2978, 2979, 2980, 2981, + 2982, 148, 2983, 148, 148, 148, 148, 148, + 2395, 0, 148, 2395, 0, 148, 148, 2395, + 148, 0, 148, 0, 126, 148, 2395, 0, + 0, 0, 2395, 2395, 0, 0, 0, 0, + 2395, 148, 148, 0, 0, 0, 0, 0, + 148, 0, 126, 148, 0, 2395, 2395, 2395, + 148, 148, 148, 148, 148, 148, 148, 2395, + 0, 0, 0, 0, 0, 0, 148, 0, + 126, 148, 0, 2395, 148, 2395, 148, 148, + 148, 148, 148, 148, 2395, 0, 0, 0, + 148, 148, 0, 148, 0, 126, 0, 2395, + 148, 2395, 148, 148, 148, 148, 148, 148, + 2395, 0, 148, 2395, 2395, 2395, 2395, 148, + 148, 2395, 126, 0, 2395, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 2395, + 0, 148, 2395, 2395, 2395, 2395, 126, 0, + 148, 2395, 148, 148, 148, 148, 2395, 0, + 0, 0, 0, 0, 148, 0, 148, 0, + 126, 0, 2395, 148, 2395, 148, 148, 148, + 148, 148, 2395, 0, 148, 2395, 2395, 2395, + 2395, 148, 2395, 126, 148, 0, 148, 2395, + 148, 148, 148, 2395, 0, 0, 0, 148, + 0, 0, 148, 0, 126, 0, 148, 0, + 2395, 148, 2395, 148, 148, 148, 0, 2395, + 2395, 148, 2395, 2395, 126, 2395, 0, 2395, + 126, 0, 2395, 126, 0, 148, 2395, 2395, + 2395, 2395, 126, 2395, 0, 148, 148, 2395, + 0, 2395, 2395, 148, 2395, 2395, 0, 126, + 2395, 2395, 2395, 2395, 2395, 0, 2395, 2395, + 126, 2395, 148, 0, 148, 2984, 148, 2984, + 148, 181, 148, 2985, 2, 2984, 2985, 2985, + 148, 2985, 148, 2985, 2984, 2985, 2984, 148, + 2985, 2985, 2984, 2985, 148, 2984, 148, 181, + 2984, 2984, 572, 572, 2985, 2984, 2984, 2984, + 148, 2985, 421, 2984, 148, 2984, 421, 148, + 2985, 2985, 2985, 2985, 2984, 2984, 421, 2985, + 2985, 148, 148, 2984, 148, 2984, 2985, 2985, + 148, 2984, 2984, 2985, 148, 148, 421, 148, + 2984, 148, 2985, 2986, 2987, 184, 2988, 2989, + 2990, 2991, 2992, 2993, 2994, 2995, 2996, 2997, + 2998, 2999, 3000, 3001, 3002, 3003, 3004, 3005, + 3006, 3007, 3008, 3009, 3010, 3011, 3012, 3013, + 3014, 3015, 3016, 2985, 148, 148, 148, 148, + 2984, 2, 148, 2984, 2, 2984, 2, 148, + 148, 2984, 148, 2, 148, 2, 421, 148, + 2984, 2, 2, 2, 2984, 2984, 2, 2, + 2, 2, 2984, 148, 148, 2, 2, 2, + 2, 2, 148, 2, 421, 148, 2, 2984, + 2984, 2984, 148, 148, 148, 148, 148, 148, + 148, 2984, 2, 2, 2, 2, 2, 2, + 148, 2, 421, 148, 2, 2984, 148, 2984, + 148, 148, 148, 148, 148, 148, 2984, 2, + 2, 2, 148, 148, 2, 148, 2, 421, + 2, 2984, 148, 2984, 148, 148, 148, 148, + 148, 148, 2984, 2, 148, 2984, 2984, 2984, + 2984, 148, 148, 2984, 421, 2, 2984, 148, + 148, 148, 148, 148, 148, 148, 148, 148, + 148, 2984, 2, 148, 2984, 2984, 2984, 2984, + 421, 2, 148, 2984, 148, 148, 148, 148, + 2984, 2, 2, 2, 2, 2, 148, 2, + 148, 2, 421, 2, 2984, 148, 2984, 148, + 148, 148, 148, 148, 2984, 2, 148, 2984, + 2984, 2984, 2984, 148, 2984, 421, 148, 2, + 148, 2984, 148, 148, 148, 2984, 2, 2, + 2, 148, 2, 2, 148, 2, 421, 2, + 148, 2, 2984, 148, 2984, 148, 148, 148, + 2, 2984, 2984, 148, 2984, 2984, 421, 2984, + 2, 2984, 2984, 2, 2984, 421, 2, 2984, + 2984, 2984, 2, 2984, 421, 2, 148, 2984, + 2984, 2984, 2984, 421, 2984, 2, 148, 148, + 2984, 2, 2984, 2984, 148, 2984, 2984, 2, + 2984, 2, 3017, 3018, 3019, 217, 3020, 3022, + 218, 219, 220, 221, 3023, 223, 224, 225, + 226, 227, 228, 3024, 3025, 3026, 3027, 3028, + 234, 3029, 236, 3030, 483, 484, 3031, 3032, + 3033, 3034, 3035, 3036, 3037, 3038, 646, 3039, + 151, 152, 3040, 249, 250, 251, 252, 3021, + 151, 153, 151, 2985, 2984, 2, 421, 2984, + 2984, 2984, 2984, 2984, 2, 2984, 2984, 421, + 2984, 148, 2, 2984, 148, 2984, 2, 2984, + 2, 148, 148, 148, 2984, 148, 2984, 2, + 148, 2984, 148, 148, 2984, 2, 2984, 2, + 2, 2, 421, 2, 2984, 2984, 421, 148, + 2, 2984, 148, 148, 2, 148, 2984, 2984, + 2, 148, 2984, 2, 2984, 2984, 2984, 2, + 421, 421, 2984, 2, 2984, 148, 2984, 2, + 148, 2, 421, 2, 2, 2984, 2984, 148, + 2984, 148, 421, 148, 2, 2984, 2, 148, + 148, 2984, 2, 2984, 2984, 2984, 148, 2984, + 148, 2984, 2, 2984, 2984, 2, 3041, 3042, + 255, 3043, 257, 258, 259, 260, 261, 262, + 263, 151, 3044, 265, 3045, 267, 3046, 269, + 2985, 181, 181, 2984, 181, 2984, 571, 2, + 2, 148, 148, 2, 2, 2984, 2, 571, + 2984, 2, 2, 2984, 2, 148, 2984, 2, + 2, 148, 148, 148, 148, 148, 2984, 2, + 3047, 3048, 3049, 3021, 3050, 3051, 3052, 2985, + 148, 2984, 148, 2, 2984, 2, 148, 2984, + 2, 2, 148, 2, 2984, 3053, 2, 3053, + 2985, 2985, 3053, 2985, 3053, 3053, 2985, 3053, + 3053, 2985, 3053, 3053, 3053, 2985, 3053, 3053, + 3053, 2985, 3053, 3053, 2985, 3053, 3053, 3053, + 3053, 2985, 3053, 3053, 3053, 2985, 2985, 3053, + 3053, 2985, 3053, 2985, 3054, 3055, 3056, 3057, + 3058, 3060, 3061, 3062, 3064, 3065, 3066, 3067, + 3068, 3069, 3070, 3071, 3072, 3073, 3074, 3075, + 3076, 3077, 3078, 3079, 3080, 3081, 3059, 3063, + 2985, 3053, 3053, 3053, 3053, 2985, 3053, 2985, + 3053, 2985, 2985, 2985, 3053, 2985, 2985, 2985, + 3053, 3053, 3053, 3053, 2985, 2985, 2985, 2985, + 2985, 2985, 3053, 2985, 2985, 2985, 2985, 2985, + 2985, 3053, 2985, 2985, 2985, 2985, 3053, 3053, + 3053, 3053, 2985, 3053, 3053, 3053, 3053, 3053, + 2985, 3053, 3053, 2985, 3053, 3053, 3053, 3053, + 2985, 3053, 3053, 2985, 2985, 2985, 2985, 2985, + 2985, 3053, 3053, 3053, 3053, 3053, 3053, 2985, + 3053, 3053, 2985, 2985, 2985, 2985, 2985, 2985, + 3053, 3053, 2985, 3053, 3053, 3053, 3053, 3053, + 2985, 3053, 3053, 2985, 3053, 2985, 3053, 3053, + 3053, 2985, 3053, 2985, 3053, 3053, 3053, 3053, + 3053, 2985, 3053, 2985, 3053, 3053, 3053, 3053, + 2985, 3053, 2985, 3082, 3083, 3084, 3085, 3087, + 3088, 3089, 3090, 3091, 3092, 3093, 3094, 3095, + 3096, 3097, 3098, 3099, 3100, 3101, 3102, 3103, + 3104, 3105, 3086, 2985, 3053, 2985, 3053, 3053, + 3053, 3053, 3053, 2985, 3053, 3053, 3053, 2985, + 3053, 2985, 3053, 3053, 2985, 3053, 3053, 2985, + 3053, 3053, 2985, 3053, 2985, 2985, 2985, 3053, + 3053, 2985, 3053, 2985, 3053, 3053, 2985, 3053, + 2985, 3053, 3053, 3053, 2985, 3053, 2985, 3053, + 3053, 2985, 2985, 2985, 3053, 3053, 3053, 2985, + 3053, 2985, 3053, 2985, 3053, 3053, 3053, 3053, + 3053, 2985, 3053, 3053, 2985, 3106, 3107, 3108, + 3109, 3110, 3111, 2985, 3053, 3053, 2985, 3053, + 3053, 2985, 3053, 2985, 3053, 2985, 3053, 2985, + 3053, 2985, 3112, 3113, 3114, 3086, 3115, 3051, + 3052, 2985, 3053, 2985, 3053, 2985, 3053, 2985, + 2985, 3053, 3053, 2, 3116, 3117, 3118, 3119, + 3120, 3121, 3122, 3123, 3124, 3125, 3126, 3127, + 3128, 3129, 3130, 3085, 3086, 2985, 3053, 3053, + 2985, 3053, 2985, 3053, 2985, 3053, 3053, 3053, + 3053, 2985, 3053, 3053, 2985, 2985, 2985, 3053, + 3053, 2985, 3053, 3053, 2985, 3053, 3053, 2985, + 2985, 2985, 3053, 3053, 2985, 3053, 3053, 3053, + 2985, 3053, 3053, 3053, 3053, 2985, 3053, 3053, + 3053, 2985, 3053, 3053, 2985, 3086, 3131, 3132, + 2985, 3086, 2985, 3053, 2985, 2985, 3053, 3133, + 3134, 3110, 3135, 3136, 2985, 3053, 2985, 3053, + 3053, 2985, 3053, 2985, 3053, 3053, 3053, 3053, + 3053, 2985, 3137, 3138, 3139, 3140, 3141, 3142, + 2985, 3143, 3144, 3145, 3146, 3147, 2985, 3053, + 2985, 3053, 2985, 3053, 2985, 3053, 3053, 3053, + 3053, 3053, 2985, 3053, 2985, 3148, 3149, 3150, + 3151, 3152, 3153, 3154, 3155, 3156, 3157, 3158, + 3159, 3160, 3161, 3162, 3159, 3163, 3164, 3165, + 2985, 3053, 3053, 2985, 2985, 3053, 2985, 2985, + 2985, 3053, 3053, 3053, 2985, 3053, 2985, 3053, + 3053, 2985, 2985, 2985, 3053, 3053, 2985, 3053, + 2985, 3053, 3053, 3053, 2985, 3053, 3053, 3053, + 3053, 3053, 3053, 3053, 2985, 3053, 2985, 2985, + 3053, 3053, 3053, 2985, 2985, 2985, 3053, 2985, + 3053, 3053, 2985, 3053, 2985, 3166, 3167, 3168, + 3169, 2985, 3053, 2985, 3053, 2985, 3053, 2985, + 3053, 2985, 3170, 2985, 3053, 3053, 2985, 3171, + 3172, 3173, 3174, 3175, 3176, 2985, 3053, 3053, + 2985, 2985, 2985, 2985, 3053, 3053, 2985, 3053, + 3053, 2985, 2985, 2985, 3053, 3053, 3053, 3053, + 2985, 3177, 2985, 3053, 2985, 3178, 2985, 3179, + 3087, 3085, 3180, 3086, 2985, 3053, 3053, 2985, + 153, 274, 275, 153, 657, 3181, 3182, 3183, + 280, 281, 282, 3184, 284, 3185, 3186, 3187, + 3188, 3189, 3190, 3191, 3192, 3193, 3194, 295, + 296, 152, 3195, 3196, 151, 3021, 2985, 148, + 148, 2984, 2984, 2, 148, 2984, 148, 2, + 2984, 2, 148, 2984, 2984, 2984, 2984, 2, + 148, 2984, 148, 2984, 2, 148, 148, 2, + 421, 2, 148, 2, 2984, 421, 148, 2984, + 148, 2, 2984, 2, 2984, 2, 148, 2984, + 148, 2984, 2, 148, 2, 421, 2, 2, + 421, 2, 2984, 148, 2984, 2, 2984, 148, + 2984, 421, 2984, 2, 2984, 2984, 2984, 2984, + 2, 2984, 148, 2984, 148, 2984, 2, 148, + 2984, 2984, 421, 2, 3021, 3197, 3198, 2985, + 3021, 2, 2984, 2, 2, 2984, 3199, 674, + 302, 303, 304, 305, 306, 307, 3200, 932, + 3201, 934, 312, 3202, 3203, 151, 2985, 2984, + 572, 148, 148, 572, 572, 572, 2, 181, + 2984, 2984, 571, 2, 2984, 2, 148, 2984, + 2, 2984, 2984, 2984, 2984, 2984, 2, 3204, + 3205, 317, 318, 319, 3206, 3207, 3208, 3209, + 324, 2985, 325, 326, 153, 327, 328, 3210, + 330, 3211, 332, 3212, 334, 335, 153, 151, + 690, 337, 338, 153, 339, 340, 341, 342, + 343, 344, 345, 346, 3213, 348, 349, 3214, + 351, 352, 353, 153, 259, 151, 354, 2, + 2984, 2, 2984, 2, 148, 2, 2984, 2, + 148, 148, 2984, 2984, 2984, 2984, 148, 148, + 148, 2984, 2, 148, 148, 2984, 2, 3215, + 3216, 3217, 696, 3218, 3219, 3220, 3221, 3222, + 364, 3223, 3224, 3225, 3226, 3227, 3228, 3229, + 3226, 3230, 3231, 552, 3232, 375, 712, 377, + 2, 2984, 148, 2984, 2, 2, 421, 2, + 2984, 148, 2, 2, 2984, 2984, 148, 2984, + 421, 2, 2984, 148, 148, 2, 2984, 148, + 2984, 2, 2, 148, 2, 2, 421, 148, + 2, 2984, 148, 148, 2984, 2, 2984, 2, + 421, 2, 148, 148, 2984, 148, 148, 148, + 148, 148, 148, 2984, 2, 148, 2984, 2984, + 2984, 2984, 148, 2984, 2984, 2984, 2, 148, + 2984, 2, 2, 148, 2, 421, 2, 2984, + 148, 2984, 2984, 2, 2, 148, 2, 2984, + 148, 2, 421, 2, 2984, 148, 2984, 2, + 2984, 421, 2, 153, 382, 713, 3233, 3234, + 716, 386, 153, 3235, 3236, 151, 2, 148, + 2984, 2, 148, 2984, 2, 2, 2984, 2, + 148, 2984, 148, 2, 153, 389, 3237, 2, + 148, 148, 2984, 2984, 2, 3238, 3239, 3240, + 153, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 723, 3241, 3242, 3243, 151, + 2, 2984, 2984, 2, 2, 2, 2, 2984, + 2984, 2, 2984, 2984, 2, 2, 2, 2984, + 2984, 2984, 2984, 2, 153, 3244, 409, 410, + 411, 151, 2, 2, 2984, 2, 148, 3245, + 2985, 3246, 3247, 3196, 3248, 3021, 2, 2984, + 2984, 2, 2, 2984, 2, 2984, 0, 2395, + 0, 148, 148, 148, 2395, 148, 2395, 0, + 148, 2395, 148, 148, 2395, 0, 0, 0, + 126, 0, 2395, 2395, 126, 148, 0, 2395, + 148, 148, 0, 148, 2395, 2395, 0, 148, + 2395, 0, 126, 126, 2395, 0, 2395, 148, + 2395, 0, 148, 0, 126, 0, 0, 2395, + 2395, 148, 2395, 148, 126, 148, 0, 2395, + 0, 148, 148, 2395, 0, 2395, 2395, 2395, + 148, 2395, 148, 2395, 0, 2395, 3249, 2395, + 2136, 0, 0, 148, 148, 0, 0, 2395, + 0, 2136, 0, 2395, 0, 148, 2395, 0, + 0, 148, 148, 148, 148, 148, 2395, 0, + 3250, 3250, 0, 3250, 3251, 2, 3250, 2, + 3250, 3250, 3251, 3250, 3250, 3251, 3250, 3250, + 3250, 3251, 3250, 3250, 3250, 3251, 3250, 3250, + 3251, 3250, 3250, 3250, 3250, 3251, 3250, 3250, + 3250, 3251, 3251, 3250, 3250, 3251, 3250, 3251, + 3252, 3253, 3254, 3255, 3256, 3258, 3259, 3260, + 3262, 3263, 3264, 3265, 3266, 3267, 3268, 3269, + 3270, 3271, 3272, 3273, 3274, 3275, 3276, 3277, + 3278, 3279, 3257, 3261, 3251, 3250, 3250, 3250, + 3250, 2, 3250, 2, 3250, 2, 2, 2, + 3250, 2, 2, 2, 3250, 3250, 3250, 3250, + 2, 2, 2, 2, 2, 2, 3250, 2, + 2, 2, 2, 2, 2, 3250, 2, 2, + 2, 2, 3250, 3250, 3250, 3250, 2, 3250, + 3250, 3250, 3250, 3250, 2, 3250, 3250, 2, + 3250, 3250, 3250, 3250, 2, 3250, 3250, 2, + 2, 2, 2, 2, 2, 3250, 3250, 3250, + 3250, 3250, 3250, 2, 3250, 3250, 2, 2, + 2, 2, 2, 2, 3250, 3250, 2, 3250, + 3250, 3250, 3250, 3250, 2, 3250, 3250, 2, + 3250, 2, 3250, 3250, 3250, 2, 3250, 2, + 3250, 3250, 3250, 3250, 3250, 2, 3250, 2, + 3250, 3250, 3250, 3250, 2, 3250, 2, 3280, + 3281, 3282, 3283, 3284, 3285, 3286, 3287, 3288, + 3289, 3290, 3291, 3292, 3293, 3294, 3295, 3296, + 3297, 3298, 3299, 3300, 3251, 3250, 2, 3250, + 3250, 3250, 3250, 3250, 2, 3250, 3250, 3250, + 2, 3250, 2, 3250, 3250, 2, 3250, 3250, + 2, 3250, 2, 2, 2, 3250, 3250, 2, + 3250, 2, 3250, 3250, 2, 3250, 2, 3250, + 3250, 3250, 2, 3250, 2, 3250, 3250, 2, + 2, 2, 3250, 3250, 3250, 2, 3250, 2, + 3250, 2, 3250, 3250, 3250, 3250, 3250, 2, + 3250, 3250, 2, 3301, 3302, 3303, 3304, 3305, + 3306, 3251, 3250, 3250, 2, 3250, 3250, 2, + 3250, 2, 3250, 2, 3250, 2, 3250, 2, + 3307, 3308, 3251, 3250, 2, 3250, 2, 3309, + 3310, 3311, 3312, 3313, 3314, 3315, 3316, 3317, + 3318, 3319, 3320, 3321, 3322, 3323, 3251, 3250, + 3250, 2, 3250, 2, 3250, 2, 3250, 3250, + 3250, 3250, 2, 3250, 3250, 2, 2, 2, + 3250, 3250, 2, 3250, 2, 3250, 3250, 2, + 2, 2, 3250, 3250, 2, 3250, 3250, 3250, + 2, 3250, 3250, 3250, 3250, 2, 3250, 3250, + 3250, 2, 3250, 3250, 2, 3324, 3325, 3305, + 3310, 3326, 3251, 3250, 2, 3250, 3250, 2, + 3250, 2, 3327, 3328, 3329, 3330, 3331, 3332, + 3251, 3333, 3334, 3335, 3336, 3337, 2, 3250, + 2, 3250, 2, 3250, 2, 3250, 3250, 3250, + 3250, 3250, 2, 3250, 2, 3338, 3339, 3340, + 3341, 3342, 3343, 3344, 3345, 3346, 3347, 3348, + 3349, 3350, 3351, 3352, 3349, 3353, 3354, 3355, + 2, 3250, 3250, 2, 2, 3250, 2, 2, + 2, 3250, 3250, 3250, 2, 3250, 2, 3250, + 3250, 2, 2, 2, 3250, 3250, 2, 3250, + 2, 3250, 3250, 3250, 2, 3250, 3250, 3250, + 3250, 3250, 3250, 3250, 2, 3250, 2, 2, + 3250, 3250, 3250, 2, 2, 2, 3250, 2, + 3250, 3250, 2, 3250, 2, 3356, 3357, 3358, + 3359, 2, 3250, 2, 3250, 2, 3250, 2, + 3250, 2, 3360, 2, 3250, 3250, 2, 3361, + 3362, 3363, 3364, 3365, 3366, 2, 3250, 3250, + 2, 2, 2, 2, 3250, 3250, 2, 3250, + 3250, 2, 2, 2, 3250, 3250, 3250, 3250, + 2, 3367, 2, 3250, 2, 3368, 3251, 3369, + 3370, 3371, 3373, 3372, 2, 3250, 3250, 2, + 2, 3250, 3250, 0, 3250, 0, 3250, 3374, + 3250, 3374, 148, 3250, 2395, 3375, 3376, 3250, + 0, 148, 3374, 148, 181, 148, 420, 420, + 3374, 420, 420, 148, 420, 148, 420, 3374, + 420, 3374, 148, 420, 420, 3374, 420, 148, + 3374, 148, 181, 3374, 3374, 572, 572, 420, + 3374, 3374, 3374, 148, 420, 421, 3374, 148, + 3374, 421, 148, 420, 420, 420, 420, 3374, + 3374, 421, 420, 420, 148, 148, 3374, 148, + 3374, 420, 420, 148, 3374, 3374, 420, 148, + 148, 421, 148, 3374, 148, 420, 3377, 3378, + 184, 3379, 3380, 3381, 3382, 3383, 3384, 3385, + 3386, 3387, 3388, 3389, 3390, 3391, 3392, 3393, + 3394, 3395, 3396, 3397, 3398, 3399, 3400, 3401, + 3402, 3403, 3404, 3405, 3406, 3407, 420, 148, + 148, 148, 148, 3374, 420, 148, 3374, 420, + 3374, 420, 148, 148, 3374, 148, 420, 148, + 420, 421, 148, 3374, 420, 420, 420, 3374, + 3374, 420, 420, 420, 420, 3374, 148, 148, + 420, 420, 420, 420, 420, 148, 420, 421, + 148, 420, 3374, 3374, 3374, 148, 148, 148, + 148, 148, 148, 148, 3374, 420, 420, 420, + 420, 420, 420, 148, 420, 421, 148, 420, + 3374, 148, 3374, 148, 148, 148, 148, 148, + 148, 3374, 420, 420, 420, 148, 148, 420, + 148, 420, 421, 420, 3374, 148, 3374, 148, + 148, 148, 148, 148, 148, 3374, 420, 148, + 3374, 3374, 3374, 3374, 148, 148, 3374, 421, + 420, 3374, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 3374, 420, 148, 3374, + 3374, 3374, 3374, 421, 420, 148, 3374, 148, + 148, 148, 148, 3374, 420, 420, 420, 420, + 420, 148, 420, 148, 420, 421, 420, 3374, + 148, 3374, 148, 148, 148, 148, 148, 3374, + 420, 148, 3374, 3374, 3374, 3374, 148, 3374, + 421, 148, 420, 148, 3374, 148, 148, 148, + 3374, 420, 420, 420, 148, 420, 420, 148, + 420, 421, 420, 148, 420, 3374, 148, 3374, + 148, 148, 148, 420, 3374, 3374, 148, 3374, + 3374, 421, 3374, 420, 3374, 3374, 420, 3374, + 421, 420, 3374, 3374, 3374, 420, 3374, 421, + 420, 148, 3374, 3374, 3374, 3374, 421, 3374, + 420, 148, 148, 3374, 420, 3374, 3374, 148, + 3374, 3374, 420, 3374, 420, 3408, 3409, 3410, + 217, 218, 219, 220, 221, 3411, 223, 224, + 225, 226, 227, 228, 3412, 3413, 3414, 3415, + 3416, 234, 3417, 236, 3418, 483, 484, 3419, + 3420, 3421, 3422, 3423, 3424, 3425, 3426, 646, + 3427, 151, 152, 3428, 249, 250, 251, 252, + 151, 153, 151, 420, 3374, 420, 421, 3374, + 3374, 3374, 3374, 3374, 420, 3374, 3374, 421, + 3374, 148, 420, 420, 3374, 420, 148, 148, + 148, 3374, 148, 3374, 420, 148, 3374, 148, + 148, 3374, 420, 3374, 420, 420, 420, 421, + 420, 3374, 3374, 421, 148, 420, 3374, 148, + 148, 420, 148, 3374, 3374, 420, 148, 3374, + 420, 3374, 3374, 3374, 420, 421, 421, 3374, + 420, 3374, 148, 3374, 420, 148, 420, 421, + 420, 420, 3374, 3374, 148, 3374, 148, 421, + 148, 420, 3374, 420, 148, 148, 3374, 420, + 3374, 3374, 3374, 148, 3374, 148, 3374, 420, + 3374, 3374, 420, 3429, 3430, 255, 3431, 257, + 258, 259, 260, 261, 262, 263, 151, 3432, + 265, 3433, 267, 3434, 269, 420, 181, 181, + 3374, 181, 3374, 571, 420, 420, 148, 148, + 420, 420, 3374, 420, 571, 3374, 420, 420, + 3374, 420, 148, 3374, 420, 420, 148, 148, + 148, 148, 148, 3374, 420, 3435, 3436, 272, + 151, 273, 420, 148, 3374, 148, 420, 3374, + 420, 153, 274, 275, 153, 657, 3437, 3438, + 3439, 280, 281, 282, 3440, 284, 3441, 3442, + 3443, 3444, 3445, 3446, 3447, 3448, 3449, 3450, + 295, 296, 152, 3451, 153, 151, 420, 148, + 148, 3374, 3374, 420, 148, 3374, 148, 420, + 3374, 420, 148, 3374, 3374, 3374, 3374, 420, + 148, 3374, 148, 3374, 420, 148, 148, 420, + 421, 420, 148, 420, 3374, 421, 148, 3374, + 148, 420, 3374, 420, 420, 148, 3374, 148, + 3374, 420, 148, 420, 421, 420, 420, 421, + 420, 3374, 148, 3374, 420, 3374, 148, 3374, + 421, 3374, 420, 3374, 3374, 3374, 3374, 420, + 3374, 148, 3374, 148, 3374, 420, 148, 3374, + 3374, 421, 420, 3452, 674, 302, 303, 304, + 305, 306, 307, 3453, 932, 3454, 934, 312, + 3455, 3456, 151, 420, 3374, 572, 148, 148, + 572, 572, 572, 420, 181, 3374, 3374, 571, + 420, 3374, 420, 148, 3374, 148, 420, 148, + 148, 148, 148, 3374, 420, 3457, 3458, 317, + 318, 319, 3459, 3460, 3461, 3462, 324, 420, + 325, 326, 153, 327, 328, 3463, 330, 3464, + 332, 3465, 334, 335, 153, 151, 690, 337, + 338, 153, 339, 340, 341, 342, 343, 344, + 345, 346, 3466, 348, 349, 3467, 351, 352, + 353, 153, 259, 151, 354, 420, 3374, 420, + 3374, 420, 148, 420, 3374, 420, 148, 148, + 3374, 3374, 3374, 3374, 148, 148, 148, 3374, + 420, 148, 148, 3374, 420, 3468, 3469, 3470, + 696, 3471, 3472, 3473, 3474, 3475, 364, 3476, + 3477, 3478, 3479, 3480, 3481, 3482, 3479, 3483, + 3484, 552, 3485, 375, 712, 377, 420, 3374, + 148, 3374, 420, 420, 421, 420, 3374, 148, + 420, 420, 3374, 3374, 148, 3374, 421, 420, + 3374, 148, 148, 420, 3374, 148, 3374, 420, + 420, 148, 420, 420, 421, 148, 420, 3374, + 148, 148, 3374, 420, 3374, 420, 421, 420, + 148, 148, 3374, 148, 148, 148, 148, 148, + 148, 3374, 420, 148, 3374, 3374, 3374, 3374, + 148, 3374, 3374, 3374, 420, 148, 3374, 420, + 420, 148, 420, 421, 420, 3374, 148, 3374, + 3374, 420, 420, 148, 420, 3374, 148, 420, + 421, 420, 3374, 148, 3374, 420, 3374, 421, + 420, 153, 382, 713, 3486, 3487, 716, 386, + 153, 3488, 3489, 151, 420, 148, 3374, 420, + 148, 3374, 420, 420, 3374, 420, 148, 3374, + 148, 420, 153, 389, 3490, 420, 148, 148, + 3374, 3374, 420, 3491, 3492, 3493, 153, 394, + 395, 396, 397, 398, 399, 400, 401, 402, + 403, 723, 3494, 3495, 3496, 151, 420, 3374, + 3374, 420, 420, 420, 420, 3374, 3374, 420, + 3374, 3374, 420, 420, 420, 3374, 3374, 3374, + 3374, 420, 153, 3497, 409, 410, 411, 151, + 420, 420, 3374, 420, 148, 3498, 420, 3499, + 3500, 3501, 3503, 3502, 420, 3374, 3374, 420, + 420, 3374, 3374, 420, 3374, 3375, 2985, 2985, + 3375, 2985, 3375, 3375, 2985, 3375, 3375, 2985, + 3375, 3375, 3375, 2985, 3375, 3375, 3375, 2985, + 3375, 3375, 2985, 3375, 3375, 3375, 3375, 2985, + 3375, 3375, 3375, 2985, 2985, 3375, 3375, 2985, + 3375, 2985, 3504, 3505, 3506, 3507, 3508, 3510, + 3511, 3512, 3514, 3515, 3516, 3517, 3518, 3519, + 3520, 3521, 3522, 3523, 3524, 3525, 3526, 3527, + 3528, 3529, 3530, 3531, 3509, 3513, 2985, 3375, + 3375, 3375, 3375, 2985, 3375, 2985, 3375, 2985, + 2985, 2985, 3375, 2985, 2985, 2985, 3375, 3375, + 3375, 3375, 2985, 2985, 2985, 2985, 2985, 2985, + 3375, 2985, 2985, 2985, 2985, 2985, 2985, 3375, + 2985, 2985, 2985, 2985, 3375, 3375, 3375, 3375, + 2985, 3375, 3375, 3375, 3375, 3375, 2985, 3375, + 3375, 2985, 3375, 3375, 3375, 3375, 2985, 3375, + 3375, 2985, 2985, 2985, 2985, 2985, 2985, 3375, + 3375, 3375, 3375, 3375, 3375, 2985, 3375, 3375, + 2985, 2985, 2985, 2985, 2985, 2985, 3375, 3375, + 2985, 3375, 3375, 3375, 3375, 3375, 2985, 3375, + 3375, 2985, 3375, 2985, 3375, 3375, 3375, 2985, + 3375, 2985, 3375, 3375, 3375, 3375, 3375, 2985, + 3375, 2985, 3375, 3375, 3375, 3375, 2985, 3375, + 2985, 3532, 3533, 3534, 3085, 3087, 3535, 3536, + 3537, 3538, 3539, 3540, 3541, 3542, 3543, 3544, + 3545, 3546, 3547, 3548, 3549, 3550, 3551, 3552, + 3086, 2985, 3375, 2985, 3375, 3375, 3375, 3375, + 3375, 2985, 3375, 3375, 3375, 2985, 3375, 2985, + 3375, 3375, 2985, 3375, 3375, 2985, 3375, 2985, + 2985, 2985, 3375, 3375, 2985, 3375, 2985, 3375, + 3375, 2985, 3375, 2985, 3375, 3375, 3375, 2985, + 3375, 2985, 3375, 3375, 2985, 2985, 2985, 3375, + 3375, 3375, 2985, 3375, 2985, 3375, 2985, 3375, + 3375, 3375, 3375, 3375, 2985, 3375, 3375, 2985, + 3553, 3554, 3555, 3556, 3557, 3558, 2985, 3375, + 3375, 2985, 3375, 3375, 2985, 3375, 2985, 3375, + 2985, 3375, 2985, 3375, 2985, 3559, 3560, 3114, + 3086, 3115, 3051, 3052, 2985, 3375, 2985, 3375, + 2985, 3561, 3562, 3563, 3564, 3565, 3566, 3567, + 3568, 3569, 3570, 3571, 3572, 3573, 3574, 3575, + 3085, 3086, 2985, 3375, 3375, 2985, 3375, 2985, + 3375, 2985, 3375, 3375, 3375, 3375, 2985, 3375, + 3375, 2985, 2985, 2985, 3375, 3375, 2985, 3375, + 3053, 2985, 3375, 3375, 2985, 2985, 2985, 3375, + 3375, 2985, 3375, 3375, 3375, 2985, 3375, 3375, + 3375, 3375, 2985, 3375, 3375, 3375, 2985, 3375, + 3375, 2985, 3576, 3577, 3557, 3578, 3579, 2985, + 3375, 2985, 3375, 3375, 2985, 3375, 3053, 2985, + 3053, 3053, 3053, 3053, 3375, 2985, 3580, 3581, + 3582, 3583, 3584, 3585, 2985, 3586, 3587, 3588, + 3589, 3590, 2985, 3375, 2985, 3375, 2985, 3375, + 2985, 3375, 3375, 3375, 3375, 3375, 2985, 3375, + 2985, 3591, 3592, 3593, 3594, 3595, 3596, 3597, + 3598, 3599, 3600, 3601, 3602, 3603, 3604, 3605, + 3602, 3606, 3607, 3608, 2985, 3375, 3375, 2985, + 2985, 3375, 2985, 2985, 2985, 3375, 3375, 3375, + 2985, 3375, 2985, 3375, 3375, 2985, 2985, 2985, + 3375, 3375, 2985, 3375, 2985, 3375, 3375, 3375, + 2985, 3375, 3375, 3375, 3375, 3375, 3375, 3375, + 2985, 3375, 2985, 2985, 3375, 3375, 3375, 2985, + 2985, 2985, 3375, 2985, 3375, 3375, 2985, 3375, + 2985, 3609, 3610, 3611, 3612, 2985, 3375, 2985, + 3375, 2985, 3375, 2985, 3375, 2985, 3613, 2985, + 3375, 3375, 2985, 3614, 3615, 3616, 3617, 3618, + 3619, 2985, 3375, 3375, 2985, 2985, 2985, 2985, + 3375, 3375, 2985, 3375, 3375, 2985, 2985, 2985, + 3375, 3375, 3375, 3375, 2985, 3620, 2985, 3375, + 2985, 3621, 2985, 3622, 3623, 3624, 3626, 3625, + 2985, 3375, 3375, 2985, 2985, 3375, 3375, 3376, + 3627, 2, 3376, 3627, 3376, 3376, 3627, 3376, + 3376, 3627, 3376, 3376, 3376, 3627, 3376, 3376, + 3376, 3627, 3376, 3376, 3627, 3376, 3376, 3376, + 3376, 3627, 3376, 3376, 3376, 3627, 3627, 3376, + 3376, 3627, 3376, 3627, 3628, 3629, 3630, 3631, + 3632, 3634, 3635, 3636, 3638, 3639, 3640, 3641, + 3642, 3643, 3644, 3645, 3646, 3647, 3648, 3649, + 3650, 3651, 3652, 3653, 3654, 3655, 3633, 3637, + 3627, 3376, 3376, 3376, 3376, 3627, 3376, 3627, + 3376, 3627, 3627, 3627, 3376, 3627, 3627, 3627, + 3376, 3376, 3376, 3376, 3627, 3627, 3627, 3627, + 3627, 3627, 3376, 3627, 3627, 3627, 3627, 3627, + 3627, 3376, 3627, 3627, 3627, 3627, 3376, 3376, + 3376, 3376, 3627, 3376, 3376, 3376, 3376, 3376, + 3627, 3376, 3376, 3627, 3376, 3376, 3376, 3376, + 3627, 3376, 3376, 3627, 3627, 3627, 3627, 3627, + 3627, 3376, 3376, 3376, 3376, 3376, 3376, 3627, + 3376, 3376, 3627, 3627, 3627, 3627, 3627, 3627, + 3376, 3376, 3627, 3376, 3376, 3376, 3376, 3376, + 3627, 3376, 3376, 3627, 3376, 3627, 3376, 3376, + 3376, 3627, 3376, 3627, 3376, 3376, 3376, 3376, + 3376, 3627, 3376, 3627, 3376, 3376, 3376, 3376, + 3627, 3376, 3627, 3656, 3657, 3658, 3659, 3660, + 3661, 3662, 3663, 3664, 3665, 3666, 3667, 3668, + 3669, 3670, 3671, 3672, 3673, 3674, 3675, 3676, + 3627, 3376, 3627, 3376, 3376, 3376, 3376, 3376, + 3627, 3376, 3376, 3376, 3627, 3376, 3627, 3376, + 3376, 3627, 3376, 3376, 3627, 3376, 3627, 3627, + 3627, 3376, 3376, 3627, 3376, 3627, 3376, 3376, + 3627, 3376, 3627, 3376, 3376, 3376, 3627, 3376, + 3627, 3376, 3376, 3627, 3627, 3627, 3376, 3376, + 3376, 3627, 3376, 3627, 3376, 3627, 3376, 3376, + 3376, 3376, 3376, 3627, 3376, 3376, 3627, 3677, + 3678, 3679, 3680, 3681, 3682, 3627, 3376, 3376, + 571, 3627, 3627, 3627, 3627, 3376, 3627, 571, + 3376, 3627, 3376, 3627, 3376, 3627, 3376, 3627, + 3683, 3684, 3685, 3686, 3687, 3688, 3689, 3627, + 3376, 3376, 3627, 3376, 3376, 3627, 2, 2, + 3376, 3376, 2, 3376, 2, 2, 3376, 3690, + 3691, 3692, 3693, 3694, 3695, 3696, 3697, 3698, + 3699, 3700, 3701, 3702, 3703, 3704, 3627, 3376, + 3376, 3627, 3376, 3627, 3376, 3627, 3376, 3376, + 3376, 3376, 3627, 3376, 3376, 3627, 3627, 3627, + 3376, 3376, 3627, 3376, 3627, 3376, 3376, 3627, + 3627, 3627, 3376, 3376, 3627, 3376, 3376, 3376, + 3627, 3376, 3376, 3376, 3376, 3627, 3376, 3376, + 3376, 3627, 3376, 3376, 3627, 3705, 3706, 1124, + 3681, 1125, 3707, 3708, 3709, 3627, 3376, 3627, + 3376, 3376, 571, 3627, 3376, 3627, 3627, 3376, + 3376, 3627, 3710, 3711, 3712, 3713, 3714, 3715, + 3627, 3716, 3717, 3718, 3719, 3720, 3627, 3376, + 3627, 3376, 3627, 3376, 3627, 3376, 3376, 3376, + 3376, 3376, 3627, 3376, 3627, 3721, 3722, 3723, + 3724, 3725, 3726, 3727, 3728, 3729, 3730, 3731, + 3732, 3733, 3734, 3735, 3732, 3736, 3737, 3738, + 3627, 3376, 3376, 3627, 3627, 3376, 3627, 3627, + 3627, 3376, 3376, 3376, 3627, 3376, 3627, 3376, + 3376, 3627, 3627, 3627, 3376, 3376, 3627, 3376, + 3627, 3376, 3376, 3376, 3627, 3376, 3376, 3376, + 3376, 3376, 3376, 3376, 3627, 3376, 3627, 3627, + 3376, 3376, 3376, 3627, 3627, 3627, 3376, 3627, + 3376, 3376, 3627, 3376, 3627, 3739, 3740, 3741, + 3742, 3627, 3376, 3627, 3376, 3627, 3376, 3627, + 3376, 3627, 3743, 3744, 3627, 3376, 3627, 3376, + 3376, 3627, 3745, 3746, 3747, 3748, 3749, 3750, + 3627, 3376, 3376, 3627, 3627, 3627, 3627, 3376, + 3376, 3627, 3376, 3376, 3627, 3627, 3627, 3376, + 3376, 3376, 3376, 3627, 3751, 3627, 3376, 3627, + 3752, 3627, 3753, 3754, 3688, 3756, 3755, 3627, + 3376, 3376, 3627, 3627, 3376, 3376, 3757, 0, + 3757, 3758, 3757, 3758, 3758, 3757, 3757, 3758, + 3757, 3757, 3758, 3757, 3757, 3757, 3758, 3757, + 3757, 3757, 3758, 3757, 3757, 3758, 3757, 3757, + 3757, 3757, 3758, 3757, 3757, 3757, 3758, 3758, + 3757, 3757, 3758, 3757, 3758, 3759, 3760, 3761, + 3762, 3763, 3765, 3766, 3767, 3769, 3770, 3771, + 3772, 3773, 3774, 3775, 3776, 3777, 3778, 3779, + 3780, 3781, 3782, 3783, 3784, 3785, 3786, 3764, + 3768, 3758, 3757, 3757, 3757, 3757, 3758, 3757, + 3758, 3757, 3758, 3758, 3758, 3757, 3758, 3758, + 3758, 3757, 3757, 3757, 3757, 3758, 3758, 3758, + 3758, 3758, 3758, 3757, 3758, 3758, 3758, 3758, + 3758, 3758, 3757, 3758, 3758, 3758, 3758, 3757, + 3757, 3757, 3757, 3758, 3757, 3757, 3757, 3757, + 3757, 3758, 3757, 3757, 3758, 3757, 3757, 3757, + 3757, 3758, 3757, 3757, 3758, 3758, 3758, 3758, + 3758, 3758, 3757, 3757, 3757, 3757, 3757, 3757, + 3758, 3757, 3757, 3758, 3758, 3758, 3758, 3758, + 3758, 3757, 3757, 3758, 3757, 3757, 3757, 3757, + 3757, 3758, 3757, 3757, 3758, 3757, 3758, 3757, + 3757, 3757, 3758, 3757, 3758, 3757, 3757, 3757, + 3757, 3757, 3758, 3757, 3758, 3757, 3757, 3757, + 3757, 3758, 3757, 3758, 3787, 3788, 3789, 3790, + 3791, 3792, 3793, 3794, 3795, 3796, 3797, 3798, + 3799, 3800, 3801, 3802, 3803, 3804, 3805, 3806, + 3807, 3758, 3757, 3758, 3757, 3757, 3757, 3757, + 3757, 3758, 3757, 3757, 3757, 3758, 3757, 3758, + 3757, 3757, 3758, 3757, 3757, 3758, 3757, 3758, + 3758, 3758, 3757, 3757, 3758, 3757, 3758, 3757, + 3757, 3758, 3757, 3758, 3757, 3757, 3757, 3758, + 3757, 3758, 3757, 3757, 3758, 3758, 3758, 3757, + 3757, 3757, 3758, 3757, 3758, 3757, 3758, 3757, + 3757, 3757, 3757, 3757, 3758, 3757, 3757, 3758, + 3808, 3809, 3810, 3811, 3812, 3813, 3758, 3757, + 3757, 3758, 3757, 3757, 3758, 3757, 3758, 3757, + 3758, 3757, 3758, 3757, 3758, 3814, 3815, 3758, + 3757, 3758, 3757, 3758, 3816, 3817, 3818, 3819, + 3820, 3821, 3822, 3823, 3824, 3825, 3826, 3827, + 3828, 3829, 3830, 3758, 3757, 3757, 3758, 3757, + 3758, 3757, 3758, 3757, 3757, 3757, 3757, 3758, + 3757, 3757, 3758, 3758, 3758, 3757, 3757, 3758, + 3757, 3758, 3757, 3757, 3758, 3758, 3758, 3757, + 3757, 3758, 3757, 3757, 3757, 3758, 3757, 3757, + 3757, 3757, 3758, 3757, 3757, 3757, 3758, 3757, + 3757, 3758, 3831, 3832, 3812, 3817, 3833, 3758, + 3757, 3758, 3757, 3757, 3758, 3757, 3758, 3834, + 3835, 3836, 3837, 3838, 3839, 3758, 3840, 3841, + 3842, 3843, 3844, 3758, 3757, 3758, 3757, 3758, + 3757, 3758, 3757, 3757, 3757, 3757, 3757, 3758, + 3757, 3758, 3845, 3846, 3847, 3848, 3849, 3850, + 3851, 3852, 3853, 3854, 3855, 3856, 3857, 3858, + 3859, 3856, 3860, 3861, 3862, 3758, 3757, 3757, + 3758, 3758, 3757, 3758, 3758, 3758, 3757, 3757, + 3757, 3758, 3757, 3758, 3757, 3757, 3758, 3758, + 3758, 3757, 3757, 3758, 3757, 3758, 3757, 3757, + 3757, 3758, 3757, 3757, 3757, 3757, 3757, 3757, + 3757, 3758, 3757, 3758, 3758, 3757, 3757, 3757, + 3758, 3758, 3758, 3757, 3758, 3757, 3757, 3758, + 3757, 3758, 3863, 3864, 3865, 3866, 3758, 3757, + 3758, 3757, 3758, 3757, 3758, 3757, 3758, 3867, + 3758, 3757, 3757, 3758, 3868, 3869, 3870, 3871, + 3872, 3873, 3758, 3757, 3757, 3758, 3758, 3758, + 3758, 3757, 3757, 3758, 3757, 3757, 3758, 3758, + 3758, 3757, 3757, 3757, 3757, 3758, 3874, 3758, + 3757, 3758, 3875, 3758, 3876, 3877, 3878, 3880, + 3879, 3758, 3757, 3757, 3758, 3758, 3757, 3757, + 0, 2395, 3376, 3376, 3757, 3881, 3250, 3881, + 3251, 3881, 3251, 3251, 3881, 3881, 3251, 3881, + 3881, 3251, 3881, 3881, 3881, 3251, 3881, 3881, + 3881, 3251, 3881, 3881, 3251, 3881, 3881, 3881, + 3881, 3251, 3881, 3881, 3881, 3251, 3251, 3881, + 3881, 3251, 3881, 3251, 3882, 3883, 3884, 3885, + 3886, 3888, 3889, 3890, 3892, 3893, 3894, 3895, + 3896, 3897, 3898, 3899, 3900, 3901, 3902, 3903, + 3904, 3905, 3906, 3907, 3908, 3909, 3887, 3891, + 3251, 3881, 3881, 3881, 3881, 3251, 3881, 3251, + 3881, 3251, 3251, 3251, 3881, 3251, 3251, 3251, + 3881, 3881, 3881, 3881, 3251, 3251, 3251, 3251, + 3251, 3251, 3881, 3251, 3251, 3251, 3251, 3251, + 3251, 3881, 3251, 3251, 3251, 3251, 3881, 3881, + 3881, 3881, 3251, 3881, 3881, 3881, 3881, 3881, + 3251, 3881, 3881, 3251, 3881, 3881, 3881, 3881, + 3251, 3881, 3881, 3251, 3251, 3251, 3251, 3251, + 3251, 3881, 3881, 3881, 3881, 3881, 3881, 3251, + 3881, 3881, 3251, 3251, 3251, 3251, 3251, 3251, + 3881, 3881, 3251, 3881, 3881, 3881, 3881, 3881, + 3251, 3881, 3881, 3251, 3881, 3251, 3881, 3881, + 3881, 3251, 3881, 3251, 3881, 3881, 3881, 3881, + 3881, 3251, 3881, 3251, 3881, 3881, 3881, 3881, + 3251, 3881, 3251, 3910, 3911, 3912, 3913, 3914, + 3915, 3916, 3917, 3918, 3919, 3920, 3921, 3922, + 3923, 3924, 3925, 3926, 3927, 3928, 3929, 3930, + 3251, 3881, 3251, 3881, 3881, 3881, 3881, 3881, + 3251, 3881, 3881, 3881, 3251, 3881, 3251, 3881, + 3881, 3251, 3881, 3881, 3251, 3881, 3251, 3251, + 3251, 3881, 3881, 3251, 3881, 3251, 3881, 3881, + 3251, 3881, 3251, 3881, 3881, 3881, 3251, 3881, + 3251, 3881, 3881, 3251, 3251, 3251, 3881, 3881, + 3881, 3251, 3881, 3251, 3881, 3251, 3881, 3881, + 3881, 3881, 3881, 3251, 3881, 3881, 3251, 3931, + 3932, 3933, 3934, 3935, 3936, 3251, 3881, 3881, + 3251, 3881, 3881, 3251, 3881, 3251, 3881, 3251, + 3881, 3251, 3881, 3251, 3937, 3938, 3251, 3881, + 3251, 3881, 3251, 3939, 3940, 3941, 3942, 3943, + 3944, 3945, 3946, 3947, 3948, 3949, 3950, 3951, + 3952, 3953, 3251, 3881, 3881, 3251, 3881, 3251, + 3881, 3251, 3881, 3881, 3881, 3881, 3251, 3881, + 3881, 3251, 3251, 3251, 3881, 3881, 3251, 3881, + 3251, 3881, 3881, 3251, 3251, 3251, 3881, 3881, + 3251, 3881, 3881, 3881, 3251, 3881, 3881, 3881, + 3881, 3251, 3881, 3881, 3881, 3251, 3881, 3881, + 3251, 3954, 3955, 3935, 3940, 3956, 3251, 3881, + 3251, 3881, 3881, 3251, 3881, 3251, 3957, 3958, + 3959, 3960, 3961, 3962, 3251, 3963, 3964, 3965, + 3966, 3967, 3251, 3881, 3251, 3881, 3251, 3881, + 3251, 3881, 3881, 3881, 3881, 3881, 3251, 3881, + 3251, 3968, 3969, 3970, 3971, 3972, 3973, 3974, + 3975, 3976, 3977, 3978, 3979, 3980, 3981, 3982, + 3979, 3983, 3984, 3985, 3251, 3881, 3881, 3251, + 3251, 3881, 3251, 3251, 3251, 3881, 3881, 3881, + 3251, 3881, 3251, 3881, 3881, 3251, 3251, 3251, + 3881, 3881, 3251, 3881, 3251, 3881, 3881, 3881, + 3251, 3881, 3881, 3881, 3881, 3881, 3881, 3881, + 3251, 3881, 3251, 3251, 3881, 3881, 3881, 3251, + 3251, 3251, 3881, 3251, 3881, 3881, 3251, 3881, + 3251, 3986, 3987, 3988, 3989, 3251, 3881, 3251, + 3881, 3251, 3881, 3251, 3881, 3251, 3990, 3251, + 3881, 3881, 3251, 3991, 3992, 3993, 3994, 3995, + 3996, 3251, 3881, 3881, 3251, 3251, 3251, 3251, + 3881, 3881, 3251, 3881, 3881, 3251, 3251, 3251, + 3881, 3881, 3881, 3881, 3251, 3997, 3251, 3881, + 3251, 3998, 3251, 3999, 4000, 4001, 4003, 4002, + 3251, 3881, 3881, 3251, 3251, 3881, 3881, 3881, + 3250, 3250, 3881, 3881, 3250, 3881, 3881, 3250, + 3881, 3881, 3881, 3250, 3881, 3881, 3881, 3250, + 3881, 3881, 3250, 3881, 3881, 3881, 3881, 3250, + 3881, 3881, 3881, 3250, 3250, 3881, 3881, 3250, + 3881, 3250, 4004, 4005, 4006, 4007, 4008, 4010, + 4011, 4012, 4014, 4015, 4016, 4017, 4018, 4019, + 4020, 4021, 4022, 4023, 4024, 4025, 4026, 4027, + 4028, 4029, 4030, 4031, 4009, 4013, 3250, 4032, + 4033, 4034, 4035, 4036, 4037, 4038, 4039, 4040, + 4041, 4042, 4043, 4044, 4045, 4046, 4047, 4048, + 4049, 4050, 4051, 4052, 3250, 4053, 4054, 4055, + 4056, 4057, 4058, 3250, 4059, 4060, 3250, 4061, + 4062, 4063, 4064, 4065, 4066, 4067, 4068, 4069, + 4070, 4071, 4072, 4073, 4074, 4075, 3250, 4076, + 4077, 4057, 4062, 4078, 3250, 4079, 4080, 4081, + 4082, 4083, 4084, 3250, 4085, 3250, 0, 3250, + 148, 148, 2395, 2395, 0, 148, 2395, 148, + 0, 2395, 0, 148, 2395, 2395, 2395, 2395, + 0, 148, 2395, 148, 2395, 0, 148, 148, + 0, 126, 0, 148, 0, 2395, 126, 148, + 2395, 148, 0, 2395, 0, 2984, 0, 148, + 2395, 148, 2395, 0, 148, 0, 126, 0, + 0, 126, 0, 2395, 148, 2395, 0, 2395, + 148, 2395, 126, 2395, 0, 2395, 148, 2395, + 148, 2395, 0, 148, 2395, 2395, 126, 0, + 4086, 2984, 148, 4086, 148, 181, 148, 2985, + 4086, 2985, 2985, 2985, 148, 2985, 148, 2985, + 4086, 2985, 4086, 148, 2985, 2985, 4086, 2985, + 148, 4086, 148, 181, 4086, 4086, 572, 572, + 2985, 4086, 4086, 4086, 148, 2985, 421, 4086, + 148, 4086, 421, 148, 2985, 2985, 2985, 2985, + 4086, 4086, 421, 2985, 2985, 148, 148, 4086, + 148, 4086, 2985, 2985, 148, 4086, 4086, 2985, + 148, 148, 421, 148, 4086, 148, 2985, 4087, + 4088, 184, 4089, 4090, 4091, 4092, 4093, 4094, + 4095, 4096, 4097, 4098, 4099, 4100, 4101, 4102, + 4103, 4104, 4105, 4106, 4107, 4108, 4109, 4110, + 4111, 4112, 4113, 4114, 4115, 4116, 4117, 2985, + 148, 148, 148, 148, 4086, 2985, 148, 4086, + 2985, 4086, 2985, 148, 148, 4086, 148, 2985, + 148, 2985, 421, 148, 4086, 2985, 2985, 2985, + 4086, 4086, 2985, 2985, 2985, 2985, 4086, 148, + 148, 2985, 2985, 2985, 2985, 2985, 148, 2985, + 421, 148, 2985, 4086, 4086, 4086, 148, 148, + 148, 148, 148, 148, 148, 4086, 2985, 2985, + 2985, 2985, 2985, 2985, 148, 2985, 421, 148, + 2985, 4086, 148, 4086, 148, 148, 148, 148, + 148, 148, 4086, 2985, 2985, 2985, 148, 148, + 2985, 148, 2985, 421, 2985, 4086, 148, 4086, + 148, 148, 148, 148, 148, 148, 4086, 2985, + 148, 4086, 4086, 4086, 4086, 148, 148, 4086, + 421, 2985, 4086, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 4086, 2985, 148, + 4086, 4086, 4086, 4086, 421, 2985, 148, 4086, + 148, 148, 148, 148, 4086, 2985, 2985, 2985, + 2985, 2985, 148, 2985, 148, 2985, 421, 2985, + 4086, 148, 4086, 148, 148, 148, 148, 148, + 4086, 2985, 148, 4086, 4086, 4086, 4086, 148, + 4086, 421, 148, 2985, 148, 4086, 148, 148, + 148, 4086, 2985, 2985, 2985, 148, 2985, 2985, + 148, 2985, 421, 2985, 148, 2985, 4086, 148, + 4086, 148, 148, 148, 2985, 4086, 4086, 148, + 4086, 4086, 421, 4086, 2985, 4086, 4086, 2985, + 4086, 421, 2985, 4086, 4086, 4086, 2985, 4086, + 421, 2985, 148, 4086, 4086, 4086, 4086, 421, + 4086, 2985, 148, 148, 4086, 2985, 4086, 4086, + 148, 4086, 4086, 2985, 4086, 2985, 4118, 4119, + 4120, 217, 3020, 3022, 218, 219, 220, 221, + 4121, 223, 224, 225, 226, 227, 228, 4122, + 4123, 4124, 4125, 4126, 234, 4127, 236, 4128, + 483, 484, 4129, 4130, 4131, 4132, 4133, 4134, + 4135, 4136, 646, 4137, 151, 152, 4138, 249, + 250, 251, 252, 3021, 151, 153, 151, 2985, + 4086, 2985, 421, 4086, 4086, 4086, 4086, 4086, + 2985, 4086, 4086, 421, 4086, 148, 2985, 2985, + 4086, 2985, 148, 148, 148, 4086, 148, 4086, + 2985, 148, 4086, 148, 148, 4086, 2985, 4086, + 2985, 2985, 2985, 421, 2985, 4086, 4086, 421, + 148, 2985, 4086, 148, 148, 2985, 148, 4086, + 4086, 2985, 148, 4086, 2985, 4086, 4086, 4086, + 2985, 421, 421, 4086, 2985, 4086, 148, 4086, + 2985, 148, 2985, 421, 2985, 2985, 4086, 4086, + 148, 4086, 148, 421, 148, 2985, 4086, 2985, + 148, 148, 4086, 2985, 4086, 4086, 4086, 148, + 4086, 148, 4086, 2985, 4086, 4086, 2985, 4139, + 4140, 255, 4141, 257, 258, 259, 260, 261, + 262, 263, 151, 4142, 265, 4143, 267, 4144, + 269, 2985, 181, 181, 4086, 181, 4086, 571, + 2985, 2985, 148, 148, 2985, 2985, 4086, 2985, + 571, 4086, 2985, 2985, 4086, 2985, 148, 4086, + 2985, 2985, 148, 148, 148, 148, 148, 4086, + 2985, 4145, 4146, 3049, 3021, 3050, 3051, 3052, + 2985, 148, 4086, 148, 2985, 4086, 2985, 153, + 274, 275, 153, 657, 4147, 4148, 4149, 280, + 281, 282, 4150, 284, 4151, 4152, 4153, 4154, + 4155, 4156, 4157, 4158, 4159, 4160, 295, 296, + 152, 4161, 3196, 151, 3021, 2985, 148, 148, + 4086, 4086, 2985, 148, 4086, 148, 2985, 4086, + 2985, 148, 4086, 4086, 4086, 4086, 2985, 148, + 4086, 148, 4086, 2985, 148, 148, 2985, 421, + 2985, 148, 2985, 4086, 421, 148, 4086, 148, + 2985, 4086, 2985, 2984, 2985, 148, 4086, 148, + 4086, 2985, 148, 2985, 421, 2985, 2985, 421, + 2985, 4086, 148, 4086, 2985, 4086, 148, 4086, + 421, 4086, 2985, 4086, 4086, 4086, 4086, 2985, + 4086, 148, 4086, 148, 4086, 2985, 148, 4086, + 4086, 421, 2985, 4162, 674, 302, 303, 304, + 305, 306, 307, 4163, 932, 4164, 934, 312, + 4165, 4166, 151, 2985, 4086, 572, 148, 148, + 572, 572, 572, 2985, 181, 4086, 4086, 571, + 2985, 4086, 2985, 148, 4086, 2984, 2985, 2984, + 2984, 2984, 2984, 4086, 2985, 4167, 4168, 317, + 318, 319, 4169, 4170, 4171, 4172, 324, 2985, + 325, 326, 153, 327, 328, 4173, 330, 4174, + 332, 4175, 334, 335, 153, 151, 690, 337, + 338, 153, 339, 340, 341, 342, 343, 344, + 345, 346, 4176, 348, 349, 4177, 351, 352, + 353, 153, 259, 151, 354, 2985, 4086, 2985, + 4086, 2985, 148, 2985, 4086, 2985, 148, 148, + 4086, 4086, 4086, 4086, 148, 148, 148, 4086, + 2985, 148, 148, 4086, 2985, 4178, 4179, 4180, + 696, 4181, 4182, 4183, 4184, 4185, 364, 4186, + 4187, 4188, 4189, 4190, 4191, 4192, 4189, 4193, + 4194, 552, 4195, 375, 712, 377, 2985, 4086, + 148, 4086, 2985, 2985, 421, 2985, 4086, 148, + 2985, 2985, 4086, 4086, 148, 4086, 421, 2985, + 4086, 148, 148, 2985, 4086, 148, 4086, 2985, + 2985, 148, 2985, 2985, 421, 148, 2985, 4086, + 148, 148, 4086, 2985, 4086, 2985, 421, 2985, + 148, 148, 4086, 148, 148, 148, 148, 148, + 148, 4086, 2985, 148, 4086, 4086, 4086, 4086, + 148, 4086, 4086, 4086, 2985, 148, 4086, 2985, + 2985, 148, 2985, 421, 2985, 4086, 148, 4086, + 4086, 2985, 2985, 148, 2985, 4086, 148, 2985, + 421, 2985, 4086, 148, 4086, 2985, 4086, 421, + 2985, 153, 382, 713, 4196, 4197, 716, 386, + 153, 4198, 4199, 151, 2985, 148, 4086, 2985, + 148, 4086, 2985, 2985, 4086, 2985, 148, 4086, + 148, 2985, 153, 389, 4200, 2985, 148, 148, + 4086, 4086, 2985, 4201, 4202, 4203, 153, 394, + 395, 396, 397, 398, 399, 400, 401, 402, + 403, 723, 4204, 4205, 4206, 151, 2985, 4086, + 4086, 2985, 2985, 2985, 2985, 4086, 4086, 2985, + 4086, 4086, 2985, 2985, 2985, 4086, 4086, 4086, + 4086, 2985, 153, 4207, 409, 410, 411, 151, + 2985, 2985, 4086, 2985, 148, 4208, 2985, 4209, + 4210, 4211, 4213, 4212, 2985, 4086, 4086, 2985, + 2985, 4086, 4086, 2985, 4086, 4086, 2984, 2984, + 4086, 4086, 2984, 4086, 4086, 2984, 4086, 4086, + 4086, 2984, 4086, 4086, 4086, 2984, 4086, 4086, + 2984, 4086, 4086, 4086, 4086, 2984, 4086, 4086, + 4086, 2984, 2984, 4086, 4086, 2984, 4086, 2984, + 4214, 4215, 4216, 4217, 4218, 4220, 4221, 4222, + 4224, 4225, 4226, 4227, 4228, 4229, 4230, 4231, + 4232, 4233, 4234, 4235, 4236, 4237, 4238, 4239, + 4240, 4241, 4219, 4223, 2984, 4242, 4243, 4244, + 4245, 4246, 4247, 4248, 4249, 4250, 4251, 4252, + 4253, 4254, 4255, 4256, 4257, 4258, 4259, 4260, + 4261, 4262, 2984, 4263, 4264, 4265, 4266, 4267, + 4268, 2984, 4269, 4270, 2984, 4271, 4272, 4273, + 4274, 4275, 4276, 4277, 4278, 4279, 4280, 4281, + 4282, 4283, 4284, 4285, 2984, 4286, 4287, 4267, + 4272, 4288, 2984, 4289, 4290, 4291, 4292, 4293, + 4294, 2984, 4295, 2984, 0, 3250, 0, 3250, + 2395, 572, 148, 148, 572, 572, 572, 0, + 2395, 2395, 2136, 0, 2395, 0, 148, 148, + 3376, 0, 2395, 2984, 0, 3376, 2984, 2984, + 2984, 2984, 2395, 0, 325, 326, 153, 327, + 328, 2477, 330, 4296, 332, 4297, 334, 335, + 153, 151, 1581, 337, 338, 153, 339, 340, + 341, 342, 343, 344, 345, 346, 4298, 348, + 349, 4299, 351, 352, 353, 153, 259, 151, + 354, 0, 2395, 0, 148, 0, 2395, 0, + 148, 148, 2395, 2395, 2395, 2395, 148, 148, + 148, 2395, 0, 148, 148, 2395, 0, 4300, + 4301, 4302, 1587, 4303, 4304, 4305, 4306, 4307, + 364, 4308, 4309, 4310, 4311, 4312, 4313, 4314, + 4311, 4315, 4316, 1602, 4317, 375, 1604, 377, + 0, 2395, 148, 2395, 0, 0, 126, 0, + 2395, 148, 0, 0, 2395, 2395, 148, 2395, + 126, 0, 2395, 148, 148, 0, 2395, 148, + 2395, 0, 0, 148, 0, 0, 126, 148, + 0, 2395, 148, 148, 2395, 0, 2395, 0, + 126, 0, 148, 148, 2395, 148, 148, 148, + 148, 148, 148, 2395, 0, 148, 2395, 2395, + 2395, 2395, 148, 2395, 2395, 2395, 0, 148, + 2395, 0, 0, 148, 0, 126, 0, 2395, + 148, 2395, 2395, 0, 0, 148, 0, 2395, + 148, 0, 126, 0, 2395, 148, 2395, 0, + 2395, 126, 0, 153, 382, 1605, 4318, 4319, + 1608, 386, 153, 4320, 4321, 151, 0, 148, + 2395, 0, 148, 2395, 0, 0, 2395, 0, + 148, 2395, 148, 0, 4322, 153, 389, 4323, + 0, 3376, 3757, 0, 148, 148, 2395, 2395, + 0, 2505, 2506, 2507, 153, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 1615, + 2508, 2509, 2510, 151, 0, 153, 4324, 409, + 410, 411, 151, 0, 0, 2395, 0, 148, + 412, 413, 414, 4325, 4326, 0, 4327, 2, + 4327, 4328, 4328, 4327, 4328, 4327, 4327, 4328, + 4327, 4327, 4328, 4327, 4327, 4327, 4328, 4327, + 4327, 4327, 4328, 4327, 4327, 4328, 4327, 4327, + 4327, 4327, 4328, 4327, 4327, 4327, 4328, 4328, + 4327, 4327, 4328, 4327, 4328, 4329, 4330, 4331, + 4332, 4333, 4335, 4336, 4337, 4339, 4340, 4341, + 4342, 4343, 4344, 4345, 4346, 4347, 4348, 4349, + 4350, 4351, 4352, 4353, 4354, 4355, 4356, 4334, + 4338, 4328, 4327, 4327, 4327, 4327, 4328, 4327, + 4328, 4327, 4328, 4328, 4328, 4327, 4328, 4328, + 4328, 4327, 4327, 4327, 4327, 4328, 4328, 4328, + 4328, 4328, 4328, 4327, 4328, 4328, 4328, 4328, + 4328, 4328, 4327, 4328, 4328, 4328, 4328, 4327, + 4327, 4327, 4327, 4328, 4327, 4327, 4327, 4327, + 4327, 4328, 4327, 4327, 4328, 4327, 4327, 4327, + 4327, 4328, 4327, 4327, 4328, 4328, 4328, 4328, + 4328, 4328, 4327, 4327, 4327, 4327, 4327, 4327, + 4328, 4327, 4327, 4328, 4328, 4328, 4328, 4328, + 4328, 4327, 4327, 4328, 4327, 4327, 4327, 4327, + 4327, 4328, 4327, 4327, 4328, 4327, 4328, 4327, + 4327, 4327, 4328, 4327, 4328, 4327, 4327, 4327, + 4327, 4327, 4328, 4327, 4328, 4327, 4327, 4327, + 4327, 4328, 4327, 4328, 4357, 4358, 4359, 4360, + 4361, 4362, 4363, 4364, 4365, 4366, 4367, 4368, + 4369, 4370, 4371, 4372, 4373, 4374, 4375, 4376, + 4377, 4328, 4327, 4328, 4327, 4327, 4327, 4327, + 4327, 4328, 4327, 4327, 4327, 4328, 4327, 4328, + 4327, 4327, 4328, 4327, 4327, 4328, 4327, 4328, + 4328, 4328, 4327, 4327, 4328, 4327, 4328, 4327, + 4327, 4328, 4327, 4328, 4327, 4327, 4327, 4328, + 4327, 4328, 4327, 4327, 4328, 4328, 4328, 4327, + 4327, 4327, 4328, 4327, 4328, 4327, 4328, 4327, + 4327, 4327, 4327, 4327, 4328, 4327, 4327, 4328, + 4378, 4379, 4380, 4381, 4382, 4383, 4328, 4327, + 4327, 4328, 4327, 4327, 4328, 4327, 4328, 4327, + 4328, 4327, 4328, 4327, 4328, 4384, 4385, 4328, + 4327, 4328, 4327, 4328, 4386, 4387, 4388, 4389, + 4390, 4391, 4392, 4393, 4394, 4395, 4396, 4397, + 4398, 4399, 4400, 4328, 4327, 4327, 4328, 4327, + 4328, 4327, 4328, 4327, 4327, 4327, 4327, 4328, + 4327, 4327, 4328, 4328, 4328, 4327, 4327, 4328, + 4327, 4328, 4327, 4327, 4328, 4328, 4328, 4327, + 4327, 4328, 4327, 4327, 4327, 4328, 4327, 4327, + 4327, 4327, 4328, 4327, 4327, 4327, 4328, 4327, + 4327, 4328, 4401, 4402, 4382, 4387, 4403, 4328, + 4327, 4328, 4327, 4327, 4328, 4327, 4328, 4404, + 4405, 4406, 4407, 4408, 4409, 4410, 4328, 4411, + 4412, 4413, 4414, 4415, 4328, 4327, 4328, 4327, + 4328, 4327, 4328, 4327, 4327, 4327, 4327, 4327, + 4328, 4327, 4328, 4416, 4417, 4418, 4419, 4420, + 4421, 4422, 4423, 4424, 4425, 4426, 4427, 4428, + 4429, 4430, 4427, 4431, 4432, 4433, 4328, 4327, + 4327, 4328, 4328, 4327, 4328, 4328, 4328, 4327, + 4327, 4327, 4328, 4327, 4328, 4327, 4327, 4328, + 4328, 4328, 4327, 4327, 4328, 4327, 4328, 4327, + 4327, 4327, 4328, 4327, 4327, 4327, 4327, 4327, + 4327, 4327, 4328, 4327, 4328, 4328, 4327, 4327, + 4327, 4328, 4328, 4328, 4327, 4328, 4327, 4327, + 4328, 4327, 4328, 4434, 4435, 4436, 4437, 4328, + 4327, 4328, 4327, 4328, 4327, 4328, 4327, 4328, + 4438, 4328, 4327, 4327, 4328, 4439, 4440, 4441, + 4442, 4443, 4444, 4328, 4327, 4327, 4328, 4328, + 4328, 4328, 4327, 4327, 4328, 4327, 4327, 4328, + 4328, 4328, 4327, 4327, 4327, 4327, 4328, 4445, + 4328, 4327, 4328, 4325, 4328, 4446, 4328, 4447, + 4448, 4449, 4451, 4450, 4328, 4327, 4327, 4328, + 4328, 4327, 4327, 3757, 0, 3371, 3372, 0, + 3372, 4452, 3371, 3372, 0, 3250, 4453, 3371, + 4454, 3372, 0, 3250, 0, 3250, 4455, 0, + 3372, 0, 3250, 3371, 4456, 3372, 0, 0, + 3250, 4458, 4460, 4463, 4464, 4465, 4467, 4468, + 4469, 4470, 4471, 4472, 4473, 4474, 4475, 4476, + 4477, 4478, 4479, 4480, 4481, 4482, 4483, 4484, + 4485, 4486, 4487, 4488, 4489, 4490, 4492, 4493, + 4495, 4496, 4497, 4498, 4459, 4461, 4462, 4462, + 4466, 4491, 4494, 4457, 4500, 122, 124, 4501, + 4502, 4503, 4504, 4505, 4506, 4507, 4508, 4509, + 4510, 4511, 4512, 4513, 4514, 4515, 4516, 4517, + 4518, 4499, 4520, 4519, 1626, 1626, 1626, 1626, + 1485, 4522, 150, 152, 153, 154, 2005, 4523, + 157, 158, 4524, 160, 161, 4525, 4526, 4527, + 4528, 4529, 4530, 4531, 4532, 4533, 4534, 4535, + 4536, 4537, 4538, 177, 4539, 4540, 4541, 126, + 148, 148, 151, 176, 4521, 1626, 1626, 1626, + 1626, 1485, 4542, 150, 152, 153, 154, 1753, + 4543, 157, 158, 4544, 160, 161, 4545, 4546, + 4547, 4548, 4549, 4550, 4551, 4552, 4553, 4554, + 4555, 4556, 4557, 4558, 177, 4559, 4560, 4561, + 126, 148, 148, 151, 176, 4521, 181, 181, + 181, 571, 4563, 150, 152, 153, 4564, 153, + 4565, 4566, 158, 4567, 160, 161, 4568, 4569, + 4570, 4571, 4572, 4573, 4574, 302, 4575, 4576, + 4577, 4578, 4579, 4580, 177, 4581, 4582, 4583, + 421, 148, 148, 151, 176, 4562, 443, 443, + 443, 443, 571, 4584, 150, 152, 153, 154, + 1370, 4585, 157, 158, 4586, 160, 161, 4587, + 4588, 4589, 4590, 4591, 4592, 4593, 4594, 4595, + 4596, 4597, 4598, 4599, 4600, 177, 4601, 4602, + 4603, 421, 148, 148, 151, 176, 4562, 571, + 4604, 150, 152, 153, 154, 1241, 4605, 157, + 158, 4606, 160, 161, 4607, 4608, 4609, 4610, + 4611, 4612, 4613, 4614, 4615, 4616, 4617, 4618, + 4619, 4620, 177, 4621, 4622, 4623, 421, 148, + 148, 151, 176, 4562, 594, 595, 181, 181, + 571, 4624, 150, 152, 153, 4564, 981, 4625, + 4566, 158, 4626, 160, 161, 4627, 4628, 4629, + 4630, 4631, 4632, 4633, 4634, 4635, 4636, 4637, + 4638, 4639, 4640, 177, 4641, 4642, 4643, 421, + 148, 148, 151, 176, 4562, 571, 4644, 150, + 152, 153, 154, 731, 4645, 157, 158, 4646, + 160, 161, 4647, 4648, 4649, 4650, 4651, 4652, + 4653, 4654, 4655, 4656, 4657, 4658, 4659, 4660, + 177, 4661, 4662, 4663, 421, 148, 148, 151, + 176, 4562, 571, 4664, 1047, 1175, 4665, 4666, + 4667, 4668, 4669, 4670, 4671, 4672, 4673, 4674, + 4675, 4676, 4677, 4678, 4679, 4680, 4681, 4682, + 4562, 1485, 4683, 150, 152, 153, 154, 1623, + 4684, 157, 158, 4685, 160, 161, 4686, 4687, + 4688, 4689, 4690, 4691, 4692, 4693, 4694, 4695, + 4696, 4697, 4698, 4699, 177, 4700, 4701, 4702, + 126, 148, 148, 151, 176, 4521, 181, 181, + 181, 571, 4703, 150, 152, 153, 4564, 2133, + 4704, 4566, 158, 4705, 160, 161, 4706, 4707, + 4708, 4709, 4710, 4711, 4712, 4713, 4714, 4715, + 4716, 4717, 4718, 4719, 177, 4720, 4721, 4722, + 421, 148, 148, 151, 176, 4562, 2136, 4723, + 150, 152, 153, 154, 2391, 4724, 157, 158, + 4725, 160, 161, 4726, 4727, 4728, 4729, 4730, + 4731, 4732, 4733, 4734, 4735, 4736, 4737, 4738, + 4739, 177, 4740, 4741, 4742, 126, 148, 148, + 151, 176, 4562, 2136, 4743, 150, 152, 153, + 154, 2263, 4744, 157, 158, 4745, 160, 161, + 4746, 4747, 4748, 4749, 4750, 4751, 4752, 4753, + 4754, 4755, 4756, 4757, 4758, 4759, 177, 4760, + 4761, 4762, 126, 148, 148, 151, 176, 4562, + 3249, 148, 2395, 148, 148, 4500, 122, 124, + 4501, 4502, 4503, 4504, 4505, 4506, 4507, 4508, + 4509, 4510, 4511, 4512, 4513, 4514, 4515, 4516, + 4517, 4518, 4499, 4764, 2515, 2517, 4765, 4766, + 4767, 4768, 4769, 4770, 4771, 4772, 4773, 4774, + 4775, 4776, 4777, 4778, 4779, 4780, 4781, 4782, + 4763, 4783, 4784, 4785, 4786, 4787, 4788, 4789, + 4790, 4791, 4792, 4793, 4794, 4795, 4796, 4797, + 4798, 4799, 4800, 4801, 4802, 4803, 148, 148, + 148, 4499, 181, 181, 181, 571, 1, 4563, + 150, 152, 153, 4564, 153, 4565, 4566, 158, + 4567, 160, 161, 4568, 4569, 4570, 4571, 4572, + 4573, 4574, 302, 4575, 4576, 4577, 4578, 4579, + 4580, 177, 4581, 4582, 4583, 421, 148, 148, + 151, 176, 4562, 181, 181, 181, 571, 4804, + 4805, 4807, 4808, 4809, 4808, 4810, 4811, 4812, + 4813, 4814, 4815, 4816, 4817, 4818, 4819, 4820, + 4821, 4822, 4823, 4824, 4825, 4826, 4827, 4828, + 4829, 4831, 4832, 4833, 4834, 4562, 421, 4562, + 148, 4562, 148, 4562, 4806, 4830, 1, 148, + 148, 148, 181, 148, 4500, 122, 124, 4501, + 4502, 4503, 4504, 4505, 4506, 4507, 4508, 4509, + 4510, 4511, 4512, 4513, 4514, 4515, 4516, 4517, + 4518, 4499, 4783, 4784, 4785, 4786, 4787, 4788, + 4789, 4790, 4791, 4792, 4793, 4794, 4795, 4796, + 4797, 4798, 4799, 4800, 4801, 4802, 4803, 148, + 2518, 2518, 2518, 2774, 4563, 150, 152, 153, + 4564, 153, 4565, 4566, 158, 4567, 160, 161, + 4568, 4569, 4570, 4571, 4572, 4573, 4574, 302, + 4575, 4576, 4577, 4578, 4579, 4580, 177, 4581, + 4582, 4583, 2646, 2008, 2008, 4562, 151, 4562, + 176, 4562, 1, 4835, 150, 152, 153, 154, + 2643, 4836, 157, 158, 4837, 160, 161, 4838, + 4839, 4840, 4841, 4842, 4843, 4844, 4845, 4846, + 4847, 4848, 4849, 4850, 4851, 177, 4852, 4853, + 4854, 148, 148, 151, 176, 4499, 443, 443, + 443, 443, 571, 4855, 150, 152, 153, 154, + 2771, 4856, 157, 158, 4857, 160, 161, 4858, + 4859, 4860, 4861, 4862, 4863, 4864, 4865, 4866, + 4867, 4868, 4869, 4870, 4871, 177, 4872, 4873, + 4874, 421, 148, 148, 151, 176, 4562, 571, + 4875, 150, 152, 153, 154, 2899, 4876, 157, + 158, 4877, 160, 161, 4878, 4879, 4880, 4881, + 4882, 4883, 4884, 4885, 4886, 4887, 4888, 4889, + 4890, 4891, 177, 4892, 4893, 4894, 421, 148, + 148, 151, 176, 4562, 181, 181, 181, 571, + 4563, 150, 152, 153, 4564, 153, 4565, 4566, + 158, 4567, 160, 161, 4568, 4569, 4570, 4571, + 4572, 4573, 4574, 302, 4575, 4576, 4577, 4578, + 4579, 4580, 177, 4581, 4582, 4583, 421, 148, + 148, 1, 151, 176, 4562, 181, 181, 181, + 571, 1, 4563, 150, 152, 153, 4564, 153, + 4565, 4566, 158, 4567, 160, 161, 4568, 4569, + 4570, 4571, 4572, 4573, 4574, 302, 4575, 4576, + 4577, 4578, 4579, 4580, 177, 4581, 4582, 4583, + 421, 148, 148, 1, 151, 176, 4562, 181, + 181, 181, 571, 1, 4563, 150, 152, 153, + 4564, 153, 4565, 4566, 158, 4567, 160, 161, + 4568, 4569, 4570, 4571, 4572, 4573, 4574, 302, + 4575, 4576, 4577, 4578, 4579, 4580, 177, 4581, + 4582, 4583, 421, 148, 148, 1, 1, 151, + 176, 4562, 181, 181, 181, 571, 1, 4563, + 150, 152, 153, 4564, 153, 4565, 4566, 158, + 4567, 160, 161, 4568, 4569, 4570, 4571, 4572, + 4573, 4574, 302, 4575, 4576, 4577, 4578, 4579, + 4580, 177, 4581, 4582, 4583, 421, 148, 148, + 1, 1, 151, 176, 4562, 181, 181, 181, + 571, 1, 4563, 150, 152, 153, 4564, 153, + 4565, 4566, 158, 4567, 160, 161, 4568, 4569, + 4570, 4571, 4572, 4573, 4574, 302, 4575, 4576, + 4577, 4578, 4579, 4580, 177, 4581, 4582, 4583, + 421, 148, 148, 1, 151, 176, 4562, 181, + 181, 181, 571, 4563, 150, 152, 153, 4564, + 153, 4565, 4566, 158, 4567, 160, 161, 4568, + 4569, 4570, 4571, 4572, 4573, 4574, 302, 4575, + 4576, 4577, 4578, 4579, 4580, 177, 4581, 4582, + 4583, 421, 148, 148, 1, 1, 1, 1, + 151, 176, 4562, 181, 181, 181, 571, 1, + 1, 4804, 4805, 4807, 4808, 4809, 4808, 4810, + 4811, 4812, 4813, 4814, 4815, 4816, 4817, 4818, + 4819, 4820, 4821, 4822, 4823, 4824, 4825, 4826, + 4827, 4828, 4829, 4831, 4832, 4833, 4834, 421, + 148, 148, 1, 4806, 1, 4830, 1, 4562, + 4500, 122, 124, 4501, 4502, 4503, 4504, 4505, + 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, + 4514, 4515, 4516, 4517, 4518, 4499, 148, 4783, + 4784, 4785, 4786, 4787, 4788, 4789, 4790, 4791, + 4792, 4793, 4794, 4795, 4796, 4797, 4798, 4799, + 4800, 4801, 4802, 4803, 148, 4499, 2518, 2518, + 2518, 2774, 4563, 150, 152, 153, 4564, 153, + 4565, 4566, 158, 4567, 160, 161, 4568, 4569, + 4570, 4571, 4572, 4573, 4574, 302, 4575, 4576, + 4577, 4578, 4579, 4580, 177, 4581, 4582, 4583, + 1, 2646, 1, 2008, 1, 2008, 1, 151, + 176, 4562, 181, 181, 181, 571, 4563, 150, + 152, 153, 4564, 153, 4565, 4566, 158, 4567, + 160, 161, 4568, 4569, 4570, 4571, 4572, 4573, + 4574, 302, 4575, 4576, 4577, 4578, 4579, 4580, + 177, 4581, 4582, 4583, 421, 148, 148, 1, + 151, 176, 4562, 181, 181, 181, 571, 4563, + 150, 152, 153, 4564, 153, 4565, 4566, 158, + 4567, 160, 161, 4568, 4569, 4570, 4571, 4572, + 4573, 4574, 302, 4575, 4576, 4577, 4578, 4579, + 4580, 177, 4581, 4582, 4583, 421, 148, 148, + 1, 151, 176, 4562, 181, 181, 181, 571, + 3, 4, 5, 6, 7, 9, 10, 11, + 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 4563, 150, 152, 153, 4564, 153, + 4565, 4566, 158, 4567, 160, 161, 4568, 4569, + 4570, 4571, 4572, 4573, 4574, 302, 4575, 4576, + 4577, 4578, 4579, 4580, 177, 4581, 4582, 4583, + 421, 148, 148, 8, 12, 151, 176, 4562, + 181, 181, 181, 571, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, + 51, 4563, 150, 152, 153, 4564, 153, 4565, + 4566, 158, 4567, 160, 161, 4568, 4569, 4570, + 4571, 4572, 4573, 4574, 302, 4575, 4576, 4577, + 4578, 4579, 4580, 177, 4581, 4582, 4583, 421, + 148, 148, 151, 176, 4562, 181, 181, 181, + 571, 52, 53, 54, 55, 56, 57, 4563, + 150, 152, 153, 4564, 153, 4565, 4566, 158, + 4567, 160, 161, 4568, 4569, 4570, 4571, 4572, + 4573, 4574, 302, 4575, 4576, 4577, 4578, 4579, + 4580, 177, 4581, 4582, 4583, 421, 148, 148, + 151, 176, 4562, 181, 181, 181, 571, 58, + 59, 4563, 150, 152, 153, 4564, 153, 4565, + 4566, 158, 4567, 160, 161, 4568, 4569, 4570, + 4571, 4572, 4573, 4574, 302, 4575, 4576, 4577, + 4578, 4579, 4580, 177, 4581, 4582, 4583, 421, + 148, 148, 151, 176, 4562, 181, 181, 181, + 571, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, + 4563, 150, 152, 153, 4564, 153, 4565, 4566, + 158, 4567, 160, 161, 4568, 4569, 4570, 4571, + 4572, 4573, 4574, 302, 4575, 4576, 4577, 4578, + 4579, 4580, 177, 4581, 4582, 4583, 421, 148, + 148, 151, 176, 4562, 181, 181, 181, 571, + 75, 76, 56, 61, 77, 4563, 150, 152, + 153, 4564, 153, 4565, 4566, 158, 4567, 160, + 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, + 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, + 4581, 4582, 4583, 421, 148, 148, 151, 176, + 4562, 181, 181, 181, 571, 78, 79, 80, + 81, 82, 83, 4563, 150, 152, 153, 4564, + 153, 4565, 4566, 158, 4567, 160, 161, 4568, + 4569, 4570, 4571, 4572, 4573, 4574, 302, 4575, + 4576, 4577, 4578, 4579, 4580, 177, 4581, 4582, + 4583, 421, 148, 148, 151, 176, 4562, 181, + 181, 181, 571, 119, 4563, 150, 152, 153, + 4564, 153, 4565, 4566, 158, 4567, 160, 161, + 4568, 4569, 4570, 4571, 4572, 4573, 4574, 302, + 4575, 4576, 4577, 4578, 4579, 4580, 177, 4581, + 4582, 4583, 421, 148, 148, 151, 176, 4562, + 181, 4499, 4500, 122, 124, 4501, 4502, 4503, + 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, + 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4499, + 4499, 4499, 4499, 148, 4499, 4499, 4500, 122, + 124, 4501, 4502, 4503, 4504, 4505, 4506, 4507, + 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, + 4516, 4517, 4518, 4499, 4499, 148, 181, 148, + 4783, 4784, 4785, 4786, 4787, 4788, 4789, 4790, + 4791, 4792, 4793, 4794, 4795, 4796, 4797, 4798, + 4799, 4800, 4801, 4802, 4803, 148, 148, 148, + 4499, 4499, 4783, 4784, 4785, 4786, 4787, 4788, + 4789, 4790, 4791, 4792, 4793, 4794, 4795, 4796, + 4797, 4798, 4799, 4800, 4801, 4802, 4803, 148, + 4499, 4783, 4784, 4785, 4786, 4787, 4788, 4789, + 4790, 4791, 4792, 4793, 4794, 4795, 4796, 4797, + 4798, 4799, 4800, 4801, 4802, 4803, 148, 4499, + 4783, 4784, 4785, 4786, 4787, 4788, 4789, 4790, + 4791, 4792, 4793, 4794, 4795, 4796, 4797, 4798, + 4799, 4800, 4801, 4802, 4803, 148, 4783, 4784, + 4785, 4786, 4787, 4788, 4789, 4790, 4791, 4792, + 4793, 4794, 4795, 4796, 4797, 4798, 4799, 4800, + 4801, 4802, 4803, 4499, 4499, 148, 4499, 4500, + 122, 124, 4501, 4502, 4503, 4504, 4505, 4506, + 4507, 4508, 4509, 4510, 4511, 4512, 4513, 4514, + 4515, 4516, 4517, 4518, 4499, 4499, 148, 148, + 148, 181, 4500, 122, 124, 4501, 4502, 4503, + 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, + 4512, 4513, 4514, 4515, 4516, 4517, 4518, 148, + 148, 572, 572, 4499, 148, 4500, 122, 124, + 4501, 4502, 4503, 4504, 4505, 4506, 4507, 4508, + 4509, 4510, 4511, 4512, 4513, 4514, 4515, 4516, + 4517, 4518, 148, 148, 148, 4499, 421, 4783, + 4784, 4785, 4786, 4787, 4788, 4789, 4790, 4791, + 4792, 4793, 4794, 4795, 4796, 4797, 4798, 4799, + 4800, 4801, 4802, 4803, 148, 421, 148, 4499, + 4499, 4499, 4499, 4500, 122, 124, 4501, 4502, + 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, + 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, + 421, 4499, 4499, 148, 4783, 4784, 4785, 4786, + 4787, 4788, 4789, 4790, 4791, 4792, 4793, 4794, + 4795, 4796, 4797, 4798, 4799, 4800, 4801, 4802, + 4803, 148, 4499, 4783, 4784, 4785, 4786, 4787, + 4788, 4789, 4790, 4791, 4792, 4793, 4794, 4795, + 4796, 4797, 4798, 4799, 4800, 4801, 4802, 4803, + 4499, 148, 4500, 122, 124, 4501, 4502, 4503, + 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, + 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4499, + 148, 148, 4500, 122, 124, 4501, 4502, 4503, + 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, + 4512, 4513, 4514, 4515, 4516, 4517, 4518, 421, + 148, 4499, 1373, 1374, 184, 1375, 151, 1376, + 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, + 1385, 1386, 1387, 1388, 1389, 1390, 1391, 1392, + 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, + 1401, 1402, 4500, 122, 124, 4501, 4502, 4503, + 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, + 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4499, + 1403, 1404, 1405, 217, 218, 219, 220, 221, + 1406, 223, 224, 225, 226, 227, 228, 1407, + 1408, 1409, 1410, 1411, 234, 1412, 236, 1413, + 483, 484, 1374, 1414, 1415, 153, 1416, 1417, + 1418, 1419, 646, 1420, 151, 152, 1421, 249, + 250, 251, 252, 4500, 122, 124, 4501, 4502, + 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, + 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, + 151, 153, 151, 4499, 1422, 1423, 255, 1424, + 257, 258, 259, 260, 261, 262, 263, 151, + 1425, 265, 1426, 267, 1427, 269, 4500, 122, + 124, 4501, 4502, 4503, 4504, 4505, 4506, 4507, + 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, + 4516, 4517, 4518, 4499, 1428, 1429, 272, 151, + 273, 4500, 122, 124, 4501, 4502, 4503, 4504, + 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, + 4513, 4514, 4515, 4516, 4517, 4518, 4499, 153, + 274, 275, 153, 657, 1430, 153, 302, 280, + 281, 282, 1431, 284, 153, 1432, 1433, 1434, + 153, 1435, 1436, 1437, 1438, 1439, 295, 296, + 152, 1440, 153, 4895, 4896, 4897, 4898, 4899, + 4900, 4901, 4902, 4903, 4904, 4905, 4906, 4907, + 4908, 4909, 4910, 4911, 4912, 4913, 4914, 4915, + 151, 4499, 181, 181, 181, 571, 4563, 150, + 152, 153, 4564, 153, 4565, 4566, 158, 4567, + 160, 161, 4568, 4569, 4570, 4571, 4572, 4573, + 4574, 302, 4575, 4576, 4577, 4578, 4579, 4580, + 177, 4581, 4582, 4583, 421, 148, 148, 1, + 1, 1, 1, 151, 176, 4562, 181, 181, + 181, 571, 4563, 150, 152, 153, 4564, 153, + 4565, 4566, 158, 4567, 160, 161, 4568, 4569, + 4570, 4571, 4572, 4573, 4574, 302, 4575, 4576, + 4577, 4578, 4579, 4580, 177, 4581, 4582, 4583, + 421, 148, 148, 1, 151, 176, 4562, 181, + 181, 181, 571, 4804, 4805, 4807, 4808, 4809, + 4808, 4810, 4811, 4812, 4813, 4814, 4815, 4816, + 4817, 4818, 4819, 4820, 4821, 4822, 4823, 4824, + 4825, 4826, 4827, 4828, 4829, 4831, 4832, 4833, + 4834, 421, 148, 148, 1, 4806, 1, 4830, + 1, 4562, 4895, 4896, 4897, 4898, 4899, 4900, + 4901, 4902, 4903, 4904, 4905, 4906, 4907, 4908, + 4909, 4910, 4911, 4912, 4913, 4914, 4915, 151, + 181, 181, 181, 571, 4563, 150, 152, 153, + 4564, 153, 4565, 4566, 158, 4567, 160, 161, + 4568, 4569, 4570, 4571, 4572, 4573, 4574, 302, + 4575, 4576, 4577, 4578, 4579, 4580, 177, 4581, + 4582, 4583, 421, 148, 148, 1, 151, 176, + 4562, 181, 181, 181, 571, 4563, 150, 152, + 153, 4564, 153, 4565, 4566, 158, 4567, 160, + 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, + 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, + 4581, 4582, 4583, 421, 148, 148, 1, 1, + 1, 1, 1, 151, 176, 4562, 181, 181, + 181, 571, 1, 4563, 150, 152, 153, 4564, + 153, 4565, 4566, 158, 4567, 160, 161, 4568, + 4569, 4570, 4571, 4572, 4573, 4574, 302, 4575, + 4576, 4577, 4578, 4579, 4580, 177, 4581, 4582, + 4583, 421, 148, 148, 1, 1, 151, 176, + 4562, 181, 181, 181, 571, 4563, 150, 152, + 153, 4564, 153, 4565, 4566, 158, 4567, 160, + 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, + 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, + 4581, 4582, 4583, 421, 148, 148, 1, 151, + 176, 4562, 181, 181, 181, 571, 4563, 150, + 152, 153, 4564, 153, 4565, 4566, 158, 4567, + 160, 161, 4568, 4569, 4570, 4571, 4572, 4573, + 4574, 302, 4575, 4576, 4577, 4578, 4579, 4580, + 177, 4581, 4582, 4583, 421, 148, 148, 1, + 1, 151, 176, 4562, 181, 181, 181, 571, + 4563, 150, 152, 153, 4564, 153, 4565, 4566, + 158, 4567, 160, 161, 4568, 4569, 4570, 4571, + 4572, 4573, 4574, 302, 4575, 4576, 4577, 4578, + 4579, 4580, 177, 4581, 4582, 4583, 421, 148, + 148, 1, 1, 151, 176, 4562, 181, 181, + 181, 571, 4804, 4805, 4807, 4808, 4809, 4808, + 4810, 4811, 4812, 4813, 4814, 4815, 4816, 4817, + 4818, 4819, 4820, 4821, 4822, 4823, 4824, 4825, + 4826, 4827, 4828, 4829, 4831, 4832, 4833, 4834, + 421, 148, 148, 1, 4806, 1, 4830, 1, + 4562, 298, 299, 4500, 122, 124, 4501, 4502, + 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, + 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, + 4499, 151, 1441, 674, 302, 303, 304, 305, + 306, 307, 1442, 932, 1443, 934, 312, 1444, + 1445, 4500, 122, 124, 4501, 4502, 4503, 4504, + 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, + 4513, 4514, 4515, 4516, 4517, 4518, 151, 4499, + 1446, 1447, 317, 318, 319, 1448, 1449, 1450, + 1451, 324, 4500, 122, 124, 4501, 4502, 4503, + 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, + 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4499, + 1482, 4500, 122, 124, 4501, 4502, 4503, 4504, + 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, + 4513, 4514, 4515, 4516, 4517, 4518, 4499, 2518, + 2518, 2518, 2774, 4563, 150, 152, 153, 4564, + 153, 4565, 4566, 158, 4567, 160, 161, 4568, + 4569, 4570, 4571, 4572, 4573, 4574, 302, 4575, + 4576, 4577, 4578, 4579, 4580, 177, 4581, 4582, + 4583, 2646, 2008, 2008, 4562, 4562, 151, 4562, + 176, 4562, 1, 181, 181, 181, 571, 4563, + 150, 152, 153, 4564, 153, 4565, 4566, 158, + 4567, 160, 161, 4568, 4569, 4570, 4571, 4572, + 4573, 4574, 302, 4575, 4576, 4577, 4578, 4579, + 4580, 177, 4581, 4582, 4583, 421, 148, 148, + 1, 151, 176, 4562, 181, 181, 181, 571, + 1, 4563, 150, 152, 153, 4564, 153, 4565, + 4566, 158, 4567, 160, 161, 4568, 4569, 4570, + 4571, 4572, 4573, 4574, 302, 4575, 4576, 4577, + 4578, 4579, 4580, 177, 4581, 4582, 4583, 421, + 148, 148, 151, 176, 4562, 181, 181, 181, + 571, 4563, 150, 152, 153, 4564, 153, 4565, + 4566, 158, 4567, 160, 161, 4568, 4569, 4570, + 4571, 4572, 4573, 4574, 302, 4575, 4576, 4577, + 4578, 4579, 4580, 177, 4581, 4582, 4583, 421, + 148, 148, 1, 1, 151, 176, 4562, 181, + 181, 181, 571, 4563, 150, 152, 153, 4564, + 153, 4565, 4566, 158, 4567, 160, 161, 4568, + 4569, 4570, 4571, 4572, 4573, 4574, 302, 4575, + 4576, 4577, 4578, 4579, 4580, 177, 4581, 4582, + 4583, 421, 148, 148, 1, 151, 176, 4562, + 181, 181, 181, 571, 1, 4563, 150, 152, + 153, 4564, 153, 4565, 4566, 158, 4567, 160, + 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, + 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, + 4581, 4582, 4583, 421, 148, 148, 1, 1, + 151, 176, 4562, 181, 181, 181, 571, 4563, + 150, 152, 153, 4564, 153, 4565, 4566, 158, + 4567, 160, 161, 4568, 4569, 4570, 4571, 4572, + 4573, 4574, 302, 4575, 4576, 4577, 4578, 4579, + 4580, 177, 4581, 4582, 4583, 421, 148, 148, + 1, 151, 176, 4562, 181, 181, 181, 571, + 4804, 4805, 4807, 4808, 4809, 4808, 4810, 4811, + 4812, 4813, 4814, 4815, 4816, 4817, 4818, 4819, + 4820, 4821, 4822, 4823, 4824, 4825, 4826, 4827, + 4828, 4829, 4831, 4832, 4833, 4834, 421, 148, + 148, 1, 1, 4806, 1, 4830, 1, 4562, + 2518, 2518, 2518, 2774, 4563, 150, 152, 153, + 4564, 153, 4565, 4566, 158, 4567, 160, 161, + 4568, 4569, 4570, 4571, 4572, 4573, 4574, 302, + 4575, 4576, 4577, 4578, 4579, 4580, 177, 4581, + 4582, 4583, 2646, 2008, 2008, 4562, 4562, 151, + 4562, 176, 4562, 1, 181, 181, 181, 571, + 4563, 150, 152, 153, 4564, 153, 4565, 4566, + 158, 4567, 160, 161, 4568, 4569, 4570, 4571, + 4572, 4573, 4574, 302, 4575, 4576, 4577, 4578, + 4579, 4580, 177, 4581, 4582, 4583, 421, 148, + 148, 1, 1, 151, 176, 4562, 181, 181, + 181, 571, 4563, 150, 152, 153, 4564, 153, + 4565, 4566, 158, 4567, 160, 161, 4568, 4569, + 4570, 4571, 4572, 4573, 4574, 302, 4575, 4576, + 4577, 4578, 4579, 4580, 177, 4581, 4582, 4583, + 421, 148, 148, 1, 151, 176, 4562, 181, + 181, 181, 571, 4563, 150, 152, 153, 4564, + 153, 4565, 4566, 158, 4567, 160, 161, 4568, + 4569, 4570, 4571, 4572, 4573, 4574, 302, 4575, + 4576, 4577, 4578, 4579, 4580, 177, 4581, 4582, + 4583, 421, 148, 148, 1, 151, 176, 4562, + 181, 181, 181, 571, 1, 4563, 150, 152, + 153, 4564, 153, 4565, 4566, 158, 4567, 160, + 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, + 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, + 4581, 4582, 4583, 421, 148, 148, 1, 1, + 1, 1, 151, 176, 4562, 181, 181, 181, + 571, 4563, 150, 152, 153, 4564, 153, 4565, + 4566, 158, 4567, 160, 161, 4568, 4569, 4570, + 4571, 4572, 4573, 4574, 302, 4575, 4576, 4577, + 4578, 4579, 4580, 177, 4581, 4582, 4583, 421, + 148, 148, 1, 1, 151, 176, 4562, 181, + 181, 181, 571, 4563, 150, 152, 153, 4564, + 153, 4565, 4566, 158, 4567, 160, 161, 4568, + 4569, 4570, 4571, 4572, 4573, 4574, 302, 4575, + 4576, 4577, 4578, 4579, 4580, 177, 4581, 4582, + 4583, 421, 148, 148, 1, 1, 151, 176, + 4562, 181, 181, 181, 571, 4563, 150, 152, + 153, 4564, 153, 4565, 4566, 158, 4567, 160, + 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, + 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, + 4581, 4582, 4583, 421, 148, 148, 1, 1, + 151, 176, 4562, 181, 181, 181, 571, 4563, + 150, 152, 153, 4564, 153, 4565, 4566, 158, + 4567, 160, 161, 4568, 4569, 4570, 4571, 4572, + 4573, 4574, 302, 4575, 4576, 4577, 4578, 4579, + 4580, 177, 4581, 4582, 4583, 421, 148, 148, + 1, 151, 176, 4562, 181, 181, 181, 571, + 4563, 150, 152, 153, 4564, 153, 4565, 4566, + 158, 4567, 160, 161, 4568, 4569, 4570, 4571, + 4572, 4573, 4574, 302, 4575, 4576, 4577, 4578, + 4579, 4580, 177, 4581, 4582, 4583, 421, 148, + 148, 1, 151, 176, 4562, 181, 181, 181, + 571, 1, 4563, 150, 152, 153, 4564, 153, + 4565, 4566, 158, 4567, 160, 161, 4568, 4569, + 4570, 4571, 4572, 4573, 4574, 302, 4575, 4576, + 4577, 4578, 4579, 4580, 177, 4581, 4582, 4583, + 421, 148, 148, 151, 176, 4562, 181, 181, + 181, 571, 4563, 150, 152, 153, 4564, 153, + 4565, 4566, 158, 4567, 160, 161, 4568, 4569, + 4570, 4571, 4572, 4573, 4574, 302, 4575, 4576, + 4577, 4578, 4579, 4580, 177, 4581, 4582, 4583, + 421, 148, 148, 1, 151, 176, 4562, 181, + 181, 181, 571, 4563, 150, 152, 153, 4564, + 153, 4565, 4566, 158, 4567, 160, 161, 4568, + 4569, 4570, 4571, 4572, 4573, 4574, 302, 4575, + 4576, 4577, 4578, 4579, 4580, 177, 4581, 4582, + 4583, 421, 148, 148, 1, 151, 176, 4562, + 181, 181, 181, 571, 4563, 150, 152, 153, + 4564, 153, 4565, 4566, 158, 4567, 160, 161, + 4568, 4569, 4570, 4571, 4572, 4573, 4574, 302, + 4575, 4576, 4577, 4578, 4579, 4580, 177, 4581, + 4582, 4583, 421, 148, 148, 1, 151, 176, + 4562, 181, 181, 181, 571, 4563, 150, 152, + 153, 4564, 153, 4565, 4566, 158, 4567, 160, + 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, + 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, + 4581, 4582, 4583, 421, 148, 148, 1, 1, + 151, 176, 4562, 181, 181, 181, 571, 4563, + 150, 152, 153, 4564, 153, 4565, 4566, 158, + 4567, 160, 161, 4568, 4569, 4570, 4571, 4572, + 4573, 4574, 302, 4575, 4576, 4577, 4578, 4579, + 4580, 177, 4581, 4582, 4583, 421, 148, 148, + 1, 151, 176, 4562, 181, 181, 181, 571, + 4563, 150, 152, 153, 4564, 153, 4565, 4566, + 158, 4567, 160, 161, 4568, 4569, 4570, 4571, + 4572, 4573, 4574, 302, 4575, 4576, 4577, 4578, + 4579, 4580, 177, 4581, 4582, 4583, 421, 148, + 148, 1, 151, 176, 4562, 181, 181, 181, + 571, 1, 1, 1, 4563, 150, 152, 153, + 4564, 153, 4565, 4566, 158, 4567, 160, 161, + 4568, 4569, 4570, 4571, 4572, 4573, 4574, 302, + 4575, 4576, 4577, 4578, 4579, 4580, 177, 4581, + 4582, 4583, 421, 148, 148, 1, 151, 176, + 4562, 181, 181, 181, 571, 4804, 4805, 4807, + 4808, 4809, 4808, 4810, 4811, 4812, 4813, 4814, + 4815, 4816, 4817, 4818, 4819, 4820, 4821, 4822, + 4823, 4824, 4825, 4826, 4827, 4828, 4829, 4831, + 4832, 4833, 4834, 421, 148, 148, 1, 1, + 4806, 1, 4830, 1, 4562, 2518, 2518, 2518, + 2774, 4563, 150, 152, 153, 4564, 153, 4565, + 4566, 158, 4567, 160, 161, 4568, 4569, 4570, + 4571, 4572, 4573, 4574, 302, 4575, 4576, 4577, + 4578, 4579, 4580, 177, 4581, 4582, 4583, 2646, + 2008, 2008, 4562, 4562, 151, 4562, 176, 4562, + 1, 181, 181, 181, 571, 4563, 150, 152, + 153, 4564, 153, 4565, 4566, 158, 4567, 160, + 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, + 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, + 4581, 4582, 4583, 421, 148, 148, 1, 151, + 176, 4562, 181, 181, 181, 571, 4563, 150, + 152, 153, 4564, 153, 4565, 4566, 158, 4567, + 160, 161, 4568, 4569, 4570, 4571, 4572, 4573, + 4574, 302, 4575, 4576, 4577, 4578, 4579, 4580, + 177, 4581, 4582, 4583, 421, 148, 148, 1, + 151, 176, 4562, 181, 181, 181, 571, 4804, + 4805, 4807, 4808, 4809, 4808, 4810, 4811, 4812, + 4813, 4814, 4815, 4816, 4817, 4818, 4819, 4820, + 4821, 4822, 4823, 4824, 4825, 4826, 4827, 4828, + 4829, 4831, 4832, 4833, 4834, 421, 148, 148, + 1, 1, 4806, 1, 4830, 1, 4562, 2518, + 2518, 2518, 2774, 1, 4563, 150, 152, 153, + 4564, 153, 4565, 4566, 158, 4567, 160, 161, + 4568, 4569, 4570, 4571, 4572, 4573, 4574, 302, + 4575, 4576, 4577, 4578, 4579, 4580, 177, 4581, + 4582, 4583, 1, 2646, 1, 2008, 1, 2008, + 1, 151, 176, 4562, 181, 181, 181, 571, + 4563, 150, 152, 153, 4564, 153, 4565, 4566, + 158, 4567, 160, 161, 4568, 4569, 4570, 4571, + 4572, 4573, 4574, 302, 4575, 4576, 4577, 4578, + 4579, 4580, 177, 4581, 4582, 4583, 421, 148, + 148, 1, 151, 176, 4562, 181, 181, 181, + 571, 1, 4563, 150, 152, 153, 4564, 153, + 4565, 4566, 158, 4567, 160, 161, 4568, 4569, + 4570, 4571, 4572, 4573, 4574, 302, 4575, 4576, + 4577, 4578, 4579, 4580, 177, 4581, 4582, 4583, + 421, 148, 148, 1, 1, 151, 176, 4562, + 181, 181, 181, 571, 1, 4563, 150, 152, + 153, 4564, 153, 4565, 4566, 158, 4567, 160, + 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, + 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, + 4581, 4582, 4583, 421, 148, 148, 1, 1, + 1, 151, 176, 4562, 181, 181, 181, 571, + 1, 4563, 150, 152, 153, 4564, 153, 4565, + 4566, 158, 4567, 160, 161, 4568, 4569, 4570, + 4571, 4572, 4573, 4574, 302, 4575, 4576, 4577, + 4578, 4579, 4580, 177, 4581, 4582, 4583, 421, + 148, 148, 1, 1, 151, 176, 4562, 181, + 181, 181, 571, 4563, 150, 152, 153, 4564, + 153, 4565, 4566, 158, 4567, 160, 161, 4568, + 4569, 4570, 4571, 4572, 4573, 4574, 302, 4575, + 4576, 4577, 4578, 4579, 4580, 177, 4581, 4582, + 4583, 421, 148, 148, 1, 1, 151, 176, + 4562, 181, 181, 181, 571, 1, 4563, 150, + 152, 153, 4564, 153, 4565, 4566, 158, 4567, + 160, 161, 4568, 4569, 4570, 4571, 4572, 4573, + 4574, 302, 4575, 4576, 4577, 4578, 4579, 4580, + 177, 4581, 4582, 4583, 421, 148, 148, 151, + 176, 4562, 181, 181, 181, 571, 4563, 150, + 152, 153, 4564, 153, 4565, 4566, 158, 4567, + 160, 161, 4568, 4569, 4570, 4571, 4572, 4573, + 4574, 302, 4575, 4576, 4577, 4578, 4579, 4580, + 177, 4581, 4582, 4583, 421, 148, 148, 1, + 1, 151, 176, 4562, 181, 181, 181, 571, + 4563, 150, 152, 153, 4564, 153, 4565, 4566, + 158, 4567, 160, 161, 4568, 4569, 4570, 4571, + 4572, 4573, 4574, 302, 4575, 4576, 4577, 4578, + 4579, 4580, 177, 4581, 4582, 4583, 421, 148, + 148, 1, 151, 176, 4562, 181, 181, 181, + 571, 84, 85, 86, 87, 88, 4563, 150, + 152, 153, 4564, 153, 4565, 4566, 158, 4567, + 160, 161, 4568, 4569, 4570, 4571, 4572, 4573, + 4574, 302, 4575, 4576, 4577, 4578, 4579, 4580, + 177, 4581, 4582, 4583, 421, 148, 148, 151, + 176, 4562, 181, 181, 181, 571, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 100, 104, 105, + 106, 4563, 150, 152, 153, 4564, 153, 4565, + 4566, 158, 4567, 160, 161, 4568, 4569, 4570, + 4571, 4572, 4573, 4574, 302, 4575, 4576, 4577, + 4578, 4579, 4580, 177, 4581, 4582, 4583, 421, + 148, 148, 151, 176, 4562, 181, 181, 181, + 571, 107, 108, 109, 110, 4563, 150, 152, + 153, 4564, 153, 4565, 4566, 158, 4567, 160, + 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, + 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, + 4581, 4582, 4583, 421, 148, 148, 151, 176, + 4562, 181, 181, 181, 571, 111, 4563, 150, + 152, 153, 4564, 153, 4565, 4566, 158, 4567, + 160, 161, 4568, 4569, 4570, 4571, 4572, 4573, + 4574, 302, 4575, 4576, 4577, 4578, 4579, 4580, + 177, 4581, 4582, 4583, 421, 148, 148, 151, + 176, 4562, 181, 181, 181, 571, 112, 113, + 114, 115, 116, 117, 4563, 150, 152, 153, + 4564, 153, 4565, 4566, 158, 4567, 160, 161, + 4568, 4569, 4570, 4571, 4572, 4573, 4574, 302, + 4575, 4576, 4577, 4578, 4579, 4580, 177, 4581, + 4582, 4583, 421, 148, 148, 151, 176, 4562, + 181, 181, 181, 571, 118, 4563, 150, 152, + 153, 4564, 153, 4565, 4566, 158, 4567, 160, + 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, + 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, + 4581, 4582, 4583, 421, 148, 148, 151, 176, + 4562, 181, 181, 181, 571, 120, 121, 122, + 124, 4563, 150, 152, 153, 4564, 153, 4565, + 4566, 158, 4567, 160, 161, 4568, 4569, 4570, + 4571, 4572, 4573, 4574, 302, 4575, 4576, 4577, + 4578, 4579, 4580, 177, 4581, 4582, 4583, 421, + 148, 148, 123, 151, 176, 4562, 2518, 2518, + 2518, 2774, 4562, 4804, 4805, 4807, 4808, 4809, + 4808, 4810, 4811, 4812, 4813, 4814, 4815, 4816, + 4817, 4818, 4819, 4820, 4821, 4822, 4823, 4824, + 4825, 4826, 4827, 4828, 4829, 4831, 4832, 4833, + 4834, 2646, 2008, 2008, 4562, 4806, 4830, 1, + 2518, 2518, 2518, 2774, 4562, 4563, 150, 152, + 153, 4564, 153, 4565, 4566, 158, 4567, 160, + 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, + 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, + 4581, 4582, 4583, 2646, 2008, 2008, 4562, 4562, + 151, 4562, 176, 4562, 1, 181, 181, 181, + 571, 1, 4804, 4805, 4807, 4808, 4809, 4808, + 4810, 4811, 4812, 4813, 4814, 4815, 4816, 4817, + 4818, 4819, 4820, 4821, 4822, 4823, 4824, 4825, + 4826, 4827, 4828, 4829, 4831, 4832, 4833, 4834, + 421, 148, 148, 1, 1, 4806, 1, 4830, + 1, 4562, 2518, 2518, 2518, 2774, 4563, 150, + 152, 153, 4564, 153, 4565, 4566, 158, 4567, + 160, 161, 4568, 4569, 4570, 4571, 4572, 4573, + 4574, 302, 4575, 4576, 4577, 4578, 4579, 4580, + 177, 4581, 4582, 4583, 2646, 2008, 2008, 4562, + 4562, 4562, 4562, 4562, 151, 4562, 176, 4562, + 1, 2518, 2518, 2518, 2774, 1, 1, 4563, + 150, 152, 153, 4564, 153, 4565, 4566, 158, + 4567, 160, 161, 4568, 4569, 4570, 4571, 4572, + 4573, 4574, 302, 4575, 4576, 4577, 4578, 4579, + 4580, 177, 4581, 4582, 4583, 1, 2646, 1, + 2008, 1, 2008, 1, 1, 1, 1, 151, + 176, 4562, 2518, 2518, 2518, 2774, 4562, 4562, + 4563, 150, 152, 153, 4564, 153, 4565, 4566, + 158, 4567, 160, 161, 4568, 4569, 4570, 4571, + 4572, 4573, 4574, 302, 4575, 4576, 4577, 4578, + 4579, 4580, 177, 4581, 4582, 4583, 2646, 2008, + 2008, 4562, 4562, 151, 4562, 176, 4562, 1, + 181, 181, 181, 571, 1, 4563, 150, 152, + 153, 4564, 153, 4565, 4566, 158, 4567, 160, + 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, + 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, + 4581, 4582, 4583, 421, 148, 148, 1, 1, + 151, 176, 4562, 181, 181, 181, 571, 4563, + 150, 152, 153, 4564, 153, 4565, 4566, 158, + 4567, 160, 161, 4568, 4569, 4570, 4571, 4572, + 4573, 4574, 302, 4575, 4576, 4577, 4578, 4579, + 4580, 177, 4581, 4582, 4583, 421, 148, 148, + 1, 1, 1, 1, 1, 151, 176, 4562, + 181, 181, 181, 571, 1, 4563, 150, 152, + 153, 4564, 153, 4565, 4566, 158, 4567, 160, + 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, + 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, + 4581, 4582, 4583, 421, 148, 148, 1, 151, + 176, 4562, 181, 181, 181, 571, 1, 4563, + 150, 152, 153, 4564, 153, 4565, 4566, 158, + 4567, 160, 161, 4568, 4569, 4570, 4571, 4572, + 4573, 4574, 302, 4575, 4576, 4577, 4578, 4579, + 4580, 177, 4581, 4582, 4583, 421, 148, 148, + 1, 1, 1, 151, 176, 4562, 181, 181, + 181, 571, 4804, 4805, 4807, 4808, 4809, 4808, + 4810, 4811, 4812, 4813, 4814, 4815, 4816, 4817, + 4818, 4819, 4820, 4821, 4822, 4823, 4824, 4825, + 4826, 4827, 4828, 4829, 4831, 4832, 4833, 4834, + 421, 148, 148, 1, 1, 4806, 1, 4830, + 1, 4562, 2518, 2518, 2518, 2774, 4562, 4562, + 4563, 150, 152, 153, 4564, 153, 4565, 4566, + 158, 4567, 160, 161, 4568, 4569, 4570, 4571, + 4572, 4573, 4574, 302, 4575, 4576, 4577, 4578, + 4579, 4580, 177, 4581, 4582, 4583, 2646, 2008, + 2008, 4562, 4562, 4562, 151, 4562, 176, 4562, + 1, 181, 181, 181, 571, 4563, 150, 152, + 153, 4564, 153, 4565, 4566, 158, 4567, 160, + 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, + 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, + 4581, 4582, 4583, 421, 148, 148, 1, 1, + 1, 1, 1, 151, 176, 4562, 181, 181, + 181, 571, 4804, 4805, 4807, 4808, 4809, 4808, + 4810, 4811, 4812, 4813, 4814, 4815, 4816, 4817, + 4818, 4819, 4820, 4821, 4822, 4823, 4824, 4825, + 4826, 4827, 4828, 4829, 4831, 4832, 4833, 4834, + 421, 148, 148, 1, 1, 4806, 1, 4830, + 1, 4562, 2518, 2518, 2518, 2774, 4562, 4562, + 4563, 150, 152, 153, 4564, 153, 4565, 4566, + 158, 4567, 160, 161, 4568, 4569, 4570, 4571, + 4572, 4573, 4574, 302, 4575, 4576, 4577, 4578, + 4579, 4580, 177, 4581, 4582, 4583, 2646, 2008, + 2008, 4562, 4562, 4562, 151, 4562, 176, 4562, + 1, 181, 181, 181, 571, 4563, 150, 152, + 153, 4564, 153, 4565, 4566, 158, 4567, 160, + 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, + 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, + 4581, 4582, 4583, 421, 148, 148, 1, 151, + 176, 4562, 181, 181, 181, 571, 1, 1, + 4563, 150, 152, 153, 4564, 153, 4565, 4566, + 158, 4567, 160, 161, 4568, 4569, 4570, 4571, + 4572, 4573, 4574, 302, 4575, 4576, 4577, 4578, + 4579, 4580, 177, 4581, 4582, 4583, 421, 148, + 148, 1, 1, 1, 151, 176, 4562, 181, + 181, 181, 571, 1, 4563, 150, 152, 153, + 4564, 153, 4565, 4566, 158, 4567, 160, 161, + 4568, 4569, 4570, 4571, 4572, 4573, 4574, 302, + 4575, 4576, 4577, 4578, 4579, 4580, 177, 4581, + 4582, 4583, 421, 148, 148, 1, 151, 176, + 4562, 181, 181, 181, 571, 4563, 150, 152, + 153, 4564, 153, 4565, 4566, 158, 4567, 160, + 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, + 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, + 4581, 4582, 4583, 421, 148, 148, 1, 151, + 176, 4562, 181, 181, 181, 571, 1, 4563, + 150, 152, 153, 4564, 153, 4565, 4566, 158, + 4567, 160, 161, 4568, 4569, 4570, 4571, 4572, + 4573, 4574, 302, 4575, 4576, 4577, 4578, 4579, + 4580, 177, 4581, 4582, 4583, 421, 148, 148, + 1, 1, 151, 176, 4562, 181, 181, 181, + 571, 4563, 150, 152, 153, 4564, 153, 4565, + 4566, 158, 4567, 160, 161, 4568, 4569, 4570, + 4571, 4572, 4573, 4574, 302, 4575, 4576, 4577, + 4578, 4579, 4580, 177, 4581, 4582, 4583, 421, + 148, 148, 1, 151, 176, 4562, 181, 181, + 181, 571, 1, 1, 1, 4563, 150, 152, + 153, 4564, 153, 4565, 4566, 158, 4567, 160, + 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, + 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, + 4581, 4582, 4583, 421, 148, 148, 1, 1, + 151, 176, 4562, 181, 181, 181, 571, 4563, + 150, 152, 153, 4564, 153, 4565, 4566, 158, + 4567, 160, 161, 4568, 4569, 4570, 4571, 4572, + 4573, 4574, 302, 4575, 4576, 4577, 4578, 4579, + 4580, 177, 4581, 4582, 4583, 421, 148, 148, + 1, 151, 176, 4562, 181, 181, 181, 571, + 4563, 150, 152, 153, 4564, 153, 4565, 4566, + 158, 4567, 160, 161, 4568, 4569, 4570, 4571, + 4572, 4573, 4574, 302, 4575, 4576, 4577, 4578, + 4579, 4580, 177, 4581, 4582, 4583, 421, 148, + 148, 1, 1, 1, 1, 151, 176, 4562, + 181, 181, 181, 571, 1, 4563, 150, 152, + 153, 4564, 153, 4565, 4566, 158, 4567, 160, + 161, 4568, 4569, 4570, 4571, 4572, 4573, 4574, + 302, 4575, 4576, 4577, 4578, 4579, 4580, 177, + 4581, 4582, 4583, 421, 148, 148, 151, 176, + 4562, 4499, 4500, 122, 124, 4501, 4502, 4503, + 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, + 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4499, + 4499, 4499, 4499, 148, 4916, 4917, 4918, 4919, + 4920, 4921, 4922, 4923, 4924, 4925, 4926, 4927, + 4928, 4929, 4930, 4931, 4932, 4933, 4934, 4935, + 4936, 2395, 4499, 1, 4764, 2515, 2517, 4765, + 4766, 4767, 4768, 4769, 4770, 4771, 4772, 4773, + 4774, 4775, 4776, 4777, 4778, 4779, 4780, 4781, + 4782, 4763, 4937, 4938, 4939, 4940, 4941, 4942, + 4943, 4944, 4945, 4946, 4947, 4948, 4949, 4950, + 4951, 4952, 4953, 4954, 4955, 4956, 4957, 1, + 4763, 2395, 4500, 122, 124, 4501, 4502, 4503, + 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, + 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4499, + 4500, 122, 124, 4501, 4502, 4503, 4504, 4505, + 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, + 4514, 4515, 4516, 4517, 4518, 4499, 2395, 4500, + 122, 124, 4501, 4502, 4503, 4504, 4505, 4506, + 4507, 4508, 4509, 4510, 4511, 4512, 4513, 4514, + 4515, 4516, 4517, 4518, 2395, 4499, 2395, 4500, + 122, 124, 4501, 4502, 4503, 4504, 4505, 4506, + 4507, 4508, 4509, 4510, 4511, 4512, 4513, 4514, + 4515, 4516, 4517, 4518, 2395, 4499, 2395, 4500, + 122, 124, 4501, 4502, 4503, 4504, 4505, 4506, + 4507, 4508, 4509, 4510, 4511, 4512, 4513, 4514, + 4515, 4516, 4517, 4518, 2395, 2395, 4499, 2395, + 4500, 122, 124, 4501, 4502, 4503, 4504, 4505, + 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, + 4514, 4515, 4516, 4517, 4518, 2395, 2395, 4499, + 2395, 4500, 122, 124, 4501, 4502, 4503, 4504, + 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, + 4513, 4514, 4515, 4516, 4517, 4518, 2395, 4499, + 4500, 122, 124, 4501, 4502, 4503, 4504, 4505, + 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, + 4514, 4515, 4516, 4517, 4518, 2395, 2395, 2395, + 2395, 4499, 2395, 2395, 4916, 4917, 4918, 4919, + 4920, 4921, 4922, 4923, 4924, 4925, 4926, 4927, + 4928, 4929, 4930, 4931, 4932, 4933, 4934, 4935, + 4936, 2395, 4499, 4764, 2515, 2517, 4765, 4766, + 4767, 4768, 4769, 4770, 4771, 4772, 4773, 4774, + 4775, 4776, 4777, 4778, 4779, 4780, 4781, 4782, + 4763, 1, 4764, 2515, 2517, 4765, 4766, 4767, + 4768, 4769, 4770, 4771, 4772, 4773, 4774, 4775, + 4776, 4777, 4778, 4779, 4780, 4781, 4782, 1, + 4763, 1, 4764, 2515, 2517, 4765, 4766, 4767, + 4768, 4769, 4770, 4771, 4772, 4773, 4774, 4775, + 4776, 4777, 4778, 4779, 4780, 4781, 4782, 1, + 4763, 1, 4764, 2515, 2517, 4765, 4766, 4767, + 4768, 4769, 4770, 4771, 4772, 4773, 4774, 4775, + 4776, 4777, 4778, 4779, 4780, 4781, 4782, 1, + 1, 4763, 1, 4764, 2515, 2517, 4765, 4766, + 4767, 4768, 4769, 4770, 4771, 4772, 4773, 4774, + 4775, 4776, 4777, 4778, 4779, 4780, 4781, 4782, + 1, 1, 4763, 1, 4764, 2515, 2517, 4765, + 4766, 4767, 4768, 4769, 4770, 4771, 4772, 4773, + 4774, 4775, 4776, 4777, 4778, 4779, 4780, 4781, + 4782, 1, 4763, 4764, 2515, 2517, 4765, 4766, + 4767, 4768, 4769, 4770, 4771, 4772, 4773, 4774, + 4775, 4776, 4777, 4778, 4779, 4780, 4781, 4782, + 1, 1, 1, 1, 4763, 1, 1, 4937, + 4938, 4939, 4940, 4941, 4942, 4943, 4944, 4945, + 4946, 4947, 4948, 4949, 4950, 4951, 4952, 4953, + 4954, 4955, 4956, 4957, 1, 4763, 4500, 122, + 124, 4501, 4502, 4503, 4504, 4505, 4506, 4507, + 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, + 4516, 4517, 4518, 4499, 2395, 4500, 122, 124, + 4501, 4502, 4503, 4504, 4505, 4506, 4507, 4508, + 4509, 4510, 4511, 4512, 4513, 4514, 4515, 4516, + 4517, 4518, 2395, 4499, 4500, 122, 124, 4501, + 4502, 4503, 4504, 4505, 4506, 4507, 4508, 4509, + 4510, 4511, 4512, 4513, 4514, 4515, 4516, 4517, + 4518, 2395, 4499, 2396, 2397, 2398, 2399, 2400, + 2402, 2403, 2404, 2406, 2407, 2408, 2409, 2410, + 2411, 2412, 2413, 2414, 2415, 2416, 2417, 2418, + 2419, 2420, 2421, 2422, 2423, 4500, 122, 124, + 4501, 4502, 4503, 4504, 4505, 4506, 4507, 4508, + 4509, 4510, 4511, 4512, 4513, 4514, 4515, 4516, + 4517, 4518, 2401, 2405, 4499, 2424, 2425, 2426, + 2427, 2428, 2429, 2430, 2431, 2432, 2433, 2434, + 2435, 2436, 2437, 2438, 2439, 2440, 2441, 2442, + 2443, 2444, 4500, 122, 124, 4501, 4502, 4503, + 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, + 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4499, + 2445, 2446, 2447, 2448, 2449, 2450, 4500, 122, + 124, 4501, 4502, 4503, 4504, 4505, 4506, 4507, + 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, + 4516, 4517, 4518, 4499, 2451, 2452, 4500, 122, + 124, 4501, 4502, 4503, 4504, 4505, 4506, 4507, + 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, + 4516, 4517, 4518, 4499, 2453, 2454, 2455, 2456, + 2457, 2458, 2459, 2460, 2461, 2462, 2463, 2464, + 2465, 2466, 2467, 4500, 122, 124, 4501, 4502, + 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, + 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, + 4499, 2468, 2469, 2449, 2454, 2470, 4500, 122, + 124, 4501, 4502, 4503, 4504, 4505, 4506, 4507, + 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, + 4516, 4517, 4518, 4499, 2471, 2472, 2473, 2474, + 2475, 2476, 4500, 122, 124, 4501, 4502, 4503, + 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, + 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4499, + 2512, 4500, 122, 124, 4501, 4502, 4503, 4504, + 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, + 4513, 4514, 4515, 4516, 4517, 4518, 4499, 4764, + 2515, 2517, 4765, 4766, 4767, 4768, 4769, 4770, + 4771, 4772, 4773, 4774, 4775, 4776, 4777, 4778, + 4779, 4780, 4781, 4782, 4763, 1, 4764, 2515, + 2517, 4765, 4766, 4767, 4768, 4769, 4770, 4771, + 4772, 4773, 4774, 4775, 4776, 4777, 4778, 4779, + 4780, 4781, 4782, 1, 4763, 4764, 2515, 2517, + 4765, 4766, 4767, 4768, 4769, 4770, 4771, 4772, + 4773, 4774, 4775, 4776, 4777, 4778, 4779, 4780, + 4781, 4782, 1, 4763, 3, 4, 5, 6, + 7, 9, 10, 11, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 4764, 2515, + 2517, 4765, 4766, 4767, 4768, 4769, 4770, 4771, + 4772, 4773, 4774, 4775, 4776, 4777, 4778, 4779, + 4780, 4781, 4782, 8, 12, 4763, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 4764, 2515, 2517, 4765, 4766, + 4767, 4768, 4769, 4770, 4771, 4772, 4773, 4774, + 4775, 4776, 4777, 4778, 4779, 4780, 4781, 4782, + 4763, 52, 53, 54, 55, 56, 57, 4764, + 2515, 2517, 4765, 4766, 4767, 4768, 4769, 4770, + 4771, 4772, 4773, 4774, 4775, 4776, 4777, 4778, + 4779, 4780, 4781, 4782, 4763, 58, 59, 4764, + 2515, 2517, 4765, 4766, 4767, 4768, 4769, 4770, + 4771, 4772, 4773, 4774, 4775, 4776, 4777, 4778, + 4779, 4780, 4781, 4782, 4763, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 4764, 2515, 2517, 4765, + 4766, 4767, 4768, 4769, 4770, 4771, 4772, 4773, + 4774, 4775, 4776, 4777, 4778, 4779, 4780, 4781, + 4782, 4763, 75, 76, 56, 61, 77, 4764, + 2515, 2517, 4765, 4766, 4767, 4768, 4769, 4770, + 4771, 4772, 4773, 4774, 4775, 4776, 4777, 4778, + 4779, 4780, 4781, 4782, 4763, 78, 79, 80, + 81, 82, 83, 4764, 2515, 2517, 4765, 4766, + 4767, 4768, 4769, 4770, 4771, 4772, 4773, 4774, + 4775, 4776, 4777, 4778, 4779, 4780, 4781, 4782, + 4763, 119, 4764, 2515, 2517, 4765, 4766, 4767, + 4768, 4769, 4770, 4771, 4772, 4773, 4774, 4775, + 4776, 4777, 4778, 4779, 4780, 4781, 4782, 4763, + 4499, 4499, 4500, 122, 124, 4501, 4502, 4503, + 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, + 4512, 4513, 4514, 4515, 4516, 4517, 4518, 148, + 4499, 148, 4499, 2395, 148, 148, 4783, 4784, + 4785, 4786, 4787, 4788, 4789, 4790, 4791, 4792, + 4793, 4794, 4795, 4796, 4797, 4798, 4799, 4800, + 4801, 4802, 4803, 148, 148, 148, 4499, 4499, + 4783, 4784, 4785, 4786, 4787, 4788, 4789, 4790, + 4791, 4792, 4793, 4794, 4795, 4796, 4797, 4798, + 4799, 4800, 4801, 4802, 4803, 2395, 148, 4499, + 4500, 122, 124, 4501, 4502, 4503, 4504, 4505, + 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, + 4514, 4515, 4516, 4517, 4518, 4499, 2395, 4499, + 148, 2395, 148, 4500, 122, 124, 4501, 4502, + 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, + 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, + 2395, 2395, 572, 572, 4499, 2395, 4500, 122, + 124, 4501, 4502, 4503, 4504, 4505, 4506, 4507, + 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, + 4516, 4517, 4518, 2395, 2395, 148, 4499, 126, + 2395, 4783, 4784, 4785, 4786, 4787, 4788, 4789, + 4790, 4791, 4792, 4793, 4794, 4795, 4796, 4797, + 4798, 4799, 4800, 4801, 4802, 4803, 148, 2395, + 126, 148, 4499, 4499, 4499, 4499, 4500, 122, + 124, 4501, 4502, 4503, 4504, 4505, 4506, 4507, + 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, + 4516, 4517, 4518, 2395, 2395, 126, 4499, 4499, + 148, 148, 4916, 4917, 4918, 4919, 4920, 4921, + 4922, 4923, 4924, 4925, 4926, 4927, 4928, 4929, + 4930, 4931, 4932, 4933, 4934, 4935, 4936, 2395, + 148, 2395, 4499, 4783, 4784, 4785, 4786, 4787, + 4788, 4789, 4790, 4791, 4792, 4793, 4794, 4795, + 4796, 4797, 4798, 4799, 4800, 4801, 4802, 4803, + 4499, 148, 2395, 4500, 122, 124, 4501, 4502, + 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, + 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, + 2395, 4499, 148, 148, 4500, 122, 124, 4501, + 4502, 4503, 4504, 4505, 4506, 4507, 4508, 4509, + 4510, 4511, 4512, 4513, 4514, 4515, 4516, 4517, + 4518, 126, 148, 2395, 148, 4499, 4958, 4959, + 184, 2398, 4960, 4961, 4962, 4963, 4964, 4965, + 4966, 4967, 4968, 4969, 4970, 4971, 4972, 4973, + 4974, 4975, 4976, 4977, 4978, 4979, 2416, 4980, + 2418, 4981, 4982, 4983, 4984, 2423, 4500, 122, + 124, 4501, 4502, 4503, 4504, 4505, 4506, 4507, + 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, + 4516, 4517, 4518, 4499, 2424, 4985, 4986, 217, + 3020, 3022, 218, 219, 220, 221, 4987, 223, + 224, 225, 226, 227, 228, 4988, 4989, 2430, + 4990, 4991, 234, 4992, 236, 4993, 1528, 1529, + 4994, 2436, 4995, 4996, 4997, 4998, 4999, 5000, + 1538, 5001, 151, 152, 2444, 249, 250, 251, + 252, 4500, 122, 124, 4501, 4502, 4503, 4504, + 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, + 4513, 4514, 4515, 4516, 4517, 4518, 3021, 151, + 153, 151, 4499, 181, 181, 181, 571, 5003, + 150, 152, 153, 4564, 3196, 5004, 4566, 158, + 5005, 160, 161, 5006, 5007, 5008, 5009, 5010, + 5011, 5012, 5013, 5014, 5015, 5016, 5017, 5018, + 5019, 5021, 5022, 5023, 5024, 421, 148, 148, + 151, 5020, 5002, 5025, 3085, 3180, 5026, 5027, + 5028, 5029, 5030, 5031, 5032, 5033, 5034, 5035, + 5036, 5037, 5038, 5039, 5040, 5042, 5043, 5044, + 5045, 5041, 5002, 5046, 5047, 255, 2447, 257, + 258, 259, 260, 261, 262, 263, 151, 5048, + 265, 5049, 267, 5050, 269, 5051, 5052, 3371, + 5053, 4500, 122, 124, 4501, 4502, 4503, 4504, + 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, + 4513, 4514, 4515, 4516, 4517, 4518, 3372, 4499, + 5055, 3371, 3373, 5056, 5057, 5058, 5059, 5060, + 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, + 5069, 5070, 5071, 5072, 5073, 5054, 5074, 5075, + 5076, 3685, 3049, 3021, 3050, 3686, 3051, 3052, + 3687, 3688, 3689, 3371, 5077, 5078, 5079, 5080, + 5081, 5082, 5083, 5084, 5085, 5086, 5087, 5088, + 5089, 5090, 5091, 5092, 5093, 5094, 5095, 5096, + 5097, 3372, 4499, 181, 181, 181, 571, 5098, + 150, 152, 153, 4564, 3501, 5099, 4566, 158, + 5100, 160, 161, 5101, 5102, 5103, 5104, 5105, + 5106, 5107, 5108, 5109, 5110, 5111, 5112, 5113, + 5114, 177, 5115, 5116, 5117, 421, 148, 148, + 151, 176, 4562, 5118, 3624, 3626, 5119, 5120, + 5121, 5122, 5123, 5124, 5125, 5126, 5127, 5128, + 5129, 5130, 5131, 5132, 5133, 5042, 5134, 5135, + 5136, 5041, 5002, 571, 5138, 3688, 3756, 5139, + 5140, 5141, 5142, 5143, 5144, 5145, 5146, 5147, + 5148, 5149, 5150, 5151, 5152, 5153, 5154, 5155, + 5156, 5137, 5158, 3878, 3880, 5159, 5160, 5161, + 5162, 5163, 5164, 5165, 5166, 5167, 5168, 5169, + 5170, 5171, 5172, 5173, 5174, 5175, 5176, 5157, + 5177, 4001, 4003, 5178, 5179, 5180, 5181, 5182, + 5183, 5184, 5185, 5186, 5187, 5188, 5189, 5190, + 5191, 5192, 5193, 5194, 5195, 5054, 5055, 3371, + 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, + 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, + 5071, 5072, 5073, 1, 1, 1, 1, 5054, + 5055, 3371, 3373, 5056, 5057, 5058, 5059, 5060, + 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, + 5069, 5070, 5071, 5072, 5073, 1, 5054, 5196, + 5197, 5198, 5199, 5200, 5201, 5202, 5203, 5204, + 5205, 5206, 5207, 5208, 5209, 5210, 5211, 5212, + 5213, 5214, 5215, 5216, 1, 5054, 3250, 4500, + 122, 124, 4501, 4502, 4503, 4504, 4505, 4506, + 4507, 4508, 4509, 4510, 4511, 4512, 4513, 4514, + 4515, 4516, 4517, 4518, 4499, 5217, 5218, 5219, + 5220, 5221, 5222, 5223, 5224, 5225, 5226, 5227, + 5228, 5229, 5230, 5231, 5232, 5233, 5234, 5235, + 5236, 5237, 3250, 4499, 1, 5055, 3371, 3373, + 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, + 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, + 5072, 5073, 5054, 5196, 5197, 5198, 5199, 5200, + 5201, 5202, 5203, 5204, 5205, 5206, 5207, 5208, + 5209, 5210, 5211, 5212, 5213, 5214, 5215, 5216, + 1, 5054, 4500, 122, 124, 4501, 4502, 4503, + 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, + 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4499, + 3250, 4500, 122, 124, 4501, 4502, 4503, 4504, + 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, + 4513, 4514, 4515, 4516, 4517, 4518, 3250, 4499, + 3250, 4500, 122, 124, 4501, 4502, 4503, 4504, + 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, + 4513, 4514, 4515, 4516, 4517, 4518, 3250, 4499, + 3250, 4500, 122, 124, 4501, 4502, 4503, 4504, + 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, + 4513, 4514, 4515, 4516, 4517, 4518, 3250, 3250, + 4499, 3250, 4500, 122, 124, 4501, 4502, 4503, + 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, + 4512, 4513, 4514, 4515, 4516, 4517, 4518, 3250, + 3250, 4499, 3250, 4500, 122, 124, 4501, 4502, + 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, + 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, + 3250, 4499, 4500, 122, 124, 4501, 4502, 4503, + 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, + 4512, 4513, 4514, 4515, 4516, 4517, 4518, 3250, + 3250, 3250, 3250, 4499, 3250, 3250, 5217, 5218, + 5219, 5220, 5221, 5222, 5223, 5224, 5225, 5226, + 5227, 5228, 5229, 5230, 5231, 5232, 5233, 5234, + 5235, 5236, 5237, 3250, 4499, 5055, 3371, 3373, + 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, + 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, + 5072, 5073, 5054, 1, 5055, 3371, 3373, 5056, + 5057, 5058, 5059, 5060, 5061, 5062, 5063, 5064, + 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, + 5073, 1, 5054, 1, 5055, 3371, 3373, 5056, + 5057, 5058, 5059, 5060, 5061, 5062, 5063, 5064, + 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, + 5073, 1, 5054, 1, 5055, 3371, 3373, 5056, + 5057, 5058, 5059, 5060, 5061, 5062, 5063, 5064, + 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, + 5073, 1, 1, 5054, 1, 5055, 3371, 3373, + 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, + 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, + 5072, 5073, 1, 1, 5054, 1, 5055, 3371, + 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, + 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, + 5071, 5072, 5073, 1, 5054, 5055, 3371, 3373, + 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, + 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, + 5072, 5073, 1, 1, 1, 1, 5054, 1, + 1, 5196, 5197, 5198, 5199, 5200, 5201, 5202, + 5203, 5204, 5205, 5206, 5207, 5208, 5209, 5210, + 5211, 5212, 5213, 5214, 5215, 5216, 1, 5054, + 4500, 122, 124, 4501, 4502, 4503, 4504, 4505, + 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, + 4514, 4515, 4516, 4517, 4518, 4499, 3250, 4500, + 122, 124, 4501, 4502, 4503, 4504, 4505, 4506, + 4507, 4508, 4509, 4510, 4511, 4512, 4513, 4514, + 4515, 4516, 4517, 4518, 3250, 4499, 4500, 122, + 124, 4501, 4502, 4503, 4504, 4505, 4506, 4507, + 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, + 4516, 4517, 4518, 3250, 4499, 3252, 3253, 3254, + 3255, 3256, 3258, 3259, 3260, 3262, 3263, 3264, + 3265, 3266, 3267, 3268, 3269, 3270, 3271, 3272, + 3273, 3274, 3275, 3276, 3277, 3278, 3279, 4500, + 122, 124, 4501, 4502, 4503, 4504, 4505, 4506, + 4507, 4508, 4509, 4510, 4511, 4512, 4513, 4514, + 4515, 4516, 4517, 4518, 3257, 3261, 4499, 3280, + 3281, 3282, 3283, 3284, 3285, 3286, 3287, 3288, + 3289, 3290, 3291, 3292, 3293, 3294, 3295, 3296, + 3297, 3298, 3299, 3300, 4500, 122, 124, 4501, + 4502, 4503, 4504, 4505, 4506, 4507, 4508, 4509, + 4510, 4511, 4512, 4513, 4514, 4515, 4516, 4517, + 4518, 4499, 3301, 3302, 3303, 3304, 3305, 3306, + 4500, 122, 124, 4501, 4502, 4503, 4504, 4505, + 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, + 4514, 4515, 4516, 4517, 4518, 4499, 3307, 3308, + 4500, 122, 124, 4501, 4502, 4503, 4504, 4505, + 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, + 4514, 4515, 4516, 4517, 4518, 4499, 3309, 3310, + 3311, 3312, 3313, 3314, 3315, 3316, 3317, 3318, + 3319, 3320, 3321, 3322, 3323, 4500, 122, 124, + 4501, 4502, 4503, 4504, 4505, 4506, 4507, 4508, + 4509, 4510, 4511, 4512, 4513, 4514, 4515, 4516, + 4517, 4518, 4499, 3324, 3325, 3305, 3310, 3326, + 4500, 122, 124, 4501, 4502, 4503, 4504, 4505, + 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, + 4514, 4515, 4516, 4517, 4518, 4499, 3327, 3328, + 3329, 3330, 3331, 3332, 4500, 122, 124, 4501, + 4502, 4503, 4504, 4505, 4506, 4507, 4508, 4509, + 4510, 4511, 4512, 4513, 4514, 4515, 4516, 4517, + 4518, 4499, 3368, 4500, 122, 124, 4501, 4502, + 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, + 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, + 4499, 5055, 3371, 3373, 5056, 5057, 5058, 5059, + 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, + 5068, 5069, 5070, 5071, 5072, 5073, 5054, 1, + 5055, 3371, 3373, 5056, 5057, 5058, 5059, 5060, + 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, + 5069, 5070, 5071, 5072, 5073, 1, 5054, 5055, + 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, + 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, + 5070, 5071, 5072, 5073, 1, 5054, 3, 4, + 5, 6, 7, 9, 10, 11, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, + 5055, 3371, 3373, 5056, 5057, 5058, 5059, 5060, + 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, + 5069, 5070, 5071, 5072, 5073, 8, 12, 5054, + 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 5055, 3371, 3373, + 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, + 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, + 5072, 5073, 5054, 52, 53, 54, 55, 56, + 57, 5055, 3371, 3373, 5056, 5057, 5058, 5059, + 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, + 5068, 5069, 5070, 5071, 5072, 5073, 5054, 58, + 59, 5055, 3371, 3373, 5056, 5057, 5058, 5059, + 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, + 5068, 5069, 5070, 5071, 5072, 5073, 5054, 60, + 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 5055, 3371, + 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, + 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, + 5071, 5072, 5073, 5054, 75, 76, 56, 61, + 77, 5055, 3371, 3373, 5056, 5057, 5058, 5059, + 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, + 5068, 5069, 5070, 5071, 5072, 5073, 5054, 78, + 79, 80, 81, 82, 83, 5055, 3371, 3373, + 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, + 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, + 5072, 5073, 5054, 119, 5055, 3371, 3373, 5056, + 5057, 5058, 5059, 5060, 5061, 5062, 5063, 5064, + 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, + 5073, 5054, 5054, 5196, 5197, 5198, 5199, 5200, + 5201, 5202, 5203, 5204, 5205, 5206, 5207, 5208, + 5209, 5210, 5211, 5212, 5213, 5214, 5215, 5216, + 5054, 1, 5054, 5055, 3371, 3373, 5056, 5057, + 5058, 5059, 5060, 5061, 5062, 5063, 5064, 5065, + 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5073, + 5054, 5054, 1, 1, 5196, 5197, 5198, 5199, + 5200, 5201, 5202, 5203, 5204, 5205, 5206, 5207, + 5208, 5209, 5210, 5211, 5212, 5213, 5214, 5215, + 5216, 1, 1, 5054, 5055, 3371, 3373, 5056, + 5057, 5058, 5059, 5060, 5061, 5062, 5063, 5064, + 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, + 5073, 5054, 5054, 5054, 5054, 5054, 1, 5055, + 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, + 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, + 5070, 5071, 5072, 5073, 5054, 5054, 5054, 5054, + 5054, 5054, 1, 5054, 5054, 5055, 3371, 3373, + 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, + 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, + 5072, 5073, 5054, 5054, 1, 1, 5055, 3371, + 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, + 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, + 5071, 5072, 5073, 1, 1, 5054, 5055, 3371, + 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, + 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, + 5071, 5072, 5073, 1, 1, 1, 1, 1, + 5054, 1, 5055, 3371, 3373, 5056, 5057, 5058, + 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, + 5067, 5068, 5069, 5070, 5071, 5072, 5073, 1, + 5054, 1, 5055, 3371, 3373, 5056, 5057, 5058, + 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, + 5067, 5068, 5069, 5070, 5071, 5072, 5073, 1, + 1, 1, 5054, 5196, 5197, 5198, 5199, 5200, + 5201, 5202, 5203, 5204, 5205, 5206, 5207, 5208, + 5209, 5210, 5211, 5212, 5213, 5214, 5215, 5216, + 1, 1, 5054, 5054, 5054, 5055, 3371, 3373, + 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, + 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, + 5072, 5073, 5054, 5054, 5054, 1, 5055, 3371, + 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, + 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, + 5071, 5072, 5073, 1, 1, 1, 1, 1, + 5054, 5196, 5197, 5198, 5199, 5200, 5201, 5202, + 5203, 5204, 5205, 5206, 5207, 5208, 5209, 5210, + 5211, 5212, 5213, 5214, 5215, 5216, 1, 1, + 5054, 5054, 5054, 5055, 3371, 3373, 5056, 5057, + 5058, 5059, 5060, 5061, 5062, 5063, 5064, 5065, + 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5073, + 5054, 5054, 5054, 1, 5055, 3371, 3373, 5056, + 5057, 5058, 5059, 5060, 5061, 5062, 5063, 5064, + 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, + 5073, 1, 5054, 1, 1, 5055, 3371, 3373, + 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, + 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, + 5072, 5073, 1, 1, 1, 5054, 1, 5055, + 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, + 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, + 5070, 5071, 5072, 5073, 1, 5054, 5055, 3371, + 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, + 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, + 5071, 5072, 5073, 1, 5054, 1, 5055, 3371, + 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, + 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, + 5071, 5072, 5073, 1, 1, 5054, 5055, 3371, + 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, + 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, + 5071, 5072, 5073, 1, 5054, 1, 1, 1, + 5055, 3371, 3373, 5056, 5057, 5058, 5059, 5060, + 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, + 5069, 5070, 5071, 5072, 5073, 1, 1, 5054, + 5055, 3371, 3373, 5056, 5057, 5058, 5059, 5060, + 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, + 5069, 5070, 5071, 5072, 5073, 1, 5054, 5055, + 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, + 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, + 5070, 5071, 5072, 5073, 1, 1, 1, 1, + 5054, 1, 5055, 3371, 3373, 5056, 5057, 5058, + 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, + 5067, 5068, 5069, 5070, 5071, 5072, 5073, 5054, + 5055, 3371, 3373, 5056, 5057, 5058, 5059, 5060, + 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, + 5069, 5070, 5071, 5072, 5073, 1, 5054, 5055, + 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, + 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, + 5070, 5071, 5072, 5073, 1, 1, 1, 1, + 1, 5054, 1, 5055, 3371, 3373, 5056, 5057, + 5058, 5059, 5060, 5061, 5062, 5063, 5064, 5065, + 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5073, + 1, 1, 5054, 5055, 3371, 3373, 5056, 5057, + 5058, 5059, 5060, 5061, 5062, 5063, 5064, 5065, + 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5073, + 1, 5054, 5055, 3371, 3373, 5056, 5057, 5058, + 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, + 5067, 5068, 5069, 5070, 5071, 5072, 5073, 1, + 1, 5054, 5055, 3371, 3373, 5056, 5057, 5058, + 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, + 5067, 5068, 5069, 5070, 5071, 5072, 5073, 1, + 1, 5054, 5196, 5197, 5198, 5199, 5200, 5201, + 5202, 5203, 5204, 5205, 5206, 5207, 5208, 5209, + 5210, 5211, 5212, 5213, 5214, 5215, 5216, 1, + 5054, 5055, 3371, 3373, 5056, 5057, 5058, 5059, + 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, + 5068, 5069, 5070, 5071, 5072, 5073, 5054, 5054, + 1, 5055, 3371, 3373, 5056, 5057, 5058, 5059, + 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, + 5068, 5069, 5070, 5071, 5072, 5073, 1, 5054, + 1, 5055, 3371, 3373, 5056, 5057, 5058, 5059, + 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, + 5068, 5069, 5070, 5071, 5072, 5073, 5054, 5055, + 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, + 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, + 5070, 5071, 5072, 5073, 1, 1, 5054, 5055, + 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, + 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, + 5070, 5071, 5072, 5073, 1, 5054, 1, 5055, + 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, + 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, + 5070, 5071, 5072, 5073, 1, 1, 5054, 5055, + 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, + 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, + 5070, 5071, 5072, 5073, 1, 5054, 5196, 5197, + 5198, 5199, 5200, 5201, 5202, 5203, 5204, 5205, + 5206, 5207, 5208, 5209, 5210, 5211, 5212, 5213, + 5214, 5215, 5216, 1, 1, 5054, 5055, 3371, + 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, + 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, + 5071, 5072, 5073, 5054, 5054, 1, 5055, 3371, + 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, + 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, + 5071, 5072, 5073, 1, 1, 5054, 5055, 3371, + 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, + 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, + 5071, 5072, 5073, 1, 5054, 5055, 3371, 3373, + 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, + 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, + 5072, 5073, 1, 5054, 1, 5055, 3371, 3373, + 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, + 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, + 5072, 5073, 1, 1, 1, 1, 5054, 5055, + 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, + 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, + 5070, 5071, 5072, 5073, 1, 1, 5054, 5055, + 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, + 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, + 5070, 5071, 5072, 5073, 1, 1, 5054, 5055, + 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, + 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, + 5070, 5071, 5072, 5073, 1, 1, 5054, 5055, + 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, + 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, + 5070, 5071, 5072, 5073, 1, 5054, 5055, 3371, + 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, + 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, + 5071, 5072, 5073, 1, 5054, 1, 5055, 3371, + 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, + 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, + 5071, 5072, 5073, 5054, 5055, 3371, 3373, 5056, + 5057, 5058, 5059, 5060, 5061, 5062, 5063, 5064, + 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, + 5073, 1, 5054, 5055, 3371, 3373, 5056, 5057, + 5058, 5059, 5060, 5061, 5062, 5063, 5064, 5065, + 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5073, + 1, 5054, 5055, 3371, 3373, 5056, 5057, 5058, + 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, + 5067, 5068, 5069, 5070, 5071, 5072, 5073, 1, + 5054, 5055, 3371, 3373, 5056, 5057, 5058, 5059, + 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, + 5068, 5069, 5070, 5071, 5072, 5073, 1, 1, + 5054, 5055, 3371, 3373, 5056, 5057, 5058, 5059, + 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, + 5068, 5069, 5070, 5071, 5072, 5073, 1, 5054, + 5055, 3371, 3373, 5056, 5057, 5058, 5059, 5060, + 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, + 5069, 5070, 5071, 5072, 5073, 1, 5054, 1, + 1, 1, 5055, 3371, 3373, 5056, 5057, 5058, + 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, + 5067, 5068, 5069, 5070, 5071, 5072, 5073, 1, + 5054, 5196, 5197, 5198, 5199, 5200, 5201, 5202, + 5203, 5204, 5205, 5206, 5207, 5208, 5209, 5210, + 5211, 5212, 5213, 5214, 5215, 5216, 1, 1, + 5054, 5055, 3371, 3373, 5056, 5057, 5058, 5059, + 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, + 5068, 5069, 5070, 5071, 5072, 5073, 5054, 5054, + 1, 5055, 3371, 3373, 5056, 5057, 5058, 5059, + 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, + 5068, 5069, 5070, 5071, 5072, 5073, 1, 5054, + 5055, 3371, 3373, 5056, 5057, 5058, 5059, 5060, + 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, + 5069, 5070, 5071, 5072, 5073, 1, 5054, 5196, + 5197, 5198, 5199, 5200, 5201, 5202, 5203, 5204, + 5205, 5206, 5207, 5208, 5209, 5210, 5211, 5212, + 5213, 5214, 5215, 5216, 1, 1, 5054, 5055, + 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, + 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, + 5070, 5071, 5072, 5073, 5054, 5054, 1, 5055, + 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, + 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, + 5070, 5071, 5072, 5073, 1, 5054, 1, 5055, + 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, + 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, + 5070, 5071, 5072, 5073, 1, 1, 5054, 1, + 5055, 3371, 3373, 5056, 5057, 5058, 5059, 5060, + 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, + 5069, 5070, 5071, 5072, 5073, 1, 1, 1, + 5054, 1, 5055, 3371, 3373, 5056, 5057, 5058, + 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, + 5067, 5068, 5069, 5070, 5071, 5072, 5073, 1, + 1, 5054, 5055, 3371, 3373, 5056, 5057, 5058, + 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, + 5067, 5068, 5069, 5070, 5071, 5072, 5073, 1, + 1, 5054, 1, 5055, 3371, 3373, 5056, 5057, + 5058, 5059, 5060, 5061, 5062, 5063, 5064, 5065, + 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5073, + 5054, 5055, 3371, 3373, 5056, 5057, 5058, 5059, + 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, + 5068, 5069, 5070, 5071, 5072, 5073, 1, 1, + 5054, 5055, 3371, 3373, 5056, 5057, 5058, 5059, + 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, + 5068, 5069, 5070, 5071, 5072, 5073, 1, 5054, + 84, 85, 86, 87, 88, 5055, 3371, 3373, + 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, + 5064, 5065, 5066, 5067, 5068, 5069, 5070, 5071, + 5072, 5073, 5054, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 100, 104, 105, 106, 5055, 3371, + 3373, 5056, 5057, 5058, 5059, 5060, 5061, 5062, + 5063, 5064, 5065, 5066, 5067, 5068, 5069, 5070, + 5071, 5072, 5073, 5054, 107, 108, 109, 110, + 5055, 3371, 3373, 5056, 5057, 5058, 5059, 5060, + 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, + 5069, 5070, 5071, 5072, 5073, 5054, 111, 5055, + 3371, 3373, 5056, 5057, 5058, 5059, 5060, 5061, + 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, + 5070, 5071, 5072, 5073, 5054, 112, 113, 114, + 115, 116, 117, 5055, 3371, 3373, 5056, 5057, + 5058, 5059, 5060, 5061, 5062, 5063, 5064, 5065, + 5066, 5067, 5068, 5069, 5070, 5071, 5072, 5073, + 5054, 118, 5055, 3371, 3373, 5056, 5057, 5058, + 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, + 5067, 5068, 5069, 5070, 5071, 5072, 5073, 5054, + 120, 121, 122, 124, 5055, 3371, 3373, 5056, + 5057, 5058, 5059, 5060, 5061, 5062, 5063, 5064, + 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, + 5073, 123, 5054, 5238, 4499, 3371, 5077, 5078, + 5079, 5080, 5081, 5082, 5083, 5084, 5085, 5086, + 5087, 5088, 5089, 5090, 5091, 5092, 5093, 5094, + 5095, 5096, 5097, 3372, 5077, 5078, 5079, 5080, + 5081, 5082, 5083, 5084, 5085, 5086, 5087, 5088, + 5089, 5090, 5091, 5092, 5093, 5094, 5095, 5096, + 5097, 3372, 5053, 4500, 122, 124, 4501, 4502, + 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, + 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, + 4499, 3372, 153, 274, 275, 153, 1549, 5239, + 5240, 5241, 280, 281, 282, 5242, 284, 5243, + 5244, 5245, 5246, 5247, 5248, 5249, 5250, 2465, + 5251, 295, 296, 152, 5252, 3196, 5253, 5254, + 5255, 5256, 5257, 5258, 5259, 5260, 5261, 5262, + 5263, 5264, 5265, 5266, 5267, 5268, 5269, 5270, + 5271, 5272, 5273, 151, 3021, 4499, 181, 181, + 181, 571, 5274, 150, 152, 153, 4564, 4211, + 5275, 4566, 158, 5276, 160, 161, 5277, 5278, + 5279, 5280, 5281, 5282, 5283, 5284, 5285, 5286, + 5287, 5288, 5289, 5290, 5021, 5291, 5292, 5293, + 421, 148, 148, 151, 5020, 5002, 181, 181, + 181, 571, 5003, 150, 152, 153, 4564, 3196, + 5004, 4566, 158, 5005, 160, 161, 5006, 5007, + 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, + 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, + 421, 148, 148, 1, 1, 1, 1, 151, + 5020, 5002, 181, 181, 181, 571, 5003, 150, + 152, 153, 4564, 3196, 5004, 4566, 158, 5005, + 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, + 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, + 5021, 5022, 5023, 5024, 421, 148, 148, 1, + 151, 5020, 5002, 181, 181, 181, 571, 5294, + 4805, 4807, 4808, 4809, 5295, 5296, 4811, 4812, + 5297, 4814, 4815, 5298, 5299, 5300, 5301, 5302, + 5303, 5304, 5305, 5306, 5307, 5308, 5309, 5310, + 5311, 5313, 5314, 5315, 5316, 421, 148, 148, + 1, 4806, 1, 5312, 1, 5002, 148, 2984, + 148, 181, 148, 4500, 122, 124, 4501, 4502, + 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, + 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, + 4499, 5317, 5318, 5319, 5320, 5321, 5322, 5323, + 5324, 5325, 5326, 5327, 5328, 5329, 5330, 5331, + 5332, 5333, 5334, 5335, 5336, 5337, 2984, 4499, + 181, 181, 181, 571, 1, 5003, 150, 152, + 153, 4564, 3196, 5004, 4566, 158, 5005, 160, + 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, + 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, + 5022, 5023, 5024, 421, 148, 148, 151, 5020, + 5002, 181, 181, 181, 571, 5294, 4805, 4807, + 4808, 4809, 5295, 5296, 4811, 4812, 5297, 4814, + 4815, 5298, 5299, 5300, 5301, 5302, 5303, 5304, + 5305, 5306, 5307, 5308, 5309, 5310, 5311, 5313, + 5314, 5315, 5316, 5002, 421, 5002, 148, 5002, + 148, 5002, 4806, 5312, 1, 4499, 4499, 4500, + 122, 124, 4501, 4502, 4503, 4504, 4505, 4506, + 4507, 4508, 4509, 4510, 4511, 4512, 4513, 4514, + 4515, 4516, 4517, 4518, 148, 4499, 148, 4499, + 2984, 4499, 4783, 4784, 4785, 4786, 4787, 4788, + 4789, 4790, 4791, 4792, 4793, 4794, 4795, 4796, + 4797, 4798, 4799, 4800, 4801, 4802, 4803, 2984, + 148, 4499, 4500, 122, 124, 4501, 4502, 4503, + 4504, 4505, 4506, 4507, 4508, 4509, 4510, 4511, + 4512, 4513, 4514, 4515, 4516, 4517, 4518, 4499, + 2984, 4499, 148, 2984, 148, 181, 4500, 122, + 124, 4501, 4502, 4503, 4504, 4505, 4506, 4507, + 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, + 4516, 4517, 4518, 2984, 2984, 572, 572, 4499, + 2984, 4500, 122, 124, 4501, 4502, 4503, 4504, + 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, + 4513, 4514, 4515, 4516, 4517, 4518, 2984, 2984, + 148, 4499, 421, 2984, 4783, 4784, 4785, 4786, + 4787, 4788, 4789, 4790, 4791, 4792, 4793, 4794, + 4795, 4796, 4797, 4798, 4799, 4800, 4801, 4802, + 4803, 148, 2984, 421, 148, 4499, 4499, 4499, + 4499, 4500, 122, 124, 4501, 4502, 4503, 4504, + 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, + 4513, 4514, 4515, 4516, 4517, 4518, 2984, 2984, + 421, 4499, 4499, 148, 148, 5317, 5318, 5319, + 5320, 5321, 5322, 5323, 5324, 5325, 5326, 5327, + 5328, 5329, 5330, 5331, 5332, 5333, 5334, 5335, + 5336, 5337, 2984, 148, 2984, 4499, 2518, 2518, + 2518, 2774, 5003, 150, 152, 153, 4564, 3196, + 5004, 4566, 158, 5005, 160, 161, 5006, 5007, + 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, + 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, + 2646, 2008, 2008, 5002, 151, 5002, 5020, 5002, + 1, 181, 181, 181, 571, 5003, 150, 152, + 153, 4564, 3196, 5004, 4566, 158, 5005, 160, + 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, + 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, + 5022, 5023, 5024, 421, 148, 148, 1, 151, + 5020, 5002, 181, 181, 181, 571, 1, 5003, + 150, 152, 153, 4564, 3196, 5004, 4566, 158, + 5005, 160, 161, 5006, 5007, 5008, 5009, 5010, + 5011, 5012, 5013, 5014, 5015, 5016, 5017, 5018, + 5019, 5021, 5022, 5023, 5024, 421, 148, 148, + 1, 151, 5020, 5002, 181, 181, 181, 571, + 1, 5003, 150, 152, 153, 4564, 3196, 5004, + 4566, 158, 5005, 160, 161, 5006, 5007, 5008, + 5009, 5010, 5011, 5012, 5013, 5014, 5015, 5016, + 5017, 5018, 5019, 5021, 5022, 5023, 5024, 421, + 148, 148, 1, 1, 151, 5020, 5002, 181, + 181, 181, 571, 1, 5003, 150, 152, 153, + 4564, 3196, 5004, 4566, 158, 5005, 160, 161, + 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, + 5014, 5015, 5016, 5017, 5018, 5019, 5021, 5022, + 5023, 5024, 421, 148, 148, 1, 1, 151, + 5020, 5002, 181, 181, 181, 571, 1, 5003, + 150, 152, 153, 4564, 3196, 5004, 4566, 158, + 5005, 160, 161, 5006, 5007, 5008, 5009, 5010, + 5011, 5012, 5013, 5014, 5015, 5016, 5017, 5018, + 5019, 5021, 5022, 5023, 5024, 421, 148, 148, + 1, 151, 5020, 5002, 181, 181, 181, 571, + 5003, 150, 152, 153, 4564, 3196, 5004, 4566, + 158, 5005, 160, 161, 5006, 5007, 5008, 5009, + 5010, 5011, 5012, 5013, 5014, 5015, 5016, 5017, + 5018, 5019, 5021, 5022, 5023, 5024, 421, 148, + 148, 1, 1, 1, 1, 151, 5020, 5002, + 181, 181, 181, 571, 1, 1, 5294, 4805, + 4807, 4808, 4809, 5295, 5296, 4811, 4812, 5297, + 4814, 4815, 5298, 5299, 5300, 5301, 5302, 5303, + 5304, 5305, 5306, 5307, 5308, 5309, 5310, 5311, + 5313, 5314, 5315, 5316, 421, 148, 148, 1, + 4806, 1, 5312, 1, 5002, 4783, 4784, 4785, + 4786, 4787, 4788, 4789, 4790, 4791, 4792, 4793, + 4794, 4795, 4796, 4797, 4798, 4799, 4800, 4801, + 4802, 4803, 4499, 148, 2984, 4500, 122, 124, + 4501, 4502, 4503, 4504, 4505, 4506, 4507, 4508, + 4509, 4510, 4511, 4512, 4513, 4514, 4515, 4516, + 4517, 4518, 2984, 4499, 148, 148, 4500, 122, + 124, 4501, 4502, 4503, 4504, 4505, 4506, 4507, + 4508, 4509, 4510, 4511, 4512, 4513, 4514, 4515, + 4516, 4517, 4518, 421, 148, 2984, 148, 4499, + 2986, 2987, 184, 2988, 2989, 2990, 2991, 2992, + 2993, 2994, 2995, 2996, 2997, 2998, 2999, 3000, + 3001, 3002, 3003, 3004, 3005, 3006, 3007, 3008, + 3009, 3010, 3011, 3012, 3013, 3014, 3015, 3016, + 4500, 122, 124, 4501, 4502, 4503, 4504, 4505, + 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, + 4514, 4515, 4516, 4517, 4518, 4499, 3017, 3018, + 3019, 217, 3020, 3022, 218, 219, 220, 221, + 3023, 223, 224, 225, 226, 227, 228, 3024, + 3025, 3026, 3027, 3028, 234, 3029, 236, 3030, + 483, 484, 3031, 3032, 3033, 3034, 3035, 3036, + 3037, 3038, 646, 3039, 151, 152, 3040, 249, + 250, 251, 252, 4500, 122, 124, 4501, 4502, + 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, + 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, + 3021, 151, 153, 151, 4499, 3041, 3042, 255, + 3043, 257, 258, 259, 260, 261, 262, 263, + 151, 3044, 265, 3045, 267, 3046, 269, 4500, + 122, 124, 4501, 4502, 4503, 4504, 4505, 4506, + 4507, 4508, 4509, 4510, 4511, 4512, 4513, 4514, + 4515, 4516, 4517, 4518, 4499, 3047, 3048, 3049, + 3021, 3050, 3051, 3052, 4500, 122, 124, 4501, + 4502, 4503, 4504, 4505, 4506, 4507, 4508, 4509, + 4510, 4511, 4512, 4513, 4514, 4515, 4516, 4517, + 4518, 4499, 153, 274, 275, 153, 657, 3181, + 3182, 3183, 280, 281, 282, 3184, 284, 3185, + 3186, 3187, 3188, 3189, 3190, 3191, 3192, 3193, + 3194, 295, 296, 152, 3195, 3196, 5253, 5254, + 5255, 5256, 5257, 5258, 5259, 5260, 5261, 5262, + 5263, 5264, 5265, 5266, 5267, 5268, 5269, 5270, + 5271, 5272, 5273, 151, 3021, 4499, 181, 181, + 181, 571, 5003, 150, 152, 153, 4564, 3196, + 5004, 4566, 158, 5005, 160, 161, 5006, 5007, + 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, + 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, + 421, 148, 148, 1, 151, 5020, 5002, 181, + 181, 181, 571, 5003, 150, 152, 153, 4564, + 3196, 5004, 4566, 158, 5005, 160, 161, 5006, + 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, + 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, + 5024, 421, 148, 148, 1, 1, 1, 1, + 1, 151, 5020, 5002, 181, 181, 181, 571, + 1, 5003, 150, 152, 153, 4564, 3196, 5004, + 4566, 158, 5005, 160, 161, 5006, 5007, 5008, + 5009, 5010, 5011, 5012, 5013, 5014, 5015, 5016, + 5017, 5018, 5019, 5021, 5022, 5023, 5024, 421, + 148, 148, 1, 1, 151, 5020, 5002, 181, + 181, 181, 571, 5003, 150, 152, 153, 4564, + 3196, 5004, 4566, 158, 5005, 160, 161, 5006, + 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, + 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, + 5024, 421, 148, 148, 1, 151, 5020, 5002, + 181, 181, 181, 571, 5003, 150, 152, 153, + 4564, 3196, 5004, 4566, 158, 5005, 160, 161, + 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, + 5014, 5015, 5016, 5017, 5018, 5019, 5021, 5022, + 5023, 5024, 421, 148, 148, 1, 1, 151, + 5020, 5002, 181, 181, 181, 571, 5003, 150, + 152, 153, 4564, 3196, 5004, 4566, 158, 5005, + 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, + 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, + 5021, 5022, 5023, 5024, 421, 148, 148, 1, + 1, 151, 5020, 5002, 181, 181, 181, 571, + 5294, 4805, 4807, 4808, 4809, 5295, 5296, 4811, + 4812, 5297, 4814, 4815, 5298, 5299, 5300, 5301, + 5302, 5303, 5304, 5305, 5306, 5307, 5308, 5309, + 5310, 5311, 5313, 5314, 5315, 5316, 421, 148, + 148, 1, 4806, 1, 5312, 1, 5002, 5253, + 5254, 5255, 5256, 5257, 5258, 5259, 5260, 5261, + 5262, 5263, 5264, 5265, 5266, 5267, 5268, 5269, + 5270, 5271, 5272, 5273, 3021, 181, 181, 181, + 571, 5003, 150, 152, 153, 4564, 3196, 5004, + 4566, 158, 5005, 160, 161, 5006, 5007, 5008, + 5009, 5010, 5011, 5012, 5013, 5014, 5015, 5016, + 5017, 5018, 5019, 5021, 5022, 5023, 5024, 421, + 148, 148, 1, 1, 151, 5020, 5002, 181, + 181, 181, 571, 5003, 150, 152, 153, 4564, + 3196, 5004, 4566, 158, 5005, 160, 161, 5006, + 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, + 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, + 5024, 421, 148, 148, 1, 1, 151, 5020, + 5002, 181, 181, 181, 571, 5003, 150, 152, + 153, 4564, 3196, 5004, 4566, 158, 5005, 160, + 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, + 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, + 5022, 5023, 5024, 421, 148, 148, 1, 151, + 5020, 5002, 181, 181, 181, 571, 5003, 150, + 152, 153, 4564, 3196, 5004, 4566, 158, 5005, + 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, + 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, + 5021, 5022, 5023, 5024, 421, 148, 148, 1, + 151, 5020, 5002, 181, 181, 181, 571, 1, + 5003, 150, 152, 153, 4564, 3196, 5004, 4566, + 158, 5005, 160, 161, 5006, 5007, 5008, 5009, + 5010, 5011, 5012, 5013, 5014, 5015, 5016, 5017, + 5018, 5019, 5021, 5022, 5023, 5024, 421, 148, + 148, 151, 5020, 5002, 181, 181, 181, 571, + 5003, 150, 152, 153, 4564, 3196, 5004, 4566, + 158, 5005, 160, 161, 5006, 5007, 5008, 5009, + 5010, 5011, 5012, 5013, 5014, 5015, 5016, 5017, + 5018, 5019, 5021, 5022, 5023, 5024, 421, 148, + 148, 1, 151, 5020, 5002, 181, 181, 181, + 571, 5003, 150, 152, 153, 4564, 3196, 5004, + 4566, 158, 5005, 160, 161, 5006, 5007, 5008, + 5009, 5010, 5011, 5012, 5013, 5014, 5015, 5016, + 5017, 5018, 5019, 5021, 5022, 5023, 5024, 421, + 148, 148, 1, 151, 5020, 5002, 181, 181, + 181, 571, 5003, 150, 152, 153, 4564, 3196, + 5004, 4566, 158, 5005, 160, 161, 5006, 5007, + 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, + 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, + 421, 148, 148, 1, 151, 5020, 5002, 181, + 181, 181, 571, 5003, 150, 152, 153, 4564, + 3196, 5004, 4566, 158, 5005, 160, 161, 5006, + 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, + 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, + 5024, 421, 148, 148, 1, 1, 151, 5020, + 5002, 181, 181, 181, 571, 5003, 150, 152, + 153, 4564, 3196, 5004, 4566, 158, 5005, 160, + 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, + 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, + 5022, 5023, 5024, 421, 148, 148, 1, 151, + 5020, 5002, 181, 181, 181, 571, 5003, 150, + 152, 153, 4564, 3196, 5004, 4566, 158, 5005, + 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, + 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, + 5021, 5022, 5023, 5024, 421, 148, 148, 1, + 151, 5020, 5002, 181, 181, 181, 571, 1, + 1, 1, 5003, 150, 152, 153, 4564, 3196, + 5004, 4566, 158, 5005, 160, 161, 5006, 5007, + 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, + 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, + 421, 148, 148, 1, 151, 5020, 5002, 181, + 181, 181, 571, 5294, 4805, 4807, 4808, 4809, + 5295, 5296, 4811, 4812, 5297, 4814, 4815, 5298, + 5299, 5300, 5301, 5302, 5303, 5304, 5305, 5306, + 5307, 5308, 5309, 5310, 5311, 5313, 5314, 5315, + 5316, 421, 148, 148, 1, 1, 4806, 1, + 5312, 1, 5002, 3197, 3198, 4500, 122, 124, + 4501, 4502, 4503, 4504, 4505, 4506, 4507, 4508, + 4509, 4510, 4511, 4512, 4513, 4514, 4515, 4516, + 4517, 4518, 4499, 3021, 3199, 674, 302, 303, + 304, 305, 306, 307, 3200, 932, 3201, 934, + 312, 3202, 3203, 4500, 122, 124, 4501, 4502, + 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, + 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, + 151, 4499, 3204, 3205, 317, 318, 319, 3206, + 3207, 3208, 3209, 324, 4500, 122, 124, 4501, + 4502, 4503, 4504, 4505, 4506, 4507, 4508, 4509, + 4510, 4511, 4512, 4513, 4514, 4515, 4516, 4517, + 4518, 4499, 3245, 4500, 122, 124, 4501, 4502, + 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4510, + 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, + 4499, 2518, 2518, 2518, 2774, 5003, 150, 152, + 153, 4564, 3196, 5004, 4566, 158, 5005, 160, + 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, + 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, + 5022, 5023, 5024, 2646, 2008, 2008, 5002, 5002, + 151, 5002, 5020, 5002, 1, 181, 181, 181, + 571, 5003, 150, 152, 153, 4564, 3196, 5004, + 4566, 158, 5005, 160, 161, 5006, 5007, 5008, + 5009, 5010, 5011, 5012, 5013, 5014, 5015, 5016, + 5017, 5018, 5019, 5021, 5022, 5023, 5024, 421, + 148, 148, 1, 151, 5020, 5002, 181, 181, + 181, 571, 5003, 150, 152, 153, 4564, 3196, + 5004, 4566, 158, 5005, 160, 161, 5006, 5007, + 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, + 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, + 421, 148, 148, 1, 151, 5020, 5002, 181, + 181, 181, 571, 5294, 4805, 4807, 4808, 4809, + 5295, 5296, 4811, 4812, 5297, 4814, 4815, 5298, + 5299, 5300, 5301, 5302, 5303, 5304, 5305, 5306, + 5307, 5308, 5309, 5310, 5311, 5313, 5314, 5315, + 5316, 421, 148, 148, 1, 1, 4806, 1, + 5312, 1, 5002, 2518, 2518, 2518, 2774, 1, + 5003, 150, 152, 153, 4564, 3196, 5004, 4566, + 158, 5005, 160, 161, 5006, 5007, 5008, 5009, + 5010, 5011, 5012, 5013, 5014, 5015, 5016, 5017, + 5018, 5019, 5021, 5022, 5023, 5024, 1, 2646, + 1, 2008, 1, 2008, 1, 151, 5020, 5002, + 181, 181, 181, 571, 5003, 150, 152, 153, + 4564, 3196, 5004, 4566, 158, 5005, 160, 161, + 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, + 5014, 5015, 5016, 5017, 5018, 5019, 5021, 5022, + 5023, 5024, 421, 148, 148, 1, 151, 5020, + 5002, 181, 181, 181, 571, 1, 5003, 150, + 152, 153, 4564, 3196, 5004, 4566, 158, 5005, + 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, + 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, + 5021, 5022, 5023, 5024, 421, 148, 148, 1, + 1, 151, 5020, 5002, 181, 181, 181, 571, + 1, 5003, 150, 152, 153, 4564, 3196, 5004, + 4566, 158, 5005, 160, 161, 5006, 5007, 5008, + 5009, 5010, 5011, 5012, 5013, 5014, 5015, 5016, + 5017, 5018, 5019, 5021, 5022, 5023, 5024, 421, + 148, 148, 1, 1, 1, 151, 5020, 5002, + 181, 181, 181, 571, 1, 5003, 150, 152, + 153, 4564, 3196, 5004, 4566, 158, 5005, 160, + 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, + 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, + 5022, 5023, 5024, 421, 148, 148, 1, 1, + 151, 5020, 5002, 181, 181, 181, 571, 5003, + 150, 152, 153, 4564, 3196, 5004, 4566, 158, + 5005, 160, 161, 5006, 5007, 5008, 5009, 5010, + 5011, 5012, 5013, 5014, 5015, 5016, 5017, 5018, + 5019, 5021, 5022, 5023, 5024, 421, 148, 148, + 1, 1, 151, 5020, 5002, 181, 181, 181, + 571, 1, 5003, 150, 152, 153, 4564, 3196, + 5004, 4566, 158, 5005, 160, 161, 5006, 5007, + 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, + 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, + 421, 148, 148, 151, 5020, 5002, 181, 181, + 181, 571, 5003, 150, 152, 153, 4564, 3196, + 5004, 4566, 158, 5005, 160, 161, 5006, 5007, + 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, + 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, + 421, 148, 148, 1, 1, 151, 5020, 5002, + 181, 181, 181, 571, 5003, 150, 152, 153, + 4564, 3196, 5004, 4566, 158, 5005, 160, 161, + 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, + 5014, 5015, 5016, 5017, 5018, 5019, 5021, 5022, + 5023, 5024, 421, 148, 148, 1, 151, 5020, + 5002, 181, 181, 181, 571, 84, 85, 86, + 87, 88, 5003, 150, 152, 153, 4564, 3196, + 5004, 4566, 158, 5005, 160, 161, 5006, 5007, + 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, + 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, + 421, 148, 148, 151, 5020, 5002, 181, 181, + 181, 571, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, + 103, 100, 104, 105, 106, 5003, 150, 152, + 153, 4564, 3196, 5004, 4566, 158, 5005, 160, + 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, + 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, + 5022, 5023, 5024, 421, 148, 148, 151, 5020, + 5002, 181, 181, 181, 571, 107, 108, 109, + 110, 5003, 150, 152, 153, 4564, 3196, 5004, + 4566, 158, 5005, 160, 161, 5006, 5007, 5008, + 5009, 5010, 5011, 5012, 5013, 5014, 5015, 5016, + 5017, 5018, 5019, 5021, 5022, 5023, 5024, 421, + 148, 148, 151, 5020, 5002, 181, 181, 181, + 571, 111, 5003, 150, 152, 153, 4564, 3196, + 5004, 4566, 158, 5005, 160, 161, 5006, 5007, + 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, + 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, + 421, 148, 148, 151, 5020, 5002, 181, 181, + 181, 571, 112, 113, 114, 115, 116, 117, + 5003, 150, 152, 153, 4564, 3196, 5004, 4566, + 158, 5005, 160, 161, 5006, 5007, 5008, 5009, + 5010, 5011, 5012, 5013, 5014, 5015, 5016, 5017, + 5018, 5019, 5021, 5022, 5023, 5024, 421, 148, + 148, 151, 5020, 5002, 181, 181, 181, 571, + 118, 5003, 150, 152, 153, 4564, 3196, 5004, + 4566, 158, 5005, 160, 161, 5006, 5007, 5008, + 5009, 5010, 5011, 5012, 5013, 5014, 5015, 5016, + 5017, 5018, 5019, 5021, 5022, 5023, 5024, 421, + 148, 148, 151, 5020, 5002, 181, 181, 181, + 571, 120, 121, 122, 124, 5003, 150, 152, + 153, 4564, 3196, 5004, 4566, 158, 5005, 160, + 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, + 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, + 5022, 5023, 5024, 421, 148, 148, 123, 151, + 5020, 5002, 2518, 2518, 2518, 2774, 5003, 150, + 152, 153, 4564, 3196, 5004, 4566, 158, 5005, + 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, + 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, + 5021, 5022, 5023, 5024, 2646, 2008, 2008, 5002, + 5002, 151, 5002, 5020, 5002, 1, 181, 181, + 181, 571, 5003, 150, 152, 153, 4564, 3196, + 5004, 4566, 158, 5005, 160, 161, 5006, 5007, + 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, + 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, + 421, 148, 148, 1, 151, 5020, 5002, 181, + 181, 181, 571, 1, 5003, 150, 152, 153, + 4564, 3196, 5004, 4566, 158, 5005, 160, 161, + 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, + 5014, 5015, 5016, 5017, 5018, 5019, 5021, 5022, + 5023, 5024, 421, 148, 148, 151, 5020, 5002, + 181, 181, 181, 571, 5003, 150, 152, 153, + 4564, 3196, 5004, 4566, 158, 5005, 160, 161, + 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, + 5014, 5015, 5016, 5017, 5018, 5019, 5021, 5022, + 5023, 5024, 421, 148, 148, 1, 1, 151, + 5020, 5002, 181, 181, 181, 571, 5003, 150, + 152, 153, 4564, 3196, 5004, 4566, 158, 5005, + 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, + 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, + 5021, 5022, 5023, 5024, 421, 148, 148, 1, + 151, 5020, 5002, 181, 181, 181, 571, 1, + 5003, 150, 152, 153, 4564, 3196, 5004, 4566, + 158, 5005, 160, 161, 5006, 5007, 5008, 5009, + 5010, 5011, 5012, 5013, 5014, 5015, 5016, 5017, + 5018, 5019, 5021, 5022, 5023, 5024, 421, 148, + 148, 1, 1, 151, 5020, 5002, 181, 181, + 181, 571, 5003, 150, 152, 153, 4564, 3196, + 5004, 4566, 158, 5005, 160, 161, 5006, 5007, + 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, + 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, + 421, 148, 148, 1, 151, 5020, 5002, 181, + 181, 181, 571, 5294, 4805, 4807, 4808, 4809, + 5295, 5296, 4811, 4812, 5297, 4814, 4815, 5298, + 5299, 5300, 5301, 5302, 5303, 5304, 5305, 5306, + 5307, 5308, 5309, 5310, 5311, 5313, 5314, 5315, + 5316, 421, 148, 148, 1, 1, 4806, 1, + 5312, 1, 5002, 2518, 2518, 2518, 2774, 5003, + 150, 152, 153, 4564, 3196, 5004, 4566, 158, + 5005, 160, 161, 5006, 5007, 5008, 5009, 5010, + 5011, 5012, 5013, 5014, 5015, 5016, 5017, 5018, + 5019, 5021, 5022, 5023, 5024, 2646, 2008, 2008, + 5002, 5002, 151, 5002, 5020, 5002, 1, 181, + 181, 181, 571, 5003, 150, 152, 153, 4564, + 3196, 5004, 4566, 158, 5005, 160, 161, 5006, + 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, + 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, + 5024, 421, 148, 148, 1, 1, 151, 5020, + 5002, 181, 181, 181, 571, 5003, 150, 152, + 153, 4564, 3196, 5004, 4566, 158, 5005, 160, + 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, + 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, + 5022, 5023, 5024, 421, 148, 148, 1, 151, + 5020, 5002, 181, 181, 181, 571, 5003, 150, + 152, 153, 4564, 3196, 5004, 4566, 158, 5005, + 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, + 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, + 5021, 5022, 5023, 5024, 421, 148, 148, 1, + 151, 5020, 5002, 181, 181, 181, 571, 1, + 5003, 150, 152, 153, 4564, 3196, 5004, 4566, + 158, 5005, 160, 161, 5006, 5007, 5008, 5009, + 5010, 5011, 5012, 5013, 5014, 5015, 5016, 5017, + 5018, 5019, 5021, 5022, 5023, 5024, 421, 148, + 148, 1, 1, 1, 1, 151, 5020, 5002, + 181, 181, 181, 571, 5003, 150, 152, 153, + 4564, 3196, 5004, 4566, 158, 5005, 160, 161, + 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, + 5014, 5015, 5016, 5017, 5018, 5019, 5021, 5022, + 5023, 5024, 421, 148, 148, 1, 1, 151, + 5020, 5002, 2518, 2518, 2518, 2774, 5003, 150, + 152, 153, 4564, 3196, 5004, 4566, 158, 5005, + 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, + 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, + 5021, 5022, 5023, 5024, 1, 2646, 1, 2008, + 1, 2008, 1, 151, 5020, 5002, 181, 181, + 181, 571, 5003, 150, 152, 153, 4564, 3196, + 5004, 4566, 158, 5005, 160, 161, 5006, 5007, + 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, + 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, + 421, 148, 148, 1, 151, 5020, 5002, 181, + 181, 181, 571, 5003, 150, 152, 153, 4564, + 3196, 5004, 4566, 158, 5005, 160, 161, 5006, + 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, + 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, + 5024, 421, 148, 148, 1, 151, 5020, 5002, + 181, 181, 181, 571, 3, 4, 5, 6, + 7, 9, 10, 11, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 5003, 150, + 152, 153, 4564, 3196, 5004, 4566, 158, 5005, + 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, + 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, + 5021, 5022, 5023, 5024, 421, 148, 148, 8, + 12, 151, 5020, 5002, 181, 181, 181, 571, + 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 5003, 150, 152, + 153, 4564, 3196, 5004, 4566, 158, 5005, 160, + 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, + 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, + 5022, 5023, 5024, 421, 148, 148, 151, 5020, + 5002, 181, 181, 181, 571, 52, 53, 54, + 55, 56, 57, 5003, 150, 152, 153, 4564, + 3196, 5004, 4566, 158, 5005, 160, 161, 5006, + 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, + 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, + 5024, 421, 148, 148, 151, 5020, 5002, 181, + 181, 181, 571, 58, 59, 5003, 150, 152, + 153, 4564, 3196, 5004, 4566, 158, 5005, 160, + 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, + 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, + 5022, 5023, 5024, 421, 148, 148, 151, 5020, + 5002, 181, 181, 181, 571, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 5003, 150, 152, 153, + 4564, 3196, 5004, 4566, 158, 5005, 160, 161, + 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, + 5014, 5015, 5016, 5017, 5018, 5019, 5021, 5022, + 5023, 5024, 421, 148, 148, 151, 5020, 5002, + 181, 181, 181, 571, 75, 76, 56, 61, + 77, 5003, 150, 152, 153, 4564, 3196, 5004, + 4566, 158, 5005, 160, 161, 5006, 5007, 5008, + 5009, 5010, 5011, 5012, 5013, 5014, 5015, 5016, + 5017, 5018, 5019, 5021, 5022, 5023, 5024, 421, + 148, 148, 151, 5020, 5002, 181, 181, 181, + 571, 78, 79, 80, 81, 82, 83, 5003, + 150, 152, 153, 4564, 3196, 5004, 4566, 158, + 5005, 160, 161, 5006, 5007, 5008, 5009, 5010, + 5011, 5012, 5013, 5014, 5015, 5016, 5017, 5018, + 5019, 5021, 5022, 5023, 5024, 421, 148, 148, + 151, 5020, 5002, 181, 181, 181, 571, 119, + 5003, 150, 152, 153, 4564, 3196, 5004, 4566, + 158, 5005, 160, 161, 5006, 5007, 5008, 5009, + 5010, 5011, 5012, 5013, 5014, 5015, 5016, 5017, + 5018, 5019, 5021, 5022, 5023, 5024, 421, 148, + 148, 151, 5020, 5002, 2518, 2518, 2518, 2774, + 5002, 5294, 4805, 4807, 4808, 4809, 5295, 5296, + 4811, 4812, 5297, 4814, 4815, 5298, 5299, 5300, + 5301, 5302, 5303, 5304, 5305, 5306, 5307, 5308, + 5309, 5310, 5311, 5313, 5314, 5315, 5316, 2646, + 2008, 2008, 5002, 4806, 5312, 1, 2518, 2518, + 2518, 2774, 5002, 5003, 150, 152, 153, 4564, + 3196, 5004, 4566, 158, 5005, 160, 161, 5006, + 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, + 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, + 5024, 2646, 2008, 2008, 5002, 5002, 151, 5002, + 5020, 5002, 1, 181, 181, 181, 571, 1, + 5294, 4805, 4807, 4808, 4809, 5295, 5296, 4811, + 4812, 5297, 4814, 4815, 5298, 5299, 5300, 5301, + 5302, 5303, 5304, 5305, 5306, 5307, 5308, 5309, + 5310, 5311, 5313, 5314, 5315, 5316, 421, 148, + 148, 1, 1, 4806, 1, 5312, 1, 5002, + 2518, 2518, 2518, 2774, 5003, 150, 152, 153, + 4564, 3196, 5004, 4566, 158, 5005, 160, 161, + 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, + 5014, 5015, 5016, 5017, 5018, 5019, 5021, 5022, + 5023, 5024, 2646, 2008, 2008, 5002, 5002, 5002, + 5002, 5002, 151, 5002, 5020, 5002, 1, 2518, + 2518, 2518, 2774, 1, 1, 5003, 150, 152, + 153, 4564, 3196, 5004, 4566, 158, 5005, 160, + 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, + 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, + 5022, 5023, 5024, 1, 2646, 1, 2008, 1, + 2008, 1, 1, 1, 1, 151, 5020, 5002, + 2518, 2518, 2518, 2774, 5002, 5002, 5003, 150, + 152, 153, 4564, 3196, 5004, 4566, 158, 5005, + 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, + 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, + 5021, 5022, 5023, 5024, 2646, 2008, 2008, 5002, + 5002, 151, 5002, 5020, 5002, 1, 181, 181, + 181, 571, 1, 5003, 150, 152, 153, 4564, + 3196, 5004, 4566, 158, 5005, 160, 161, 5006, + 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, + 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, + 5024, 421, 148, 148, 1, 1, 151, 5020, + 5002, 181, 181, 181, 571, 5003, 150, 152, + 153, 4564, 3196, 5004, 4566, 158, 5005, 160, + 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, + 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, + 5022, 5023, 5024, 421, 148, 148, 1, 1, + 1, 1, 1, 151, 5020, 5002, 181, 181, + 181, 571, 1, 5003, 150, 152, 153, 4564, + 3196, 5004, 4566, 158, 5005, 160, 161, 5006, + 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, + 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, + 5024, 421, 148, 148, 1, 151, 5020, 5002, + 181, 181, 181, 571, 1, 5003, 150, 152, + 153, 4564, 3196, 5004, 4566, 158, 5005, 160, + 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, + 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, + 5022, 5023, 5024, 421, 148, 148, 1, 1, + 1, 151, 5020, 5002, 181, 181, 181, 571, + 5294, 4805, 4807, 4808, 4809, 5295, 5296, 4811, + 4812, 5297, 4814, 4815, 5298, 5299, 5300, 5301, + 5302, 5303, 5304, 5305, 5306, 5307, 5308, 5309, + 5310, 5311, 5313, 5314, 5315, 5316, 421, 148, + 148, 1, 1, 4806, 1, 5312, 1, 5002, + 2518, 2518, 2518, 2774, 5002, 5002, 5003, 150, + 152, 153, 4564, 3196, 5004, 4566, 158, 5005, + 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, + 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, + 5021, 5022, 5023, 5024, 2646, 2008, 2008, 5002, + 5002, 5002, 151, 5002, 5020, 5002, 1, 181, + 181, 181, 571, 5003, 150, 152, 153, 4564, + 3196, 5004, 4566, 158, 5005, 160, 161, 5006, + 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, + 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, + 5024, 421, 148, 148, 1, 1, 1, 1, + 1, 151, 5020, 5002, 181, 181, 181, 571, + 5294, 4805, 4807, 4808, 4809, 5295, 5296, 4811, + 4812, 5297, 4814, 4815, 5298, 5299, 5300, 5301, + 5302, 5303, 5304, 5305, 5306, 5307, 5308, 5309, + 5310, 5311, 5313, 5314, 5315, 5316, 421, 148, + 148, 1, 1, 4806, 1, 5312, 1, 5002, + 2518, 2518, 2518, 2774, 5002, 5002, 5003, 150, + 152, 153, 4564, 3196, 5004, 4566, 158, 5005, + 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, + 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, + 5021, 5022, 5023, 5024, 2646, 2008, 2008, 5002, + 5002, 5002, 151, 5002, 5020, 5002, 1, 181, + 181, 181, 571, 5003, 150, 152, 153, 4564, + 3196, 5004, 4566, 158, 5005, 160, 161, 5006, + 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, + 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, + 5024, 421, 148, 148, 1, 151, 5020, 5002, + 181, 181, 181, 571, 1, 1, 5003, 150, + 152, 153, 4564, 3196, 5004, 4566, 158, 5005, + 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, + 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, + 5021, 5022, 5023, 5024, 421, 148, 148, 1, + 1, 1, 151, 5020, 5002, 181, 181, 181, + 571, 1, 5003, 150, 152, 153, 4564, 3196, + 5004, 4566, 158, 5005, 160, 161, 5006, 5007, + 5008, 5009, 5010, 5011, 5012, 5013, 5014, 5015, + 5016, 5017, 5018, 5019, 5021, 5022, 5023, 5024, + 421, 148, 148, 1, 151, 5020, 5002, 181, + 181, 181, 571, 5003, 150, 152, 153, 4564, + 3196, 5004, 4566, 158, 5005, 160, 161, 5006, + 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, + 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, + 5024, 421, 148, 148, 1, 151, 5020, 5002, + 181, 181, 181, 571, 1, 5003, 150, 152, + 153, 4564, 3196, 5004, 4566, 158, 5005, 160, + 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, + 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, + 5022, 5023, 5024, 421, 148, 148, 1, 1, + 151, 5020, 5002, 181, 181, 181, 571, 5003, + 150, 152, 153, 4564, 3196, 5004, 4566, 158, + 5005, 160, 161, 5006, 5007, 5008, 5009, 5010, + 5011, 5012, 5013, 5014, 5015, 5016, 5017, 5018, + 5019, 5021, 5022, 5023, 5024, 421, 148, 148, + 1, 151, 5020, 5002, 181, 181, 181, 571, + 1, 1, 1, 5003, 150, 152, 153, 4564, + 3196, 5004, 4566, 158, 5005, 160, 161, 5006, + 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, + 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, + 5024, 421, 148, 148, 1, 1, 151, 5020, + 5002, 181, 181, 181, 571, 5003, 150, 152, + 153, 4564, 3196, 5004, 4566, 158, 5005, 160, + 161, 5006, 5007, 5008, 5009, 5010, 5011, 5012, + 5013, 5014, 5015, 5016, 5017, 5018, 5019, 5021, + 5022, 5023, 5024, 421, 148, 148, 1, 151, + 5020, 5002, 181, 181, 181, 571, 5003, 150, + 152, 153, 4564, 3196, 5004, 4566, 158, 5005, + 160, 161, 5006, 5007, 5008, 5009, 5010, 5011, + 5012, 5013, 5014, 5015, 5016, 5017, 5018, 5019, + 5021, 5022, 5023, 5024, 421, 148, 148, 1, + 1, 1, 1, 151, 5020, 5002, 181, 181, + 181, 571, 1, 5003, 150, 152, 153, 4564, + 3196, 5004, 4566, 158, 5005, 160, 161, 5006, + 5007, 5008, 5009, 5010, 5011, 5012, 5013, 5014, + 5015, 5016, 5017, 5018, 5019, 5021, 5022, 5023, + 5024, 421, 148, 148, 151, 5020, 5002, 3371, + 5338, 5339, 5340, 674, 302, 303, 304, 305, + 306, 307, 5341, 2214, 5342, 2216, 5343, 5344, + 5345, 4500, 122, 124, 4501, 4502, 4503, 4504, + 4505, 4506, 4507, 4508, 4509, 4510, 4511, 4512, + 4513, 4514, 4515, 4516, 4517, 4518, 3372, 151, + 4499, 5346, 5347, 317, 318, 319, 5348, 5349, + 5350, 5351, 5352, 5353, 5355, 5356, 5357, 5358, + 4500, 122, 124, 4501, 4502, 4503, 4504, 4505, + 4506, 4507, 4508, 4509, 4510, 4511, 4512, 4513, + 4514, 4515, 4516, 4517, 4518, 5354, 4499, 5360, + 4449, 4451, 5361, 5362, 5363, 5364, 5365, 5366, + 5367, 5368, 5369, 5370, 5371, 5372, 5373, 5374, + 5375, 5376, 5377, 5378, 5359, } var _s_trans_targs []int16 = []int16{ - 4862, 4863, 4862, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 43, - 44, 45, 46, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 65, 66, 67, 68, - 69, 70, 72, 73, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 91, 92, 93, 95, 101, - 120, 125, 127, 134, 96, 97, 98, 99, - 100, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, - 117, 118, 119, 121, 122, 123, 124, 126, - 128, 129, 130, 131, 132, 133, 135, 137, - 138, 139, 1, 140, 2, 4862, 4866, 1901, - 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, - 1910, 1911, 1912, 1913, 1914, 1943, 1966, 1973, - 1976, 1993, 1997, 2041, 4867, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, 164, 165, 198, 238, 256, 261, - 286, 287, 290, 306, 407, 142, 166, 167, - 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 239, 240, 241, - 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 257, 258, - 259, 260, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, - 284, 285, 288, 289, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 307, 338, 362, 366, 367, - 369, 377, 380, 398, 403, 308, 309, 310, - 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, - 327, 328, 329, 330, 331, 332, 333, 334, - 335, 336, 337, 339, 340, 341, 342, 343, - 344, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, 358, 359, - 360, 361, 363, 364, 365, 368, 370, 371, - 372, 373, 374, 375, 376, 378, 379, 381, - 382, 383, 384, 385, 386, 387, 388, 389, - 390, 391, 392, 393, 394, 395, 396, 397, - 399, 400, 401, 402, 404, 405, 406, 408, - 409, 410, 411, 412, 4862, 4868, 414, 415, - 416, 417, 418, 419, 420, 421, 422, 423, - 424, 425, 426, 427, 456, 481, 488, 491, - 508, 512, 557, 413, 428, 429, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 443, 444, 445, 446, 447, - 448, 449, 450, 451, 452, 453, 454, 455, - 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, - 473, 474, 475, 476, 477, 478, 479, 480, - 482, 483, 484, 485, 486, 487, 489, 490, - 492, 493, 494, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, - 509, 510, 511, 513, 519, 540, 545, 547, - 555, 514, 515, 516, 517, 518, 520, 521, - 522, 523, 524, 525, 526, 527, 528, 529, - 530, 531, 532, 533, 534, 535, 536, 537, - 538, 539, 541, 542, 543, 544, 546, 548, - 549, 550, 551, 552, 553, 554, 556, 558, - 559, 560, 561, 4869, 4870, 569, 570, 571, - 572, 573, 574, 733, 734, 735, 736, 737, - 738, 739, 740, 769, 791, 798, 801, 817, - 822, 864, 568, 4871, 589, 590, 591, 592, - 593, 594, 595, 596, 597, 598, 599, 600, - 601, 602, 603, 604, 605, 606, 607, 608, - 609, 610, 611, 612, 613, 614, 615, 616, - 617, 618, 619, 621, 622, 623, 624, 625, - 626, 627, 628, 629, 630, 631, 632, 633, - 634, 635, 636, 637, 638, 639, 640, 641, - 642, 644, 645, 646, 647, 648, 649, 651, - 652, 654, 655, 656, 657, 658, 659, 660, - 661, 662, 663, 664, 665, 666, 667, 668, - 669, 671, 672, 673, 674, 675, 676, 677, - 678, 680, 687, 708, 715, 717, 725, 681, - 682, 683, 684, 685, 686, 688, 689, 690, - 691, 692, 693, 694, 695, 696, 697, 698, - 699, 700, 701, 702, 703, 704, 705, 706, - 707, 709, 710, 711, 712, 713, 714, 716, - 718, 719, 720, 721, 722, 723, 724, 726, - 728, 729, 730, 576, 731, 732, 741, 742, - 743, 744, 745, 746, 747, 748, 749, 750, - 751, 752, 753, 754, 755, 756, 757, 758, - 759, 760, 761, 762, 763, 764, 765, 766, - 767, 768, 770, 771, 772, 773, 774, 775, - 776, 777, 778, 779, 780, 781, 782, 783, - 784, 785, 786, 787, 788, 789, 790, 792, - 793, 794, 795, 796, 797, 799, 800, 802, - 803, 804, 805, 806, 807, 808, 809, 810, - 811, 812, 813, 814, 815, 816, 818, 819, - 820, 821, 823, 829, 848, 853, 855, 862, - 824, 825, 826, 827, 828, 830, 831, 832, - 833, 834, 835, 836, 837, 838, 839, 840, - 841, 842, 843, 844, 845, 846, 847, 849, - 850, 851, 852, 854, 856, 857, 858, 859, - 860, 861, 863, 865, 866, 867, 868, 885, - 886, 887, 888, 889, 890, 891, 892, 893, - 894, 895, 896, 897, 898, 899, 900, 901, - 902, 903, 904, 905, 906, 907, 908, 909, - 910, 911, 912, 913, 914, 915, 917, 918, - 919, 920, 921, 922, 923, 924, 925, 926, - 927, 928, 929, 930, 931, 932, 933, 934, - 935, 936, 937, 939, 940, 941, 942, 943, - 944, 946, 947, 949, 950, 951, 952, 953, - 954, 955, 956, 957, 958, 959, 960, 961, - 962, 963, 965, 966, 967, 968, 969, 970, - 971, 973, 979, 998, 1003, 1005, 1012, 974, - 975, 976, 977, 978, 980, 981, 982, 983, - 984, 985, 986, 987, 988, 989, 990, 991, - 992, 993, 994, 995, 996, 997, 999, 1000, - 1001, 1002, 1004, 1006, 1007, 1008, 1009, 1010, - 1011, 1013, 1015, 1016, 1017, 871, 1018, 1019, - 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, - 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, - 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, - 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1060, - 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, - 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, - 1077, 1078, 1079, 1080, 1082, 1083, 1084, 1085, - 1086, 1087, 1089, 1240, 1164, 1165, 1166, 1091, - 1167, 4872, 1104, 1105, 1106, 1107, 1108, 1109, - 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, - 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, - 1126, 1127, 1128, 1129, 1130, 1131, 1133, 1134, - 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, - 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, - 1151, 1152, 1153, 1155, 1156, 1157, 1158, 1159, - 1160, 1162, 1163, 1169, 1170, 1171, 1172, 1173, - 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, - 1182, 1183, 1185, 1186, 1187, 1188, 1189, 1190, - 1191, 1193, 1199, 1218, 1223, 1226, 1233, 1194, - 1195, 1196, 1197, 1198, 1200, 1201, 1202, 1203, - 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, - 1212, 1213, 1214, 1215, 1216, 1217, 1219, 1220, - 1221, 1222, 1224, 1225, 1227, 1228, 1229, 1230, - 1231, 1232, 1234, 1236, 1237, 1238, 1239, 1092, - 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, - 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1258, - 1259, 1260, 1261, 1262, 1263, 1265, 1271, 1290, - 1295, 1297, 1304, 1266, 1267, 1268, 1269, 1270, - 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, - 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, - 1288, 1289, 1291, 1292, 1293, 1294, 1296, 1298, - 1299, 1300, 1301, 1302, 1303, 1305, 1307, 1308, - 1309, 563, 1310, 1311, 1326, 1327, 1328, 1329, - 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, - 1338, 1339, 1340, 1341, 1342, 1343, 1344, 1345, - 1346, 1347, 1348, 1349, 1350, 1351, 1352, 1353, - 1354, 1355, 1356, 1358, 1359, 1360, 1361, 1362, - 1363, 1364, 1365, 1366, 1367, 1368, 1369, 1370, - 1371, 1372, 1373, 1374, 1375, 1376, 1377, 1378, - 1380, 1381, 1382, 1383, 1384, 1385, 1387, 1388, - 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, - 1398, 1399, 1400, 1401, 1402, 1403, 1404, 1406, - 1407, 1408, 1409, 1410, 1411, 1412, 1414, 1420, - 1439, 1444, 1446, 1453, 1415, 1416, 1417, 1418, - 1419, 1421, 1422, 1423, 1424, 1425, 1426, 1427, - 1428, 1429, 1430, 1431, 1432, 1433, 1434, 1435, - 1436, 1437, 1438, 1440, 1441, 1442, 1443, 1445, - 1447, 1448, 1449, 1450, 1451, 1452, 1454, 1456, - 1457, 1458, 1313, 1459, 1460, 1473, 1474, 1475, - 1476, 1477, 1478, 1479, 1480, 1481, 1482, 1483, - 1484, 1485, 1486, 1487, 1488, 1489, 1490, 1491, - 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, - 1500, 1501, 1502, 1504, 1505, 1506, 1507, 1508, - 1509, 1510, 1511, 1512, 1513, 1514, 1515, 1516, - 1517, 1518, 1519, 1520, 1521, 1522, 1524, 1525, - 1526, 1527, 1528, 1529, 1531, 1532, 1534, 1535, - 1536, 1537, 1538, 1539, 1540, 1541, 1542, 1543, - 1544, 1546, 1547, 1548, 1549, 1550, 1552, 1558, - 1573, 1577, 1579, 1586, 1553, 1554, 1555, 1556, - 1557, 1559, 1560, 1561, 1562, 1563, 1564, 1565, - 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1574, - 1575, 1576, 1578, 1580, 1581, 1582, 1583, 1584, - 1585, 1587, 1589, 1590, 1591, 4873, 1606, 1607, - 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, - 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, - 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, - 1632, 1633, 1634, 1635, 1636, 1638, 1639, 1640, - 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, - 1649, 1650, 1651, 1652, 1653, 1654, 1655, 1656, - 1657, 1658, 1659, 1660, 1661, 1663, 1664, 1665, - 1666, 1667, 1668, 1670, 1671, 1673, 1674, 1675, - 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, - 1684, 1685, 1686, 1687, 1688, 1690, 1691, 1692, - 1693, 1694, 1695, 1696, 1698, 1705, 1727, 1734, - 1736, 1744, 1699, 1700, 1701, 1702, 1703, 1704, - 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, - 1714, 1715, 1716, 1717, 1718, 1719, 1720, 1721, - 1722, 1723, 1724, 1725, 1726, 1728, 1729, 1730, - 1731, 1732, 1733, 1735, 1737, 1738, 1739, 1740, - 1741, 1742, 1743, 1745, 1747, 1748, 1749, 1593, - 1750, 1751, 141, 1766, 1767, 1768, 1769, 1770, - 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778, - 1779, 1780, 1781, 1782, 1783, 1784, 1785, 1786, - 1787, 1788, 1789, 1790, 1791, 1792, 1793, 1794, - 1795, 1796, 1798, 1799, 1800, 1801, 1802, 1803, - 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, - 1812, 1813, 1814, 1815, 1816, 1817, 1818, 1820, - 1821, 1822, 1823, 1824, 1825, 1827, 1828, 1830, - 1831, 1832, 1833, 1834, 1835, 1836, 1837, 1838, - 1839, 1840, 1841, 1842, 1843, 1844, 1846, 1847, - 1848, 1849, 1850, 1851, 1852, 1854, 1860, 1879, - 1884, 1886, 1893, 1855, 1856, 1857, 1858, 1859, - 1861, 1862, 1863, 1864, 1865, 1866, 1867, 1868, - 1869, 1870, 1871, 1872, 1873, 1874, 1875, 1876, - 1877, 1878, 1880, 1881, 1882, 1883, 1885, 1887, - 1888, 1889, 1890, 1891, 1892, 1894, 1896, 1897, - 1898, 1753, 1899, 1900, 1915, 1916, 1917, 1918, - 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, - 1927, 1928, 1929, 1930, 1931, 1932, 1933, 1934, - 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, - 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, - 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, - 1960, 1961, 1962, 1963, 1964, 1965, 1967, 1968, - 1969, 1970, 1971, 1972, 1974, 1975, 1977, 1978, - 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, - 1987, 1988, 1989, 1990, 1991, 1992, 1994, 1995, - 1996, 1998, 2004, 2024, 2029, 2031, 2039, 1999, - 2000, 2001, 2002, 2003, 2005, 2006, 2007, 2008, - 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, - 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2025, - 2026, 2027, 2028, 2030, 2032, 2033, 2034, 2035, - 2036, 2037, 2038, 2040, 2042, 2043, 2044, 2045, - 4865, 2060, 2061, 2062, 2063, 2064, 2065, 2066, - 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, - 2075, 2076, 2077, 2078, 2079, 2080, 2081, 2082, - 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, - 2092, 2093, 2094, 2095, 2096, 2097, 2098, 2099, - 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, - 2108, 2109, 2110, 2111, 2112, 2114, 2115, 2116, - 2117, 2118, 2119, 2121, 2122, 2124, 2125, 2126, - 2127, 2128, 2129, 2130, 2131, 2132, 2133, 2134, - 2135, 2136, 2137, 2138, 2140, 2141, 2142, 2143, - 2144, 2146, 2152, 2171, 2176, 2178, 2185, 2147, - 2148, 2149, 2150, 2151, 2153, 2154, 2155, 2156, - 2157, 2158, 2159, 2160, 2161, 2162, 2163, 2164, - 2165, 2166, 2167, 2168, 2169, 2170, 2172, 2173, - 2174, 2175, 2177, 2179, 2180, 2181, 2182, 2183, - 2184, 2186, 2188, 2189, 2190, 2047, 2191, 2192, - 4874, 2207, 2208, 2209, 2210, 2211, 2212, 2213, - 2214, 2215, 2216, 2217, 2218, 2219, 2220, 2221, - 2222, 2223, 2224, 2225, 2226, 2227, 2228, 2229, - 2230, 2231, 2232, 2233, 2234, 2235, 2236, 2237, - 2239, 2240, 2241, 2242, 2243, 2244, 2245, 2246, - 2247, 2248, 2249, 2250, 2251, 2252, 2253, 2254, - 2255, 2256, 2257, 2258, 2259, 2261, 2262, 2263, - 2264, 2265, 2266, 2268, 2269, 2271, 2272, 2273, - 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281, - 2282, 2283, 2284, 2285, 2287, 2288, 2289, 2290, - 2291, 2293, 2299, 2318, 2323, 2325, 2332, 2294, - 2295, 2296, 2297, 2298, 2300, 2301, 2302, 2303, - 2304, 2305, 2306, 2307, 2308, 2309, 2310, 2311, - 2312, 2313, 2314, 2315, 2316, 2317, 2319, 2320, - 2321, 2322, 2324, 2326, 2327, 2328, 2329, 2330, - 2331, 2333, 2335, 2336, 2337, 2194, 2338, 2339, - 4876, 2354, 2355, 2356, 2357, 2358, 2359, 2360, - 2361, 2362, 2363, 2364, 2365, 2366, 2367, 2368, - 2369, 2370, 2371, 2372, 2373, 2374, 2375, 2376, - 2377, 2378, 2379, 2380, 2381, 2382, 2383, 2384, - 2386, 2387, 2388, 2389, 2390, 2391, 2392, 2393, - 2394, 2395, 2396, 2397, 2398, 2399, 2400, 2401, - 2402, 2403, 2404, 2405, 2406, 2408, 2409, 2410, - 2411, 2412, 2413, 2415, 2416, 2418, 2419, 2420, - 2421, 2422, 2423, 2424, 2425, 2426, 2427, 2428, - 2429, 2430, 2431, 2432, 2434, 2435, 2436, 2437, - 2438, 2439, 2440, 2442, 2448, 2467, 2472, 2474, - 2481, 2443, 2444, 2445, 2446, 2447, 2449, 2450, - 2451, 2452, 2453, 2454, 2455, 2456, 2457, 2458, - 2459, 2460, 2461, 2462, 2463, 2464, 2465, 2466, - 2468, 2469, 2470, 2471, 2473, 2475, 2476, 2477, - 2478, 2479, 2480, 2482, 2484, 2485, 2486, 2341, - 2487, 2488, 4875, 2503, 2504, 2505, 2506, 2507, - 2508, 2509, 2510, 2511, 2512, 2513, 2514, 2515, - 2516, 2517, 2518, 2519, 2520, 2521, 2522, 2523, - 2524, 2525, 2526, 2527, 2528, 2529, 2530, 2531, - 2532, 2533, 2535, 2536, 2537, 2538, 2539, 2540, - 2541, 2542, 2543, 2544, 2545, 2546, 2547, 2548, - 2549, 2550, 2551, 2552, 2553, 2554, 2555, 2557, - 2558, 2559, 2560, 2561, 2562, 2564, 2565, 2567, - 2568, 2569, 2570, 2571, 2572, 2573, 2574, 2575, - 2576, 2577, 2578, 2579, 2580, 2581, 2583, 2584, - 2585, 2586, 2587, 2589, 2595, 2614, 2619, 2621, - 2628, 2590, 2591, 2592, 2593, 2594, 2596, 2597, - 2598, 2599, 2600, 2601, 2602, 2603, 2604, 2605, - 2606, 2607, 2608, 2609, 2610, 2611, 2612, 2613, - 2615, 2616, 2617, 2618, 2620, 2622, 2623, 2624, - 2625, 2626, 2627, 2629, 2631, 2632, 2633, 2490, - 2634, 2635, 4862, 4878, 2650, 2651, 2652, 2653, - 2654, 2655, 2656, 2657, 2658, 2659, 2660, 2661, - 2662, 2663, 2664, 2665, 2666, 2667, 2668, 2669, - 2670, 2671, 2672, 2673, 2674, 2675, 2676, 2677, - 2679, 2680, 2681, 2682, 2683, 2684, 2685, 2686, - 2687, 2688, 2689, 2690, 2691, 2692, 2693, 2694, - 2695, 2696, 2697, 2698, 2699, 2701, 2702, 2703, - 2704, 2705, 2706, 2708, 2709, 2711, 2712, 2713, - 2714, 2715, 2716, 2717, 2718, 2719, 2720, 2721, - 2722, 2723, 2724, 2725, 2727, 2728, 2729, 2731, - 2737, 2756, 2761, 2763, 2770, 2732, 2733, 2734, - 2735, 2736, 2738, 2739, 2740, 2741, 2742, 2743, - 2744, 2745, 2746, 2747, 2748, 2749, 2750, 2751, - 2752, 2753, 2754, 2755, 2757, 2758, 2759, 2760, - 2762, 2764, 2765, 2766, 2767, 2768, 2769, 2771, - 2773, 2774, 2775, 2637, 2776, 2638, 4885, 2791, - 2792, 2793, 2794, 2795, 2796, 2797, 2798, 2799, - 2800, 2801, 2802, 2803, 2804, 2805, 2806, 2807, - 2808, 2809, 2810, 2811, 2812, 2813, 2814, 2815, - 2816, 2817, 2818, 2819, 2820, 2821, 2823, 2824, - 2825, 2826, 2827, 2828, 2829, 2830, 2831, 2832, - 2833, 2834, 2835, 2836, 2837, 2838, 2839, 2840, - 2841, 2842, 2843, 2845, 2846, 2847, 2848, 2849, - 2850, 2852, 2853, 2855, 2856, 2857, 2858, 2859, - 2860, 2861, 2862, 2863, 2864, 2865, 2866, 2867, - 2868, 2869, 2871, 2872, 2873, 2874, 2875, 2877, - 2883, 2902, 2907, 2909, 2916, 2878, 2879, 2880, - 2881, 2882, 2884, 2885, 2886, 2887, 2888, 2889, - 2890, 2891, 2892, 2893, 2894, 2895, 2896, 2897, - 2898, 2899, 2900, 2901, 2903, 2904, 2905, 2906, - 2908, 2910, 2911, 2912, 2913, 2914, 2915, 2917, - 2919, 2920, 2921, 2778, 2922, 2923, 4886, 2938, - 2939, 2940, 2941, 2942, 2943, 2944, 2945, 2946, - 2947, 2948, 2949, 2950, 2951, 2952, 2953, 2954, - 2955, 2956, 2957, 2958, 2959, 2960, 2961, 2962, - 2963, 2964, 2965, 2966, 2967, 2968, 2970, 2971, - 2972, 2973, 2974, 2975, 2976, 2977, 2978, 2979, - 2980, 2981, 2982, 2983, 2984, 2985, 2986, 2987, - 2988, 2989, 2990, 2992, 2993, 2994, 2995, 2996, - 2997, 2999, 3000, 3002, 3003, 3004, 3005, 3006, - 3007, 3008, 3009, 3010, 3011, 3012, 3013, 3014, - 3015, 3016, 3018, 3019, 3020, 3021, 3022, 3024, - 3030, 3049, 3054, 3056, 3063, 3025, 3026, 3027, - 3028, 3029, 3031, 3032, 3033, 3034, 3035, 3036, - 3037, 3038, 3039, 3040, 3041, 3042, 3043, 3044, - 3045, 3046, 3047, 3048, 3050, 3051, 3052, 3053, - 3055, 3057, 3058, 3059, 3060, 3061, 3062, 3064, - 3066, 3067, 3068, 2925, 3069, 3070, 4887, 3085, - 3086, 3087, 3088, 3089, 3090, 3091, 3092, 3093, - 3094, 3095, 3096, 3097, 3098, 3099, 3100, 3101, - 3102, 3103, 3104, 3105, 3106, 3107, 3108, 3109, - 3110, 3111, 3112, 3113, 3114, 3115, 3117, 3118, - 3119, 3120, 3121, 3122, 3123, 3124, 3125, 3126, - 3127, 3128, 3129, 3130, 3131, 3132, 3133, 3134, - 3135, 3136, 3137, 3139, 3140, 3141, 3142, 3143, - 3144, 3146, 3147, 3149, 3150, 3151, 3152, 3153, - 3154, 3155, 3156, 3157, 3158, 3159, 3160, 3161, - 3162, 3163, 3165, 3166, 3167, 3168, 3169, 3171, - 3177, 3196, 3201, 3203, 3210, 3172, 3173, 3174, - 3175, 3176, 3178, 3179, 3180, 3181, 3182, 3183, - 3184, 3185, 3186, 3187, 3188, 3189, 3190, 3191, - 3192, 3193, 3194, 3195, 3197, 3198, 3199, 3200, - 3202, 3204, 3205, 3206, 3207, 3208, 3209, 3211, - 3213, 3214, 3215, 3072, 3216, 3217, 4929, 4930, - 4931, 4991, 4992, 4993, 4994, 4995, 4996, 4997, - 4998, 4999, 5000, 5001, 5002, 5003, 5004, 5005, - 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, - 5014, 5015, 4933, 4934, 4935, 4936, 4937, 4938, - 4939, 4944, 4945, 4946, 4947, 4948, 4949, 4950, - 4951, 4952, 4953, 4954, 4955, 4956, 4957, 4958, - 4959, 4960, 4961, 4962, 4963, 4964, 4965, 4966, - 4967, 4968, 4969, 4970, 4971, 4972, 4973, 4974, - 4975, 4976, 4977, 4978, 4979, 4980, 4981, 4982, - 4983, 4984, 4985, 4986, 4987, 4988, 4989, 4990, - 5073, 4862, 3283, 3284, 3285, 3286, 3287, 3288, - 3289, 3290, 3291, 3292, 3293, 3294, 3295, 3296, - 3297, 3298, 3299, 3300, 3301, 3302, 3303, 3304, - 3305, 3306, 3307, 3308, 3309, 3310, 3311, 3312, - 3313, 3315, 3316, 3317, 3268, 3318, 3319, 3320, - 3321, 3322, 3323, 3324, 3325, 3326, 3327, 3328, - 3329, 3330, 3331, 3332, 3333, 3334, 3335, 3336, - 3337, 3339, 3340, 3341, 3342, 3343, 3344, 3346, - 3347, 3348, 3349, 3350, 3429, 5074, 3365, 3366, - 3367, 3368, 3369, 3370, 3371, 3372, 3373, 3374, - 3375, 3376, 3377, 3378, 3379, 3380, 3381, 3382, - 3383, 3384, 3385, 3386, 3387, 3388, 3389, 3390, - 3391, 3392, 3394, 3395, 3396, 3352, 3397, 3398, - 3399, 3400, 3401, 3402, 3403, 3404, 3405, 3406, - 3407, 3408, 3409, 3410, 3411, 3412, 3413, 3414, - 3415, 3416, 3418, 3419, 3420, 3421, 3422, 3423, - 3425, 3426, 3427, 3428, 3431, 3432, 3433, 3434, - 3435, 3436, 3437, 3438, 3439, 3440, 3441, 3442, - 3443, 3444, 3445, 3448, 3449, 3451, 3452, 3453, - 3454, 3456, 3462, 3481, 3486, 3488, 3495, 3457, - 3458, 3459, 3460, 3461, 3463, 3464, 3465, 3466, - 3467, 3468, 3469, 3470, 3471, 3472, 3473, 3474, - 3475, 3476, 3477, 3478, 3479, 3480, 3482, 3483, - 3484, 3485, 3487, 3489, 3490, 3491, 3492, 3493, - 3494, 3496, 3498, 3499, 3353, 3501, 3502, 3503, - 3504, 3505, 3506, 3507, 3508, 3509, 3510, 3511, - 3512, 3513, 3514, 3515, 3270, 3518, 3519, 3521, - 3522, 3523, 3524, 3525, 3527, 3533, 3552, 3557, - 3559, 3566, 3528, 3529, 3530, 3531, 3532, 3534, - 3535, 3536, 3537, 3538, 3539, 3540, 3541, 3542, - 3543, 3544, 3545, 3546, 3547, 3548, 3549, 3550, - 3551, 3553, 3554, 3555, 3556, 3558, 3560, 3561, - 3562, 3563, 3564, 3565, 3567, 3569, 3570, 3571, - 3572, 4862, 5076, 4862, 3608, 3609, 3610, 3611, - 3612, 3613, 3614, 3615, 3616, 3617, 3618, 3619, - 3620, 3621, 3622, 3623, 3624, 3625, 3626, 3627, - 3628, 3629, 3630, 3631, 3632, 3633, 3634, 3635, - 3637, 3638, 3639, 3640, 3641, 3642, 3643, 3644, - 3645, 3646, 3647, 3648, 3649, 3650, 3651, 3652, - 3653, 3654, 3655, 3656, 3657, 3659, 3660, 3661, - 3662, 3663, 3664, 3666, 3667, 3669, 3670, 3671, - 3672, 3673, 3674, 3675, 3676, 3677, 3678, 3679, - 3680, 3681, 3682, 3683, 3685, 3686, 3687, 3689, - 3695, 3714, 3719, 3721, 3728, 3690, 3691, 3692, - 3693, 3694, 3696, 3697, 3698, 3699, 3700, 3701, - 3702, 3703, 3704, 3705, 3706, 3707, 3708, 3709, - 3710, 3711, 3712, 3713, 3715, 3716, 3717, 3718, - 3720, 3722, 3723, 3724, 3725, 3726, 3727, 3729, - 3731, 3732, 3733, 3595, 3734, 3596, 5078, 5079, - 5080, 3752, 3753, 3754, 3755, 3756, 3757, 3758, - 3759, 3760, 3761, 3762, 3763, 3764, 3765, 3766, - 3767, 3768, 3769, 3770, 3771, 3772, 3773, 3774, - 3775, 3776, 3777, 3778, 3779, 3780, 3781, 3782, - 3784, 3785, 3786, 3787, 3788, 3789, 3790, 3791, - 3792, 3793, 3794, 3795, 3796, 3797, 3798, 3799, - 3800, 3801, 3802, 3803, 3804, 3806, 3807, 3808, - 3809, 3810, 3811, 3813, 3814, 3816, 3817, 3818, - 3819, 3820, 3821, 3822, 3823, 3824, 3825, 3826, - 3827, 3828, 3829, 3830, 3832, 3833, 3834, 3835, - 3836, 3838, 3844, 3863, 3868, 3870, 3877, 3839, - 3840, 3841, 3842, 3843, 3845, 3846, 3847, 3848, - 3849, 3850, 3851, 3852, 3853, 3854, 3855, 3856, - 3857, 3858, 3859, 3860, 3861, 3862, 3864, 3865, - 3866, 3867, 3869, 3871, 3872, 3873, 3874, 3875, - 3876, 3878, 3880, 3881, 3882, 3739, 3883, 3884, - 3899, 3900, 3901, 3902, 3903, 3904, 3905, 3906, - 3907, 3908, 3909, 3910, 3911, 3912, 3913, 3914, - 3915, 3916, 3917, 3918, 3919, 3920, 3921, 3922, - 3923, 3924, 3925, 3926, 3928, 3929, 3930, 3931, - 3932, 3933, 3934, 3935, 3936, 3937, 3938, 3939, - 3940, 3941, 3942, 3943, 3944, 3945, 3946, 3947, - 3948, 3950, 3951, 3952, 3953, 3954, 3955, 3957, - 3958, 3960, 3961, 3962, 3963, 3964, 3965, 3966, - 3967, 3968, 3969, 3970, 3971, 3972, 3973, 3974, - 3976, 3977, 3978, 3979, 3981, 3987, 4006, 4011, - 4013, 4020, 3982, 3983, 3984, 3985, 3986, 3988, - 3989, 3990, 3991, 3992, 3993, 3994, 3995, 3996, - 3997, 3998, 3999, 4000, 4001, 4002, 4003, 4004, - 4005, 4007, 4008, 4009, 4010, 4012, 4014, 4015, - 4016, 4017, 4018, 4019, 4021, 4023, 4024, 4025, - 3886, 4026, 3887, 4862, 4041, 4042, 4043, 4044, - 4045, 4046, 4047, 4048, 4049, 4050, 4051, 4052, - 4053, 4054, 4055, 4056, 4057, 4058, 4059, 4060, - 4061, 4062, 4063, 4064, 4065, 4066, 4067, 4068, - 4070, 4071, 4072, 4073, 4074, 4075, 4076, 4077, - 4078, 4079, 4080, 4081, 4082, 4083, 4084, 4085, - 4086, 4087, 4088, 4089, 4090, 4092, 4093, 4094, - 4095, 4096, 4097, 4099, 4100, 4101, 4102, 4103, - 4028, 4104, 4106, 4107, 4108, 4109, 4110, 4111, - 4112, 4113, 4114, 4115, 4116, 4117, 4118, 4119, - 4120, 4122, 4123, 4124, 4125, 4126, 4128, 4134, - 4153, 4158, 4161, 4168, 4129, 4130, 4131, 4132, - 4133, 4135, 4136, 4137, 4138, 4139, 4140, 4141, - 4142, 4143, 4144, 4145, 4146, 4147, 4148, 4149, - 4150, 4151, 4152, 4154, 4155, 4156, 4157, 4159, - 4160, 4162, 4163, 4164, 4165, 4166, 4167, 4169, - 4171, 4172, 4173, 4174, 4029, 5081, 4862, 4190, - 4191, 4192, 4193, 4194, 4195, 4196, 4197, 4198, - 4199, 4200, 4201, 4202, 4203, 4204, 4205, 4206, - 4207, 4208, 4209, 4210, 4211, 4212, 4213, 4214, - 4215, 4216, 4217, 4219, 4220, 4221, 4222, 4223, - 4224, 4225, 4226, 4227, 4228, 4229, 4230, 4231, - 4232, 4233, 4234, 4235, 4236, 4237, 4238, 4239, - 4241, 4242, 4243, 4244, 4245, 4246, 4248, 4249, - 4251, 4252, 4253, 4254, 4255, 4256, 4257, 4258, - 4259, 4260, 4261, 4262, 4263, 4264, 4265, 4267, - 4268, 4269, 4271, 4277, 4296, 4301, 4303, 4310, - 4272, 4273, 4274, 4275, 4276, 4278, 4279, 4280, - 4281, 4282, 4283, 4284, 4285, 4286, 4287, 4288, - 4289, 4290, 4291, 4292, 4293, 4294, 4295, 4297, - 4298, 4299, 4300, 4302, 4304, 4305, 4306, 4307, - 4308, 4309, 4311, 4313, 4314, 4315, 4177, 4316, - 4178, 5082, 4333, 4334, 4335, 4336, 4337, 4338, - 4339, 4340, 4341, 4342, 4343, 4344, 4345, 4346, - 4347, 4348, 4349, 4350, 4351, 4352, 4353, 4354, - 4355, 4356, 4357, 4358, 4359, 4360, 4362, 4363, - 4364, 4365, 4366, 4367, 4368, 4369, 4370, 4371, - 4372, 4373, 4374, 4375, 4376, 4377, 4378, 4379, - 4380, 4381, 4382, 4384, 4385, 4386, 4387, 4388, - 4389, 4391, 4392, 4394, 4395, 4396, 4397, 4398, - 4399, 4400, 4401, 4402, 4403, 4404, 4405, 4406, - 4407, 4408, 4410, 4411, 4412, 4414, 4420, 4439, - 4444, 4446, 4453, 4415, 4416, 4417, 4418, 4419, - 4421, 4422, 4423, 4424, 4425, 4426, 4427, 4428, - 4429, 4430, 4431, 4432, 4433, 4434, 4435, 4436, - 4437, 4438, 4440, 4441, 4442, 4443, 4445, 4447, - 4448, 4449, 4450, 4451, 4452, 4454, 4456, 4457, - 4458, 4320, 4459, 4321, 5083, 5084, 5085, 5128, - 5129, 5130, 5131, 5132, 5133, 5134, 5135, 5136, - 5137, 5138, 5139, 5140, 5141, 5142, 5143, 5144, - 5145, 5146, 5147, 5148, 5149, 5150, 5151, 5152, - 5153, 5154, 5155, 5156, 5157, 5158, 5159, 5160, - 5161, 5162, 5163, 5164, 5165, 5166, 5167, 5168, - 5169, 5170, 5171, 5172, 5173, 5174, 5175, 5176, - 5177, 5178, 5179, 5180, 5181, 5182, 5183, 5184, - 5185, 5186, 5187, 5188, 5189, 5190, 5191, 5192, - 5193, 5194, 5195, 5196, 5197, 5198, 5199, 5200, - 5201, 5202, 5203, 5204, 5205, 5206, 5211, 4510, - 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, - 4519, 4520, 4521, 4522, 4523, 4524, 4525, 4526, - 4527, 4528, 4529, 4530, 4531, 4532, 4533, 4534, - 4535, 4536, 4537, 4538, 4539, 4540, 4542, 4543, - 4544, 4545, 4546, 4547, 4548, 4549, 4550, 4551, - 4552, 4553, 4554, 4555, 4556, 4557, 4558, 4559, - 4560, 4561, 4562, 4564, 4565, 4566, 4567, 4568, - 4569, 4571, 4572, 4574, 4575, 4576, 4577, 4578, - 4579, 4580, 4581, 4582, 4583, 4584, 4585, 4586, - 4587, 4588, 4590, 4591, 4592, 4593, 4594, 4596, - 4602, 4621, 4626, 4628, 4635, 4597, 4598, 4599, - 4600, 4601, 4603, 4604, 4605, 4606, 4607, 4608, - 4609, 4610, 4611, 4612, 4613, 4614, 4615, 4616, - 4617, 4618, 4619, 4620, 4622, 4623, 4624, 4625, - 4627, 4629, 4630, 4631, 4632, 4633, 4634, 4636, - 4638, 4639, 4640, 4497, 4641, 4642, 5212, 5213, - 5214, 5313, 5314, 5315, 5316, 5317, 5318, 5319, - 5320, 5321, 5322, 5323, 5324, 5325, 5326, 5327, - 5328, 5329, 5330, 5331, 5332, 5333, 5334, 5335, - 5336, 5337, 5243, 5244, 5245, 5246, 5247, 5248, - 5249, 5288, 5289, 5290, 5291, 5292, 5293, 5294, - 5295, 5296, 5297, 5298, 5299, 5300, 5301, 5251, - 5252, 5253, 5254, 5255, 5256, 5257, 5258, 5259, - 5260, 5261, 5262, 5263, 5268, 5269, 5270, 5271, - 5272, 5273, 5274, 5275, 5276, 5277, 5278, 5279, - 5280, 5281, 5282, 5283, 5284, 5285, 5286, 5287, - 4672, 4673, 4674, 4675, 4677, 4678, 4679, 4680, - 4681, 4682, 4683, 4684, 4685, 4686, 4687, 4688, - 4689, 4690, 4691, 4692, 4693, 4694, 4696, 4697, - 4698, 4699, 4701, 4702, 4705, 4707, 4850, 5340, - 4862, 4722, 4723, 4724, 4725, 4726, 4727, 4728, - 4729, 4730, 4731, 4732, 4733, 4734, 4735, 4736, - 4737, 4738, 4739, 4740, 4741, 4742, 4743, 4744, - 4745, 4746, 4747, 4748, 4749, 4751, 4752, 4753, - 4754, 4755, 4756, 4757, 4758, 4759, 4760, 4761, - 4762, 4763, 4764, 4765, 4766, 4767, 4768, 4769, - 4770, 4771, 4773, 4774, 4775, 4776, 4777, 4778, - 4780, 4781, 4783, 4784, 4785, 4786, 4787, 4788, - 4789, 4790, 4791, 4792, 4793, 4794, 4795, 4796, - 4797, 4799, 4800, 4801, 4803, 4809, 4828, 4833, - 4835, 4842, 4844, 4804, 4805, 4806, 4807, 4808, - 4810, 4811, 4812, 4813, 4814, 4815, 4816, 4817, - 4818, 4819, 4820, 4821, 4822, 4823, 4824, 4825, - 4826, 4827, 4829, 4830, 4831, 4832, 4834, 4836, - 4837, 4838, 4839, 4840, 4841, 4843, 4846, 4847, - 4848, 4709, 4849, 4710, 4854, 4856, 4857, 4859, - 4861, 4863, 4862, 4862, 4864, 4865, 4874, 4875, - 4877, 4879, 4883, 4895, 4896, 5016, 5017, 5059, - 5060, 4911, 5061, 4913, 4914, 5062, 5063, 5064, - 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, - 5075, 5077, 5207, 5208, 5209, 5210, 5250, 5264, - 5338, 5339, 5047, 4862, 0, 3, 4, 5, - 6, 7, 8, 9, 10, 11, 12, 13, - 42, 64, 71, 74, 90, 94, 136, 4862, - 4862, 4862, 2046, 2048, 2049, 2050, 2051, 2052, - 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2091, - 2113, 2120, 2123, 2139, 2145, 2187, 1752, 1754, - 1755, 1756, 1757, 1758, 1759, 1760, 1761, 1762, - 1763, 1764, 1765, 1797, 1819, 1826, 1829, 1845, - 1853, 1895, 4862, 1461, 870, 1462, 873, 1463, - 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, - 1472, 1503, 1523, 1530, 1533, 1545, 1551, 1588, - 1312, 1314, 1315, 1316, 1317, 1318, 1319, 1320, - 1321, 1322, 1323, 1324, 1325, 1357, 1379, 1386, - 1389, 1405, 1413, 1455, 562, 564, 565, 566, - 567, 1020, 1021, 1022, 1023, 1024, 1025, 1026, - 1027, 1059, 1081, 1088, 1241, 1257, 1264, 1306, - 869, 872, 874, 875, 876, 877, 878, 879, - 880, 881, 882, 883, 884, 916, 938, 945, - 948, 964, 972, 1014, 575, 577, 578, 579, - 580, 581, 582, 583, 584, 585, 586, 587, - 588, 620, 643, 650, 653, 670, 679, 727, - 1090, 1093, 1094, 1095, 1096, 1097, 1098, 1099, - 1100, 1101, 1102, 1103, 1132, 1154, 1161, 1168, - 1184, 1192, 1235, 1592, 1594, 1595, 1596, 1597, - 1598, 1599, 1600, 1601, 1602, 1603, 1604, 1605, - 1637, 1662, 1669, 1672, 1689, 1697, 1746, 2193, - 2195, 2196, 2197, 2198, 2199, 2200, 2201, 2202, - 2203, 2204, 2205, 2206, 2238, 2260, 2267, 2270, - 2286, 2292, 2334, 2489, 2491, 2492, 2493, 2494, - 2495, 2496, 2497, 2498, 2499, 2500, 2501, 2502, - 2534, 2556, 2563, 2566, 2582, 2588, 2630, 2340, - 2342, 2343, 2344, 2345, 2346, 2347, 2348, 2349, - 2350, 2351, 2352, 2353, 2385, 2407, 2414, 2417, - 2433, 2441, 2483, 4862, 2636, 2639, 2640, 2641, - 2642, 2643, 2644, 2645, 2646, 2647, 2648, 2649, - 2678, 2700, 2707, 2710, 2726, 2730, 2772, 4880, - 4881, 4884, 4888, 4889, 4890, 4891, 4892, 4893, - 4894, 4897, 4898, 4899, 4900, 4901, 4902, 4903, - 4904, 4905, 4906, 4907, 4882, 4879, 4883, 4895, - 4896, 4908, 4909, 4910, 4911, 4912, 4913, 4914, - 4915, 4916, 4917, 4918, 4919, 4920, 4921, 4922, - 4923, 4924, 4925, 4926, 4927, 4928, 4932, 4940, - 4941, 4942, 4943, 2777, 2779, 2780, 2781, 2782, - 2783, 2784, 2785, 2786, 2787, 2788, 2789, 2790, - 2822, 2844, 2851, 2854, 2870, 2876, 2918, 2924, - 2926, 2927, 2928, 2929, 2930, 2931, 2932, 2933, - 2934, 2935, 2936, 2937, 2969, 2991, 2998, 3001, - 3017, 3023, 3065, 3071, 3073, 3074, 3075, 3076, - 3077, 3078, 3079, 3080, 3081, 3082, 3083, 3084, - 3116, 3138, 3145, 3148, 3164, 3170, 3212, 3218, - 3219, 3220, 3221, 3222, 3223, 3224, 3225, 3226, - 3227, 3228, 3229, 3230, 3231, 3232, 3233, 3234, - 3235, 3236, 3237, 3238, 5018, 5019, 5029, 5030, - 5031, 5032, 5033, 5034, 5035, 5036, 5048, 5049, - 5050, 5051, 5052, 5053, 5054, 5055, 5056, 5057, - 5058, 5020, 5017, 5021, 5022, 5023, 5024, 5025, - 5026, 5027, 5028, 5037, 5038, 5039, 5040, 5041, - 5042, 5043, 5044, 5045, 5046, 5047, 3239, 3240, - 3241, 3242, 3243, 3244, 3245, 3246, 3247, 3248, - 3249, 3250, 3251, 3252, 3253, 3254, 3255, 3256, - 3257, 3258, 3259, 3260, 3261, 3262, 3263, 3264, - 3265, 3266, 3267, 3573, 3574, 3575, 3576, 3577, - 3578, 3579, 3580, 3581, 3582, 3583, 3584, 3585, - 3586, 3587, 4862, 3269, 3271, 3272, 3273, 3274, - 3275, 3276, 3277, 3278, 3279, 3280, 3281, 3282, - 3314, 3338, 3345, 3500, 3516, 3517, 3520, 3526, - 3568, 3351, 3354, 3355, 3356, 3357, 3358, 3359, - 3360, 3361, 3362, 3363, 3364, 3393, 3417, 3424, - 3430, 3446, 3447, 3450, 3455, 3497, 3588, 3589, - 3590, 3591, 3592, 3593, 3735, 3736, 4862, 3594, - 3597, 3598, 3599, 3600, 3601, 3602, 3603, 3604, - 3605, 3606, 3607, 3636, 3658, 3665, 3668, 3684, - 3688, 3730, 3737, 4175, 4317, 4318, 4460, 4461, - 4462, 4463, 4464, 4465, 4466, 4467, 4468, 4469, - 4470, 4471, 4472, 4473, 4474, 4475, 4476, 4477, - 4478, 4479, 3738, 3740, 3741, 3742, 3743, 3744, - 3745, 3746, 3747, 3748, 3749, 3750, 3751, 3783, - 3805, 3812, 3815, 3831, 3837, 3879, 3885, 3888, - 3889, 3890, 3891, 3892, 3893, 3894, 3895, 3896, - 3897, 3898, 3927, 3949, 3956, 3959, 3975, 3980, - 4022, 4862, 4027, 4030, 4031, 4032, 4033, 4034, - 4035, 4036, 4037, 4038, 4039, 4040, 4069, 4091, - 4098, 4105, 4121, 4127, 4170, 4862, 4176, 4179, - 4180, 4181, 4182, 4183, 4184, 4185, 4186, 4187, - 4188, 4189, 4218, 4240, 4247, 4250, 4266, 4270, - 4312, 4319, 4322, 4323, 4324, 4325, 4326, 4327, - 4328, 4329, 4330, 4331, 4332, 4361, 4383, 4390, - 4393, 4409, 4413, 4455, 5086, 5087, 5090, 5091, - 5092, 5093, 5094, 5095, 5096, 5097, 5106, 5107, - 5108, 5109, 5110, 5111, 5112, 5113, 5114, 5115, - 5116, 5088, 5089, 5098, 5099, 5100, 5101, 5102, - 5103, 5104, 5105, 5117, 5118, 5119, 5120, 5121, - 5122, 5123, 5124, 5125, 5126, 5127, 4480, 4481, - 4482, 4483, 4484, 4485, 4486, 4487, 4488, 4489, - 4490, 4491, 4492, 4493, 4494, 4495, 4643, 4644, - 4645, 4646, 4647, 4648, 4649, 4650, 4651, 4652, - 4653, 4654, 4655, 4656, 4657, 4658, 4659, 4660, - 4661, 4662, 4496, 4498, 4499, 4500, 4501, 4502, - 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4541, - 4563, 4570, 4573, 4589, 4595, 4637, 5215, 5216, - 5219, 5220, 5221, 5222, 5223, 5224, 5225, 5226, - 5235, 5236, 5237, 5238, 5239, 5240, 5241, 5242, - 5250, 5264, 5265, 5266, 5267, 5217, 5218, 5227, - 5228, 5229, 5230, 5231, 5232, 5233, 5234, 5302, - 5303, 5304, 5305, 5306, 5307, 5308, 5309, 5310, - 5311, 5312, 4663, 4664, 4665, 4666, 4667, 4668, - 4669, 4670, 4671, 4676, 4695, 4700, 4703, 4704, - 4706, 4851, 4852, 4853, 4855, 4858, 4860, 4862, - 4708, 4711, 4712, 4713, 4714, 4715, 4716, 4717, - 4718, 4719, 4720, 4721, 4750, 4772, 4779, 4782, - 4798, 4802, 4845, + 4862, 4863, 4862, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 43, + 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 65, 66, 67, 68, + 69, 70, 72, 73, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 91, 92, 93, 95, 101, + 120, 125, 127, 134, 96, 97, 98, 99, + 100, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 121, 122, 123, 124, 126, + 128, 129, 130, 131, 132, 133, 135, 137, + 138, 139, 1, 140, 2, 4862, 4866, 1901, + 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, + 1910, 1911, 1912, 1913, 1914, 1943, 1966, 1973, + 1976, 1993, 1997, 2041, 4867, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 198, 238, 256, 261, + 286, 287, 290, 306, 407, 142, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 257, 258, + 259, 260, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 288, 289, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 307, 338, 362, 366, 367, + 369, 377, 380, 398, 403, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 363, 364, 365, 368, 370, 371, + 372, 373, 374, 375, 376, 378, 379, 381, + 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, + 399, 400, 401, 402, 404, 405, 406, 408, + 409, 410, 411, 412, 4862, 4868, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 456, 481, 488, 491, + 508, 512, 557, 413, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, + 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, + 482, 483, 484, 485, 486, 487, 489, 490, + 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, + 509, 510, 511, 513, 519, 540, 545, 547, + 555, 514, 515, 516, 517, 518, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 536, 537, + 538, 539, 541, 542, 543, 544, 546, 548, + 549, 550, 551, 552, 553, 554, 556, 558, + 559, 560, 561, 4869, 4870, 569, 570, 571, + 572, 573, 574, 733, 734, 735, 736, 737, + 738, 739, 740, 769, 791, 798, 801, 817, + 822, 864, 568, 4871, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, + 642, 644, 645, 646, 647, 648, 649, 651, + 652, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, + 669, 671, 672, 673, 674, 675, 676, 677, + 678, 680, 687, 708, 715, 717, 725, 681, + 682, 683, 684, 685, 686, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, + 707, 709, 710, 711, 712, 713, 714, 716, + 718, 719, 720, 721, 722, 723, 724, 726, + 728, 729, 730, 576, 731, 732, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, 755, 756, 757, 758, + 759, 760, 761, 762, 763, 764, 765, 766, + 767, 768, 770, 771, 772, 773, 774, 775, + 776, 777, 778, 779, 780, 781, 782, 783, + 784, 785, 786, 787, 788, 789, 790, 792, + 793, 794, 795, 796, 797, 799, 800, 802, + 803, 804, 805, 806, 807, 808, 809, 810, + 811, 812, 813, 814, 815, 816, 818, 819, + 820, 821, 823, 829, 848, 853, 855, 862, + 824, 825, 826, 827, 828, 830, 831, 832, + 833, 834, 835, 836, 837, 838, 839, 840, + 841, 842, 843, 844, 845, 846, 847, 849, + 850, 851, 852, 854, 856, 857, 858, 859, + 860, 861, 863, 865, 866, 867, 868, 885, + 886, 887, 888, 889, 890, 891, 892, 893, + 894, 895, 896, 897, 898, 899, 900, 901, + 902, 903, 904, 905, 906, 907, 908, 909, + 910, 911, 912, 913, 914, 915, 917, 918, + 919, 920, 921, 922, 923, 924, 925, 926, + 927, 928, 929, 930, 931, 932, 933, 934, + 935, 936, 937, 939, 940, 941, 942, 943, + 944, 946, 947, 949, 950, 951, 952, 953, + 954, 955, 956, 957, 958, 959, 960, 961, + 962, 963, 965, 966, 967, 968, 969, 970, + 971, 973, 979, 998, 1003, 1005, 1012, 974, + 975, 976, 977, 978, 980, 981, 982, 983, + 984, 985, 986, 987, 988, 989, 990, 991, + 992, 993, 994, 995, 996, 997, 999, 1000, + 1001, 1002, 1004, 1006, 1007, 1008, 1009, 1010, + 1011, 1013, 1015, 1016, 1017, 871, 1018, 1019, + 1028, 1029, 1030, 1031, 1032, 1033, 1034, 1035, + 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, + 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, + 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1060, + 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, + 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, + 1077, 1078, 1079, 1080, 1082, 1083, 1084, 1085, + 1086, 1087, 1089, 1240, 1164, 1165, 1166, 1091, + 1167, 4872, 1104, 1105, 1106, 1107, 1108, 1109, + 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, + 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, + 1126, 1127, 1128, 1129, 1130, 1131, 1133, 1134, + 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, + 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, + 1151, 1152, 1153, 1155, 1156, 1157, 1158, 1159, + 1160, 1162, 1163, 1169, 1170, 1171, 1172, 1173, + 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, + 1182, 1183, 1185, 1186, 1187, 1188, 1189, 1190, + 1191, 1193, 1199, 1218, 1223, 1226, 1233, 1194, + 1195, 1196, 1197, 1198, 1200, 1201, 1202, 1203, + 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, + 1212, 1213, 1214, 1215, 1216, 1217, 1219, 1220, + 1221, 1222, 1224, 1225, 1227, 1228, 1229, 1230, + 1231, 1232, 1234, 1236, 1237, 1238, 1239, 1092, + 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, + 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1258, + 1259, 1260, 1261, 1262, 1263, 1265, 1271, 1290, + 1295, 1297, 1304, 1266, 1267, 1268, 1269, 1270, + 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, + 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, + 1288, 1289, 1291, 1292, 1293, 1294, 1296, 1298, + 1299, 1300, 1301, 1302, 1303, 1305, 1307, 1308, + 1309, 563, 1310, 1311, 1326, 1327, 1328, 1329, + 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1337, + 1338, 1339, 1340, 1341, 1342, 1343, 1344, 1345, + 1346, 1347, 1348, 1349, 1350, 1351, 1352, 1353, + 1354, 1355, 1356, 1358, 1359, 1360, 1361, 1362, + 1363, 1364, 1365, 1366, 1367, 1368, 1369, 1370, + 1371, 1372, 1373, 1374, 1375, 1376, 1377, 1378, + 1380, 1381, 1382, 1383, 1384, 1385, 1387, 1388, + 1390, 1391, 1392, 1393, 1394, 1395, 1396, 1397, + 1398, 1399, 1400, 1401, 1402, 1403, 1404, 1406, + 1407, 1408, 1409, 1410, 1411, 1412, 1414, 1420, + 1439, 1444, 1446, 1453, 1415, 1416, 1417, 1418, + 1419, 1421, 1422, 1423, 1424, 1425, 1426, 1427, + 1428, 1429, 1430, 1431, 1432, 1433, 1434, 1435, + 1436, 1437, 1438, 1440, 1441, 1442, 1443, 1445, + 1447, 1448, 1449, 1450, 1451, 1452, 1454, 1456, + 1457, 1458, 1313, 1459, 1460, 1473, 1474, 1475, + 1476, 1477, 1478, 1479, 1480, 1481, 1482, 1483, + 1484, 1485, 1486, 1487, 1488, 1489, 1490, 1491, + 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, + 1500, 1501, 1502, 1504, 1505, 1506, 1507, 1508, + 1509, 1510, 1511, 1512, 1513, 1514, 1515, 1516, + 1517, 1518, 1519, 1520, 1521, 1522, 1524, 1525, + 1526, 1527, 1528, 1529, 1531, 1532, 1534, 1535, + 1536, 1537, 1538, 1539, 1540, 1541, 1542, 1543, + 1544, 1546, 1547, 1548, 1549, 1550, 1552, 1558, + 1573, 1577, 1579, 1586, 1553, 1554, 1555, 1556, + 1557, 1559, 1560, 1561, 1562, 1563, 1564, 1565, + 1566, 1567, 1568, 1569, 1570, 1571, 1572, 1574, + 1575, 1576, 1578, 1580, 1581, 1582, 1583, 1584, + 1585, 1587, 1589, 1590, 1591, 4873, 1606, 1607, + 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, + 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, + 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, + 1632, 1633, 1634, 1635, 1636, 1638, 1639, 1640, + 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, + 1649, 1650, 1651, 1652, 1653, 1654, 1655, 1656, + 1657, 1658, 1659, 1660, 1661, 1663, 1664, 1665, + 1666, 1667, 1668, 1670, 1671, 1673, 1674, 1675, + 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, + 1684, 1685, 1686, 1687, 1688, 1690, 1691, 1692, + 1693, 1694, 1695, 1696, 1698, 1705, 1727, 1734, + 1736, 1744, 1699, 1700, 1701, 1702, 1703, 1704, + 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, + 1714, 1715, 1716, 1717, 1718, 1719, 1720, 1721, + 1722, 1723, 1724, 1725, 1726, 1728, 1729, 1730, + 1731, 1732, 1733, 1735, 1737, 1738, 1739, 1740, + 1741, 1742, 1743, 1745, 1747, 1748, 1749, 1593, + 1750, 1751, 141, 1766, 1767, 1768, 1769, 1770, + 1771, 1772, 1773, 1774, 1775, 1776, 1777, 1778, + 1779, 1780, 1781, 1782, 1783, 1784, 1785, 1786, + 1787, 1788, 1789, 1790, 1791, 1792, 1793, 1794, + 1795, 1796, 1798, 1799, 1800, 1801, 1802, 1803, + 1804, 1805, 1806, 1807, 1808, 1809, 1810, 1811, + 1812, 1813, 1814, 1815, 1816, 1817, 1818, 1820, + 1821, 1822, 1823, 1824, 1825, 1827, 1828, 1830, + 1831, 1832, 1833, 1834, 1835, 1836, 1837, 1838, + 1839, 1840, 1841, 1842, 1843, 1844, 1846, 1847, + 1848, 1849, 1850, 1851, 1852, 1854, 1860, 1879, + 1884, 1886, 1893, 1855, 1856, 1857, 1858, 1859, + 1861, 1862, 1863, 1864, 1865, 1866, 1867, 1868, + 1869, 1870, 1871, 1872, 1873, 1874, 1875, 1876, + 1877, 1878, 1880, 1881, 1882, 1883, 1885, 1887, + 1888, 1889, 1890, 1891, 1892, 1894, 1896, 1897, + 1898, 1753, 1899, 1900, 1915, 1916, 1917, 1918, + 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, + 1927, 1928, 1929, 1930, 1931, 1932, 1933, 1934, + 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, + 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, + 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, + 1960, 1961, 1962, 1963, 1964, 1965, 1967, 1968, + 1969, 1970, 1971, 1972, 1974, 1975, 1977, 1978, + 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, + 1987, 1988, 1989, 1990, 1991, 1992, 1994, 1995, + 1996, 1998, 2004, 2024, 2029, 2031, 2039, 1999, + 2000, 2001, 2002, 2003, 2005, 2006, 2007, 2008, + 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, + 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2025, + 2026, 2027, 2028, 2030, 2032, 2033, 2034, 2035, + 2036, 2037, 2038, 2040, 2042, 2043, 2044, 2045, + 4865, 2060, 2061, 2062, 2063, 2064, 2065, 2066, + 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, + 2075, 2076, 2077, 2078, 2079, 2080, 2081, 2082, + 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, + 2092, 2093, 2094, 2095, 2096, 2097, 2098, 2099, + 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, + 2108, 2109, 2110, 2111, 2112, 2114, 2115, 2116, + 2117, 2118, 2119, 2121, 2122, 2124, 2125, 2126, + 2127, 2128, 2129, 2130, 2131, 2132, 2133, 2134, + 2135, 2136, 2137, 2138, 2140, 2141, 2142, 2143, + 2144, 2146, 2152, 2171, 2176, 2178, 2185, 2147, + 2148, 2149, 2150, 2151, 2153, 2154, 2155, 2156, + 2157, 2158, 2159, 2160, 2161, 2162, 2163, 2164, + 2165, 2166, 2167, 2168, 2169, 2170, 2172, 2173, + 2174, 2175, 2177, 2179, 2180, 2181, 2182, 2183, + 2184, 2186, 2188, 2189, 2190, 2047, 2191, 2192, + 4874, 2207, 2208, 2209, 2210, 2211, 2212, 2213, + 2214, 2215, 2216, 2217, 2218, 2219, 2220, 2221, + 2222, 2223, 2224, 2225, 2226, 2227, 2228, 2229, + 2230, 2231, 2232, 2233, 2234, 2235, 2236, 2237, + 2239, 2240, 2241, 2242, 2243, 2244, 2245, 2246, + 2247, 2248, 2249, 2250, 2251, 2252, 2253, 2254, + 2255, 2256, 2257, 2258, 2259, 2261, 2262, 2263, + 2264, 2265, 2266, 2268, 2269, 2271, 2272, 2273, + 2274, 2275, 2276, 2277, 2278, 2279, 2280, 2281, + 2282, 2283, 2284, 2285, 2287, 2288, 2289, 2290, + 2291, 2293, 2299, 2318, 2323, 2325, 2332, 2294, + 2295, 2296, 2297, 2298, 2300, 2301, 2302, 2303, + 2304, 2305, 2306, 2307, 2308, 2309, 2310, 2311, + 2312, 2313, 2314, 2315, 2316, 2317, 2319, 2320, + 2321, 2322, 2324, 2326, 2327, 2328, 2329, 2330, + 2331, 2333, 2335, 2336, 2337, 2194, 2338, 2339, + 4876, 2354, 2355, 2356, 2357, 2358, 2359, 2360, + 2361, 2362, 2363, 2364, 2365, 2366, 2367, 2368, + 2369, 2370, 2371, 2372, 2373, 2374, 2375, 2376, + 2377, 2378, 2379, 2380, 2381, 2382, 2383, 2384, + 2386, 2387, 2388, 2389, 2390, 2391, 2392, 2393, + 2394, 2395, 2396, 2397, 2398, 2399, 2400, 2401, + 2402, 2403, 2404, 2405, 2406, 2408, 2409, 2410, + 2411, 2412, 2413, 2415, 2416, 2418, 2419, 2420, + 2421, 2422, 2423, 2424, 2425, 2426, 2427, 2428, + 2429, 2430, 2431, 2432, 2434, 2435, 2436, 2437, + 2438, 2439, 2440, 2442, 2448, 2467, 2472, 2474, + 2481, 2443, 2444, 2445, 2446, 2447, 2449, 2450, + 2451, 2452, 2453, 2454, 2455, 2456, 2457, 2458, + 2459, 2460, 2461, 2462, 2463, 2464, 2465, 2466, + 2468, 2469, 2470, 2471, 2473, 2475, 2476, 2477, + 2478, 2479, 2480, 2482, 2484, 2485, 2486, 2341, + 2487, 2488, 4875, 2503, 2504, 2505, 2506, 2507, + 2508, 2509, 2510, 2511, 2512, 2513, 2514, 2515, + 2516, 2517, 2518, 2519, 2520, 2521, 2522, 2523, + 2524, 2525, 2526, 2527, 2528, 2529, 2530, 2531, + 2532, 2533, 2535, 2536, 2537, 2538, 2539, 2540, + 2541, 2542, 2543, 2544, 2545, 2546, 2547, 2548, + 2549, 2550, 2551, 2552, 2553, 2554, 2555, 2557, + 2558, 2559, 2560, 2561, 2562, 2564, 2565, 2567, + 2568, 2569, 2570, 2571, 2572, 2573, 2574, 2575, + 2576, 2577, 2578, 2579, 2580, 2581, 2583, 2584, + 2585, 2586, 2587, 2589, 2595, 2614, 2619, 2621, + 2628, 2590, 2591, 2592, 2593, 2594, 2596, 2597, + 2598, 2599, 2600, 2601, 2602, 2603, 2604, 2605, + 2606, 2607, 2608, 2609, 2610, 2611, 2612, 2613, + 2615, 2616, 2617, 2618, 2620, 2622, 2623, 2624, + 2625, 2626, 2627, 2629, 2631, 2632, 2633, 2490, + 2634, 2635, 4862, 4878, 2650, 2651, 2652, 2653, + 2654, 2655, 2656, 2657, 2658, 2659, 2660, 2661, + 2662, 2663, 2664, 2665, 2666, 2667, 2668, 2669, + 2670, 2671, 2672, 2673, 2674, 2675, 2676, 2677, + 2679, 2680, 2681, 2682, 2683, 2684, 2685, 2686, + 2687, 2688, 2689, 2690, 2691, 2692, 2693, 2694, + 2695, 2696, 2697, 2698, 2699, 2701, 2702, 2703, + 2704, 2705, 2706, 2708, 2709, 2711, 2712, 2713, + 2714, 2715, 2716, 2717, 2718, 2719, 2720, 2721, + 2722, 2723, 2724, 2725, 2727, 2728, 2729, 2731, + 2737, 2756, 2761, 2763, 2770, 2732, 2733, 2734, + 2735, 2736, 2738, 2739, 2740, 2741, 2742, 2743, + 2744, 2745, 2746, 2747, 2748, 2749, 2750, 2751, + 2752, 2753, 2754, 2755, 2757, 2758, 2759, 2760, + 2762, 2764, 2765, 2766, 2767, 2768, 2769, 2771, + 2773, 2774, 2775, 2637, 2776, 2638, 4885, 2791, + 2792, 2793, 2794, 2795, 2796, 2797, 2798, 2799, + 2800, 2801, 2802, 2803, 2804, 2805, 2806, 2807, + 2808, 2809, 2810, 2811, 2812, 2813, 2814, 2815, + 2816, 2817, 2818, 2819, 2820, 2821, 2823, 2824, + 2825, 2826, 2827, 2828, 2829, 2830, 2831, 2832, + 2833, 2834, 2835, 2836, 2837, 2838, 2839, 2840, + 2841, 2842, 2843, 2845, 2846, 2847, 2848, 2849, + 2850, 2852, 2853, 2855, 2856, 2857, 2858, 2859, + 2860, 2861, 2862, 2863, 2864, 2865, 2866, 2867, + 2868, 2869, 2871, 2872, 2873, 2874, 2875, 2877, + 2883, 2902, 2907, 2909, 2916, 2878, 2879, 2880, + 2881, 2882, 2884, 2885, 2886, 2887, 2888, 2889, + 2890, 2891, 2892, 2893, 2894, 2895, 2896, 2897, + 2898, 2899, 2900, 2901, 2903, 2904, 2905, 2906, + 2908, 2910, 2911, 2912, 2913, 2914, 2915, 2917, + 2919, 2920, 2921, 2778, 2922, 2923, 4886, 2938, + 2939, 2940, 2941, 2942, 2943, 2944, 2945, 2946, + 2947, 2948, 2949, 2950, 2951, 2952, 2953, 2954, + 2955, 2956, 2957, 2958, 2959, 2960, 2961, 2962, + 2963, 2964, 2965, 2966, 2967, 2968, 2970, 2971, + 2972, 2973, 2974, 2975, 2976, 2977, 2978, 2979, + 2980, 2981, 2982, 2983, 2984, 2985, 2986, 2987, + 2988, 2989, 2990, 2992, 2993, 2994, 2995, 2996, + 2997, 2999, 3000, 3002, 3003, 3004, 3005, 3006, + 3007, 3008, 3009, 3010, 3011, 3012, 3013, 3014, + 3015, 3016, 3018, 3019, 3020, 3021, 3022, 3024, + 3030, 3049, 3054, 3056, 3063, 3025, 3026, 3027, + 3028, 3029, 3031, 3032, 3033, 3034, 3035, 3036, + 3037, 3038, 3039, 3040, 3041, 3042, 3043, 3044, + 3045, 3046, 3047, 3048, 3050, 3051, 3052, 3053, + 3055, 3057, 3058, 3059, 3060, 3061, 3062, 3064, + 3066, 3067, 3068, 2925, 3069, 3070, 4887, 3085, + 3086, 3087, 3088, 3089, 3090, 3091, 3092, 3093, + 3094, 3095, 3096, 3097, 3098, 3099, 3100, 3101, + 3102, 3103, 3104, 3105, 3106, 3107, 3108, 3109, + 3110, 3111, 3112, 3113, 3114, 3115, 3117, 3118, + 3119, 3120, 3121, 3122, 3123, 3124, 3125, 3126, + 3127, 3128, 3129, 3130, 3131, 3132, 3133, 3134, + 3135, 3136, 3137, 3139, 3140, 3141, 3142, 3143, + 3144, 3146, 3147, 3149, 3150, 3151, 3152, 3153, + 3154, 3155, 3156, 3157, 3158, 3159, 3160, 3161, + 3162, 3163, 3165, 3166, 3167, 3168, 3169, 3171, + 3177, 3196, 3201, 3203, 3210, 3172, 3173, 3174, + 3175, 3176, 3178, 3179, 3180, 3181, 3182, 3183, + 3184, 3185, 3186, 3187, 3188, 3189, 3190, 3191, + 3192, 3193, 3194, 3195, 3197, 3198, 3199, 3200, + 3202, 3204, 3205, 3206, 3207, 3208, 3209, 3211, + 3213, 3214, 3215, 3072, 3216, 3217, 4929, 4930, + 4931, 4991, 4992, 4993, 4994, 4995, 4996, 4997, + 4998, 4999, 5000, 5001, 5002, 5003, 5004, 5005, + 5006, 5007, 5008, 5009, 5010, 5011, 5012, 5013, + 5014, 5015, 4933, 4934, 4935, 4936, 4937, 4938, + 4939, 4944, 4945, 4946, 4947, 4948, 4949, 4950, + 4951, 4952, 4953, 4954, 4955, 4956, 4957, 4958, + 4959, 4960, 4961, 4962, 4963, 4964, 4965, 4966, + 4967, 4968, 4969, 4970, 4971, 4972, 4973, 4974, + 4975, 4976, 4977, 4978, 4979, 4980, 4981, 4982, + 4983, 4984, 4985, 4986, 4987, 4988, 4989, 4990, + 5073, 4862, 3283, 3284, 3285, 3286, 3287, 3288, + 3289, 3290, 3291, 3292, 3293, 3294, 3295, 3296, + 3297, 3298, 3299, 3300, 3301, 3302, 3303, 3304, + 3305, 3306, 3307, 3308, 3309, 3310, 3311, 3312, + 3313, 3315, 3316, 3317, 3268, 3318, 3319, 3320, + 3321, 3322, 3323, 3324, 3325, 3326, 3327, 3328, + 3329, 3330, 3331, 3332, 3333, 3334, 3335, 3336, + 3337, 3339, 3340, 3341, 3342, 3343, 3344, 3346, + 3347, 3348, 3349, 3350, 3429, 5074, 3365, 3366, + 3367, 3368, 3369, 3370, 3371, 3372, 3373, 3374, + 3375, 3376, 3377, 3378, 3379, 3380, 3381, 3382, + 3383, 3384, 3385, 3386, 3387, 3388, 3389, 3390, + 3391, 3392, 3394, 3395, 3396, 3352, 3397, 3398, + 3399, 3400, 3401, 3402, 3403, 3404, 3405, 3406, + 3407, 3408, 3409, 3410, 3411, 3412, 3413, 3414, + 3415, 3416, 3418, 3419, 3420, 3421, 3422, 3423, + 3425, 3426, 3427, 3428, 3431, 3432, 3433, 3434, + 3435, 3436, 3437, 3438, 3439, 3440, 3441, 3442, + 3443, 3444, 3445, 3448, 3449, 3451, 3452, 3453, + 3454, 3456, 3462, 3481, 3486, 3488, 3495, 3457, + 3458, 3459, 3460, 3461, 3463, 3464, 3465, 3466, + 3467, 3468, 3469, 3470, 3471, 3472, 3473, 3474, + 3475, 3476, 3477, 3478, 3479, 3480, 3482, 3483, + 3484, 3485, 3487, 3489, 3490, 3491, 3492, 3493, + 3494, 3496, 3498, 3499, 3353, 3501, 3502, 3503, + 3504, 3505, 3506, 3507, 3508, 3509, 3510, 3511, + 3512, 3513, 3514, 3515, 3270, 3518, 3519, 3521, + 3522, 3523, 3524, 3525, 3527, 3533, 3552, 3557, + 3559, 3566, 3528, 3529, 3530, 3531, 3532, 3534, + 3535, 3536, 3537, 3538, 3539, 3540, 3541, 3542, + 3543, 3544, 3545, 3546, 3547, 3548, 3549, 3550, + 3551, 3553, 3554, 3555, 3556, 3558, 3560, 3561, + 3562, 3563, 3564, 3565, 3567, 3569, 3570, 3571, + 3572, 4862, 5076, 4862, 3608, 3609, 3610, 3611, + 3612, 3613, 3614, 3615, 3616, 3617, 3618, 3619, + 3620, 3621, 3622, 3623, 3624, 3625, 3626, 3627, + 3628, 3629, 3630, 3631, 3632, 3633, 3634, 3635, + 3637, 3638, 3639, 3640, 3641, 3642, 3643, 3644, + 3645, 3646, 3647, 3648, 3649, 3650, 3651, 3652, + 3653, 3654, 3655, 3656, 3657, 3659, 3660, 3661, + 3662, 3663, 3664, 3666, 3667, 3669, 3670, 3671, + 3672, 3673, 3674, 3675, 3676, 3677, 3678, 3679, + 3680, 3681, 3682, 3683, 3685, 3686, 3687, 3689, + 3695, 3714, 3719, 3721, 3728, 3690, 3691, 3692, + 3693, 3694, 3696, 3697, 3698, 3699, 3700, 3701, + 3702, 3703, 3704, 3705, 3706, 3707, 3708, 3709, + 3710, 3711, 3712, 3713, 3715, 3716, 3717, 3718, + 3720, 3722, 3723, 3724, 3725, 3726, 3727, 3729, + 3731, 3732, 3733, 3595, 3734, 3596, 5078, 5079, + 5080, 3752, 3753, 3754, 3755, 3756, 3757, 3758, + 3759, 3760, 3761, 3762, 3763, 3764, 3765, 3766, + 3767, 3768, 3769, 3770, 3771, 3772, 3773, 3774, + 3775, 3776, 3777, 3778, 3779, 3780, 3781, 3782, + 3784, 3785, 3786, 3787, 3788, 3789, 3790, 3791, + 3792, 3793, 3794, 3795, 3796, 3797, 3798, 3799, + 3800, 3801, 3802, 3803, 3804, 3806, 3807, 3808, + 3809, 3810, 3811, 3813, 3814, 3816, 3817, 3818, + 3819, 3820, 3821, 3822, 3823, 3824, 3825, 3826, + 3827, 3828, 3829, 3830, 3832, 3833, 3834, 3835, + 3836, 3838, 3844, 3863, 3868, 3870, 3877, 3839, + 3840, 3841, 3842, 3843, 3845, 3846, 3847, 3848, + 3849, 3850, 3851, 3852, 3853, 3854, 3855, 3856, + 3857, 3858, 3859, 3860, 3861, 3862, 3864, 3865, + 3866, 3867, 3869, 3871, 3872, 3873, 3874, 3875, + 3876, 3878, 3880, 3881, 3882, 3739, 3883, 3884, + 3899, 3900, 3901, 3902, 3903, 3904, 3905, 3906, + 3907, 3908, 3909, 3910, 3911, 3912, 3913, 3914, + 3915, 3916, 3917, 3918, 3919, 3920, 3921, 3922, + 3923, 3924, 3925, 3926, 3928, 3929, 3930, 3931, + 3932, 3933, 3934, 3935, 3936, 3937, 3938, 3939, + 3940, 3941, 3942, 3943, 3944, 3945, 3946, 3947, + 3948, 3950, 3951, 3952, 3953, 3954, 3955, 3957, + 3958, 3960, 3961, 3962, 3963, 3964, 3965, 3966, + 3967, 3968, 3969, 3970, 3971, 3972, 3973, 3974, + 3976, 3977, 3978, 3979, 3981, 3987, 4006, 4011, + 4013, 4020, 3982, 3983, 3984, 3985, 3986, 3988, + 3989, 3990, 3991, 3992, 3993, 3994, 3995, 3996, + 3997, 3998, 3999, 4000, 4001, 4002, 4003, 4004, + 4005, 4007, 4008, 4009, 4010, 4012, 4014, 4015, + 4016, 4017, 4018, 4019, 4021, 4023, 4024, 4025, + 3886, 4026, 3887, 4862, 4041, 4042, 4043, 4044, + 4045, 4046, 4047, 4048, 4049, 4050, 4051, 4052, + 4053, 4054, 4055, 4056, 4057, 4058, 4059, 4060, + 4061, 4062, 4063, 4064, 4065, 4066, 4067, 4068, + 4070, 4071, 4072, 4073, 4074, 4075, 4076, 4077, + 4078, 4079, 4080, 4081, 4082, 4083, 4084, 4085, + 4086, 4087, 4088, 4089, 4090, 4092, 4093, 4094, + 4095, 4096, 4097, 4099, 4100, 4101, 4102, 4103, + 4028, 4104, 4106, 4107, 4108, 4109, 4110, 4111, + 4112, 4113, 4114, 4115, 4116, 4117, 4118, 4119, + 4120, 4122, 4123, 4124, 4125, 4126, 4128, 4134, + 4153, 4158, 4161, 4168, 4129, 4130, 4131, 4132, + 4133, 4135, 4136, 4137, 4138, 4139, 4140, 4141, + 4142, 4143, 4144, 4145, 4146, 4147, 4148, 4149, + 4150, 4151, 4152, 4154, 4155, 4156, 4157, 4159, + 4160, 4162, 4163, 4164, 4165, 4166, 4167, 4169, + 4171, 4172, 4173, 4174, 4029, 5081, 4862, 4190, + 4191, 4192, 4193, 4194, 4195, 4196, 4197, 4198, + 4199, 4200, 4201, 4202, 4203, 4204, 4205, 4206, + 4207, 4208, 4209, 4210, 4211, 4212, 4213, 4214, + 4215, 4216, 4217, 4219, 4220, 4221, 4222, 4223, + 4224, 4225, 4226, 4227, 4228, 4229, 4230, 4231, + 4232, 4233, 4234, 4235, 4236, 4237, 4238, 4239, + 4241, 4242, 4243, 4244, 4245, 4246, 4248, 4249, + 4251, 4252, 4253, 4254, 4255, 4256, 4257, 4258, + 4259, 4260, 4261, 4262, 4263, 4264, 4265, 4267, + 4268, 4269, 4271, 4277, 4296, 4301, 4303, 4310, + 4272, 4273, 4274, 4275, 4276, 4278, 4279, 4280, + 4281, 4282, 4283, 4284, 4285, 4286, 4287, 4288, + 4289, 4290, 4291, 4292, 4293, 4294, 4295, 4297, + 4298, 4299, 4300, 4302, 4304, 4305, 4306, 4307, + 4308, 4309, 4311, 4313, 4314, 4315, 4177, 4316, + 4178, 5082, 4333, 4334, 4335, 4336, 4337, 4338, + 4339, 4340, 4341, 4342, 4343, 4344, 4345, 4346, + 4347, 4348, 4349, 4350, 4351, 4352, 4353, 4354, + 4355, 4356, 4357, 4358, 4359, 4360, 4362, 4363, + 4364, 4365, 4366, 4367, 4368, 4369, 4370, 4371, + 4372, 4373, 4374, 4375, 4376, 4377, 4378, 4379, + 4380, 4381, 4382, 4384, 4385, 4386, 4387, 4388, + 4389, 4391, 4392, 4394, 4395, 4396, 4397, 4398, + 4399, 4400, 4401, 4402, 4403, 4404, 4405, 4406, + 4407, 4408, 4410, 4411, 4412, 4414, 4420, 4439, + 4444, 4446, 4453, 4415, 4416, 4417, 4418, 4419, + 4421, 4422, 4423, 4424, 4425, 4426, 4427, 4428, + 4429, 4430, 4431, 4432, 4433, 4434, 4435, 4436, + 4437, 4438, 4440, 4441, 4442, 4443, 4445, 4447, + 4448, 4449, 4450, 4451, 4452, 4454, 4456, 4457, + 4458, 4320, 4459, 4321, 5083, 5084, 5085, 5128, + 5129, 5130, 5131, 5132, 5133, 5134, 5135, 5136, + 5137, 5138, 5139, 5140, 5141, 5142, 5143, 5144, + 5145, 5146, 5147, 5148, 5149, 5150, 5151, 5152, + 5153, 5154, 5155, 5156, 5157, 5158, 5159, 5160, + 5161, 5162, 5163, 5164, 5165, 5166, 5167, 5168, + 5169, 5170, 5171, 5172, 5173, 5174, 5175, 5176, + 5177, 5178, 5179, 5180, 5181, 5182, 5183, 5184, + 5185, 5186, 5187, 5188, 5189, 5190, 5191, 5192, + 5193, 5194, 5195, 5196, 5197, 5198, 5199, 5200, + 5201, 5202, 5203, 5204, 5205, 5206, 5211, 4510, + 4511, 4512, 4513, 4514, 4515, 4516, 4517, 4518, + 4519, 4520, 4521, 4522, 4523, 4524, 4525, 4526, + 4527, 4528, 4529, 4530, 4531, 4532, 4533, 4534, + 4535, 4536, 4537, 4538, 4539, 4540, 4542, 4543, + 4544, 4545, 4546, 4547, 4548, 4549, 4550, 4551, + 4552, 4553, 4554, 4555, 4556, 4557, 4558, 4559, + 4560, 4561, 4562, 4564, 4565, 4566, 4567, 4568, + 4569, 4571, 4572, 4574, 4575, 4576, 4577, 4578, + 4579, 4580, 4581, 4582, 4583, 4584, 4585, 4586, + 4587, 4588, 4590, 4591, 4592, 4593, 4594, 4596, + 4602, 4621, 4626, 4628, 4635, 4597, 4598, 4599, + 4600, 4601, 4603, 4604, 4605, 4606, 4607, 4608, + 4609, 4610, 4611, 4612, 4613, 4614, 4615, 4616, + 4617, 4618, 4619, 4620, 4622, 4623, 4624, 4625, + 4627, 4629, 4630, 4631, 4632, 4633, 4634, 4636, + 4638, 4639, 4640, 4497, 4641, 4642, 5212, 5213, + 5214, 5313, 5314, 5315, 5316, 5317, 5318, 5319, + 5320, 5321, 5322, 5323, 5324, 5325, 5326, 5327, + 5328, 5329, 5330, 5331, 5332, 5333, 5334, 5335, + 5336, 5337, 5243, 5244, 5245, 5246, 5247, 5248, + 5249, 5288, 5289, 5290, 5291, 5292, 5293, 5294, + 5295, 5296, 5297, 5298, 5299, 5300, 5301, 5251, + 5252, 5253, 5254, 5255, 5256, 5257, 5258, 5259, + 5260, 5261, 5262, 5263, 5268, 5269, 5270, 5271, + 5272, 5273, 5274, 5275, 5276, 5277, 5278, 5279, + 5280, 5281, 5282, 5283, 5284, 5285, 5286, 5287, + 4672, 4673, 4674, 4675, 4677, 4678, 4679, 4680, + 4681, 4682, 4683, 4684, 4685, 4686, 4687, 4688, + 4689, 4690, 4691, 4692, 4693, 4694, 4696, 4697, + 4698, 4699, 4701, 4702, 4705, 4707, 4850, 5340, + 4862, 4722, 4723, 4724, 4725, 4726, 4727, 4728, + 4729, 4730, 4731, 4732, 4733, 4734, 4735, 4736, + 4737, 4738, 4739, 4740, 4741, 4742, 4743, 4744, + 4745, 4746, 4747, 4748, 4749, 4751, 4752, 4753, + 4754, 4755, 4756, 4757, 4758, 4759, 4760, 4761, + 4762, 4763, 4764, 4765, 4766, 4767, 4768, 4769, + 4770, 4771, 4773, 4774, 4775, 4776, 4777, 4778, + 4780, 4781, 4783, 4784, 4785, 4786, 4787, 4788, + 4789, 4790, 4791, 4792, 4793, 4794, 4795, 4796, + 4797, 4799, 4800, 4801, 4803, 4809, 4828, 4833, + 4835, 4842, 4844, 4804, 4805, 4806, 4807, 4808, + 4810, 4811, 4812, 4813, 4814, 4815, 4816, 4817, + 4818, 4819, 4820, 4821, 4822, 4823, 4824, 4825, + 4826, 4827, 4829, 4830, 4831, 4832, 4834, 4836, + 4837, 4838, 4839, 4840, 4841, 4843, 4846, 4847, + 4848, 4709, 4849, 4710, 4854, 4856, 4857, 4859, + 4861, 4863, 4862, 4862, 4864, 4865, 4874, 4875, + 4877, 4879, 4883, 4895, 4896, 5016, 5017, 5059, + 5060, 4911, 5061, 4913, 4914, 5062, 5063, 5064, + 5065, 5066, 5067, 5068, 5069, 5070, 5071, 5072, + 5075, 5077, 5207, 5208, 5209, 5210, 5250, 5264, + 5338, 5339, 5047, 4862, 0, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, + 42, 64, 71, 74, 90, 94, 136, 4862, + 4862, 4862, 2046, 2048, 2049, 2050, 2051, 2052, + 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2091, + 2113, 2120, 2123, 2139, 2145, 2187, 1752, 1754, + 1755, 1756, 1757, 1758, 1759, 1760, 1761, 1762, + 1763, 1764, 1765, 1797, 1819, 1826, 1829, 1845, + 1853, 1895, 4862, 1461, 870, 1462, 873, 1463, + 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, + 1472, 1503, 1523, 1530, 1533, 1545, 1551, 1588, + 1312, 1314, 1315, 1316, 1317, 1318, 1319, 1320, + 1321, 1322, 1323, 1324, 1325, 1357, 1379, 1386, + 1389, 1405, 1413, 1455, 562, 564, 565, 566, + 567, 1020, 1021, 1022, 1023, 1024, 1025, 1026, + 1027, 1059, 1081, 1088, 1241, 1257, 1264, 1306, + 869, 872, 874, 875, 876, 877, 878, 879, + 880, 881, 882, 883, 884, 916, 938, 945, + 948, 964, 972, 1014, 575, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, + 588, 620, 643, 650, 653, 670, 679, 727, + 1090, 1093, 1094, 1095, 1096, 1097, 1098, 1099, + 1100, 1101, 1102, 1103, 1132, 1154, 1161, 1168, + 1184, 1192, 1235, 1592, 1594, 1595, 1596, 1597, + 1598, 1599, 1600, 1601, 1602, 1603, 1604, 1605, + 1637, 1662, 1669, 1672, 1689, 1697, 1746, 2193, + 2195, 2196, 2197, 2198, 2199, 2200, 2201, 2202, + 2203, 2204, 2205, 2206, 2238, 2260, 2267, 2270, + 2286, 2292, 2334, 2489, 2491, 2492, 2493, 2494, + 2495, 2496, 2497, 2498, 2499, 2500, 2501, 2502, + 2534, 2556, 2563, 2566, 2582, 2588, 2630, 2340, + 2342, 2343, 2344, 2345, 2346, 2347, 2348, 2349, + 2350, 2351, 2352, 2353, 2385, 2407, 2414, 2417, + 2433, 2441, 2483, 4862, 2636, 2639, 2640, 2641, + 2642, 2643, 2644, 2645, 2646, 2647, 2648, 2649, + 2678, 2700, 2707, 2710, 2726, 2730, 2772, 4880, + 4881, 4884, 4888, 4889, 4890, 4891, 4892, 4893, + 4894, 4897, 4898, 4899, 4900, 4901, 4902, 4903, + 4904, 4905, 4906, 4907, 4882, 4879, 4883, 4895, + 4896, 4908, 4909, 4910, 4911, 4912, 4913, 4914, + 4915, 4916, 4917, 4918, 4919, 4920, 4921, 4922, + 4923, 4924, 4925, 4926, 4927, 4928, 4932, 4940, + 4941, 4942, 4943, 2777, 2779, 2780, 2781, 2782, + 2783, 2784, 2785, 2786, 2787, 2788, 2789, 2790, + 2822, 2844, 2851, 2854, 2870, 2876, 2918, 2924, + 2926, 2927, 2928, 2929, 2930, 2931, 2932, 2933, + 2934, 2935, 2936, 2937, 2969, 2991, 2998, 3001, + 3017, 3023, 3065, 3071, 3073, 3074, 3075, 3076, + 3077, 3078, 3079, 3080, 3081, 3082, 3083, 3084, + 3116, 3138, 3145, 3148, 3164, 3170, 3212, 3218, + 3219, 3220, 3221, 3222, 3223, 3224, 3225, 3226, + 3227, 3228, 3229, 3230, 3231, 3232, 3233, 3234, + 3235, 3236, 3237, 3238, 5018, 5019, 5029, 5030, + 5031, 5032, 5033, 5034, 5035, 5036, 5048, 5049, + 5050, 5051, 5052, 5053, 5054, 5055, 5056, 5057, + 5058, 5020, 5017, 5021, 5022, 5023, 5024, 5025, + 5026, 5027, 5028, 5037, 5038, 5039, 5040, 5041, + 5042, 5043, 5044, 5045, 5046, 5047, 3239, 3240, + 3241, 3242, 3243, 3244, 3245, 3246, 3247, 3248, + 3249, 3250, 3251, 3252, 3253, 3254, 3255, 3256, + 3257, 3258, 3259, 3260, 3261, 3262, 3263, 3264, + 3265, 3266, 3267, 3573, 3574, 3575, 3576, 3577, + 3578, 3579, 3580, 3581, 3582, 3583, 3584, 3585, + 3586, 3587, 4862, 3269, 3271, 3272, 3273, 3274, + 3275, 3276, 3277, 3278, 3279, 3280, 3281, 3282, + 3314, 3338, 3345, 3500, 3516, 3517, 3520, 3526, + 3568, 3351, 3354, 3355, 3356, 3357, 3358, 3359, + 3360, 3361, 3362, 3363, 3364, 3393, 3417, 3424, + 3430, 3446, 3447, 3450, 3455, 3497, 3588, 3589, + 3590, 3591, 3592, 3593, 3735, 3736, 4862, 3594, + 3597, 3598, 3599, 3600, 3601, 3602, 3603, 3604, + 3605, 3606, 3607, 3636, 3658, 3665, 3668, 3684, + 3688, 3730, 3737, 4175, 4317, 4318, 4460, 4461, + 4462, 4463, 4464, 4465, 4466, 4467, 4468, 4469, + 4470, 4471, 4472, 4473, 4474, 4475, 4476, 4477, + 4478, 4479, 3738, 3740, 3741, 3742, 3743, 3744, + 3745, 3746, 3747, 3748, 3749, 3750, 3751, 3783, + 3805, 3812, 3815, 3831, 3837, 3879, 3885, 3888, + 3889, 3890, 3891, 3892, 3893, 3894, 3895, 3896, + 3897, 3898, 3927, 3949, 3956, 3959, 3975, 3980, + 4022, 4862, 4027, 4030, 4031, 4032, 4033, 4034, + 4035, 4036, 4037, 4038, 4039, 4040, 4069, 4091, + 4098, 4105, 4121, 4127, 4170, 4862, 4176, 4179, + 4180, 4181, 4182, 4183, 4184, 4185, 4186, 4187, + 4188, 4189, 4218, 4240, 4247, 4250, 4266, 4270, + 4312, 4319, 4322, 4323, 4324, 4325, 4326, 4327, + 4328, 4329, 4330, 4331, 4332, 4361, 4383, 4390, + 4393, 4409, 4413, 4455, 5086, 5087, 5090, 5091, + 5092, 5093, 5094, 5095, 5096, 5097, 5106, 5107, + 5108, 5109, 5110, 5111, 5112, 5113, 5114, 5115, + 5116, 5088, 5089, 5098, 5099, 5100, 5101, 5102, + 5103, 5104, 5105, 5117, 5118, 5119, 5120, 5121, + 5122, 5123, 5124, 5125, 5126, 5127, 4480, 4481, + 4482, 4483, 4484, 4485, 4486, 4487, 4488, 4489, + 4490, 4491, 4492, 4493, 4494, 4495, 4643, 4644, + 4645, 4646, 4647, 4648, 4649, 4650, 4651, 4652, + 4653, 4654, 4655, 4656, 4657, 4658, 4659, 4660, + 4661, 4662, 4496, 4498, 4499, 4500, 4501, 4502, + 4503, 4504, 4505, 4506, 4507, 4508, 4509, 4541, + 4563, 4570, 4573, 4589, 4595, 4637, 5215, 5216, + 5219, 5220, 5221, 5222, 5223, 5224, 5225, 5226, + 5235, 5236, 5237, 5238, 5239, 5240, 5241, 5242, + 5250, 5264, 5265, 5266, 5267, 5217, 5218, 5227, + 5228, 5229, 5230, 5231, 5232, 5233, 5234, 5302, + 5303, 5304, 5305, 5306, 5307, 5308, 5309, 5310, + 5311, 5312, 4663, 4664, 4665, 4666, 4667, 4668, + 4669, 4670, 4671, 4676, 4695, 4700, 4703, 4704, + 4706, 4851, 4852, 4853, 4855, 4858, 4860, 4862, + 4708, 4711, 4712, 4713, 4714, 4715, 4716, 4717, + 4718, 4719, 4720, 4721, 4750, 4772, 4779, 4782, + 4798, 4802, 4845, } var _s_trans_actions []byte = []byte{ - 1, 2, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 5, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 6, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 6, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 6, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 8, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 6, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 6, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 6, 6, - 6, 10, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 11, 12, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 11, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 13, 14, 15, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 6, 11, - 16, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 17, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 18, 19, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 18, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 14, 14, 10, 10, - 14, 10, 14, 14, 14, 14, 14, 14, - 14, 10, 14, 14, 10, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 10, 14, - 14, 14, 14, 14, 14, 14, 10, 14, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 10, 14, 14, 14, 10, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 11, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 11, 11, - 11, 10, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 20, - 21, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 25, 26, 27, 28, 29, 30, 30, - 25, 28, 28, 25, 28, 25, 28, 25, - 28, 28, 28, 28, 28, 25, 25, 25, - 28, 25, 28, 28, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 31, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 32, - 33, 34, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 35, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 36, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 2, 10, 10, 2, - 10, 2, 2, 2, 10, 10, 10, 10, - 2, 2, 2, 10, 2, 10, 10, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 10, 9, 9, - 9, 9, 9, 9, 9, 10, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, - 9, 2, 10, 2, 2, 2, 2, 2, - 2, 2, 10, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 37, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 38, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 39, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 40, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 10, 2, 2, - 2, 2, 2, 2, 2, 10, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 2, 14, 10, 14, 14, 14, 14, 14, - 14, 14, 10, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 10, - 2, 10, 2, 2, 2, 10, 2, 10, - 10, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 41, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, + 1, 2, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 6, + 6, 10, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 11, 12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 13, 14, 15, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 11, + 16, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 17, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 18, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 18, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 14, 14, 10, 10, + 14, 10, 14, 14, 14, 14, 14, 14, + 14, 10, 14, 14, 10, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 10, 14, + 14, 14, 14, 14, 14, 14, 10, 14, + 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, + 14, 10, 14, 14, 14, 10, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 11, 11, + 11, 10, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 20, + 21, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 25, 26, 27, 28, 29, 30, 30, + 25, 28, 28, 25, 28, 25, 28, 25, + 28, 28, 28, 28, 28, 25, 25, 25, + 28, 25, 28, 28, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 32, + 33, 34, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 35, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 36, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 2, 10, 10, 2, + 10, 2, 2, 2, 10, 10, 10, 10, + 2, 2, 2, 10, 2, 10, 10, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 10, 9, 9, + 9, 9, 9, 9, 9, 10, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, + 9, 2, 10, 2, 2, 2, 2, 2, + 2, 2, 10, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 37, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 38, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 39, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 40, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 10, 2, 2, + 2, 2, 2, 2, 2, 10, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 14, 10, 14, 14, 14, 14, 14, + 14, 14, 10, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 10, + 2, 10, 2, 2, 2, 10, 2, 10, + 10, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 41, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, } var _s_to_state_actions []byte = []byte{ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 22, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, } var _s_from_state_actions []byte = []byte{ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 23, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 23, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, } var _s_eof_actions []byte = []byte{ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 24, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 24, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, } var _s_eof_trans []uint16 = []uint16{ - 1, 3, 3, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 1, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 1, 3, 3, 3, 3, 3, 3, 1, - 3, 3, 1, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 1, 3, 3, 3, 1, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 1, 3, 3, 3, 3, 126, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 3, 3, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 3, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 3, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 3, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 3, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 3, 421, 421, 421, - 421, 421, 421, 3, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 3, 421, 3, 421, 421, - 3, 421, 421, 421, 421, 421, 421, 421, - 421, 3, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 3, 421, - 421, 3, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 3, - 421, 3, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 3, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 3, 3, 3, 3, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 3, 3, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 3, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 3, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 421, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 421, 3, 3, 3, 3, - 3, 3, 421, 3, 3, 421, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 421, 3, 3, 3, 3, 3, 421, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 421, 3, 3, 3, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 3, 3, 126, 126, 126, 126, 126, - 126, 126, 126, 3, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 3, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 3, 126, - 126, 126, 126, 126, 126, 3, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 3, 126, 3, 126, - 3, 126, 126, 3, 126, 126, 126, 126, - 126, 126, 126, 126, 3, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, - 126, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 3, 421, 3, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 2395, 3, 3, 2395, - 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, - 2395, 2395, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 2395, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 2395, 3, 3, 3, - 3, 3, 3, 2395, 3, 3, 2395, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 2395, 3, - 3, 3, 2395, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 2395, 3, 3, 3, - 3, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 3, 2986, 3, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 2986, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 2986, 3, 3, 3, 3, 3, - 3, 2986, 3, 3, 3, 3, 3, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 3, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 2986, 2986, 3, 3, - 2986, 3, 3, 3, 3, 3, 2986, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 2986, 3, 3, 3, 3, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 3252, 3, 3, 3252, 3252, 3252, - 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3252, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3252, 3, 3, 3, 3, 3, - 3, 3252, 3, 3, 3252, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3252, 3, 3, 3, - 3252, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3252, 3, 3, 3, 3, 1, - 1, 1, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 421, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 3628, 3, 3628, 3628, 3628, - 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, - 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, - 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, - 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, - 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, - 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, - 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, - 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, - 3628, 3628, 3628, 3628, 3628, 3, 3, 3, - 3, 3628, 3628, 3628, 3628, 3628, 3628, 3628, - 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, - 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, - 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, - 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, - 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, - 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, - 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, - 3628, 3628, 3628, 3628, 3628, 3628, 3628, 1, - 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, - 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, - 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, - 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, - 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, - 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, - 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, - 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, - 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, - 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, - 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, - 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, - 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, - 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, - 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, - 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, - 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, - 3759, 3759, 3759, 3759, 3759, 1, 1, 3252, - 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, - 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, - 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, - 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, - 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, - 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, - 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, - 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, - 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, - 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, - 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, - 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, - 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, - 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, - 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, - 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, - 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, - 3252, 3252, 3252, 3252, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, - 2986, 2986, 2986, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 3, 4329, 4329, 4329, 4329, - 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, - 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, - 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, - 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, - 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, - 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, - 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, - 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, - 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, - 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, - 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, - 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, - 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, - 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, - 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, - 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, - 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, - 4329, 4329, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 4500, - 4520, 4522, 4522, 4563, 4563, 4563, 4563, 4563, - 4563, 4522, 4563, 4563, 4563, 4500, 4764, 4500, - 4563, 4563, 4500, 4500, 4563, 4500, 4563, 4563, - 4563, 4563, 4563, 4563, 4563, 4563, 4563, 4500, - 4500, 4563, 4563, 4563, 4563, 4563, 4563, 4563, - 4563, 4563, 4563, 4563, 4500, 4500, 4500, 4500, - 4500, 4500, 4500, 4500, 4500, 4500, 4500, 4500, - 4500, 4500, 4500, 4500, 4500, 4500, 4500, 4500, - 4500, 4563, 4563, 4563, 4500, 4563, 4563, 4563, - 4563, 4563, 4563, 4563, 4500, 4500, 4500, 4500, - 4563, 4563, 4563, 4563, 4563, 4563, 4563, 4563, - 4563, 4563, 4563, 4563, 4563, 4563, 4563, 4563, - 4563, 4563, 4563, 4563, 4563, 4563, 4563, 4563, - 4563, 4563, 4563, 4563, 4563, 4563, 4563, 4563, - 4563, 4563, 4563, 4563, 4563, 4563, 4563, 4563, - 4563, 4563, 4563, 4563, 4563, 4563, 4563, 4563, - 4563, 4563, 4563, 4563, 4563, 4563, 4563, 4563, - 4563, 4563, 4563, 4563, 4563, 4563, 4563, 4563, - 4563, 4563, 4563, 4563, 4563, 4563, 4563, 4563, - 4500, 4500, 4764, 4764, 4500, 4500, 4500, 4500, - 4500, 4500, 4500, 4500, 4500, 4764, 4764, 4764, - 4764, 4764, 4764, 4764, 4764, 4500, 4500, 4500, - 4500, 4500, 4500, 4500, 4500, 4500, 4500, 4500, - 4764, 4764, 4764, 4764, 4764, 4764, 4764, 4764, - 4764, 4764, 4764, 4500, 4500, 4500, 4500, 4500, - 4500, 4500, 4500, 4500, 4500, 4500, 4500, 4500, - 4500, 5003, 5003, 4500, 5055, 4500, 4563, 5003, - 5138, 5158, 5055, 5055, 5055, 5055, 4500, 4500, - 5055, 5055, 4500, 4500, 4500, 4500, 4500, 4500, - 4500, 4500, 5055, 5055, 5055, 5055, 5055, 5055, - 5055, 5055, 4500, 4500, 4500, 4500, 4500, 4500, - 4500, 4500, 4500, 4500, 4500, 5055, 5055, 5055, - 5055, 5055, 5055, 5055, 5055, 5055, 5055, 5055, - 5055, 5055, 5055, 5055, 5055, 5055, 5055, 5055, - 5055, 5055, 5055, 5055, 5055, 5055, 5055, 5055, - 5055, 5055, 5055, 5055, 5055, 5055, 5055, 5055, - 5055, 5055, 5055, 5055, 5055, 5055, 5055, 5055, - 5055, 5055, 5055, 5055, 5055, 5055, 5055, 5055, - 5055, 5055, 5055, 5055, 5055, 5055, 5055, 5055, - 5055, 5055, 5055, 5055, 5055, 5055, 5055, 5055, - 5055, 5055, 5055, 5055, 5055, 5055, 5055, 5055, - 5055, 5055, 5055, 5055, 5055, 5055, 5055, 5055, - 5055, 5055, 5055, 5055, 5055, 5055, 5055, 4500, - 4500, 4500, 4500, 5003, 5003, 5003, 5003, 4500, - 4500, 5003, 5003, 4500, 4500, 4500, 4500, 4500, - 4500, 4500, 4500, 5003, 5003, 5003, 5003, 5003, - 5003, 5003, 5003, 4500, 4500, 4500, 4500, 4500, - 4500, 4500, 4500, 5003, 5003, 5003, 5003, 5003, - 5003, 5003, 4500, 5003, 5003, 5003, 5003, 5003, - 5003, 5003, 5003, 5003, 5003, 5003, 5003, 5003, - 4500, 4500, 4500, 4500, 5003, 5003, 5003, 5003, - 5003, 5003, 5003, 5003, 5003, 5003, 5003, 5003, - 5003, 5003, 5003, 5003, 5003, 5003, 5003, 5003, - 5003, 5003, 5003, 5003, 5003, 5003, 5003, 5003, - 5003, 5003, 5003, 5003, 5003, 5003, 5003, 5003, - 5003, 5003, 5003, 5003, 5003, 5003, 5003, 5003, - 5003, 5003, 5003, 5003, 5003, 5003, 5003, 5003, - 5003, 5003, 5003, 5003, 5003, 5003, 5003, 5003, - 5003, 5003, 5003, 5003, 5003, 5003, 5003, 5003, - 5003, 5003, 4500, 4500, 5360, + 1, 3, 3, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 1, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 1, 3, 3, 3, 3, 3, 3, 1, + 3, 3, 1, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 1, 3, 3, 3, 1, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 1, 3, 3, 3, 3, 126, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 3, 3, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 3, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 3, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 3, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 3, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 3, 421, 421, 421, + 421, 421, 421, 3, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 3, 421, 3, 421, 421, + 3, 421, 421, 421, 421, 421, 421, 421, + 421, 3, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 3, 421, + 421, 3, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 3, + 421, 3, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 3, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 3, 3, 3, 3, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 3, 3, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 3, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 3, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 421, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 421, 3, 3, 3, 3, + 3, 3, 421, 3, 3, 421, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 421, 3, 3, 3, 3, 3, 421, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 421, 3, 3, 3, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 3, 3, 126, 126, 126, 126, 126, + 126, 126, 126, 3, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 3, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 3, 126, + 126, 126, 126, 126, 126, 3, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 3, 126, 3, 126, + 3, 126, 126, 3, 126, 126, 126, 126, + 126, 126, 126, 126, 3, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, + 126, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 3, 421, 3, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 2395, 3, 3, 2395, + 2395, 2395, 2395, 2395, 2395, 2395, 2395, 2395, + 2395, 2395, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 2395, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 2395, 3, 3, 3, + 3, 3, 3, 2395, 3, 3, 2395, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 2395, 3, + 3, 3, 2395, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 2395, 3, 3, 3, + 3, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 3, 2986, 3, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 2986, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 2986, 3, 3, 3, 3, 3, + 3, 2986, 3, 3, 3, 3, 3, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 3, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 2986, 2986, 3, 3, + 2986, 3, 3, 3, 3, 3, 2986, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 2986, 3, 3, 3, 3, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 3252, 3, 3, 3252, 3252, 3252, + 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3252, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3252, 3, 3, 3, 3, 3, + 3, 3252, 3, 3, 3252, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3252, 3, 3, 3, + 3252, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3252, 3, 3, 3, 3, 1, + 1, 1, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 421, 421, 421, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 3628, 3, 3628, 3628, 3628, + 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, + 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, + 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, + 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, + 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, + 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, + 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, + 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, + 3628, 3628, 3628, 3628, 3628, 3, 3, 3, + 3, 3628, 3628, 3628, 3628, 3628, 3628, 3628, + 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, + 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, + 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, + 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, + 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, + 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, + 3628, 3628, 3628, 3628, 3628, 3628, 3628, 3628, + 3628, 3628, 3628, 3628, 3628, 3628, 3628, 1, + 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, + 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, + 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, + 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, + 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, + 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, + 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, + 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, + 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, + 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, + 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, + 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, + 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, + 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, + 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, + 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, + 3759, 3759, 3759, 3759, 3759, 3759, 3759, 3759, + 3759, 3759, 3759, 3759, 3759, 1, 1, 3252, + 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, + 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, + 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, + 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, + 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, + 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, + 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, + 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, + 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, + 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, + 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, + 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, + 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, + 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, + 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, + 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, + 3252, 3252, 3252, 3252, 3252, 3252, 3252, 3252, + 3252, 3252, 3252, 3252, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 2986, 2986, 2986, 2986, 2986, + 2986, 2986, 2986, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 3, 4329, 4329, 4329, 4329, + 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, + 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, + 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, + 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, + 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, + 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, + 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, + 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, + 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, + 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, + 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, + 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, + 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, + 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, + 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, + 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, + 4329, 4329, 4329, 4329, 4329, 4329, 4329, 4329, + 4329, 4329, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 4500, + 4520, 4522, 4522, 4563, 4563, 4563, 4563, 4563, + 4563, 4522, 4563, 4563, 4563, 4500, 4764, 4500, + 4563, 4563, 4500, 4500, 4563, 4500, 4563, 4563, + 4563, 4563, 4563, 4563, 4563, 4563, 4563, 4500, + 4500, 4563, 4563, 4563, 4563, 4563, 4563, 4563, + 4563, 4563, 4563, 4563, 4500, 4500, 4500, 4500, + 4500, 4500, 4500, 4500, 4500, 4500, 4500, 4500, + 4500, 4500, 4500, 4500, 4500, 4500, 4500, 4500, + 4500, 4563, 4563, 4563, 4500, 4563, 4563, 4563, + 4563, 4563, 4563, 4563, 4500, 4500, 4500, 4500, + 4563, 4563, 4563, 4563, 4563, 4563, 4563, 4563, + 4563, 4563, 4563, 4563, 4563, 4563, 4563, 4563, + 4563, 4563, 4563, 4563, 4563, 4563, 4563, 4563, + 4563, 4563, 4563, 4563, 4563, 4563, 4563, 4563, + 4563, 4563, 4563, 4563, 4563, 4563, 4563, 4563, + 4563, 4563, 4563, 4563, 4563, 4563, 4563, 4563, + 4563, 4563, 4563, 4563, 4563, 4563, 4563, 4563, + 4563, 4563, 4563, 4563, 4563, 4563, 4563, 4563, + 4563, 4563, 4563, 4563, 4563, 4563, 4563, 4563, + 4500, 4500, 4764, 4764, 4500, 4500, 4500, 4500, + 4500, 4500, 4500, 4500, 4500, 4764, 4764, 4764, + 4764, 4764, 4764, 4764, 4764, 4500, 4500, 4500, + 4500, 4500, 4500, 4500, 4500, 4500, 4500, 4500, + 4764, 4764, 4764, 4764, 4764, 4764, 4764, 4764, + 4764, 4764, 4764, 4500, 4500, 4500, 4500, 4500, + 4500, 4500, 4500, 4500, 4500, 4500, 4500, 4500, + 4500, 5003, 5003, 4500, 5055, 4500, 4563, 5003, + 5138, 5158, 5055, 5055, 5055, 5055, 4500, 4500, + 5055, 5055, 4500, 4500, 4500, 4500, 4500, 4500, + 4500, 4500, 5055, 5055, 5055, 5055, 5055, 5055, + 5055, 5055, 4500, 4500, 4500, 4500, 4500, 4500, + 4500, 4500, 4500, 4500, 4500, 5055, 5055, 5055, + 5055, 5055, 5055, 5055, 5055, 5055, 5055, 5055, + 5055, 5055, 5055, 5055, 5055, 5055, 5055, 5055, + 5055, 5055, 5055, 5055, 5055, 5055, 5055, 5055, + 5055, 5055, 5055, 5055, 5055, 5055, 5055, 5055, + 5055, 5055, 5055, 5055, 5055, 5055, 5055, 5055, + 5055, 5055, 5055, 5055, 5055, 5055, 5055, 5055, + 5055, 5055, 5055, 5055, 5055, 5055, 5055, 5055, + 5055, 5055, 5055, 5055, 5055, 5055, 5055, 5055, + 5055, 5055, 5055, 5055, 5055, 5055, 5055, 5055, + 5055, 5055, 5055, 5055, 5055, 5055, 5055, 5055, + 5055, 5055, 5055, 5055, 5055, 5055, 5055, 4500, + 4500, 4500, 4500, 5003, 5003, 5003, 5003, 4500, + 4500, 5003, 5003, 4500, 4500, 4500, 4500, 4500, + 4500, 4500, 4500, 5003, 5003, 5003, 5003, 5003, + 5003, 5003, 5003, 4500, 4500, 4500, 4500, 4500, + 4500, 4500, 4500, 5003, 5003, 5003, 5003, 5003, + 5003, 5003, 4500, 5003, 5003, 5003, 5003, 5003, + 5003, 5003, 5003, 5003, 5003, 5003, 5003, 5003, + 4500, 4500, 4500, 4500, 5003, 5003, 5003, 5003, + 5003, 5003, 5003, 5003, 5003, 5003, 5003, 5003, + 5003, 5003, 5003, 5003, 5003, 5003, 5003, 5003, + 5003, 5003, 5003, 5003, 5003, 5003, 5003, 5003, + 5003, 5003, 5003, 5003, 5003, 5003, 5003, 5003, + 5003, 5003, 5003, 5003, 5003, 5003, 5003, 5003, + 5003, 5003, 5003, 5003, 5003, 5003, 5003, 5003, + 5003, 5003, 5003, 5003, 5003, 5003, 5003, 5003, + 5003, 5003, 5003, 5003, 5003, 5003, 5003, 5003, + 5003, 5003, 4500, 4500, 5360, } const s_start int = 4862 @@ -18539,1004 +18538,977 @@ const s_error int = -1 const s_en_main int = 4862 - //line segment_words.rl:35 - - func segmentWords(data []byte, maxTokens int, atEOF bool, val [][]byte, types []int) ([][]byte, []int, int, error) { - cs, p, pe := 0, 0, len(data) - cap := maxTokens - if cap < 0 { - cap = 1000 - } - if val == nil { - val = make([][]byte, 0, cap) - } - if types == nil { - types = make([]int, 0, cap) - } + cs, p, pe := 0, 0, len(data) + cap := maxTokens + if cap < 0 { + cap = 1000 + } + if val == nil { + val = make([][]byte, 0, cap) + } + if types == nil { + types = make([]int, 0, cap) + } - // added for scanner - ts := 0 - te := 0 - act := 0 - eof := pe - _ = ts // compiler not happy - _ = te - _ = act + // added for scanner + ts := 0 + te := 0 + act := 0 + eof := pe + _ = ts // compiler not happy + _ = te + _ = act + + // our state + startPos := 0 + endPos := 0 + totalConsumed := 0 - // our state - startPos := 0 - endPos := 0 - totalConsumed := 0 - //line segment_words.go:18574 { - cs = s_start - ts = 0 - te = 0 - act = 0 + cs = s_start + ts = 0 + te = 0 + act = 0 } //line segment_words.go:18582 { - var _klen int - var _keys int - var _trans int + var _klen int + var _keys int + var _trans int - if p == pe { - goto _test_eof - } -_resume: - switch _s_from_state_actions[cs] { - case 23: + if p == pe { + goto _test_eof + } + _resume: + switch _s_from_state_actions[cs] { + case 23: //line NONE:1 -ts = p - + ts = p //line segment_words.go:18598 - } - - _keys = int(_s_key_offsets[cs]) - _trans = int(_s_index_offsets[cs]) - - _klen = int(_s_single_lengths[cs]) - if _klen > 0 { - _lower := int(_keys) - var _mid int - _upper := int(_keys + _klen - 1) - for { - if _upper < _lower { - break - } - - _mid = _lower + ((_upper - _lower) >> 1) - switch { - case data[p] < _s_trans_keys[_mid]: - _upper = _mid - 1 - case data[p] > _s_trans_keys[_mid]: - _lower = _mid + 1 - default: - _trans += int(_mid - int(_keys)) - goto _match - } } - _keys += _klen - _trans += _klen - } - _klen = int(_s_range_lengths[cs]) - if _klen > 0 { - _lower := int(_keys) - var _mid int - _upper := int(_keys + (_klen << 1) - 2) - for { - if _upper < _lower { - break - } + _keys = int(_s_key_offsets[cs]) + _trans = int(_s_index_offsets[cs]) - _mid = _lower + (((_upper - _lower) >> 1) & ^1) - switch { - case data[p] < _s_trans_keys[_mid]: - _upper = _mid - 2 - case data[p] > _s_trans_keys[_mid + 1]: - _lower = _mid + 2 - default: - _trans += int((_mid - int(_keys)) >> 1) - goto _match + _klen = int(_s_single_lengths[cs]) + if _klen > 0 { + _lower := int(_keys) + var _mid int + _upper := int(_keys + _klen - 1) + for { + if _upper < _lower { + break + } + + _mid = _lower + ((_upper - _lower) >> 1) + switch { + case data[p] < _s_trans_keys[_mid]: + _upper = _mid - 1 + case data[p] > _s_trans_keys[_mid]: + _lower = _mid + 1 + default: + _trans += int(_mid - int(_keys)) + goto _match + } } + _keys += _klen + _trans += _klen } - _trans += _klen - } -_match: - _trans = int(_s_indicies[_trans]) -_eof_trans: - cs = int(_s_trans_targs[_trans]) + _klen = int(_s_range_lengths[cs]) + if _klen > 0 { + _lower := int(_keys) + var _mid int + _upper := int(_keys + (_klen << 1) - 2) + for { + if _upper < _lower { + break + } - if _s_trans_actions[_trans] == 0 { - goto _again - } + _mid = _lower + (((_upper - _lower) >> 1) & ^1) + switch { + case data[p] < _s_trans_keys[_mid]: + _upper = _mid - 2 + case data[p] > _s_trans_keys[_mid+1]: + _lower = _mid + 2 + default: + _trans += int((_mid - int(_keys)) >> 1) + goto _match + } + } + _trans += _klen + } - switch _s_trans_actions[_trans] { - case 10: + _match: + _trans = int(_s_indicies[_trans]) + _eof_trans: + cs = int(_s_trans_targs[_trans]) + + if _s_trans_actions[_trans] == 0 { + goto _again + } + + switch _s_trans_actions[_trans] { + case 10: //line segment_words.rl:72 + endPos = p - endPos = p - - - case 34: + case 34: //line segment_words.rl:76 -te = p -p-- -{ - if !atEOF { - return val, types, totalConsumed, nil - } + te = p + p-- + { + if !atEOF { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Number) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } + val = append(val, data[startPos:endPos+1]) + types = append(types, Number) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } - case 37: + case 37: //line segment_words.rl:89 -te = p -p-- -{ - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } + te = p + p-- + { + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Letter) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } + val = append(val, data[startPos:endPos+1]) + types = append(types, Letter) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } - case 39: + case 39: //line segment_words.rl:104 -te = p -p-- -{ - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } + te = p + p-- + { + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Ideo) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } + val = append(val, data[startPos:endPos+1]) + types = append(types, Ideo) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } - case 35: + case 35: //line segment_words.rl:119 -te = p -p-- -{ - if !atEOF { - return val, types, totalConsumed, nil - } - val = append(val, data[startPos:endPos+1]) - types = append(types, Letter) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } + te = p + p-- + { + if !atEOF { + return val, types, totalConsumed, nil + } + val = append(val, data[startPos:endPos+1]) + types = append(types, Letter) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } - case 38: + case 38: //line segment_words.rl:131 -te = p -p-- -{ - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } + te = p + p-- + { + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Ideo) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } + val = append(val, data[startPos:endPos+1]) + types = append(types, Ideo) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } - case 40: + case 40: //line segment_words.rl:146 -te = p -p-- -{ - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } + te = p + p-- + { + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Ideo) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } + val = append(val, data[startPos:endPos+1]) + types = append(types, Ideo) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } - case 41: + case 41: //line segment_words.rl:161 -te = p -p-- -{ - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + te = p + p-- + { + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } - case 32: + case 32: //line segment_words.rl:161 -te = p -p-- -{ - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + te = p + p-- + { + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } - case 36: + case 36: //line segment_words.rl:161 -te = p -p-- -{ - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + te = p + p-- + { + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } - case 31: + case 31: //line segment_words.rl:161 -te = p -p-- -{ - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + te = p + p-- + { + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } - case 4: + case 4: //line segment_words.rl:76 -p = (te) - 1 -{ - if !atEOF { - return val, types, totalConsumed, nil - } + p = (te) - 1 + { + if !atEOF { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Number) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } + val = append(val, data[startPos:endPos+1]) + types = append(types, Number) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } - case 12: + case 12: //line segment_words.rl:89 -p = (te) - 1 -{ - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } + p = (te) - 1 + { + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Letter) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } + val = append(val, data[startPos:endPos+1]) + types = append(types, Letter) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } - case 17: + case 17: //line segment_words.rl:104 -p = (te) - 1 -{ - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } + p = (te) - 1 + { + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Ideo) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } + val = append(val, data[startPos:endPos+1]) + types = append(types, Ideo) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } - case 7: + case 7: //line segment_words.rl:119 -p = (te) - 1 -{ - if !atEOF { - return val, types, totalConsumed, nil - } - val = append(val, data[startPos:endPos+1]) - types = append(types, Letter) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } + p = (te) - 1 + { + if !atEOF { + return val, types, totalConsumed, nil + } + val = append(val, data[startPos:endPos+1]) + types = append(types, Letter) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } - case 15: + case 15: //line segment_words.rl:131 -p = (te) - 1 -{ - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } + p = (te) - 1 + { + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Ideo) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } + val = append(val, data[startPos:endPos+1]) + types = append(types, Ideo) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } - case 19: + case 19: //line segment_words.rl:146 -p = (te) - 1 -{ - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } + p = (te) - 1 + { + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Ideo) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } + val = append(val, data[startPos:endPos+1]) + types = append(types, Ideo) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } - case 21: + case 21: //line segment_words.rl:161 -p = (te) - 1 -{ - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + p = (te) - 1 + { + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } - case 8: + case 8: //line segment_words.rl:161 -p = (te) - 1 -{ - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + p = (te) - 1 + { + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } - case 1: + case 1: //line segment_words.rl:161 -p = (te) - 1 -{ - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + p = (te) - 1 + { + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } - case 3: + case 3: //line NONE:1 - switch act { - case 1: - {p = (te) - 1 + switch act { + case 1: + { + p = (te) - 1 - if !atEOF { - return val, types, totalConsumed, nil - } + if !atEOF { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Number) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - case 2: - {p = (te) - 1 + val = append(val, data[startPos:endPos+1]) + types = append(types, Number) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + case 2: + { + p = (te) - 1 - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Letter) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - case 3: - {p = (te) - 1 + val = append(val, data[startPos:endPos+1]) + types = append(types, Letter) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + case 3: + { + p = (te) - 1 - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Ideo) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - case 4: - {p = (te) - 1 + val = append(val, data[startPos:endPos+1]) + types = append(types, Ideo) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + case 4: + { + p = (te) - 1 - if !atEOF { - return val, types, totalConsumed, nil - } - val = append(val, data[startPos:endPos+1]) - types = append(types, Letter) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - case 5: - {p = (te) - 1 + if !atEOF { + return val, types, totalConsumed, nil + } + val = append(val, data[startPos:endPos+1]) + types = append(types, Letter) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + case 5: + { + p = (te) - 1 - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Ideo) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - case 7: - {p = (te) - 1 + val = append(val, data[startPos:endPos+1]) + types = append(types, Ideo) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + case 7: + { + p = (te) - 1 - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - case 12: - {p = (te) - 1 + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + case 12: + { + p = (te) - 1 - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - case 13: - {p = (te) - 1 + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + case 13: + { + p = (te) - 1 - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - } - + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + } - case 28: + case 28: //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - - - case 33: + case 33: //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -te = p+1 -{ - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + te = p + 1 + { + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } - case 13: + case 13: //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -te = p+1 -{ - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + te = p + 1 + { + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } - case 18: + case 18: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - - - case 26: + case 26: //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -te = p+1 -{ - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + te = p + 1 + { + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } - case 27: + case 27: //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -te = p+1 -{ - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + te = p + 1 + { + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } - case 5: + case 5: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:76 -act = 1; + act = 1 - case 11: + case 11: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; + act = 2 - case 16: + case 16: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:104 -act = 3; + act = 3 - case 6: + case 6: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; + act = 4 - case 14: + case 14: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; + act = 5 - case 20: + case 20: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 7; + act = 7 - case 9: + case 9: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 12; + act = 12 - case 2: + case 2: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; + act = 13 - case 29: + case 29: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:76 -act = 1; + act = 1 - case 30: + case 30: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; + act = 4 - case 25: + case 25: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; + act = 13 //line segment_words.go:19500 - } + } -_again: - switch _s_to_state_actions[cs] { - case 22: + _again: + switch _s_to_state_actions[cs] { + case 22: //line NONE:1 -ts = 0 - + ts = 0 //line segment_words.go:19510 - } - - if p++; p != pe { - goto _resume - } - _test_eof: {} - if p == eof { - if _s_eof_trans[cs] > 0 { - _trans = int(_s_eof_trans[cs] - 1) - goto _eof_trans } - switch _s_eof_actions[cs] { - case 24: -//line segment_words.rl:68 - startPos = p - + if p++; p != pe { + goto _resume + } + _test_eof: + { + } + if p == eof { + if _s_eof_trans[cs] > 0 { + _trans = int(_s_eof_trans[cs] - 1) + goto _eof_trans + } + switch _s_eof_actions[cs] { + case 24: +//line segment_words.rl:68 + startPos = p //line segment_words.go:19529 + } } - } } //line segment_words.rl:278 + if cs < s_first_final { + return val, types, totalConsumed, ParseError + } - - if cs < s_first_final { - return val, types, totalConsumed, ParseError - } - - return val, types, totalConsumed, nil + return val, types, totalConsumed, nil } diff --git a/vendor/github.com/blevesearch/segment/segment_words_prod.go b/vendor/github.com/blevesearch/segment/segment_words_prod.go index 93b3b6e..0402748 100644 --- a/vendor/github.com/blevesearch/segment/segment_words_prod.go +++ b/vendor/github.com/blevesearch/segment/segment_words_prod.go @@ -1,5 +1,5 @@ - //line segment_words.rl:1 + // Copyright (c) 2015 Couchbase, Inc. // Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file // except in compliance with the License. You may obtain a copy of the License at @@ -14,8 +14,8 @@ package segment import ( - "fmt" - "unicode/utf8" + "fmt" + "unicode/utf8" ) var RagelFlags = "-G2" @@ -24,14 +24,13 @@ var ParseError = fmt.Errorf("unicode word segmentation parse error") // Word Types const ( - None = iota - Number - Letter - Kana - Ideo + None = iota + Number + Letter + Kana + Ideo ) - //line segment_words_prod.go:36 const s_start int = 4862 const s_first_final int = 4862 @@ -39,11424 +38,11423 @@ const s_error int = -1 const s_en_main int = 4862 - //line segment_words.rl:35 - - func segmentWords(data []byte, maxTokens int, atEOF bool, val [][]byte, types []int) ([][]byte, []int, int, error) { - cs, p, pe := 0, 0, len(data) - cap := maxTokens - if cap < 0 { - cap = 1000 - } - if val == nil { - val = make([][]byte, 0, cap) - } - if types == nil { - types = make([]int, 0, cap) - } + cs, p, pe := 0, 0, len(data) + cap := maxTokens + if cap < 0 { + cap = 1000 + } + if val == nil { + val = make([][]byte, 0, cap) + } + if types == nil { + types = make([]int, 0, cap) + } - // added for scanner - ts := 0 - te := 0 - act := 0 - eof := pe - _ = ts // compiler not happy - _ = te - _ = act + // added for scanner + ts := 0 + te := 0 + act := 0 + eof := pe + _ = ts // compiler not happy + _ = te + _ = act + + // our state + startPos := 0 + endPos := 0 + totalConsumed := 0 - // our state - startPos := 0 - endPos := 0 - totalConsumed := 0 - //line segment_words_prod.go:74 { - cs = s_start - ts = 0 - te = 0 - act = 0 + cs = s_start + ts = 0 + te = 0 + act = 0 } //line segment_words_prod.go:82 { - if p == pe { - goto _test_eof - } - switch cs { - case 4862: - goto st_case_4862 - case 4863: - goto st_case_4863 - case 0: - goto st_case_0 - case 1: - goto st_case_1 - case 2: - goto st_case_2 - case 3: - goto st_case_3 - case 4: - goto st_case_4 - case 5: - goto st_case_5 - case 6: - goto st_case_6 - case 7: - goto st_case_7 - case 8: - goto st_case_8 - case 9: - goto st_case_9 - case 10: - goto st_case_10 - case 11: - goto st_case_11 - case 12: - goto st_case_12 - case 13: - goto st_case_13 - case 14: - goto st_case_14 - case 15: - goto st_case_15 - case 16: - goto st_case_16 - case 17: - goto st_case_17 - case 18: - goto st_case_18 - case 19: - goto st_case_19 - case 20: - goto st_case_20 - case 21: - goto st_case_21 - case 22: - goto st_case_22 - case 23: - goto st_case_23 - case 24: - goto st_case_24 - case 25: - goto st_case_25 - case 26: - goto st_case_26 - case 27: - goto st_case_27 - case 28: - goto st_case_28 - case 29: - goto st_case_29 - case 30: - goto st_case_30 - case 31: - goto st_case_31 - case 32: - goto st_case_32 - case 33: - goto st_case_33 - case 34: - goto st_case_34 - case 35: - goto st_case_35 - case 36: - goto st_case_36 - case 37: - goto st_case_37 - case 38: - goto st_case_38 - case 39: - goto st_case_39 - case 40: - goto st_case_40 - case 41: - goto st_case_41 - case 42: - goto st_case_42 - case 43: - goto st_case_43 - case 44: - goto st_case_44 - case 45: - goto st_case_45 - case 46: - goto st_case_46 - case 47: - goto st_case_47 - case 48: - goto st_case_48 - case 49: - goto st_case_49 - case 50: - goto st_case_50 - case 51: - goto st_case_51 - case 52: - goto st_case_52 - case 53: - goto st_case_53 - case 54: - goto st_case_54 - case 55: - goto st_case_55 - case 56: - goto st_case_56 - case 57: - goto st_case_57 - case 58: - goto st_case_58 - case 59: - goto st_case_59 - case 60: - goto st_case_60 - case 61: - goto st_case_61 - case 62: - goto st_case_62 - case 63: - goto st_case_63 - case 64: - goto st_case_64 - case 65: - goto st_case_65 - case 66: - goto st_case_66 - case 67: - goto st_case_67 - case 68: - goto st_case_68 - case 69: - goto st_case_69 - case 70: - goto st_case_70 - case 71: - goto st_case_71 - case 72: - goto st_case_72 - case 73: - goto st_case_73 - case 74: - goto st_case_74 - case 75: - goto st_case_75 - case 76: - goto st_case_76 - case 77: - goto st_case_77 - case 78: - goto st_case_78 - case 79: - goto st_case_79 - case 80: - goto st_case_80 - case 81: - goto st_case_81 - case 82: - goto st_case_82 - case 83: - goto st_case_83 - case 84: - goto st_case_84 - case 85: - goto st_case_85 - case 86: - goto st_case_86 - case 87: - goto st_case_87 - case 88: - goto st_case_88 - case 89: - goto st_case_89 - case 90: - goto st_case_90 - case 91: - goto st_case_91 - case 92: - goto st_case_92 - case 93: - goto st_case_93 - case 94: - goto st_case_94 - case 95: - goto st_case_95 - case 96: - goto st_case_96 - case 97: - goto st_case_97 - case 98: - goto st_case_98 - case 99: - goto st_case_99 - case 100: - goto st_case_100 - case 101: - goto st_case_101 - case 102: - goto st_case_102 - case 103: - goto st_case_103 - case 104: - goto st_case_104 - case 105: - goto st_case_105 - case 106: - goto st_case_106 - case 107: - goto st_case_107 - case 108: - goto st_case_108 - case 109: - goto st_case_109 - case 110: - goto st_case_110 - case 111: - goto st_case_111 - case 112: - goto st_case_112 - case 113: - goto st_case_113 - case 114: - goto st_case_114 - case 115: - goto st_case_115 - case 116: - goto st_case_116 - case 117: - goto st_case_117 - case 118: - goto st_case_118 - case 119: - goto st_case_119 - case 120: - goto st_case_120 - case 121: - goto st_case_121 - case 122: - goto st_case_122 - case 123: - goto st_case_123 - case 124: - goto st_case_124 - case 125: - goto st_case_125 - case 126: - goto st_case_126 - case 127: - goto st_case_127 - case 128: - goto st_case_128 - case 129: - goto st_case_129 - case 130: - goto st_case_130 - case 131: - goto st_case_131 - case 132: - goto st_case_132 - case 133: - goto st_case_133 - case 134: - goto st_case_134 - case 135: - goto st_case_135 - case 136: - goto st_case_136 - case 137: - goto st_case_137 - case 138: - goto st_case_138 - case 139: - goto st_case_139 - case 140: - goto st_case_140 - case 4864: - goto st_case_4864 - case 4865: - goto st_case_4865 - case 141: - goto st_case_141 - case 4866: - goto st_case_4866 - case 4867: - goto st_case_4867 - case 142: - goto st_case_142 - case 143: - goto st_case_143 - case 144: - goto st_case_144 - case 145: - goto st_case_145 - case 146: - goto st_case_146 - case 147: - goto st_case_147 - case 148: - goto st_case_148 - case 149: - goto st_case_149 - case 150: - goto st_case_150 - case 151: - goto st_case_151 - case 152: - goto st_case_152 - case 153: - goto st_case_153 - case 154: - goto st_case_154 - case 155: - goto st_case_155 - case 156: - goto st_case_156 - case 157: - goto st_case_157 - case 158: - goto st_case_158 - case 159: - goto st_case_159 - case 160: - goto st_case_160 - case 161: - goto st_case_161 - case 162: - goto st_case_162 - case 163: - goto st_case_163 - case 164: - goto st_case_164 - case 165: - goto st_case_165 - case 166: - goto st_case_166 - case 167: - goto st_case_167 - case 168: - goto st_case_168 - case 169: - goto st_case_169 - case 170: - goto st_case_170 - case 171: - goto st_case_171 - case 172: - goto st_case_172 - case 173: - goto st_case_173 - case 174: - goto st_case_174 - case 175: - goto st_case_175 - case 176: - goto st_case_176 - case 177: - goto st_case_177 - case 178: - goto st_case_178 - case 179: - goto st_case_179 - case 180: - goto st_case_180 - case 181: - goto st_case_181 - case 182: - goto st_case_182 - case 183: - goto st_case_183 - case 184: - goto st_case_184 - case 185: - goto st_case_185 - case 186: - goto st_case_186 - case 187: - goto st_case_187 - case 188: - goto st_case_188 - case 189: - goto st_case_189 - case 190: - goto st_case_190 - case 191: - goto st_case_191 - case 192: - goto st_case_192 - case 193: - goto st_case_193 - case 194: - goto st_case_194 - case 195: - goto st_case_195 - case 196: - goto st_case_196 - case 197: - goto st_case_197 - case 198: - goto st_case_198 - case 199: - goto st_case_199 - case 200: - goto st_case_200 - case 201: - goto st_case_201 - case 202: - goto st_case_202 - case 203: - goto st_case_203 - case 204: - goto st_case_204 - case 205: - goto st_case_205 - case 206: - goto st_case_206 - case 207: - goto st_case_207 - case 208: - goto st_case_208 - case 209: - goto st_case_209 - case 210: - goto st_case_210 - case 211: - goto st_case_211 - case 212: - goto st_case_212 - case 213: - goto st_case_213 - case 214: - goto st_case_214 - case 215: - goto st_case_215 - case 216: - goto st_case_216 - case 217: - goto st_case_217 - case 218: - goto st_case_218 - case 219: - goto st_case_219 - case 220: - goto st_case_220 - case 221: - goto st_case_221 - case 222: - goto st_case_222 - case 223: - goto st_case_223 - case 224: - goto st_case_224 - case 225: - goto st_case_225 - case 226: - goto st_case_226 - case 227: - goto st_case_227 - case 228: - goto st_case_228 - case 229: - goto st_case_229 - case 230: - goto st_case_230 - case 231: - goto st_case_231 - case 232: - goto st_case_232 - case 233: - goto st_case_233 - case 234: - goto st_case_234 - case 235: - goto st_case_235 - case 236: - goto st_case_236 - case 237: - goto st_case_237 - case 238: - goto st_case_238 - case 239: - goto st_case_239 - case 240: - goto st_case_240 - case 241: - goto st_case_241 - case 242: - goto st_case_242 - case 243: - goto st_case_243 - case 244: - goto st_case_244 - case 245: - goto st_case_245 - case 246: - goto st_case_246 - case 247: - goto st_case_247 - case 248: - goto st_case_248 - case 249: - goto st_case_249 - case 250: - goto st_case_250 - case 251: - goto st_case_251 - case 252: - goto st_case_252 - case 253: - goto st_case_253 - case 254: - goto st_case_254 - case 255: - goto st_case_255 - case 256: - goto st_case_256 - case 257: - goto st_case_257 - case 258: - goto st_case_258 - case 259: - goto st_case_259 - case 260: - goto st_case_260 - case 261: - goto st_case_261 - case 262: - goto st_case_262 - case 263: - goto st_case_263 - case 264: - goto st_case_264 - case 265: - goto st_case_265 - case 266: - goto st_case_266 - case 267: - goto st_case_267 - case 268: - goto st_case_268 - case 269: - goto st_case_269 - case 270: - goto st_case_270 - case 271: - goto st_case_271 - case 272: - goto st_case_272 - case 273: - goto st_case_273 - case 274: - goto st_case_274 - case 275: - goto st_case_275 - case 276: - goto st_case_276 - case 277: - goto st_case_277 - case 278: - goto st_case_278 - case 279: - goto st_case_279 - case 280: - goto st_case_280 - case 281: - goto st_case_281 - case 282: - goto st_case_282 - case 283: - goto st_case_283 - case 284: - goto st_case_284 - case 285: - goto st_case_285 - case 286: - goto st_case_286 - case 287: - goto st_case_287 - case 288: - goto st_case_288 - case 289: - goto st_case_289 - case 290: - goto st_case_290 - case 291: - goto st_case_291 - case 292: - goto st_case_292 - case 293: - goto st_case_293 - case 294: - goto st_case_294 - case 295: - goto st_case_295 - case 296: - goto st_case_296 - case 297: - goto st_case_297 - case 298: - goto st_case_298 - case 299: - goto st_case_299 - case 300: - goto st_case_300 - case 301: - goto st_case_301 - case 302: - goto st_case_302 - case 303: - goto st_case_303 - case 304: - goto st_case_304 - case 305: - goto st_case_305 - case 306: - goto st_case_306 - case 307: - goto st_case_307 - case 308: - goto st_case_308 - case 309: - goto st_case_309 - case 310: - goto st_case_310 - case 311: - goto st_case_311 - case 312: - goto st_case_312 - case 313: - goto st_case_313 - case 314: - goto st_case_314 - case 315: - goto st_case_315 - case 316: - goto st_case_316 - case 317: - goto st_case_317 - case 318: - goto st_case_318 - case 319: - goto st_case_319 - case 320: - goto st_case_320 - case 321: - goto st_case_321 - case 322: - goto st_case_322 - case 323: - goto st_case_323 - case 324: - goto st_case_324 - case 325: - goto st_case_325 - case 326: - goto st_case_326 - case 327: - goto st_case_327 - case 328: - goto st_case_328 - case 329: - goto st_case_329 - case 330: - goto st_case_330 - case 331: - goto st_case_331 - case 332: - goto st_case_332 - case 333: - goto st_case_333 - case 334: - goto st_case_334 - case 335: - goto st_case_335 - case 336: - goto st_case_336 - case 337: - goto st_case_337 - case 338: - goto st_case_338 - case 339: - goto st_case_339 - case 340: - goto st_case_340 - case 341: - goto st_case_341 - case 342: - goto st_case_342 - case 343: - goto st_case_343 - case 344: - goto st_case_344 - case 345: - goto st_case_345 - case 346: - goto st_case_346 - case 347: - goto st_case_347 - case 348: - goto st_case_348 - case 349: - goto st_case_349 - case 350: - goto st_case_350 - case 351: - goto st_case_351 - case 352: - goto st_case_352 - case 353: - goto st_case_353 - case 354: - goto st_case_354 - case 355: - goto st_case_355 - case 356: - goto st_case_356 - case 357: - goto st_case_357 - case 358: - goto st_case_358 - case 359: - goto st_case_359 - case 360: - goto st_case_360 - case 361: - goto st_case_361 - case 362: - goto st_case_362 - case 363: - goto st_case_363 - case 364: - goto st_case_364 - case 365: - goto st_case_365 - case 366: - goto st_case_366 - case 367: - goto st_case_367 - case 368: - goto st_case_368 - case 369: - goto st_case_369 - case 370: - goto st_case_370 - case 371: - goto st_case_371 - case 372: - goto st_case_372 - case 373: - goto st_case_373 - case 374: - goto st_case_374 - case 375: - goto st_case_375 - case 376: - goto st_case_376 - case 377: - goto st_case_377 - case 378: - goto st_case_378 - case 379: - goto st_case_379 - case 380: - goto st_case_380 - case 381: - goto st_case_381 - case 382: - goto st_case_382 - case 383: - goto st_case_383 - case 384: - goto st_case_384 - case 385: - goto st_case_385 - case 386: - goto st_case_386 - case 387: - goto st_case_387 - case 388: - goto st_case_388 - case 389: - goto st_case_389 - case 390: - goto st_case_390 - case 391: - goto st_case_391 - case 392: - goto st_case_392 - case 393: - goto st_case_393 - case 394: - goto st_case_394 - case 395: - goto st_case_395 - case 396: - goto st_case_396 - case 397: - goto st_case_397 - case 398: - goto st_case_398 - case 399: - goto st_case_399 - case 400: - goto st_case_400 - case 401: - goto st_case_401 - case 402: - goto st_case_402 - case 403: - goto st_case_403 - case 404: - goto st_case_404 - case 405: - goto st_case_405 - case 406: - goto st_case_406 - case 407: - goto st_case_407 - case 408: - goto st_case_408 - case 409: - goto st_case_409 - case 410: - goto st_case_410 - case 411: - goto st_case_411 - case 412: - goto st_case_412 - case 4868: - goto st_case_4868 - case 413: - goto st_case_413 - case 414: - goto st_case_414 - case 415: - goto st_case_415 - case 416: - goto st_case_416 - case 417: - goto st_case_417 - case 418: - goto st_case_418 - case 419: - goto st_case_419 - case 420: - goto st_case_420 - case 421: - goto st_case_421 - case 422: - goto st_case_422 - case 423: - goto st_case_423 - case 424: - goto st_case_424 - case 425: - goto st_case_425 - case 426: - goto st_case_426 - case 427: - goto st_case_427 - case 428: - goto st_case_428 - case 429: - goto st_case_429 - case 430: - goto st_case_430 - case 431: - goto st_case_431 - case 432: - goto st_case_432 - case 433: - goto st_case_433 - case 434: - goto st_case_434 - case 435: - goto st_case_435 - case 436: - goto st_case_436 - case 437: - goto st_case_437 - case 438: - goto st_case_438 - case 439: - goto st_case_439 - case 440: - goto st_case_440 - case 441: - goto st_case_441 - case 442: - goto st_case_442 - case 443: - goto st_case_443 - case 444: - goto st_case_444 - case 445: - goto st_case_445 - case 446: - goto st_case_446 - case 447: - goto st_case_447 - case 448: - goto st_case_448 - case 449: - goto st_case_449 - case 450: - goto st_case_450 - case 451: - goto st_case_451 - case 452: - goto st_case_452 - case 453: - goto st_case_453 - case 454: - goto st_case_454 - case 455: - goto st_case_455 - case 456: - goto st_case_456 - case 457: - goto st_case_457 - case 458: - goto st_case_458 - case 459: - goto st_case_459 - case 460: - goto st_case_460 - case 461: - goto st_case_461 - case 462: - goto st_case_462 - case 463: - goto st_case_463 - case 464: - goto st_case_464 - case 465: - goto st_case_465 - case 466: - goto st_case_466 - case 467: - goto st_case_467 - case 468: - goto st_case_468 - case 469: - goto st_case_469 - case 470: - goto st_case_470 - case 471: - goto st_case_471 - case 472: - goto st_case_472 - case 473: - goto st_case_473 - case 474: - goto st_case_474 - case 475: - goto st_case_475 - case 476: - goto st_case_476 - case 477: - goto st_case_477 - case 478: - goto st_case_478 - case 479: - goto st_case_479 - case 480: - goto st_case_480 - case 481: - goto st_case_481 - case 482: - goto st_case_482 - case 483: - goto st_case_483 - case 484: - goto st_case_484 - case 485: - goto st_case_485 - case 486: - goto st_case_486 - case 487: - goto st_case_487 - case 488: - goto st_case_488 - case 489: - goto st_case_489 - case 490: - goto st_case_490 - case 491: - goto st_case_491 - case 492: - goto st_case_492 - case 493: - goto st_case_493 - case 494: - goto st_case_494 - case 495: - goto st_case_495 - case 496: - goto st_case_496 - case 497: - goto st_case_497 - case 498: - goto st_case_498 - case 499: - goto st_case_499 - case 500: - goto st_case_500 - case 501: - goto st_case_501 - case 502: - goto st_case_502 - case 503: - goto st_case_503 - case 504: - goto st_case_504 - case 505: - goto st_case_505 - case 506: - goto st_case_506 - case 507: - goto st_case_507 - case 508: - goto st_case_508 - case 509: - goto st_case_509 - case 510: - goto st_case_510 - case 511: - goto st_case_511 - case 512: - goto st_case_512 - case 513: - goto st_case_513 - case 514: - goto st_case_514 - case 515: - goto st_case_515 - case 516: - goto st_case_516 - case 517: - goto st_case_517 - case 518: - goto st_case_518 - case 519: - goto st_case_519 - case 520: - goto st_case_520 - case 521: - goto st_case_521 - case 522: - goto st_case_522 - case 523: - goto st_case_523 - case 524: - goto st_case_524 - case 525: - goto st_case_525 - case 526: - goto st_case_526 - case 527: - goto st_case_527 - case 528: - goto st_case_528 - case 529: - goto st_case_529 - case 530: - goto st_case_530 - case 531: - goto st_case_531 - case 532: - goto st_case_532 - case 533: - goto st_case_533 - case 534: - goto st_case_534 - case 535: - goto st_case_535 - case 536: - goto st_case_536 - case 537: - goto st_case_537 - case 538: - goto st_case_538 - case 539: - goto st_case_539 - case 540: - goto st_case_540 - case 541: - goto st_case_541 - case 542: - goto st_case_542 - case 543: - goto st_case_543 - case 544: - goto st_case_544 - case 545: - goto st_case_545 - case 546: - goto st_case_546 - case 547: - goto st_case_547 - case 548: - goto st_case_548 - case 549: - goto st_case_549 - case 550: - goto st_case_550 - case 551: - goto st_case_551 - case 552: - goto st_case_552 - case 553: - goto st_case_553 - case 554: - goto st_case_554 - case 555: - goto st_case_555 - case 556: - goto st_case_556 - case 557: - goto st_case_557 - case 558: - goto st_case_558 - case 559: - goto st_case_559 - case 560: - goto st_case_560 - case 561: - goto st_case_561 - case 4869: - goto st_case_4869 - case 562: - goto st_case_562 - case 563: - goto st_case_563 - case 564: - goto st_case_564 - case 565: - goto st_case_565 - case 566: - goto st_case_566 - case 567: - goto st_case_567 - case 4870: - goto st_case_4870 - case 568: - goto st_case_568 - case 569: - goto st_case_569 - case 570: - goto st_case_570 - case 571: - goto st_case_571 - case 572: - goto st_case_572 - case 573: - goto st_case_573 - case 574: - goto st_case_574 - case 4871: - goto st_case_4871 - case 575: - goto st_case_575 - case 576: - goto st_case_576 - case 577: - goto st_case_577 - case 578: - goto st_case_578 - case 579: - goto st_case_579 - case 580: - goto st_case_580 - case 581: - goto st_case_581 - case 582: - goto st_case_582 - case 583: - goto st_case_583 - case 584: - goto st_case_584 - case 585: - goto st_case_585 - case 586: - goto st_case_586 - case 587: - goto st_case_587 - case 588: - goto st_case_588 - case 589: - goto st_case_589 - case 590: - goto st_case_590 - case 591: - goto st_case_591 - case 592: - goto st_case_592 - case 593: - goto st_case_593 - case 594: - goto st_case_594 - case 595: - goto st_case_595 - case 596: - goto st_case_596 - case 597: - goto st_case_597 - case 598: - goto st_case_598 - case 599: - goto st_case_599 - case 600: - goto st_case_600 - case 601: - goto st_case_601 - case 602: - goto st_case_602 - case 603: - goto st_case_603 - case 604: - goto st_case_604 - case 605: - goto st_case_605 - case 606: - goto st_case_606 - case 607: - goto st_case_607 - case 608: - goto st_case_608 - case 609: - goto st_case_609 - case 610: - goto st_case_610 - case 611: - goto st_case_611 - case 612: - goto st_case_612 - case 613: - goto st_case_613 - case 614: - goto st_case_614 - case 615: - goto st_case_615 - case 616: - goto st_case_616 - case 617: - goto st_case_617 - case 618: - goto st_case_618 - case 619: - goto st_case_619 - case 620: - goto st_case_620 - case 621: - goto st_case_621 - case 622: - goto st_case_622 - case 623: - goto st_case_623 - case 624: - goto st_case_624 - case 625: - goto st_case_625 - case 626: - goto st_case_626 - case 627: - goto st_case_627 - case 628: - goto st_case_628 - case 629: - goto st_case_629 - case 630: - goto st_case_630 - case 631: - goto st_case_631 - case 632: - goto st_case_632 - case 633: - goto st_case_633 - case 634: - goto st_case_634 - case 635: - goto st_case_635 - case 636: - goto st_case_636 - case 637: - goto st_case_637 - case 638: - goto st_case_638 - case 639: - goto st_case_639 - case 640: - goto st_case_640 - case 641: - goto st_case_641 - case 642: - goto st_case_642 - case 643: - goto st_case_643 - case 644: - goto st_case_644 - case 645: - goto st_case_645 - case 646: - goto st_case_646 - case 647: - goto st_case_647 - case 648: - goto st_case_648 - case 649: - goto st_case_649 - case 650: - goto st_case_650 - case 651: - goto st_case_651 - case 652: - goto st_case_652 - case 653: - goto st_case_653 - case 654: - goto st_case_654 - case 655: - goto st_case_655 - case 656: - goto st_case_656 - case 657: - goto st_case_657 - case 658: - goto st_case_658 - case 659: - goto st_case_659 - case 660: - goto st_case_660 - case 661: - goto st_case_661 - case 662: - goto st_case_662 - case 663: - goto st_case_663 - case 664: - goto st_case_664 - case 665: - goto st_case_665 - case 666: - goto st_case_666 - case 667: - goto st_case_667 - case 668: - goto st_case_668 - case 669: - goto st_case_669 - case 670: - goto st_case_670 - case 671: - goto st_case_671 - case 672: - goto st_case_672 - case 673: - goto st_case_673 - case 674: - goto st_case_674 - case 675: - goto st_case_675 - case 676: - goto st_case_676 - case 677: - goto st_case_677 - case 678: - goto st_case_678 - case 679: - goto st_case_679 - case 680: - goto st_case_680 - case 681: - goto st_case_681 - case 682: - goto st_case_682 - case 683: - goto st_case_683 - case 684: - goto st_case_684 - case 685: - goto st_case_685 - case 686: - goto st_case_686 - case 687: - goto st_case_687 - case 688: - goto st_case_688 - case 689: - goto st_case_689 - case 690: - goto st_case_690 - case 691: - goto st_case_691 - case 692: - goto st_case_692 - case 693: - goto st_case_693 - case 694: - goto st_case_694 - case 695: - goto st_case_695 - case 696: - goto st_case_696 - case 697: - goto st_case_697 - case 698: - goto st_case_698 - case 699: - goto st_case_699 - case 700: - goto st_case_700 - case 701: - goto st_case_701 - case 702: - goto st_case_702 - case 703: - goto st_case_703 - case 704: - goto st_case_704 - case 705: - goto st_case_705 - case 706: - goto st_case_706 - case 707: - goto st_case_707 - case 708: - goto st_case_708 - case 709: - goto st_case_709 - case 710: - goto st_case_710 - case 711: - goto st_case_711 - case 712: - goto st_case_712 - case 713: - goto st_case_713 - case 714: - goto st_case_714 - case 715: - goto st_case_715 - case 716: - goto st_case_716 - case 717: - goto st_case_717 - case 718: - goto st_case_718 - case 719: - goto st_case_719 - case 720: - goto st_case_720 - case 721: - goto st_case_721 - case 722: - goto st_case_722 - case 723: - goto st_case_723 - case 724: - goto st_case_724 - case 725: - goto st_case_725 - case 726: - goto st_case_726 - case 727: - goto st_case_727 - case 728: - goto st_case_728 - case 729: - goto st_case_729 - case 730: - goto st_case_730 - case 731: - goto st_case_731 - case 732: - goto st_case_732 - case 733: - goto st_case_733 - case 734: - goto st_case_734 - case 735: - goto st_case_735 - case 736: - goto st_case_736 - case 737: - goto st_case_737 - case 738: - goto st_case_738 - case 739: - goto st_case_739 - case 740: - goto st_case_740 - case 741: - goto st_case_741 - case 742: - goto st_case_742 - case 743: - goto st_case_743 - case 744: - goto st_case_744 - case 745: - goto st_case_745 - case 746: - goto st_case_746 - case 747: - goto st_case_747 - case 748: - goto st_case_748 - case 749: - goto st_case_749 - case 750: - goto st_case_750 - case 751: - goto st_case_751 - case 752: - goto st_case_752 - case 753: - goto st_case_753 - case 754: - goto st_case_754 - case 755: - goto st_case_755 - case 756: - goto st_case_756 - case 757: - goto st_case_757 - case 758: - goto st_case_758 - case 759: - goto st_case_759 - case 760: - goto st_case_760 - case 761: - goto st_case_761 - case 762: - goto st_case_762 - case 763: - goto st_case_763 - case 764: - goto st_case_764 - case 765: - goto st_case_765 - case 766: - goto st_case_766 - case 767: - goto st_case_767 - case 768: - goto st_case_768 - case 769: - goto st_case_769 - case 770: - goto st_case_770 - case 771: - goto st_case_771 - case 772: - goto st_case_772 - case 773: - goto st_case_773 - case 774: - goto st_case_774 - case 775: - goto st_case_775 - case 776: - goto st_case_776 - case 777: - goto st_case_777 - case 778: - goto st_case_778 - case 779: - goto st_case_779 - case 780: - goto st_case_780 - case 781: - goto st_case_781 - case 782: - goto st_case_782 - case 783: - goto st_case_783 - case 784: - goto st_case_784 - case 785: - goto st_case_785 - case 786: - goto st_case_786 - case 787: - goto st_case_787 - case 788: - goto st_case_788 - case 789: - goto st_case_789 - case 790: - goto st_case_790 - case 791: - goto st_case_791 - case 792: - goto st_case_792 - case 793: - goto st_case_793 - case 794: - goto st_case_794 - case 795: - goto st_case_795 - case 796: - goto st_case_796 - case 797: - goto st_case_797 - case 798: - goto st_case_798 - case 799: - goto st_case_799 - case 800: - goto st_case_800 - case 801: - goto st_case_801 - case 802: - goto st_case_802 - case 803: - goto st_case_803 - case 804: - goto st_case_804 - case 805: - goto st_case_805 - case 806: - goto st_case_806 - case 807: - goto st_case_807 - case 808: - goto st_case_808 - case 809: - goto st_case_809 - case 810: - goto st_case_810 - case 811: - goto st_case_811 - case 812: - goto st_case_812 - case 813: - goto st_case_813 - case 814: - goto st_case_814 - case 815: - goto st_case_815 - case 816: - goto st_case_816 - case 817: - goto st_case_817 - case 818: - goto st_case_818 - case 819: - goto st_case_819 - case 820: - goto st_case_820 - case 821: - goto st_case_821 - case 822: - goto st_case_822 - case 823: - goto st_case_823 - case 824: - goto st_case_824 - case 825: - goto st_case_825 - case 826: - goto st_case_826 - case 827: - goto st_case_827 - case 828: - goto st_case_828 - case 829: - goto st_case_829 - case 830: - goto st_case_830 - case 831: - goto st_case_831 - case 832: - goto st_case_832 - case 833: - goto st_case_833 - case 834: - goto st_case_834 - case 835: - goto st_case_835 - case 836: - goto st_case_836 - case 837: - goto st_case_837 - case 838: - goto st_case_838 - case 839: - goto st_case_839 - case 840: - goto st_case_840 - case 841: - goto st_case_841 - case 842: - goto st_case_842 - case 843: - goto st_case_843 - case 844: - goto st_case_844 - case 845: - goto st_case_845 - case 846: - goto st_case_846 - case 847: - goto st_case_847 - case 848: - goto st_case_848 - case 849: - goto st_case_849 - case 850: - goto st_case_850 - case 851: - goto st_case_851 - case 852: - goto st_case_852 - case 853: - goto st_case_853 - case 854: - goto st_case_854 - case 855: - goto st_case_855 - case 856: - goto st_case_856 - case 857: - goto st_case_857 - case 858: - goto st_case_858 - case 859: - goto st_case_859 - case 860: - goto st_case_860 - case 861: - goto st_case_861 - case 862: - goto st_case_862 - case 863: - goto st_case_863 - case 864: - goto st_case_864 - case 865: - goto st_case_865 - case 866: - goto st_case_866 - case 867: - goto st_case_867 - case 868: - goto st_case_868 - case 869: - goto st_case_869 - case 870: - goto st_case_870 - case 871: - goto st_case_871 - case 872: - goto st_case_872 - case 873: - goto st_case_873 - case 874: - goto st_case_874 - case 875: - goto st_case_875 - case 876: - goto st_case_876 - case 877: - goto st_case_877 - case 878: - goto st_case_878 - case 879: - goto st_case_879 - case 880: - goto st_case_880 - case 881: - goto st_case_881 - case 882: - goto st_case_882 - case 883: - goto st_case_883 - case 884: - goto st_case_884 - case 885: - goto st_case_885 - case 886: - goto st_case_886 - case 887: - goto st_case_887 - case 888: - goto st_case_888 - case 889: - goto st_case_889 - case 890: - goto st_case_890 - case 891: - goto st_case_891 - case 892: - goto st_case_892 - case 893: - goto st_case_893 - case 894: - goto st_case_894 - case 895: - goto st_case_895 - case 896: - goto st_case_896 - case 897: - goto st_case_897 - case 898: - goto st_case_898 - case 899: - goto st_case_899 - case 900: - goto st_case_900 - case 901: - goto st_case_901 - case 902: - goto st_case_902 - case 903: - goto st_case_903 - case 904: - goto st_case_904 - case 905: - goto st_case_905 - case 906: - goto st_case_906 - case 907: - goto st_case_907 - case 908: - goto st_case_908 - case 909: - goto st_case_909 - case 910: - goto st_case_910 - case 911: - goto st_case_911 - case 912: - goto st_case_912 - case 913: - goto st_case_913 - case 914: - goto st_case_914 - case 915: - goto st_case_915 - case 916: - goto st_case_916 - case 917: - goto st_case_917 - case 918: - goto st_case_918 - case 919: - goto st_case_919 - case 920: - goto st_case_920 - case 921: - goto st_case_921 - case 922: - goto st_case_922 - case 923: - goto st_case_923 - case 924: - goto st_case_924 - case 925: - goto st_case_925 - case 926: - goto st_case_926 - case 927: - goto st_case_927 - case 928: - goto st_case_928 - case 929: - goto st_case_929 - case 930: - goto st_case_930 - case 931: - goto st_case_931 - case 932: - goto st_case_932 - case 933: - goto st_case_933 - case 934: - goto st_case_934 - case 935: - goto st_case_935 - case 936: - goto st_case_936 - case 937: - goto st_case_937 - case 938: - goto st_case_938 - case 939: - goto st_case_939 - case 940: - goto st_case_940 - case 941: - goto st_case_941 - case 942: - goto st_case_942 - case 943: - goto st_case_943 - case 944: - goto st_case_944 - case 945: - goto st_case_945 - case 946: - goto st_case_946 - case 947: - goto st_case_947 - case 948: - goto st_case_948 - case 949: - goto st_case_949 - case 950: - goto st_case_950 - case 951: - goto st_case_951 - case 952: - goto st_case_952 - case 953: - goto st_case_953 - case 954: - goto st_case_954 - case 955: - goto st_case_955 - case 956: - goto st_case_956 - case 957: - goto st_case_957 - case 958: - goto st_case_958 - case 959: - goto st_case_959 - case 960: - goto st_case_960 - case 961: - goto st_case_961 - case 962: - goto st_case_962 - case 963: - goto st_case_963 - case 964: - goto st_case_964 - case 965: - goto st_case_965 - case 966: - goto st_case_966 - case 967: - goto st_case_967 - case 968: - goto st_case_968 - case 969: - goto st_case_969 - case 970: - goto st_case_970 - case 971: - goto st_case_971 - case 972: - goto st_case_972 - case 973: - goto st_case_973 - case 974: - goto st_case_974 - case 975: - goto st_case_975 - case 976: - goto st_case_976 - case 977: - goto st_case_977 - case 978: - goto st_case_978 - case 979: - goto st_case_979 - case 980: - goto st_case_980 - case 981: - goto st_case_981 - case 982: - goto st_case_982 - case 983: - goto st_case_983 - case 984: - goto st_case_984 - case 985: - goto st_case_985 - case 986: - goto st_case_986 - case 987: - goto st_case_987 - case 988: - goto st_case_988 - case 989: - goto st_case_989 - case 990: - goto st_case_990 - case 991: - goto st_case_991 - case 992: - goto st_case_992 - case 993: - goto st_case_993 - case 994: - goto st_case_994 - case 995: - goto st_case_995 - case 996: - goto st_case_996 - case 997: - goto st_case_997 - case 998: - goto st_case_998 - case 999: - goto st_case_999 - case 1000: - goto st_case_1000 - case 1001: - goto st_case_1001 - case 1002: - goto st_case_1002 - case 1003: - goto st_case_1003 - case 1004: - goto st_case_1004 - case 1005: - goto st_case_1005 - case 1006: - goto st_case_1006 - case 1007: - goto st_case_1007 - case 1008: - goto st_case_1008 - case 1009: - goto st_case_1009 - case 1010: - goto st_case_1010 - case 1011: - goto st_case_1011 - case 1012: - goto st_case_1012 - case 1013: - goto st_case_1013 - case 1014: - goto st_case_1014 - case 1015: - goto st_case_1015 - case 1016: - goto st_case_1016 - case 1017: - goto st_case_1017 - case 1018: - goto st_case_1018 - case 1019: - goto st_case_1019 - case 1020: - goto st_case_1020 - case 1021: - goto st_case_1021 - case 1022: - goto st_case_1022 - case 1023: - goto st_case_1023 - case 1024: - goto st_case_1024 - case 1025: - goto st_case_1025 - case 1026: - goto st_case_1026 - case 1027: - goto st_case_1027 - case 1028: - goto st_case_1028 - case 1029: - goto st_case_1029 - case 1030: - goto st_case_1030 - case 1031: - goto st_case_1031 - case 1032: - goto st_case_1032 - case 1033: - goto st_case_1033 - case 1034: - goto st_case_1034 - case 1035: - goto st_case_1035 - case 1036: - goto st_case_1036 - case 1037: - goto st_case_1037 - case 1038: - goto st_case_1038 - case 1039: - goto st_case_1039 - case 1040: - goto st_case_1040 - case 1041: - goto st_case_1041 - case 1042: - goto st_case_1042 - case 1043: - goto st_case_1043 - case 1044: - goto st_case_1044 - case 1045: - goto st_case_1045 - case 1046: - goto st_case_1046 - case 1047: - goto st_case_1047 - case 1048: - goto st_case_1048 - case 1049: - goto st_case_1049 - case 1050: - goto st_case_1050 - case 1051: - goto st_case_1051 - case 1052: - goto st_case_1052 - case 1053: - goto st_case_1053 - case 1054: - goto st_case_1054 - case 1055: - goto st_case_1055 - case 1056: - goto st_case_1056 - case 1057: - goto st_case_1057 - case 1058: - goto st_case_1058 - case 1059: - goto st_case_1059 - case 1060: - goto st_case_1060 - case 1061: - goto st_case_1061 - case 1062: - goto st_case_1062 - case 1063: - goto st_case_1063 - case 1064: - goto st_case_1064 - case 1065: - goto st_case_1065 - case 1066: - goto st_case_1066 - case 1067: - goto st_case_1067 - case 1068: - goto st_case_1068 - case 1069: - goto st_case_1069 - case 1070: - goto st_case_1070 - case 1071: - goto st_case_1071 - case 1072: - goto st_case_1072 - case 1073: - goto st_case_1073 - case 1074: - goto st_case_1074 - case 1075: - goto st_case_1075 - case 1076: - goto st_case_1076 - case 1077: - goto st_case_1077 - case 1078: - goto st_case_1078 - case 1079: - goto st_case_1079 - case 1080: - goto st_case_1080 - case 1081: - goto st_case_1081 - case 1082: - goto st_case_1082 - case 1083: - goto st_case_1083 - case 1084: - goto st_case_1084 - case 1085: - goto st_case_1085 - case 1086: - goto st_case_1086 - case 1087: - goto st_case_1087 - case 1088: - goto st_case_1088 - case 1089: - goto st_case_1089 - case 4872: - goto st_case_4872 - case 1090: - goto st_case_1090 - case 1091: - goto st_case_1091 - case 1092: - goto st_case_1092 - case 1093: - goto st_case_1093 - case 1094: - goto st_case_1094 - case 1095: - goto st_case_1095 - case 1096: - goto st_case_1096 - case 1097: - goto st_case_1097 - case 1098: - goto st_case_1098 - case 1099: - goto st_case_1099 - case 1100: - goto st_case_1100 - case 1101: - goto st_case_1101 - case 1102: - goto st_case_1102 - case 1103: - goto st_case_1103 - case 1104: - goto st_case_1104 - case 1105: - goto st_case_1105 - case 1106: - goto st_case_1106 - case 1107: - goto st_case_1107 - case 1108: - goto st_case_1108 - case 1109: - goto st_case_1109 - case 1110: - goto st_case_1110 - case 1111: - goto st_case_1111 - case 1112: - goto st_case_1112 - case 1113: - goto st_case_1113 - case 1114: - goto st_case_1114 - case 1115: - goto st_case_1115 - case 1116: - goto st_case_1116 - case 1117: - goto st_case_1117 - case 1118: - goto st_case_1118 - case 1119: - goto st_case_1119 - case 1120: - goto st_case_1120 - case 1121: - goto st_case_1121 - case 1122: - goto st_case_1122 - case 1123: - goto st_case_1123 - case 1124: - goto st_case_1124 - case 1125: - goto st_case_1125 - case 1126: - goto st_case_1126 - case 1127: - goto st_case_1127 - case 1128: - goto st_case_1128 - case 1129: - goto st_case_1129 - case 1130: - goto st_case_1130 - case 1131: - goto st_case_1131 - case 1132: - goto st_case_1132 - case 1133: - goto st_case_1133 - case 1134: - goto st_case_1134 - case 1135: - goto st_case_1135 - case 1136: - goto st_case_1136 - case 1137: - goto st_case_1137 - case 1138: - goto st_case_1138 - case 1139: - goto st_case_1139 - case 1140: - goto st_case_1140 - case 1141: - goto st_case_1141 - case 1142: - goto st_case_1142 - case 1143: - goto st_case_1143 - case 1144: - goto st_case_1144 - case 1145: - goto st_case_1145 - case 1146: - goto st_case_1146 - case 1147: - goto st_case_1147 - case 1148: - goto st_case_1148 - case 1149: - goto st_case_1149 - case 1150: - goto st_case_1150 - case 1151: - goto st_case_1151 - case 1152: - goto st_case_1152 - case 1153: - goto st_case_1153 - case 1154: - goto st_case_1154 - case 1155: - goto st_case_1155 - case 1156: - goto st_case_1156 - case 1157: - goto st_case_1157 - case 1158: - goto st_case_1158 - case 1159: - goto st_case_1159 - case 1160: - goto st_case_1160 - case 1161: - goto st_case_1161 - case 1162: - goto st_case_1162 - case 1163: - goto st_case_1163 - case 1164: - goto st_case_1164 - case 1165: - goto st_case_1165 - case 1166: - goto st_case_1166 - case 1167: - goto st_case_1167 - case 1168: - goto st_case_1168 - case 1169: - goto st_case_1169 - case 1170: - goto st_case_1170 - case 1171: - goto st_case_1171 - case 1172: - goto st_case_1172 - case 1173: - goto st_case_1173 - case 1174: - goto st_case_1174 - case 1175: - goto st_case_1175 - case 1176: - goto st_case_1176 - case 1177: - goto st_case_1177 - case 1178: - goto st_case_1178 - case 1179: - goto st_case_1179 - case 1180: - goto st_case_1180 - case 1181: - goto st_case_1181 - case 1182: - goto st_case_1182 - case 1183: - goto st_case_1183 - case 1184: - goto st_case_1184 - case 1185: - goto st_case_1185 - case 1186: - goto st_case_1186 - case 1187: - goto st_case_1187 - case 1188: - goto st_case_1188 - case 1189: - goto st_case_1189 - case 1190: - goto st_case_1190 - case 1191: - goto st_case_1191 - case 1192: - goto st_case_1192 - case 1193: - goto st_case_1193 - case 1194: - goto st_case_1194 - case 1195: - goto st_case_1195 - case 1196: - goto st_case_1196 - case 1197: - goto st_case_1197 - case 1198: - goto st_case_1198 - case 1199: - goto st_case_1199 - case 1200: - goto st_case_1200 - case 1201: - goto st_case_1201 - case 1202: - goto st_case_1202 - case 1203: - goto st_case_1203 - case 1204: - goto st_case_1204 - case 1205: - goto st_case_1205 - case 1206: - goto st_case_1206 - case 1207: - goto st_case_1207 - case 1208: - goto st_case_1208 - case 1209: - goto st_case_1209 - case 1210: - goto st_case_1210 - case 1211: - goto st_case_1211 - case 1212: - goto st_case_1212 - case 1213: - goto st_case_1213 - case 1214: - goto st_case_1214 - case 1215: - goto st_case_1215 - case 1216: - goto st_case_1216 - case 1217: - goto st_case_1217 - case 1218: - goto st_case_1218 - case 1219: - goto st_case_1219 - case 1220: - goto st_case_1220 - case 1221: - goto st_case_1221 - case 1222: - goto st_case_1222 - case 1223: - goto st_case_1223 - case 1224: - goto st_case_1224 - case 1225: - goto st_case_1225 - case 1226: - goto st_case_1226 - case 1227: - goto st_case_1227 - case 1228: - goto st_case_1228 - case 1229: - goto st_case_1229 - case 1230: - goto st_case_1230 - case 1231: - goto st_case_1231 - case 1232: - goto st_case_1232 - case 1233: - goto st_case_1233 - case 1234: - goto st_case_1234 - case 1235: - goto st_case_1235 - case 1236: - goto st_case_1236 - case 1237: - goto st_case_1237 - case 1238: - goto st_case_1238 - case 1239: - goto st_case_1239 - case 1240: - goto st_case_1240 - case 1241: - goto st_case_1241 - case 1242: - goto st_case_1242 - case 1243: - goto st_case_1243 - case 1244: - goto st_case_1244 - case 1245: - goto st_case_1245 - case 1246: - goto st_case_1246 - case 1247: - goto st_case_1247 - case 1248: - goto st_case_1248 - case 1249: - goto st_case_1249 - case 1250: - goto st_case_1250 - case 1251: - goto st_case_1251 - case 1252: - goto st_case_1252 - case 1253: - goto st_case_1253 - case 1254: - goto st_case_1254 - case 1255: - goto st_case_1255 - case 1256: - goto st_case_1256 - case 1257: - goto st_case_1257 - case 1258: - goto st_case_1258 - case 1259: - goto st_case_1259 - case 1260: - goto st_case_1260 - case 1261: - goto st_case_1261 - case 1262: - goto st_case_1262 - case 1263: - goto st_case_1263 - case 1264: - goto st_case_1264 - case 1265: - goto st_case_1265 - case 1266: - goto st_case_1266 - case 1267: - goto st_case_1267 - case 1268: - goto st_case_1268 - case 1269: - goto st_case_1269 - case 1270: - goto st_case_1270 - case 1271: - goto st_case_1271 - case 1272: - goto st_case_1272 - case 1273: - goto st_case_1273 - case 1274: - goto st_case_1274 - case 1275: - goto st_case_1275 - case 1276: - goto st_case_1276 - case 1277: - goto st_case_1277 - case 1278: - goto st_case_1278 - case 1279: - goto st_case_1279 - case 1280: - goto st_case_1280 - case 1281: - goto st_case_1281 - case 1282: - goto st_case_1282 - case 1283: - goto st_case_1283 - case 1284: - goto st_case_1284 - case 1285: - goto st_case_1285 - case 1286: - goto st_case_1286 - case 1287: - goto st_case_1287 - case 1288: - goto st_case_1288 - case 1289: - goto st_case_1289 - case 1290: - goto st_case_1290 - case 1291: - goto st_case_1291 - case 1292: - goto st_case_1292 - case 1293: - goto st_case_1293 - case 1294: - goto st_case_1294 - case 1295: - goto st_case_1295 - case 1296: - goto st_case_1296 - case 1297: - goto st_case_1297 - case 1298: - goto st_case_1298 - case 1299: - goto st_case_1299 - case 1300: - goto st_case_1300 - case 1301: - goto st_case_1301 - case 1302: - goto st_case_1302 - case 1303: - goto st_case_1303 - case 1304: - goto st_case_1304 - case 1305: - goto st_case_1305 - case 1306: - goto st_case_1306 - case 1307: - goto st_case_1307 - case 1308: - goto st_case_1308 - case 1309: - goto st_case_1309 - case 1310: - goto st_case_1310 - case 1311: - goto st_case_1311 - case 1312: - goto st_case_1312 - case 1313: - goto st_case_1313 - case 1314: - goto st_case_1314 - case 1315: - goto st_case_1315 - case 1316: - goto st_case_1316 - case 1317: - goto st_case_1317 - case 1318: - goto st_case_1318 - case 1319: - goto st_case_1319 - case 1320: - goto st_case_1320 - case 1321: - goto st_case_1321 - case 1322: - goto st_case_1322 - case 1323: - goto st_case_1323 - case 1324: - goto st_case_1324 - case 1325: - goto st_case_1325 - case 1326: - goto st_case_1326 - case 1327: - goto st_case_1327 - case 1328: - goto st_case_1328 - case 1329: - goto st_case_1329 - case 1330: - goto st_case_1330 - case 1331: - goto st_case_1331 - case 1332: - goto st_case_1332 - case 1333: - goto st_case_1333 - case 1334: - goto st_case_1334 - case 1335: - goto st_case_1335 - case 1336: - goto st_case_1336 - case 1337: - goto st_case_1337 - case 1338: - goto st_case_1338 - case 1339: - goto st_case_1339 - case 1340: - goto st_case_1340 - case 1341: - goto st_case_1341 - case 1342: - goto st_case_1342 - case 1343: - goto st_case_1343 - case 1344: - goto st_case_1344 - case 1345: - goto st_case_1345 - case 1346: - goto st_case_1346 - case 1347: - goto st_case_1347 - case 1348: - goto st_case_1348 - case 1349: - goto st_case_1349 - case 1350: - goto st_case_1350 - case 1351: - goto st_case_1351 - case 1352: - goto st_case_1352 - case 1353: - goto st_case_1353 - case 1354: - goto st_case_1354 - case 1355: - goto st_case_1355 - case 1356: - goto st_case_1356 - case 1357: - goto st_case_1357 - case 1358: - goto st_case_1358 - case 1359: - goto st_case_1359 - case 1360: - goto st_case_1360 - case 1361: - goto st_case_1361 - case 1362: - goto st_case_1362 - case 1363: - goto st_case_1363 - case 1364: - goto st_case_1364 - case 1365: - goto st_case_1365 - case 1366: - goto st_case_1366 - case 1367: - goto st_case_1367 - case 1368: - goto st_case_1368 - case 1369: - goto st_case_1369 - case 1370: - goto st_case_1370 - case 1371: - goto st_case_1371 - case 1372: - goto st_case_1372 - case 1373: - goto st_case_1373 - case 1374: - goto st_case_1374 - case 1375: - goto st_case_1375 - case 1376: - goto st_case_1376 - case 1377: - goto st_case_1377 - case 1378: - goto st_case_1378 - case 1379: - goto st_case_1379 - case 1380: - goto st_case_1380 - case 1381: - goto st_case_1381 - case 1382: - goto st_case_1382 - case 1383: - goto st_case_1383 - case 1384: - goto st_case_1384 - case 1385: - goto st_case_1385 - case 1386: - goto st_case_1386 - case 1387: - goto st_case_1387 - case 1388: - goto st_case_1388 - case 1389: - goto st_case_1389 - case 1390: - goto st_case_1390 - case 1391: - goto st_case_1391 - case 1392: - goto st_case_1392 - case 1393: - goto st_case_1393 - case 1394: - goto st_case_1394 - case 1395: - goto st_case_1395 - case 1396: - goto st_case_1396 - case 1397: - goto st_case_1397 - case 1398: - goto st_case_1398 - case 1399: - goto st_case_1399 - case 1400: - goto st_case_1400 - case 1401: - goto st_case_1401 - case 1402: - goto st_case_1402 - case 1403: - goto st_case_1403 - case 1404: - goto st_case_1404 - case 1405: - goto st_case_1405 - case 1406: - goto st_case_1406 - case 1407: - goto st_case_1407 - case 1408: - goto st_case_1408 - case 1409: - goto st_case_1409 - case 1410: - goto st_case_1410 - case 1411: - goto st_case_1411 - case 1412: - goto st_case_1412 - case 1413: - goto st_case_1413 - case 1414: - goto st_case_1414 - case 1415: - goto st_case_1415 - case 1416: - goto st_case_1416 - case 1417: - goto st_case_1417 - case 1418: - goto st_case_1418 - case 1419: - goto st_case_1419 - case 1420: - goto st_case_1420 - case 1421: - goto st_case_1421 - case 1422: - goto st_case_1422 - case 1423: - goto st_case_1423 - case 1424: - goto st_case_1424 - case 1425: - goto st_case_1425 - case 1426: - goto st_case_1426 - case 1427: - goto st_case_1427 - case 1428: - goto st_case_1428 - case 1429: - goto st_case_1429 - case 1430: - goto st_case_1430 - case 1431: - goto st_case_1431 - case 1432: - goto st_case_1432 - case 1433: - goto st_case_1433 - case 1434: - goto st_case_1434 - case 1435: - goto st_case_1435 - case 1436: - goto st_case_1436 - case 1437: - goto st_case_1437 - case 1438: - goto st_case_1438 - case 1439: - goto st_case_1439 - case 1440: - goto st_case_1440 - case 1441: - goto st_case_1441 - case 1442: - goto st_case_1442 - case 1443: - goto st_case_1443 - case 1444: - goto st_case_1444 - case 1445: - goto st_case_1445 - case 1446: - goto st_case_1446 - case 1447: - goto st_case_1447 - case 1448: - goto st_case_1448 - case 1449: - goto st_case_1449 - case 1450: - goto st_case_1450 - case 1451: - goto st_case_1451 - case 1452: - goto st_case_1452 - case 1453: - goto st_case_1453 - case 1454: - goto st_case_1454 - case 1455: - goto st_case_1455 - case 1456: - goto st_case_1456 - case 1457: - goto st_case_1457 - case 1458: - goto st_case_1458 - case 1459: - goto st_case_1459 - case 1460: - goto st_case_1460 - case 1461: - goto st_case_1461 - case 1462: - goto st_case_1462 - case 1463: - goto st_case_1463 - case 1464: - goto st_case_1464 - case 1465: - goto st_case_1465 - case 1466: - goto st_case_1466 - case 1467: - goto st_case_1467 - case 1468: - goto st_case_1468 - case 1469: - goto st_case_1469 - case 1470: - goto st_case_1470 - case 1471: - goto st_case_1471 - case 1472: - goto st_case_1472 - case 1473: - goto st_case_1473 - case 1474: - goto st_case_1474 - case 1475: - goto st_case_1475 - case 1476: - goto st_case_1476 - case 1477: - goto st_case_1477 - case 1478: - goto st_case_1478 - case 1479: - goto st_case_1479 - case 1480: - goto st_case_1480 - case 1481: - goto st_case_1481 - case 1482: - goto st_case_1482 - case 1483: - goto st_case_1483 - case 1484: - goto st_case_1484 - case 1485: - goto st_case_1485 - case 1486: - goto st_case_1486 - case 1487: - goto st_case_1487 - case 1488: - goto st_case_1488 - case 1489: - goto st_case_1489 - case 1490: - goto st_case_1490 - case 1491: - goto st_case_1491 - case 1492: - goto st_case_1492 - case 1493: - goto st_case_1493 - case 1494: - goto st_case_1494 - case 1495: - goto st_case_1495 - case 1496: - goto st_case_1496 - case 1497: - goto st_case_1497 - case 1498: - goto st_case_1498 - case 1499: - goto st_case_1499 - case 1500: - goto st_case_1500 - case 1501: - goto st_case_1501 - case 1502: - goto st_case_1502 - case 1503: - goto st_case_1503 - case 1504: - goto st_case_1504 - case 1505: - goto st_case_1505 - case 1506: - goto st_case_1506 - case 1507: - goto st_case_1507 - case 1508: - goto st_case_1508 - case 1509: - goto st_case_1509 - case 1510: - goto st_case_1510 - case 1511: - goto st_case_1511 - case 1512: - goto st_case_1512 - case 1513: - goto st_case_1513 - case 1514: - goto st_case_1514 - case 1515: - goto st_case_1515 - case 1516: - goto st_case_1516 - case 1517: - goto st_case_1517 - case 1518: - goto st_case_1518 - case 1519: - goto st_case_1519 - case 1520: - goto st_case_1520 - case 1521: - goto st_case_1521 - case 1522: - goto st_case_1522 - case 1523: - goto st_case_1523 - case 1524: - goto st_case_1524 - case 1525: - goto st_case_1525 - case 1526: - goto st_case_1526 - case 1527: - goto st_case_1527 - case 1528: - goto st_case_1528 - case 1529: - goto st_case_1529 - case 1530: - goto st_case_1530 - case 1531: - goto st_case_1531 - case 1532: - goto st_case_1532 - case 1533: - goto st_case_1533 - case 1534: - goto st_case_1534 - case 1535: - goto st_case_1535 - case 1536: - goto st_case_1536 - case 1537: - goto st_case_1537 - case 1538: - goto st_case_1538 - case 1539: - goto st_case_1539 - case 1540: - goto st_case_1540 - case 1541: - goto st_case_1541 - case 1542: - goto st_case_1542 - case 1543: - goto st_case_1543 - case 1544: - goto st_case_1544 - case 1545: - goto st_case_1545 - case 1546: - goto st_case_1546 - case 1547: - goto st_case_1547 - case 1548: - goto st_case_1548 - case 1549: - goto st_case_1549 - case 1550: - goto st_case_1550 - case 1551: - goto st_case_1551 - case 1552: - goto st_case_1552 - case 1553: - goto st_case_1553 - case 1554: - goto st_case_1554 - case 1555: - goto st_case_1555 - case 1556: - goto st_case_1556 - case 1557: - goto st_case_1557 - case 1558: - goto st_case_1558 - case 1559: - goto st_case_1559 - case 1560: - goto st_case_1560 - case 1561: - goto st_case_1561 - case 1562: - goto st_case_1562 - case 1563: - goto st_case_1563 - case 1564: - goto st_case_1564 - case 1565: - goto st_case_1565 - case 1566: - goto st_case_1566 - case 1567: - goto st_case_1567 - case 1568: - goto st_case_1568 - case 1569: - goto st_case_1569 - case 1570: - goto st_case_1570 - case 1571: - goto st_case_1571 - case 1572: - goto st_case_1572 - case 1573: - goto st_case_1573 - case 1574: - goto st_case_1574 - case 1575: - goto st_case_1575 - case 1576: - goto st_case_1576 - case 1577: - goto st_case_1577 - case 1578: - goto st_case_1578 - case 1579: - goto st_case_1579 - case 1580: - goto st_case_1580 - case 1581: - goto st_case_1581 - case 1582: - goto st_case_1582 - case 1583: - goto st_case_1583 - case 1584: - goto st_case_1584 - case 1585: - goto st_case_1585 - case 1586: - goto st_case_1586 - case 1587: - goto st_case_1587 - case 1588: - goto st_case_1588 - case 1589: - goto st_case_1589 - case 1590: - goto st_case_1590 - case 1591: - goto st_case_1591 - case 4873: - goto st_case_4873 - case 1592: - goto st_case_1592 - case 1593: - goto st_case_1593 - case 1594: - goto st_case_1594 - case 1595: - goto st_case_1595 - case 1596: - goto st_case_1596 - case 1597: - goto st_case_1597 - case 1598: - goto st_case_1598 - case 1599: - goto st_case_1599 - case 1600: - goto st_case_1600 - case 1601: - goto st_case_1601 - case 1602: - goto st_case_1602 - case 1603: - goto st_case_1603 - case 1604: - goto st_case_1604 - case 1605: - goto st_case_1605 - case 1606: - goto st_case_1606 - case 1607: - goto st_case_1607 - case 1608: - goto st_case_1608 - case 1609: - goto st_case_1609 - case 1610: - goto st_case_1610 - case 1611: - goto st_case_1611 - case 1612: - goto st_case_1612 - case 1613: - goto st_case_1613 - case 1614: - goto st_case_1614 - case 1615: - goto st_case_1615 - case 1616: - goto st_case_1616 - case 1617: - goto st_case_1617 - case 1618: - goto st_case_1618 - case 1619: - goto st_case_1619 - case 1620: - goto st_case_1620 - case 1621: - goto st_case_1621 - case 1622: - goto st_case_1622 - case 1623: - goto st_case_1623 - case 1624: - goto st_case_1624 - case 1625: - goto st_case_1625 - case 1626: - goto st_case_1626 - case 1627: - goto st_case_1627 - case 1628: - goto st_case_1628 - case 1629: - goto st_case_1629 - case 1630: - goto st_case_1630 - case 1631: - goto st_case_1631 - case 1632: - goto st_case_1632 - case 1633: - goto st_case_1633 - case 1634: - goto st_case_1634 - case 1635: - goto st_case_1635 - case 1636: - goto st_case_1636 - case 1637: - goto st_case_1637 - case 1638: - goto st_case_1638 - case 1639: - goto st_case_1639 - case 1640: - goto st_case_1640 - case 1641: - goto st_case_1641 - case 1642: - goto st_case_1642 - case 1643: - goto st_case_1643 - case 1644: - goto st_case_1644 - case 1645: - goto st_case_1645 - case 1646: - goto st_case_1646 - case 1647: - goto st_case_1647 - case 1648: - goto st_case_1648 - case 1649: - goto st_case_1649 - case 1650: - goto st_case_1650 - case 1651: - goto st_case_1651 - case 1652: - goto st_case_1652 - case 1653: - goto st_case_1653 - case 1654: - goto st_case_1654 - case 1655: - goto st_case_1655 - case 1656: - goto st_case_1656 - case 1657: - goto st_case_1657 - case 1658: - goto st_case_1658 - case 1659: - goto st_case_1659 - case 1660: - goto st_case_1660 - case 1661: - goto st_case_1661 - case 1662: - goto st_case_1662 - case 1663: - goto st_case_1663 - case 1664: - goto st_case_1664 - case 1665: - goto st_case_1665 - case 1666: - goto st_case_1666 - case 1667: - goto st_case_1667 - case 1668: - goto st_case_1668 - case 1669: - goto st_case_1669 - case 1670: - goto st_case_1670 - case 1671: - goto st_case_1671 - case 1672: - goto st_case_1672 - case 1673: - goto st_case_1673 - case 1674: - goto st_case_1674 - case 1675: - goto st_case_1675 - case 1676: - goto st_case_1676 - case 1677: - goto st_case_1677 - case 1678: - goto st_case_1678 - case 1679: - goto st_case_1679 - case 1680: - goto st_case_1680 - case 1681: - goto st_case_1681 - case 1682: - goto st_case_1682 - case 1683: - goto st_case_1683 - case 1684: - goto st_case_1684 - case 1685: - goto st_case_1685 - case 1686: - goto st_case_1686 - case 1687: - goto st_case_1687 - case 1688: - goto st_case_1688 - case 1689: - goto st_case_1689 - case 1690: - goto st_case_1690 - case 1691: - goto st_case_1691 - case 1692: - goto st_case_1692 - case 1693: - goto st_case_1693 - case 1694: - goto st_case_1694 - case 1695: - goto st_case_1695 - case 1696: - goto st_case_1696 - case 1697: - goto st_case_1697 - case 1698: - goto st_case_1698 - case 1699: - goto st_case_1699 - case 1700: - goto st_case_1700 - case 1701: - goto st_case_1701 - case 1702: - goto st_case_1702 - case 1703: - goto st_case_1703 - case 1704: - goto st_case_1704 - case 1705: - goto st_case_1705 - case 1706: - goto st_case_1706 - case 1707: - goto st_case_1707 - case 1708: - goto st_case_1708 - case 1709: - goto st_case_1709 - case 1710: - goto st_case_1710 - case 1711: - goto st_case_1711 - case 1712: - goto st_case_1712 - case 1713: - goto st_case_1713 - case 1714: - goto st_case_1714 - case 1715: - goto st_case_1715 - case 1716: - goto st_case_1716 - case 1717: - goto st_case_1717 - case 1718: - goto st_case_1718 - case 1719: - goto st_case_1719 - case 1720: - goto st_case_1720 - case 1721: - goto st_case_1721 - case 1722: - goto st_case_1722 - case 1723: - goto st_case_1723 - case 1724: - goto st_case_1724 - case 1725: - goto st_case_1725 - case 1726: - goto st_case_1726 - case 1727: - goto st_case_1727 - case 1728: - goto st_case_1728 - case 1729: - goto st_case_1729 - case 1730: - goto st_case_1730 - case 1731: - goto st_case_1731 - case 1732: - goto st_case_1732 - case 1733: - goto st_case_1733 - case 1734: - goto st_case_1734 - case 1735: - goto st_case_1735 - case 1736: - goto st_case_1736 - case 1737: - goto st_case_1737 - case 1738: - goto st_case_1738 - case 1739: - goto st_case_1739 - case 1740: - goto st_case_1740 - case 1741: - goto st_case_1741 - case 1742: - goto st_case_1742 - case 1743: - goto st_case_1743 - case 1744: - goto st_case_1744 - case 1745: - goto st_case_1745 - case 1746: - goto st_case_1746 - case 1747: - goto st_case_1747 - case 1748: - goto st_case_1748 - case 1749: - goto st_case_1749 - case 1750: - goto st_case_1750 - case 1751: - goto st_case_1751 - case 1752: - goto st_case_1752 - case 1753: - goto st_case_1753 - case 1754: - goto st_case_1754 - case 1755: - goto st_case_1755 - case 1756: - goto st_case_1756 - case 1757: - goto st_case_1757 - case 1758: - goto st_case_1758 - case 1759: - goto st_case_1759 - case 1760: - goto st_case_1760 - case 1761: - goto st_case_1761 - case 1762: - goto st_case_1762 - case 1763: - goto st_case_1763 - case 1764: - goto st_case_1764 - case 1765: - goto st_case_1765 - case 1766: - goto st_case_1766 - case 1767: - goto st_case_1767 - case 1768: - goto st_case_1768 - case 1769: - goto st_case_1769 - case 1770: - goto st_case_1770 - case 1771: - goto st_case_1771 - case 1772: - goto st_case_1772 - case 1773: - goto st_case_1773 - case 1774: - goto st_case_1774 - case 1775: - goto st_case_1775 - case 1776: - goto st_case_1776 - case 1777: - goto st_case_1777 - case 1778: - goto st_case_1778 - case 1779: - goto st_case_1779 - case 1780: - goto st_case_1780 - case 1781: - goto st_case_1781 - case 1782: - goto st_case_1782 - case 1783: - goto st_case_1783 - case 1784: - goto st_case_1784 - case 1785: - goto st_case_1785 - case 1786: - goto st_case_1786 - case 1787: - goto st_case_1787 - case 1788: - goto st_case_1788 - case 1789: - goto st_case_1789 - case 1790: - goto st_case_1790 - case 1791: - goto st_case_1791 - case 1792: - goto st_case_1792 - case 1793: - goto st_case_1793 - case 1794: - goto st_case_1794 - case 1795: - goto st_case_1795 - case 1796: - goto st_case_1796 - case 1797: - goto st_case_1797 - case 1798: - goto st_case_1798 - case 1799: - goto st_case_1799 - case 1800: - goto st_case_1800 - case 1801: - goto st_case_1801 - case 1802: - goto st_case_1802 - case 1803: - goto st_case_1803 - case 1804: - goto st_case_1804 - case 1805: - goto st_case_1805 - case 1806: - goto st_case_1806 - case 1807: - goto st_case_1807 - case 1808: - goto st_case_1808 - case 1809: - goto st_case_1809 - case 1810: - goto st_case_1810 - case 1811: - goto st_case_1811 - case 1812: - goto st_case_1812 - case 1813: - goto st_case_1813 - case 1814: - goto st_case_1814 - case 1815: - goto st_case_1815 - case 1816: - goto st_case_1816 - case 1817: - goto st_case_1817 - case 1818: - goto st_case_1818 - case 1819: - goto st_case_1819 - case 1820: - goto st_case_1820 - case 1821: - goto st_case_1821 - case 1822: - goto st_case_1822 - case 1823: - goto st_case_1823 - case 1824: - goto st_case_1824 - case 1825: - goto st_case_1825 - case 1826: - goto st_case_1826 - case 1827: - goto st_case_1827 - case 1828: - goto st_case_1828 - case 1829: - goto st_case_1829 - case 1830: - goto st_case_1830 - case 1831: - goto st_case_1831 - case 1832: - goto st_case_1832 - case 1833: - goto st_case_1833 - case 1834: - goto st_case_1834 - case 1835: - goto st_case_1835 - case 1836: - goto st_case_1836 - case 1837: - goto st_case_1837 - case 1838: - goto st_case_1838 - case 1839: - goto st_case_1839 - case 1840: - goto st_case_1840 - case 1841: - goto st_case_1841 - case 1842: - goto st_case_1842 - case 1843: - goto st_case_1843 - case 1844: - goto st_case_1844 - case 1845: - goto st_case_1845 - case 1846: - goto st_case_1846 - case 1847: - goto st_case_1847 - case 1848: - goto st_case_1848 - case 1849: - goto st_case_1849 - case 1850: - goto st_case_1850 - case 1851: - goto st_case_1851 - case 1852: - goto st_case_1852 - case 1853: - goto st_case_1853 - case 1854: - goto st_case_1854 - case 1855: - goto st_case_1855 - case 1856: - goto st_case_1856 - case 1857: - goto st_case_1857 - case 1858: - goto st_case_1858 - case 1859: - goto st_case_1859 - case 1860: - goto st_case_1860 - case 1861: - goto st_case_1861 - case 1862: - goto st_case_1862 - case 1863: - goto st_case_1863 - case 1864: - goto st_case_1864 - case 1865: - goto st_case_1865 - case 1866: - goto st_case_1866 - case 1867: - goto st_case_1867 - case 1868: - goto st_case_1868 - case 1869: - goto st_case_1869 - case 1870: - goto st_case_1870 - case 1871: - goto st_case_1871 - case 1872: - goto st_case_1872 - case 1873: - goto st_case_1873 - case 1874: - goto st_case_1874 - case 1875: - goto st_case_1875 - case 1876: - goto st_case_1876 - case 1877: - goto st_case_1877 - case 1878: - goto st_case_1878 - case 1879: - goto st_case_1879 - case 1880: - goto st_case_1880 - case 1881: - goto st_case_1881 - case 1882: - goto st_case_1882 - case 1883: - goto st_case_1883 - case 1884: - goto st_case_1884 - case 1885: - goto st_case_1885 - case 1886: - goto st_case_1886 - case 1887: - goto st_case_1887 - case 1888: - goto st_case_1888 - case 1889: - goto st_case_1889 - case 1890: - goto st_case_1890 - case 1891: - goto st_case_1891 - case 1892: - goto st_case_1892 - case 1893: - goto st_case_1893 - case 1894: - goto st_case_1894 - case 1895: - goto st_case_1895 - case 1896: - goto st_case_1896 - case 1897: - goto st_case_1897 - case 1898: - goto st_case_1898 - case 1899: - goto st_case_1899 - case 1900: - goto st_case_1900 - case 1901: - goto st_case_1901 - case 1902: - goto st_case_1902 - case 1903: - goto st_case_1903 - case 1904: - goto st_case_1904 - case 1905: - goto st_case_1905 - case 1906: - goto st_case_1906 - case 1907: - goto st_case_1907 - case 1908: - goto st_case_1908 - case 1909: - goto st_case_1909 - case 1910: - goto st_case_1910 - case 1911: - goto st_case_1911 - case 1912: - goto st_case_1912 - case 1913: - goto st_case_1913 - case 1914: - goto st_case_1914 - case 1915: - goto st_case_1915 - case 1916: - goto st_case_1916 - case 1917: - goto st_case_1917 - case 1918: - goto st_case_1918 - case 1919: - goto st_case_1919 - case 1920: - goto st_case_1920 - case 1921: - goto st_case_1921 - case 1922: - goto st_case_1922 - case 1923: - goto st_case_1923 - case 1924: - goto st_case_1924 - case 1925: - goto st_case_1925 - case 1926: - goto st_case_1926 - case 1927: - goto st_case_1927 - case 1928: - goto st_case_1928 - case 1929: - goto st_case_1929 - case 1930: - goto st_case_1930 - case 1931: - goto st_case_1931 - case 1932: - goto st_case_1932 - case 1933: - goto st_case_1933 - case 1934: - goto st_case_1934 - case 1935: - goto st_case_1935 - case 1936: - goto st_case_1936 - case 1937: - goto st_case_1937 - case 1938: - goto st_case_1938 - case 1939: - goto st_case_1939 - case 1940: - goto st_case_1940 - case 1941: - goto st_case_1941 - case 1942: - goto st_case_1942 - case 1943: - goto st_case_1943 - case 1944: - goto st_case_1944 - case 1945: - goto st_case_1945 - case 1946: - goto st_case_1946 - case 1947: - goto st_case_1947 - case 1948: - goto st_case_1948 - case 1949: - goto st_case_1949 - case 1950: - goto st_case_1950 - case 1951: - goto st_case_1951 - case 1952: - goto st_case_1952 - case 1953: - goto st_case_1953 - case 1954: - goto st_case_1954 - case 1955: - goto st_case_1955 - case 1956: - goto st_case_1956 - case 1957: - goto st_case_1957 - case 1958: - goto st_case_1958 - case 1959: - goto st_case_1959 - case 1960: - goto st_case_1960 - case 1961: - goto st_case_1961 - case 1962: - goto st_case_1962 - case 1963: - goto st_case_1963 - case 1964: - goto st_case_1964 - case 1965: - goto st_case_1965 - case 1966: - goto st_case_1966 - case 1967: - goto st_case_1967 - case 1968: - goto st_case_1968 - case 1969: - goto st_case_1969 - case 1970: - goto st_case_1970 - case 1971: - goto st_case_1971 - case 1972: - goto st_case_1972 - case 1973: - goto st_case_1973 - case 1974: - goto st_case_1974 - case 1975: - goto st_case_1975 - case 1976: - goto st_case_1976 - case 1977: - goto st_case_1977 - case 1978: - goto st_case_1978 - case 1979: - goto st_case_1979 - case 1980: - goto st_case_1980 - case 1981: - goto st_case_1981 - case 1982: - goto st_case_1982 - case 1983: - goto st_case_1983 - case 1984: - goto st_case_1984 - case 1985: - goto st_case_1985 - case 1986: - goto st_case_1986 - case 1987: - goto st_case_1987 - case 1988: - goto st_case_1988 - case 1989: - goto st_case_1989 - case 1990: - goto st_case_1990 - case 1991: - goto st_case_1991 - case 1992: - goto st_case_1992 - case 1993: - goto st_case_1993 - case 1994: - goto st_case_1994 - case 1995: - goto st_case_1995 - case 1996: - goto st_case_1996 - case 1997: - goto st_case_1997 - case 1998: - goto st_case_1998 - case 1999: - goto st_case_1999 - case 2000: - goto st_case_2000 - case 2001: - goto st_case_2001 - case 2002: - goto st_case_2002 - case 2003: - goto st_case_2003 - case 2004: - goto st_case_2004 - case 2005: - goto st_case_2005 - case 2006: - goto st_case_2006 - case 2007: - goto st_case_2007 - case 2008: - goto st_case_2008 - case 2009: - goto st_case_2009 - case 2010: - goto st_case_2010 - case 2011: - goto st_case_2011 - case 2012: - goto st_case_2012 - case 2013: - goto st_case_2013 - case 2014: - goto st_case_2014 - case 2015: - goto st_case_2015 - case 2016: - goto st_case_2016 - case 2017: - goto st_case_2017 - case 2018: - goto st_case_2018 - case 2019: - goto st_case_2019 - case 2020: - goto st_case_2020 - case 2021: - goto st_case_2021 - case 2022: - goto st_case_2022 - case 2023: - goto st_case_2023 - case 2024: - goto st_case_2024 - case 2025: - goto st_case_2025 - case 2026: - goto st_case_2026 - case 2027: - goto st_case_2027 - case 2028: - goto st_case_2028 - case 2029: - goto st_case_2029 - case 2030: - goto st_case_2030 - case 2031: - goto st_case_2031 - case 2032: - goto st_case_2032 - case 2033: - goto st_case_2033 - case 2034: - goto st_case_2034 - case 2035: - goto st_case_2035 - case 2036: - goto st_case_2036 - case 2037: - goto st_case_2037 - case 2038: - goto st_case_2038 - case 2039: - goto st_case_2039 - case 2040: - goto st_case_2040 - case 2041: - goto st_case_2041 - case 2042: - goto st_case_2042 - case 2043: - goto st_case_2043 - case 2044: - goto st_case_2044 - case 2045: - goto st_case_2045 - case 2046: - goto st_case_2046 - case 2047: - goto st_case_2047 - case 2048: - goto st_case_2048 - case 2049: - goto st_case_2049 - case 2050: - goto st_case_2050 - case 2051: - goto st_case_2051 - case 2052: - goto st_case_2052 - case 2053: - goto st_case_2053 - case 2054: - goto st_case_2054 - case 2055: - goto st_case_2055 - case 2056: - goto st_case_2056 - case 2057: - goto st_case_2057 - case 2058: - goto st_case_2058 - case 2059: - goto st_case_2059 - case 2060: - goto st_case_2060 - case 2061: - goto st_case_2061 - case 2062: - goto st_case_2062 - case 2063: - goto st_case_2063 - case 2064: - goto st_case_2064 - case 2065: - goto st_case_2065 - case 2066: - goto st_case_2066 - case 2067: - goto st_case_2067 - case 2068: - goto st_case_2068 - case 2069: - goto st_case_2069 - case 2070: - goto st_case_2070 - case 2071: - goto st_case_2071 - case 2072: - goto st_case_2072 - case 2073: - goto st_case_2073 - case 2074: - goto st_case_2074 - case 2075: - goto st_case_2075 - case 2076: - goto st_case_2076 - case 2077: - goto st_case_2077 - case 2078: - goto st_case_2078 - case 2079: - goto st_case_2079 - case 2080: - goto st_case_2080 - case 2081: - goto st_case_2081 - case 2082: - goto st_case_2082 - case 2083: - goto st_case_2083 - case 2084: - goto st_case_2084 - case 2085: - goto st_case_2085 - case 2086: - goto st_case_2086 - case 2087: - goto st_case_2087 - case 2088: - goto st_case_2088 - case 2089: - goto st_case_2089 - case 2090: - goto st_case_2090 - case 2091: - goto st_case_2091 - case 2092: - goto st_case_2092 - case 2093: - goto st_case_2093 - case 2094: - goto st_case_2094 - case 2095: - goto st_case_2095 - case 2096: - goto st_case_2096 - case 2097: - goto st_case_2097 - case 2098: - goto st_case_2098 - case 2099: - goto st_case_2099 - case 2100: - goto st_case_2100 - case 2101: - goto st_case_2101 - case 2102: - goto st_case_2102 - case 2103: - goto st_case_2103 - case 2104: - goto st_case_2104 - case 2105: - goto st_case_2105 - case 2106: - goto st_case_2106 - case 2107: - goto st_case_2107 - case 2108: - goto st_case_2108 - case 2109: - goto st_case_2109 - case 2110: - goto st_case_2110 - case 2111: - goto st_case_2111 - case 2112: - goto st_case_2112 - case 2113: - goto st_case_2113 - case 2114: - goto st_case_2114 - case 2115: - goto st_case_2115 - case 2116: - goto st_case_2116 - case 2117: - goto st_case_2117 - case 2118: - goto st_case_2118 - case 2119: - goto st_case_2119 - case 2120: - goto st_case_2120 - case 2121: - goto st_case_2121 - case 2122: - goto st_case_2122 - case 2123: - goto st_case_2123 - case 2124: - goto st_case_2124 - case 2125: - goto st_case_2125 - case 2126: - goto st_case_2126 - case 2127: - goto st_case_2127 - case 2128: - goto st_case_2128 - case 2129: - goto st_case_2129 - case 2130: - goto st_case_2130 - case 2131: - goto st_case_2131 - case 2132: - goto st_case_2132 - case 2133: - goto st_case_2133 - case 2134: - goto st_case_2134 - case 2135: - goto st_case_2135 - case 2136: - goto st_case_2136 - case 2137: - goto st_case_2137 - case 2138: - goto st_case_2138 - case 2139: - goto st_case_2139 - case 2140: - goto st_case_2140 - case 2141: - goto st_case_2141 - case 2142: - goto st_case_2142 - case 2143: - goto st_case_2143 - case 2144: - goto st_case_2144 - case 2145: - goto st_case_2145 - case 2146: - goto st_case_2146 - case 2147: - goto st_case_2147 - case 2148: - goto st_case_2148 - case 2149: - goto st_case_2149 - case 2150: - goto st_case_2150 - case 2151: - goto st_case_2151 - case 2152: - goto st_case_2152 - case 2153: - goto st_case_2153 - case 2154: - goto st_case_2154 - case 2155: - goto st_case_2155 - case 2156: - goto st_case_2156 - case 2157: - goto st_case_2157 - case 2158: - goto st_case_2158 - case 2159: - goto st_case_2159 - case 2160: - goto st_case_2160 - case 2161: - goto st_case_2161 - case 2162: - goto st_case_2162 - case 2163: - goto st_case_2163 - case 2164: - goto st_case_2164 - case 2165: - goto st_case_2165 - case 2166: - goto st_case_2166 - case 2167: - goto st_case_2167 - case 2168: - goto st_case_2168 - case 2169: - goto st_case_2169 - case 2170: - goto st_case_2170 - case 2171: - goto st_case_2171 - case 2172: - goto st_case_2172 - case 2173: - goto st_case_2173 - case 2174: - goto st_case_2174 - case 2175: - goto st_case_2175 - case 2176: - goto st_case_2176 - case 2177: - goto st_case_2177 - case 2178: - goto st_case_2178 - case 2179: - goto st_case_2179 - case 2180: - goto st_case_2180 - case 2181: - goto st_case_2181 - case 2182: - goto st_case_2182 - case 2183: - goto st_case_2183 - case 2184: - goto st_case_2184 - case 2185: - goto st_case_2185 - case 2186: - goto st_case_2186 - case 2187: - goto st_case_2187 - case 2188: - goto st_case_2188 - case 2189: - goto st_case_2189 - case 2190: - goto st_case_2190 - case 2191: - goto st_case_2191 - case 2192: - goto st_case_2192 - case 4874: - goto st_case_4874 - case 2193: - goto st_case_2193 - case 2194: - goto st_case_2194 - case 2195: - goto st_case_2195 - case 2196: - goto st_case_2196 - case 2197: - goto st_case_2197 - case 2198: - goto st_case_2198 - case 2199: - goto st_case_2199 - case 2200: - goto st_case_2200 - case 2201: - goto st_case_2201 - case 2202: - goto st_case_2202 - case 2203: - goto st_case_2203 - case 2204: - goto st_case_2204 - case 2205: - goto st_case_2205 - case 2206: - goto st_case_2206 - case 2207: - goto st_case_2207 - case 2208: - goto st_case_2208 - case 2209: - goto st_case_2209 - case 2210: - goto st_case_2210 - case 2211: - goto st_case_2211 - case 2212: - goto st_case_2212 - case 2213: - goto st_case_2213 - case 2214: - goto st_case_2214 - case 2215: - goto st_case_2215 - case 2216: - goto st_case_2216 - case 2217: - goto st_case_2217 - case 2218: - goto st_case_2218 - case 2219: - goto st_case_2219 - case 2220: - goto st_case_2220 - case 2221: - goto st_case_2221 - case 2222: - goto st_case_2222 - case 2223: - goto st_case_2223 - case 2224: - goto st_case_2224 - case 2225: - goto st_case_2225 - case 2226: - goto st_case_2226 - case 2227: - goto st_case_2227 - case 2228: - goto st_case_2228 - case 2229: - goto st_case_2229 - case 2230: - goto st_case_2230 - case 2231: - goto st_case_2231 - case 2232: - goto st_case_2232 - case 2233: - goto st_case_2233 - case 2234: - goto st_case_2234 - case 2235: - goto st_case_2235 - case 2236: - goto st_case_2236 - case 2237: - goto st_case_2237 - case 2238: - goto st_case_2238 - case 2239: - goto st_case_2239 - case 2240: - goto st_case_2240 - case 2241: - goto st_case_2241 - case 2242: - goto st_case_2242 - case 2243: - goto st_case_2243 - case 2244: - goto st_case_2244 - case 2245: - goto st_case_2245 - case 2246: - goto st_case_2246 - case 2247: - goto st_case_2247 - case 2248: - goto st_case_2248 - case 2249: - goto st_case_2249 - case 2250: - goto st_case_2250 - case 2251: - goto st_case_2251 - case 2252: - goto st_case_2252 - case 2253: - goto st_case_2253 - case 2254: - goto st_case_2254 - case 2255: - goto st_case_2255 - case 2256: - goto st_case_2256 - case 2257: - goto st_case_2257 - case 2258: - goto st_case_2258 - case 2259: - goto st_case_2259 - case 2260: - goto st_case_2260 - case 2261: - goto st_case_2261 - case 2262: - goto st_case_2262 - case 2263: - goto st_case_2263 - case 2264: - goto st_case_2264 - case 2265: - goto st_case_2265 - case 2266: - goto st_case_2266 - case 2267: - goto st_case_2267 - case 2268: - goto st_case_2268 - case 2269: - goto st_case_2269 - case 2270: - goto st_case_2270 - case 2271: - goto st_case_2271 - case 2272: - goto st_case_2272 - case 2273: - goto st_case_2273 - case 2274: - goto st_case_2274 - case 2275: - goto st_case_2275 - case 2276: - goto st_case_2276 - case 2277: - goto st_case_2277 - case 2278: - goto st_case_2278 - case 2279: - goto st_case_2279 - case 2280: - goto st_case_2280 - case 2281: - goto st_case_2281 - case 2282: - goto st_case_2282 - case 2283: - goto st_case_2283 - case 2284: - goto st_case_2284 - case 2285: - goto st_case_2285 - case 2286: - goto st_case_2286 - case 2287: - goto st_case_2287 - case 2288: - goto st_case_2288 - case 2289: - goto st_case_2289 - case 2290: - goto st_case_2290 - case 2291: - goto st_case_2291 - case 2292: - goto st_case_2292 - case 2293: - goto st_case_2293 - case 2294: - goto st_case_2294 - case 2295: - goto st_case_2295 - case 2296: - goto st_case_2296 - case 2297: - goto st_case_2297 - case 2298: - goto st_case_2298 - case 2299: - goto st_case_2299 - case 2300: - goto st_case_2300 - case 2301: - goto st_case_2301 - case 2302: - goto st_case_2302 - case 2303: - goto st_case_2303 - case 2304: - goto st_case_2304 - case 2305: - goto st_case_2305 - case 2306: - goto st_case_2306 - case 2307: - goto st_case_2307 - case 2308: - goto st_case_2308 - case 2309: - goto st_case_2309 - case 2310: - goto st_case_2310 - case 2311: - goto st_case_2311 - case 2312: - goto st_case_2312 - case 2313: - goto st_case_2313 - case 2314: - goto st_case_2314 - case 2315: - goto st_case_2315 - case 2316: - goto st_case_2316 - case 2317: - goto st_case_2317 - case 2318: - goto st_case_2318 - case 2319: - goto st_case_2319 - case 2320: - goto st_case_2320 - case 2321: - goto st_case_2321 - case 2322: - goto st_case_2322 - case 2323: - goto st_case_2323 - case 2324: - goto st_case_2324 - case 2325: - goto st_case_2325 - case 2326: - goto st_case_2326 - case 2327: - goto st_case_2327 - case 2328: - goto st_case_2328 - case 2329: - goto st_case_2329 - case 2330: - goto st_case_2330 - case 2331: - goto st_case_2331 - case 2332: - goto st_case_2332 - case 2333: - goto st_case_2333 - case 2334: - goto st_case_2334 - case 2335: - goto st_case_2335 - case 2336: - goto st_case_2336 - case 2337: - goto st_case_2337 - case 2338: - goto st_case_2338 - case 2339: - goto st_case_2339 - case 4875: - goto st_case_4875 - case 4876: - goto st_case_4876 - case 2340: - goto st_case_2340 - case 2341: - goto st_case_2341 - case 2342: - goto st_case_2342 - case 2343: - goto st_case_2343 - case 2344: - goto st_case_2344 - case 2345: - goto st_case_2345 - case 2346: - goto st_case_2346 - case 2347: - goto st_case_2347 - case 2348: - goto st_case_2348 - case 2349: - goto st_case_2349 - case 2350: - goto st_case_2350 - case 2351: - goto st_case_2351 - case 2352: - goto st_case_2352 - case 2353: - goto st_case_2353 - case 2354: - goto st_case_2354 - case 2355: - goto st_case_2355 - case 2356: - goto st_case_2356 - case 2357: - goto st_case_2357 - case 2358: - goto st_case_2358 - case 2359: - goto st_case_2359 - case 2360: - goto st_case_2360 - case 2361: - goto st_case_2361 - case 2362: - goto st_case_2362 - case 2363: - goto st_case_2363 - case 2364: - goto st_case_2364 - case 2365: - goto st_case_2365 - case 2366: - goto st_case_2366 - case 2367: - goto st_case_2367 - case 2368: - goto st_case_2368 - case 2369: - goto st_case_2369 - case 2370: - goto st_case_2370 - case 2371: - goto st_case_2371 - case 2372: - goto st_case_2372 - case 2373: - goto st_case_2373 - case 2374: - goto st_case_2374 - case 2375: - goto st_case_2375 - case 2376: - goto st_case_2376 - case 2377: - goto st_case_2377 - case 2378: - goto st_case_2378 - case 2379: - goto st_case_2379 - case 2380: - goto st_case_2380 - case 2381: - goto st_case_2381 - case 2382: - goto st_case_2382 - case 2383: - goto st_case_2383 - case 2384: - goto st_case_2384 - case 2385: - goto st_case_2385 - case 2386: - goto st_case_2386 - case 2387: - goto st_case_2387 - case 2388: - goto st_case_2388 - case 2389: - goto st_case_2389 - case 2390: - goto st_case_2390 - case 2391: - goto st_case_2391 - case 2392: - goto st_case_2392 - case 2393: - goto st_case_2393 - case 2394: - goto st_case_2394 - case 2395: - goto st_case_2395 - case 2396: - goto st_case_2396 - case 2397: - goto st_case_2397 - case 2398: - goto st_case_2398 - case 2399: - goto st_case_2399 - case 2400: - goto st_case_2400 - case 2401: - goto st_case_2401 - case 2402: - goto st_case_2402 - case 2403: - goto st_case_2403 - case 2404: - goto st_case_2404 - case 2405: - goto st_case_2405 - case 2406: - goto st_case_2406 - case 2407: - goto st_case_2407 - case 2408: - goto st_case_2408 - case 2409: - goto st_case_2409 - case 2410: - goto st_case_2410 - case 2411: - goto st_case_2411 - case 2412: - goto st_case_2412 - case 2413: - goto st_case_2413 - case 2414: - goto st_case_2414 - case 2415: - goto st_case_2415 - case 2416: - goto st_case_2416 - case 2417: - goto st_case_2417 - case 2418: - goto st_case_2418 - case 2419: - goto st_case_2419 - case 2420: - goto st_case_2420 - case 2421: - goto st_case_2421 - case 2422: - goto st_case_2422 - case 2423: - goto st_case_2423 - case 2424: - goto st_case_2424 - case 2425: - goto st_case_2425 - case 2426: - goto st_case_2426 - case 2427: - goto st_case_2427 - case 2428: - goto st_case_2428 - case 2429: - goto st_case_2429 - case 2430: - goto st_case_2430 - case 2431: - goto st_case_2431 - case 2432: - goto st_case_2432 - case 2433: - goto st_case_2433 - case 2434: - goto st_case_2434 - case 2435: - goto st_case_2435 - case 2436: - goto st_case_2436 - case 2437: - goto st_case_2437 - case 2438: - goto st_case_2438 - case 2439: - goto st_case_2439 - case 2440: - goto st_case_2440 - case 2441: - goto st_case_2441 - case 2442: - goto st_case_2442 - case 2443: - goto st_case_2443 - case 2444: - goto st_case_2444 - case 2445: - goto st_case_2445 - case 2446: - goto st_case_2446 - case 2447: - goto st_case_2447 - case 2448: - goto st_case_2448 - case 2449: - goto st_case_2449 - case 2450: - goto st_case_2450 - case 2451: - goto st_case_2451 - case 2452: - goto st_case_2452 - case 2453: - goto st_case_2453 - case 2454: - goto st_case_2454 - case 2455: - goto st_case_2455 - case 2456: - goto st_case_2456 - case 2457: - goto st_case_2457 - case 2458: - goto st_case_2458 - case 2459: - goto st_case_2459 - case 2460: - goto st_case_2460 - case 2461: - goto st_case_2461 - case 2462: - goto st_case_2462 - case 2463: - goto st_case_2463 - case 2464: - goto st_case_2464 - case 2465: - goto st_case_2465 - case 2466: - goto st_case_2466 - case 2467: - goto st_case_2467 - case 2468: - goto st_case_2468 - case 2469: - goto st_case_2469 - case 2470: - goto st_case_2470 - case 2471: - goto st_case_2471 - case 2472: - goto st_case_2472 - case 2473: - goto st_case_2473 - case 2474: - goto st_case_2474 - case 2475: - goto st_case_2475 - case 2476: - goto st_case_2476 - case 2477: - goto st_case_2477 - case 2478: - goto st_case_2478 - case 2479: - goto st_case_2479 - case 2480: - goto st_case_2480 - case 2481: - goto st_case_2481 - case 2482: - goto st_case_2482 - case 2483: - goto st_case_2483 - case 2484: - goto st_case_2484 - case 2485: - goto st_case_2485 - case 2486: - goto st_case_2486 - case 2487: - goto st_case_2487 - case 2488: - goto st_case_2488 - case 2489: - goto st_case_2489 - case 2490: - goto st_case_2490 - case 2491: - goto st_case_2491 - case 2492: - goto st_case_2492 - case 2493: - goto st_case_2493 - case 2494: - goto st_case_2494 - case 2495: - goto st_case_2495 - case 2496: - goto st_case_2496 - case 2497: - goto st_case_2497 - case 2498: - goto st_case_2498 - case 2499: - goto st_case_2499 - case 2500: - goto st_case_2500 - case 2501: - goto st_case_2501 - case 2502: - goto st_case_2502 - case 2503: - goto st_case_2503 - case 2504: - goto st_case_2504 - case 2505: - goto st_case_2505 - case 2506: - goto st_case_2506 - case 2507: - goto st_case_2507 - case 2508: - goto st_case_2508 - case 2509: - goto st_case_2509 - case 2510: - goto st_case_2510 - case 2511: - goto st_case_2511 - case 2512: - goto st_case_2512 - case 2513: - goto st_case_2513 - case 2514: - goto st_case_2514 - case 2515: - goto st_case_2515 - case 2516: - goto st_case_2516 - case 2517: - goto st_case_2517 - case 2518: - goto st_case_2518 - case 2519: - goto st_case_2519 - case 2520: - goto st_case_2520 - case 2521: - goto st_case_2521 - case 2522: - goto st_case_2522 - case 2523: - goto st_case_2523 - case 2524: - goto st_case_2524 - case 2525: - goto st_case_2525 - case 2526: - goto st_case_2526 - case 2527: - goto st_case_2527 - case 2528: - goto st_case_2528 - case 2529: - goto st_case_2529 - case 2530: - goto st_case_2530 - case 2531: - goto st_case_2531 - case 2532: - goto st_case_2532 - case 2533: - goto st_case_2533 - case 2534: - goto st_case_2534 - case 2535: - goto st_case_2535 - case 2536: - goto st_case_2536 - case 2537: - goto st_case_2537 - case 2538: - goto st_case_2538 - case 2539: - goto st_case_2539 - case 2540: - goto st_case_2540 - case 2541: - goto st_case_2541 - case 2542: - goto st_case_2542 - case 2543: - goto st_case_2543 - case 2544: - goto st_case_2544 - case 2545: - goto st_case_2545 - case 2546: - goto st_case_2546 - case 2547: - goto st_case_2547 - case 2548: - goto st_case_2548 - case 2549: - goto st_case_2549 - case 2550: - goto st_case_2550 - case 2551: - goto st_case_2551 - case 2552: - goto st_case_2552 - case 2553: - goto st_case_2553 - case 2554: - goto st_case_2554 - case 2555: - goto st_case_2555 - case 2556: - goto st_case_2556 - case 2557: - goto st_case_2557 - case 2558: - goto st_case_2558 - case 2559: - goto st_case_2559 - case 2560: - goto st_case_2560 - case 2561: - goto st_case_2561 - case 2562: - goto st_case_2562 - case 2563: - goto st_case_2563 - case 2564: - goto st_case_2564 - case 2565: - goto st_case_2565 - case 2566: - goto st_case_2566 - case 2567: - goto st_case_2567 - case 2568: - goto st_case_2568 - case 2569: - goto st_case_2569 - case 2570: - goto st_case_2570 - case 2571: - goto st_case_2571 - case 2572: - goto st_case_2572 - case 2573: - goto st_case_2573 - case 2574: - goto st_case_2574 - case 2575: - goto st_case_2575 - case 2576: - goto st_case_2576 - case 2577: - goto st_case_2577 - case 2578: - goto st_case_2578 - case 2579: - goto st_case_2579 - case 2580: - goto st_case_2580 - case 2581: - goto st_case_2581 - case 2582: - goto st_case_2582 - case 2583: - goto st_case_2583 - case 2584: - goto st_case_2584 - case 2585: - goto st_case_2585 - case 2586: - goto st_case_2586 - case 2587: - goto st_case_2587 - case 2588: - goto st_case_2588 - case 2589: - goto st_case_2589 - case 2590: - goto st_case_2590 - case 2591: - goto st_case_2591 - case 2592: - goto st_case_2592 - case 2593: - goto st_case_2593 - case 2594: - goto st_case_2594 - case 2595: - goto st_case_2595 - case 2596: - goto st_case_2596 - case 2597: - goto st_case_2597 - case 2598: - goto st_case_2598 - case 2599: - goto st_case_2599 - case 2600: - goto st_case_2600 - case 2601: - goto st_case_2601 - case 2602: - goto st_case_2602 - case 2603: - goto st_case_2603 - case 2604: - goto st_case_2604 - case 2605: - goto st_case_2605 - case 2606: - goto st_case_2606 - case 2607: - goto st_case_2607 - case 2608: - goto st_case_2608 - case 2609: - goto st_case_2609 - case 2610: - goto st_case_2610 - case 2611: - goto st_case_2611 - case 2612: - goto st_case_2612 - case 2613: - goto st_case_2613 - case 2614: - goto st_case_2614 - case 2615: - goto st_case_2615 - case 2616: - goto st_case_2616 - case 2617: - goto st_case_2617 - case 2618: - goto st_case_2618 - case 2619: - goto st_case_2619 - case 2620: - goto st_case_2620 - case 2621: - goto st_case_2621 - case 2622: - goto st_case_2622 - case 2623: - goto st_case_2623 - case 2624: - goto st_case_2624 - case 2625: - goto st_case_2625 - case 2626: - goto st_case_2626 - case 2627: - goto st_case_2627 - case 2628: - goto st_case_2628 - case 2629: - goto st_case_2629 - case 2630: - goto st_case_2630 - case 2631: - goto st_case_2631 - case 2632: - goto st_case_2632 - case 2633: - goto st_case_2633 - case 2634: - goto st_case_2634 - case 2635: - goto st_case_2635 - case 4877: - goto st_case_4877 - case 4878: - goto st_case_4878 - case 2636: - goto st_case_2636 - case 2637: - goto st_case_2637 - case 2638: - goto st_case_2638 - case 2639: - goto st_case_2639 - case 2640: - goto st_case_2640 - case 2641: - goto st_case_2641 - case 2642: - goto st_case_2642 - case 2643: - goto st_case_2643 - case 2644: - goto st_case_2644 - case 2645: - goto st_case_2645 - case 2646: - goto st_case_2646 - case 2647: - goto st_case_2647 - case 2648: - goto st_case_2648 - case 2649: - goto st_case_2649 - case 2650: - goto st_case_2650 - case 2651: - goto st_case_2651 - case 2652: - goto st_case_2652 - case 2653: - goto st_case_2653 - case 2654: - goto st_case_2654 - case 2655: - goto st_case_2655 - case 2656: - goto st_case_2656 - case 2657: - goto st_case_2657 - case 2658: - goto st_case_2658 - case 2659: - goto st_case_2659 - case 2660: - goto st_case_2660 - case 2661: - goto st_case_2661 - case 2662: - goto st_case_2662 - case 2663: - goto st_case_2663 - case 2664: - goto st_case_2664 - case 2665: - goto st_case_2665 - case 2666: - goto st_case_2666 - case 2667: - goto st_case_2667 - case 2668: - goto st_case_2668 - case 2669: - goto st_case_2669 - case 2670: - goto st_case_2670 - case 2671: - goto st_case_2671 - case 2672: - goto st_case_2672 - case 2673: - goto st_case_2673 - case 2674: - goto st_case_2674 - case 2675: - goto st_case_2675 - case 2676: - goto st_case_2676 - case 2677: - goto st_case_2677 - case 2678: - goto st_case_2678 - case 2679: - goto st_case_2679 - case 2680: - goto st_case_2680 - case 2681: - goto st_case_2681 - case 2682: - goto st_case_2682 - case 2683: - goto st_case_2683 - case 2684: - goto st_case_2684 - case 2685: - goto st_case_2685 - case 2686: - goto st_case_2686 - case 2687: - goto st_case_2687 - case 2688: - goto st_case_2688 - case 2689: - goto st_case_2689 - case 2690: - goto st_case_2690 - case 2691: - goto st_case_2691 - case 2692: - goto st_case_2692 - case 2693: - goto st_case_2693 - case 2694: - goto st_case_2694 - case 2695: - goto st_case_2695 - case 2696: - goto st_case_2696 - case 2697: - goto st_case_2697 - case 2698: - goto st_case_2698 - case 2699: - goto st_case_2699 - case 2700: - goto st_case_2700 - case 2701: - goto st_case_2701 - case 2702: - goto st_case_2702 - case 2703: - goto st_case_2703 - case 2704: - goto st_case_2704 - case 2705: - goto st_case_2705 - case 2706: - goto st_case_2706 - case 2707: - goto st_case_2707 - case 2708: - goto st_case_2708 - case 2709: - goto st_case_2709 - case 2710: - goto st_case_2710 - case 2711: - goto st_case_2711 - case 2712: - goto st_case_2712 - case 2713: - goto st_case_2713 - case 2714: - goto st_case_2714 - case 2715: - goto st_case_2715 - case 2716: - goto st_case_2716 - case 2717: - goto st_case_2717 - case 2718: - goto st_case_2718 - case 2719: - goto st_case_2719 - case 2720: - goto st_case_2720 - case 2721: - goto st_case_2721 - case 2722: - goto st_case_2722 - case 2723: - goto st_case_2723 - case 2724: - goto st_case_2724 - case 2725: - goto st_case_2725 - case 2726: - goto st_case_2726 - case 2727: - goto st_case_2727 - case 2728: - goto st_case_2728 - case 2729: - goto st_case_2729 - case 2730: - goto st_case_2730 - case 2731: - goto st_case_2731 - case 2732: - goto st_case_2732 - case 2733: - goto st_case_2733 - case 2734: - goto st_case_2734 - case 2735: - goto st_case_2735 - case 2736: - goto st_case_2736 - case 2737: - goto st_case_2737 - case 2738: - goto st_case_2738 - case 2739: - goto st_case_2739 - case 2740: - goto st_case_2740 - case 2741: - goto st_case_2741 - case 2742: - goto st_case_2742 - case 2743: - goto st_case_2743 - case 2744: - goto st_case_2744 - case 2745: - goto st_case_2745 - case 2746: - goto st_case_2746 - case 2747: - goto st_case_2747 - case 2748: - goto st_case_2748 - case 2749: - goto st_case_2749 - case 2750: - goto st_case_2750 - case 2751: - goto st_case_2751 - case 2752: - goto st_case_2752 - case 2753: - goto st_case_2753 - case 2754: - goto st_case_2754 - case 2755: - goto st_case_2755 - case 2756: - goto st_case_2756 - case 2757: - goto st_case_2757 - case 2758: - goto st_case_2758 - case 2759: - goto st_case_2759 - case 2760: - goto st_case_2760 - case 2761: - goto st_case_2761 - case 2762: - goto st_case_2762 - case 2763: - goto st_case_2763 - case 2764: - goto st_case_2764 - case 2765: - goto st_case_2765 - case 2766: - goto st_case_2766 - case 2767: - goto st_case_2767 - case 2768: - goto st_case_2768 - case 2769: - goto st_case_2769 - case 2770: - goto st_case_2770 - case 2771: - goto st_case_2771 - case 2772: - goto st_case_2772 - case 2773: - goto st_case_2773 - case 2774: - goto st_case_2774 - case 2775: - goto st_case_2775 - case 2776: - goto st_case_2776 - case 4879: - goto st_case_4879 - case 4880: - goto st_case_4880 - case 4881: - goto st_case_4881 - case 4882: - goto st_case_4882 - case 4883: - goto st_case_4883 - case 4884: - goto st_case_4884 - case 4885: - goto st_case_4885 - case 2777: - goto st_case_2777 - case 2778: - goto st_case_2778 - case 2779: - goto st_case_2779 - case 2780: - goto st_case_2780 - case 2781: - goto st_case_2781 - case 2782: - goto st_case_2782 - case 2783: - goto st_case_2783 - case 2784: - goto st_case_2784 - case 2785: - goto st_case_2785 - case 2786: - goto st_case_2786 - case 2787: - goto st_case_2787 - case 2788: - goto st_case_2788 - case 2789: - goto st_case_2789 - case 2790: - goto st_case_2790 - case 2791: - goto st_case_2791 - case 2792: - goto st_case_2792 - case 2793: - goto st_case_2793 - case 2794: - goto st_case_2794 - case 2795: - goto st_case_2795 - case 2796: - goto st_case_2796 - case 2797: - goto st_case_2797 - case 2798: - goto st_case_2798 - case 2799: - goto st_case_2799 - case 2800: - goto st_case_2800 - case 2801: - goto st_case_2801 - case 2802: - goto st_case_2802 - case 2803: - goto st_case_2803 - case 2804: - goto st_case_2804 - case 2805: - goto st_case_2805 - case 2806: - goto st_case_2806 - case 2807: - goto st_case_2807 - case 2808: - goto st_case_2808 - case 2809: - goto st_case_2809 - case 2810: - goto st_case_2810 - case 2811: - goto st_case_2811 - case 2812: - goto st_case_2812 - case 2813: - goto st_case_2813 - case 2814: - goto st_case_2814 - case 2815: - goto st_case_2815 - case 2816: - goto st_case_2816 - case 2817: - goto st_case_2817 - case 2818: - goto st_case_2818 - case 2819: - goto st_case_2819 - case 2820: - goto st_case_2820 - case 2821: - goto st_case_2821 - case 2822: - goto st_case_2822 - case 2823: - goto st_case_2823 - case 2824: - goto st_case_2824 - case 2825: - goto st_case_2825 - case 2826: - goto st_case_2826 - case 2827: - goto st_case_2827 - case 2828: - goto st_case_2828 - case 2829: - goto st_case_2829 - case 2830: - goto st_case_2830 - case 2831: - goto st_case_2831 - case 2832: - goto st_case_2832 - case 2833: - goto st_case_2833 - case 2834: - goto st_case_2834 - case 2835: - goto st_case_2835 - case 2836: - goto st_case_2836 - case 2837: - goto st_case_2837 - case 2838: - goto st_case_2838 - case 2839: - goto st_case_2839 - case 2840: - goto st_case_2840 - case 2841: - goto st_case_2841 - case 2842: - goto st_case_2842 - case 2843: - goto st_case_2843 - case 2844: - goto st_case_2844 - case 2845: - goto st_case_2845 - case 2846: - goto st_case_2846 - case 2847: - goto st_case_2847 - case 2848: - goto st_case_2848 - case 2849: - goto st_case_2849 - case 2850: - goto st_case_2850 - case 2851: - goto st_case_2851 - case 2852: - goto st_case_2852 - case 2853: - goto st_case_2853 - case 2854: - goto st_case_2854 - case 2855: - goto st_case_2855 - case 2856: - goto st_case_2856 - case 2857: - goto st_case_2857 - case 2858: - goto st_case_2858 - case 2859: - goto st_case_2859 - case 2860: - goto st_case_2860 - case 2861: - goto st_case_2861 - case 2862: - goto st_case_2862 - case 2863: - goto st_case_2863 - case 2864: - goto st_case_2864 - case 2865: - goto st_case_2865 - case 2866: - goto st_case_2866 - case 2867: - goto st_case_2867 - case 2868: - goto st_case_2868 - case 2869: - goto st_case_2869 - case 2870: - goto st_case_2870 - case 2871: - goto st_case_2871 - case 2872: - goto st_case_2872 - case 2873: - goto st_case_2873 - case 2874: - goto st_case_2874 - case 2875: - goto st_case_2875 - case 2876: - goto st_case_2876 - case 2877: - goto st_case_2877 - case 2878: - goto st_case_2878 - case 2879: - goto st_case_2879 - case 2880: - goto st_case_2880 - case 2881: - goto st_case_2881 - case 2882: - goto st_case_2882 - case 2883: - goto st_case_2883 - case 2884: - goto st_case_2884 - case 2885: - goto st_case_2885 - case 2886: - goto st_case_2886 - case 2887: - goto st_case_2887 - case 2888: - goto st_case_2888 - case 2889: - goto st_case_2889 - case 2890: - goto st_case_2890 - case 2891: - goto st_case_2891 - case 2892: - goto st_case_2892 - case 2893: - goto st_case_2893 - case 2894: - goto st_case_2894 - case 2895: - goto st_case_2895 - case 2896: - goto st_case_2896 - case 2897: - goto st_case_2897 - case 2898: - goto st_case_2898 - case 2899: - goto st_case_2899 - case 2900: - goto st_case_2900 - case 2901: - goto st_case_2901 - case 2902: - goto st_case_2902 - case 2903: - goto st_case_2903 - case 2904: - goto st_case_2904 - case 2905: - goto st_case_2905 - case 2906: - goto st_case_2906 - case 2907: - goto st_case_2907 - case 2908: - goto st_case_2908 - case 2909: - goto st_case_2909 - case 2910: - goto st_case_2910 - case 2911: - goto st_case_2911 - case 2912: - goto st_case_2912 - case 2913: - goto st_case_2913 - case 2914: - goto st_case_2914 - case 2915: - goto st_case_2915 - case 2916: - goto st_case_2916 - case 2917: - goto st_case_2917 - case 2918: - goto st_case_2918 - case 2919: - goto st_case_2919 - case 2920: - goto st_case_2920 - case 2921: - goto st_case_2921 - case 2922: - goto st_case_2922 - case 2923: - goto st_case_2923 - case 4886: - goto st_case_4886 - case 2924: - goto st_case_2924 - case 2925: - goto st_case_2925 - case 2926: - goto st_case_2926 - case 2927: - goto st_case_2927 - case 2928: - goto st_case_2928 - case 2929: - goto st_case_2929 - case 2930: - goto st_case_2930 - case 2931: - goto st_case_2931 - case 2932: - goto st_case_2932 - case 2933: - goto st_case_2933 - case 2934: - goto st_case_2934 - case 2935: - goto st_case_2935 - case 2936: - goto st_case_2936 - case 2937: - goto st_case_2937 - case 2938: - goto st_case_2938 - case 2939: - goto st_case_2939 - case 2940: - goto st_case_2940 - case 2941: - goto st_case_2941 - case 2942: - goto st_case_2942 - case 2943: - goto st_case_2943 - case 2944: - goto st_case_2944 - case 2945: - goto st_case_2945 - case 2946: - goto st_case_2946 - case 2947: - goto st_case_2947 - case 2948: - goto st_case_2948 - case 2949: - goto st_case_2949 - case 2950: - goto st_case_2950 - case 2951: - goto st_case_2951 - case 2952: - goto st_case_2952 - case 2953: - goto st_case_2953 - case 2954: - goto st_case_2954 - case 2955: - goto st_case_2955 - case 2956: - goto st_case_2956 - case 2957: - goto st_case_2957 - case 2958: - goto st_case_2958 - case 2959: - goto st_case_2959 - case 2960: - goto st_case_2960 - case 2961: - goto st_case_2961 - case 2962: - goto st_case_2962 - case 2963: - goto st_case_2963 - case 2964: - goto st_case_2964 - case 2965: - goto st_case_2965 - case 2966: - goto st_case_2966 - case 2967: - goto st_case_2967 - case 2968: - goto st_case_2968 - case 2969: - goto st_case_2969 - case 2970: - goto st_case_2970 - case 2971: - goto st_case_2971 - case 2972: - goto st_case_2972 - case 2973: - goto st_case_2973 - case 2974: - goto st_case_2974 - case 2975: - goto st_case_2975 - case 2976: - goto st_case_2976 - case 2977: - goto st_case_2977 - case 2978: - goto st_case_2978 - case 2979: - goto st_case_2979 - case 2980: - goto st_case_2980 - case 2981: - goto st_case_2981 - case 2982: - goto st_case_2982 - case 2983: - goto st_case_2983 - case 2984: - goto st_case_2984 - case 2985: - goto st_case_2985 - case 2986: - goto st_case_2986 - case 2987: - goto st_case_2987 - case 2988: - goto st_case_2988 - case 2989: - goto st_case_2989 - case 2990: - goto st_case_2990 - case 2991: - goto st_case_2991 - case 2992: - goto st_case_2992 - case 2993: - goto st_case_2993 - case 2994: - goto st_case_2994 - case 2995: - goto st_case_2995 - case 2996: - goto st_case_2996 - case 2997: - goto st_case_2997 - case 2998: - goto st_case_2998 - case 2999: - goto st_case_2999 - case 3000: - goto st_case_3000 - case 3001: - goto st_case_3001 - case 3002: - goto st_case_3002 - case 3003: - goto st_case_3003 - case 3004: - goto st_case_3004 - case 3005: - goto st_case_3005 - case 3006: - goto st_case_3006 - case 3007: - goto st_case_3007 - case 3008: - goto st_case_3008 - case 3009: - goto st_case_3009 - case 3010: - goto st_case_3010 - case 3011: - goto st_case_3011 - case 3012: - goto st_case_3012 - case 3013: - goto st_case_3013 - case 3014: - goto st_case_3014 - case 3015: - goto st_case_3015 - case 3016: - goto st_case_3016 - case 3017: - goto st_case_3017 - case 3018: - goto st_case_3018 - case 3019: - goto st_case_3019 - case 3020: - goto st_case_3020 - case 3021: - goto st_case_3021 - case 3022: - goto st_case_3022 - case 3023: - goto st_case_3023 - case 3024: - goto st_case_3024 - case 3025: - goto st_case_3025 - case 3026: - goto st_case_3026 - case 3027: - goto st_case_3027 - case 3028: - goto st_case_3028 - case 3029: - goto st_case_3029 - case 3030: - goto st_case_3030 - case 3031: - goto st_case_3031 - case 3032: - goto st_case_3032 - case 3033: - goto st_case_3033 - case 3034: - goto st_case_3034 - case 3035: - goto st_case_3035 - case 3036: - goto st_case_3036 - case 3037: - goto st_case_3037 - case 3038: - goto st_case_3038 - case 3039: - goto st_case_3039 - case 3040: - goto st_case_3040 - case 3041: - goto st_case_3041 - case 3042: - goto st_case_3042 - case 3043: - goto st_case_3043 - case 3044: - goto st_case_3044 - case 3045: - goto st_case_3045 - case 3046: - goto st_case_3046 - case 3047: - goto st_case_3047 - case 3048: - goto st_case_3048 - case 3049: - goto st_case_3049 - case 3050: - goto st_case_3050 - case 3051: - goto st_case_3051 - case 3052: - goto st_case_3052 - case 3053: - goto st_case_3053 - case 3054: - goto st_case_3054 - case 3055: - goto st_case_3055 - case 3056: - goto st_case_3056 - case 3057: - goto st_case_3057 - case 3058: - goto st_case_3058 - case 3059: - goto st_case_3059 - case 3060: - goto st_case_3060 - case 3061: - goto st_case_3061 - case 3062: - goto st_case_3062 - case 3063: - goto st_case_3063 - case 3064: - goto st_case_3064 - case 3065: - goto st_case_3065 - case 3066: - goto st_case_3066 - case 3067: - goto st_case_3067 - case 3068: - goto st_case_3068 - case 3069: - goto st_case_3069 - case 3070: - goto st_case_3070 - case 4887: - goto st_case_4887 - case 3071: - goto st_case_3071 - case 3072: - goto st_case_3072 - case 3073: - goto st_case_3073 - case 3074: - goto st_case_3074 - case 3075: - goto st_case_3075 - case 3076: - goto st_case_3076 - case 3077: - goto st_case_3077 - case 3078: - goto st_case_3078 - case 3079: - goto st_case_3079 - case 3080: - goto st_case_3080 - case 3081: - goto st_case_3081 - case 3082: - goto st_case_3082 - case 3083: - goto st_case_3083 - case 3084: - goto st_case_3084 - case 3085: - goto st_case_3085 - case 3086: - goto st_case_3086 - case 3087: - goto st_case_3087 - case 3088: - goto st_case_3088 - case 3089: - goto st_case_3089 - case 3090: - goto st_case_3090 - case 3091: - goto st_case_3091 - case 3092: - goto st_case_3092 - case 3093: - goto st_case_3093 - case 3094: - goto st_case_3094 - case 3095: - goto st_case_3095 - case 3096: - goto st_case_3096 - case 3097: - goto st_case_3097 - case 3098: - goto st_case_3098 - case 3099: - goto st_case_3099 - case 3100: - goto st_case_3100 - case 3101: - goto st_case_3101 - case 3102: - goto st_case_3102 - case 3103: - goto st_case_3103 - case 3104: - goto st_case_3104 - case 3105: - goto st_case_3105 - case 3106: - goto st_case_3106 - case 3107: - goto st_case_3107 - case 3108: - goto st_case_3108 - case 3109: - goto st_case_3109 - case 3110: - goto st_case_3110 - case 3111: - goto st_case_3111 - case 3112: - goto st_case_3112 - case 3113: - goto st_case_3113 - case 3114: - goto st_case_3114 - case 3115: - goto st_case_3115 - case 3116: - goto st_case_3116 - case 3117: - goto st_case_3117 - case 3118: - goto st_case_3118 - case 3119: - goto st_case_3119 - case 3120: - goto st_case_3120 - case 3121: - goto st_case_3121 - case 3122: - goto st_case_3122 - case 3123: - goto st_case_3123 - case 3124: - goto st_case_3124 - case 3125: - goto st_case_3125 - case 3126: - goto st_case_3126 - case 3127: - goto st_case_3127 - case 3128: - goto st_case_3128 - case 3129: - goto st_case_3129 - case 3130: - goto st_case_3130 - case 3131: - goto st_case_3131 - case 3132: - goto st_case_3132 - case 3133: - goto st_case_3133 - case 3134: - goto st_case_3134 - case 3135: - goto st_case_3135 - case 3136: - goto st_case_3136 - case 3137: - goto st_case_3137 - case 3138: - goto st_case_3138 - case 3139: - goto st_case_3139 - case 3140: - goto st_case_3140 - case 3141: - goto st_case_3141 - case 3142: - goto st_case_3142 - case 3143: - goto st_case_3143 - case 3144: - goto st_case_3144 - case 3145: - goto st_case_3145 - case 3146: - goto st_case_3146 - case 3147: - goto st_case_3147 - case 3148: - goto st_case_3148 - case 3149: - goto st_case_3149 - case 3150: - goto st_case_3150 - case 3151: - goto st_case_3151 - case 3152: - goto st_case_3152 - case 3153: - goto st_case_3153 - case 3154: - goto st_case_3154 - case 3155: - goto st_case_3155 - case 3156: - goto st_case_3156 - case 3157: - goto st_case_3157 - case 3158: - goto st_case_3158 - case 3159: - goto st_case_3159 - case 3160: - goto st_case_3160 - case 3161: - goto st_case_3161 - case 3162: - goto st_case_3162 - case 3163: - goto st_case_3163 - case 3164: - goto st_case_3164 - case 3165: - goto st_case_3165 - case 3166: - goto st_case_3166 - case 3167: - goto st_case_3167 - case 3168: - goto st_case_3168 - case 3169: - goto st_case_3169 - case 3170: - goto st_case_3170 - case 3171: - goto st_case_3171 - case 3172: - goto st_case_3172 - case 3173: - goto st_case_3173 - case 3174: - goto st_case_3174 - case 3175: - goto st_case_3175 - case 3176: - goto st_case_3176 - case 3177: - goto st_case_3177 - case 3178: - goto st_case_3178 - case 3179: - goto st_case_3179 - case 3180: - goto st_case_3180 - case 3181: - goto st_case_3181 - case 3182: - goto st_case_3182 - case 3183: - goto st_case_3183 - case 3184: - goto st_case_3184 - case 3185: - goto st_case_3185 - case 3186: - goto st_case_3186 - case 3187: - goto st_case_3187 - case 3188: - goto st_case_3188 - case 3189: - goto st_case_3189 - case 3190: - goto st_case_3190 - case 3191: - goto st_case_3191 - case 3192: - goto st_case_3192 - case 3193: - goto st_case_3193 - case 3194: - goto st_case_3194 - case 3195: - goto st_case_3195 - case 3196: - goto st_case_3196 - case 3197: - goto st_case_3197 - case 3198: - goto st_case_3198 - case 3199: - goto st_case_3199 - case 3200: - goto st_case_3200 - case 3201: - goto st_case_3201 - case 3202: - goto st_case_3202 - case 3203: - goto st_case_3203 - case 3204: - goto st_case_3204 - case 3205: - goto st_case_3205 - case 3206: - goto st_case_3206 - case 3207: - goto st_case_3207 - case 3208: - goto st_case_3208 - case 3209: - goto st_case_3209 - case 3210: - goto st_case_3210 - case 3211: - goto st_case_3211 - case 3212: - goto st_case_3212 - case 3213: - goto st_case_3213 - case 3214: - goto st_case_3214 - case 3215: - goto st_case_3215 - case 3216: - goto st_case_3216 - case 3217: - goto st_case_3217 - case 4888: - goto st_case_4888 - case 4889: - goto st_case_4889 - case 4890: - goto st_case_4890 - case 4891: - goto st_case_4891 - case 4892: - goto st_case_4892 - case 4893: - goto st_case_4893 - case 4894: - goto st_case_4894 - case 4895: - goto st_case_4895 - case 4896: - goto st_case_4896 - case 4897: - goto st_case_4897 - case 4898: - goto st_case_4898 - case 4899: - goto st_case_4899 - case 4900: - goto st_case_4900 - case 4901: - goto st_case_4901 - case 4902: - goto st_case_4902 - case 4903: - goto st_case_4903 - case 4904: - goto st_case_4904 - case 4905: - goto st_case_4905 - case 4906: - goto st_case_4906 - case 4907: - goto st_case_4907 - case 4908: - goto st_case_4908 - case 4909: - goto st_case_4909 - case 4910: - goto st_case_4910 - case 4911: - goto st_case_4911 - case 4912: - goto st_case_4912 - case 4913: - goto st_case_4913 - case 4914: - goto st_case_4914 - case 4915: - goto st_case_4915 - case 4916: - goto st_case_4916 - case 4917: - goto st_case_4917 - case 4918: - goto st_case_4918 - case 4919: - goto st_case_4919 - case 4920: - goto st_case_4920 - case 4921: - goto st_case_4921 - case 4922: - goto st_case_4922 - case 4923: - goto st_case_4923 - case 4924: - goto st_case_4924 - case 4925: - goto st_case_4925 - case 4926: - goto st_case_4926 - case 4927: - goto st_case_4927 - case 4928: - goto st_case_4928 - case 3218: - goto st_case_3218 - case 3219: - goto st_case_3219 - case 3220: - goto st_case_3220 - case 3221: - goto st_case_3221 - case 3222: - goto st_case_3222 - case 3223: - goto st_case_3223 - case 3224: - goto st_case_3224 - case 3225: - goto st_case_3225 - case 3226: - goto st_case_3226 - case 3227: - goto st_case_3227 - case 3228: - goto st_case_3228 - case 3229: - goto st_case_3229 - case 3230: - goto st_case_3230 - case 3231: - goto st_case_3231 - case 4929: - goto st_case_4929 - case 4930: - goto st_case_4930 - case 4931: - goto st_case_4931 - case 4932: - goto st_case_4932 - case 3232: - goto st_case_3232 - case 4933: - goto st_case_4933 - case 4934: - goto st_case_4934 - case 4935: - goto st_case_4935 - case 4936: - goto st_case_4936 - case 4937: - goto st_case_4937 - case 4938: - goto st_case_4938 - case 4939: - goto st_case_4939 - case 4940: - goto st_case_4940 - case 4941: - goto st_case_4941 - case 4942: - goto st_case_4942 - case 4943: - goto st_case_4943 - case 4944: - goto st_case_4944 - case 4945: - goto st_case_4945 - case 4946: - goto st_case_4946 - case 4947: - goto st_case_4947 - case 4948: - goto st_case_4948 - case 4949: - goto st_case_4949 - case 4950: - goto st_case_4950 - case 4951: - goto st_case_4951 - case 4952: - goto st_case_4952 - case 4953: - goto st_case_4953 - case 4954: - goto st_case_4954 - case 4955: - goto st_case_4955 - case 4956: - goto st_case_4956 - case 4957: - goto st_case_4957 - case 3233: - goto st_case_3233 - case 4958: - goto st_case_4958 - case 4959: - goto st_case_4959 - case 4960: - goto st_case_4960 - case 4961: - goto st_case_4961 - case 4962: - goto st_case_4962 - case 4963: - goto st_case_4963 - case 3234: - goto st_case_3234 - case 4964: - goto st_case_4964 - case 4965: - goto st_case_4965 - case 3235: - goto st_case_3235 - case 4966: - goto st_case_4966 - case 4967: - goto st_case_4967 - case 4968: - goto st_case_4968 - case 4969: - goto st_case_4969 - case 4970: - goto st_case_4970 - case 4971: - goto st_case_4971 - case 4972: - goto st_case_4972 - case 4973: - goto st_case_4973 - case 4974: - goto st_case_4974 - case 4975: - goto st_case_4975 - case 4976: - goto st_case_4976 - case 4977: - goto st_case_4977 - case 4978: - goto st_case_4978 - case 4979: - goto st_case_4979 - case 4980: - goto st_case_4980 - case 3236: - goto st_case_3236 - case 4981: - goto st_case_4981 - case 4982: - goto st_case_4982 - case 4983: - goto st_case_4983 - case 3237: - goto st_case_3237 - case 4984: - goto st_case_4984 - case 4985: - goto st_case_4985 - case 4986: - goto st_case_4986 - case 4987: - goto st_case_4987 - case 4988: - goto st_case_4988 - case 4989: - goto st_case_4989 - case 3238: - goto st_case_3238 - case 4990: - goto st_case_4990 - case 4991: - goto st_case_4991 - case 4992: - goto st_case_4992 - case 4993: - goto st_case_4993 - case 4994: - goto st_case_4994 - case 4995: - goto st_case_4995 - case 4996: - goto st_case_4996 - case 4997: - goto st_case_4997 - case 4998: - goto st_case_4998 - case 4999: - goto st_case_4999 - case 5000: - goto st_case_5000 - case 5001: - goto st_case_5001 - case 5002: - goto st_case_5002 - case 5003: - goto st_case_5003 - case 5004: - goto st_case_5004 - case 5005: - goto st_case_5005 - case 5006: - goto st_case_5006 - case 5007: - goto st_case_5007 - case 5008: - goto st_case_5008 - case 5009: - goto st_case_5009 - case 5010: - goto st_case_5010 - case 5011: - goto st_case_5011 - case 5012: - goto st_case_5012 - case 5013: - goto st_case_5013 - case 5014: - goto st_case_5014 - case 5015: - goto st_case_5015 - case 5016: - goto st_case_5016 - case 5017: - goto st_case_5017 - case 5018: - goto st_case_5018 - case 5019: - goto st_case_5019 - case 5020: - goto st_case_5020 - case 5021: - goto st_case_5021 - case 5022: - goto st_case_5022 - case 5023: - goto st_case_5023 - case 5024: - goto st_case_5024 - case 5025: - goto st_case_5025 - case 5026: - goto st_case_5026 - case 5027: - goto st_case_5027 - case 5028: - goto st_case_5028 - case 5029: - goto st_case_5029 - case 5030: - goto st_case_5030 - case 5031: - goto st_case_5031 - case 5032: - goto st_case_5032 - case 5033: - goto st_case_5033 - case 5034: - goto st_case_5034 - case 5035: - goto st_case_5035 - case 5036: - goto st_case_5036 - case 5037: - goto st_case_5037 - case 5038: - goto st_case_5038 - case 5039: - goto st_case_5039 - case 5040: - goto st_case_5040 - case 5041: - goto st_case_5041 - case 5042: - goto st_case_5042 - case 5043: - goto st_case_5043 - case 5044: - goto st_case_5044 - case 5045: - goto st_case_5045 - case 5046: - goto st_case_5046 - case 5047: - goto st_case_5047 - case 5048: - goto st_case_5048 - case 5049: - goto st_case_5049 - case 5050: - goto st_case_5050 - case 5051: - goto st_case_5051 - case 5052: - goto st_case_5052 - case 5053: - goto st_case_5053 - case 5054: - goto st_case_5054 - case 5055: - goto st_case_5055 - case 5056: - goto st_case_5056 - case 5057: - goto st_case_5057 - case 5058: - goto st_case_5058 - case 5059: - goto st_case_5059 - case 5060: - goto st_case_5060 - case 5061: - goto st_case_5061 - case 5062: - goto st_case_5062 - case 5063: - goto st_case_5063 - case 5064: - goto st_case_5064 - case 5065: - goto st_case_5065 - case 5066: - goto st_case_5066 - case 5067: - goto st_case_5067 - case 5068: - goto st_case_5068 - case 5069: - goto st_case_5069 - case 5070: - goto st_case_5070 - case 5071: - goto st_case_5071 - case 3239: - goto st_case_3239 - case 3240: - goto st_case_3240 - case 3241: - goto st_case_3241 - case 3242: - goto st_case_3242 - case 3243: - goto st_case_3243 - case 3244: - goto st_case_3244 - case 3245: - goto st_case_3245 - case 3246: - goto st_case_3246 - case 3247: - goto st_case_3247 - case 3248: - goto st_case_3248 - case 3249: - goto st_case_3249 - case 3250: - goto st_case_3250 - case 3251: - goto st_case_3251 - case 3252: - goto st_case_3252 - case 3253: - goto st_case_3253 - case 3254: - goto st_case_3254 - case 3255: - goto st_case_3255 - case 3256: - goto st_case_3256 - case 3257: - goto st_case_3257 - case 3258: - goto st_case_3258 - case 3259: - goto st_case_3259 - case 3260: - goto st_case_3260 - case 3261: - goto st_case_3261 - case 3262: - goto st_case_3262 - case 3263: - goto st_case_3263 - case 3264: - goto st_case_3264 - case 3265: - goto st_case_3265 - case 5072: - goto st_case_5072 - case 3266: - goto st_case_3266 - case 3267: - goto st_case_3267 - case 3268: - goto st_case_3268 - case 5073: - goto st_case_5073 - case 3269: - goto st_case_3269 - case 3270: - goto st_case_3270 - case 3271: - goto st_case_3271 - case 3272: - goto st_case_3272 - case 3273: - goto st_case_3273 - case 3274: - goto st_case_3274 - case 3275: - goto st_case_3275 - case 3276: - goto st_case_3276 - case 3277: - goto st_case_3277 - case 3278: - goto st_case_3278 - case 3279: - goto st_case_3279 - case 3280: - goto st_case_3280 - case 3281: - goto st_case_3281 - case 3282: - goto st_case_3282 - case 3283: - goto st_case_3283 - case 3284: - goto st_case_3284 - case 3285: - goto st_case_3285 - case 3286: - goto st_case_3286 - case 3287: - goto st_case_3287 - case 3288: - goto st_case_3288 - case 3289: - goto st_case_3289 - case 3290: - goto st_case_3290 - case 3291: - goto st_case_3291 - case 3292: - goto st_case_3292 - case 3293: - goto st_case_3293 - case 3294: - goto st_case_3294 - case 3295: - goto st_case_3295 - case 3296: - goto st_case_3296 - case 3297: - goto st_case_3297 - case 3298: - goto st_case_3298 - case 3299: - goto st_case_3299 - case 3300: - goto st_case_3300 - case 3301: - goto st_case_3301 - case 3302: - goto st_case_3302 - case 3303: - goto st_case_3303 - case 3304: - goto st_case_3304 - case 3305: - goto st_case_3305 - case 3306: - goto st_case_3306 - case 3307: - goto st_case_3307 - case 3308: - goto st_case_3308 - case 3309: - goto st_case_3309 - case 3310: - goto st_case_3310 - case 3311: - goto st_case_3311 - case 3312: - goto st_case_3312 - case 3313: - goto st_case_3313 - case 3314: - goto st_case_3314 - case 3315: - goto st_case_3315 - case 3316: - goto st_case_3316 - case 3317: - goto st_case_3317 - case 3318: - goto st_case_3318 - case 3319: - goto st_case_3319 - case 3320: - goto st_case_3320 - case 3321: - goto st_case_3321 - case 3322: - goto st_case_3322 - case 3323: - goto st_case_3323 - case 3324: - goto st_case_3324 - case 3325: - goto st_case_3325 - case 3326: - goto st_case_3326 - case 3327: - goto st_case_3327 - case 3328: - goto st_case_3328 - case 3329: - goto st_case_3329 - case 3330: - goto st_case_3330 - case 3331: - goto st_case_3331 - case 3332: - goto st_case_3332 - case 3333: - goto st_case_3333 - case 3334: - goto st_case_3334 - case 3335: - goto st_case_3335 - case 3336: - goto st_case_3336 - case 3337: - goto st_case_3337 - case 3338: - goto st_case_3338 - case 3339: - goto st_case_3339 - case 3340: - goto st_case_3340 - case 3341: - goto st_case_3341 - case 3342: - goto st_case_3342 - case 3343: - goto st_case_3343 - case 3344: - goto st_case_3344 - case 3345: - goto st_case_3345 - case 3346: - goto st_case_3346 - case 3347: - goto st_case_3347 - case 3348: - goto st_case_3348 - case 3349: - goto st_case_3349 - case 3350: - goto st_case_3350 - case 5074: - goto st_case_5074 - case 3351: - goto st_case_3351 - case 3352: - goto st_case_3352 - case 3353: - goto st_case_3353 - case 3354: - goto st_case_3354 - case 3355: - goto st_case_3355 - case 3356: - goto st_case_3356 - case 3357: - goto st_case_3357 - case 3358: - goto st_case_3358 - case 3359: - goto st_case_3359 - case 3360: - goto st_case_3360 - case 3361: - goto st_case_3361 - case 3362: - goto st_case_3362 - case 3363: - goto st_case_3363 - case 3364: - goto st_case_3364 - case 3365: - goto st_case_3365 - case 3366: - goto st_case_3366 - case 3367: - goto st_case_3367 - case 3368: - goto st_case_3368 - case 3369: - goto st_case_3369 - case 3370: - goto st_case_3370 - case 3371: - goto st_case_3371 - case 3372: - goto st_case_3372 - case 3373: - goto st_case_3373 - case 3374: - goto st_case_3374 - case 3375: - goto st_case_3375 - case 3376: - goto st_case_3376 - case 3377: - goto st_case_3377 - case 3378: - goto st_case_3378 - case 3379: - goto st_case_3379 - case 3380: - goto st_case_3380 - case 3381: - goto st_case_3381 - case 3382: - goto st_case_3382 - case 3383: - goto st_case_3383 - case 3384: - goto st_case_3384 - case 3385: - goto st_case_3385 - case 3386: - goto st_case_3386 - case 3387: - goto st_case_3387 - case 3388: - goto st_case_3388 - case 3389: - goto st_case_3389 - case 3390: - goto st_case_3390 - case 3391: - goto st_case_3391 - case 3392: - goto st_case_3392 - case 3393: - goto st_case_3393 - case 3394: - goto st_case_3394 - case 3395: - goto st_case_3395 - case 3396: - goto st_case_3396 - case 3397: - goto st_case_3397 - case 3398: - goto st_case_3398 - case 3399: - goto st_case_3399 - case 3400: - goto st_case_3400 - case 3401: - goto st_case_3401 - case 3402: - goto st_case_3402 - case 3403: - goto st_case_3403 - case 3404: - goto st_case_3404 - case 3405: - goto st_case_3405 - case 3406: - goto st_case_3406 - case 3407: - goto st_case_3407 - case 3408: - goto st_case_3408 - case 3409: - goto st_case_3409 - case 3410: - goto st_case_3410 - case 3411: - goto st_case_3411 - case 3412: - goto st_case_3412 - case 3413: - goto st_case_3413 - case 3414: - goto st_case_3414 - case 3415: - goto st_case_3415 - case 3416: - goto st_case_3416 - case 3417: - goto st_case_3417 - case 3418: - goto st_case_3418 - case 3419: - goto st_case_3419 - case 3420: - goto st_case_3420 - case 3421: - goto st_case_3421 - case 3422: - goto st_case_3422 - case 3423: - goto st_case_3423 - case 3424: - goto st_case_3424 - case 3425: - goto st_case_3425 - case 3426: - goto st_case_3426 - case 3427: - goto st_case_3427 - case 3428: - goto st_case_3428 - case 3429: - goto st_case_3429 - case 3430: - goto st_case_3430 - case 3431: - goto st_case_3431 - case 3432: - goto st_case_3432 - case 3433: - goto st_case_3433 - case 3434: - goto st_case_3434 - case 3435: - goto st_case_3435 - case 3436: - goto st_case_3436 - case 3437: - goto st_case_3437 - case 3438: - goto st_case_3438 - case 3439: - goto st_case_3439 - case 3440: - goto st_case_3440 - case 3441: - goto st_case_3441 - case 3442: - goto st_case_3442 - case 3443: - goto st_case_3443 - case 3444: - goto st_case_3444 - case 3445: - goto st_case_3445 - case 3446: - goto st_case_3446 - case 3447: - goto st_case_3447 - case 3448: - goto st_case_3448 - case 3449: - goto st_case_3449 - case 3450: - goto st_case_3450 - case 3451: - goto st_case_3451 - case 3452: - goto st_case_3452 - case 3453: - goto st_case_3453 - case 3454: - goto st_case_3454 - case 3455: - goto st_case_3455 - case 3456: - goto st_case_3456 - case 3457: - goto st_case_3457 - case 3458: - goto st_case_3458 - case 3459: - goto st_case_3459 - case 3460: - goto st_case_3460 - case 3461: - goto st_case_3461 - case 3462: - goto st_case_3462 - case 3463: - goto st_case_3463 - case 3464: - goto st_case_3464 - case 3465: - goto st_case_3465 - case 3466: - goto st_case_3466 - case 3467: - goto st_case_3467 - case 3468: - goto st_case_3468 - case 3469: - goto st_case_3469 - case 3470: - goto st_case_3470 - case 3471: - goto st_case_3471 - case 3472: - goto st_case_3472 - case 3473: - goto st_case_3473 - case 3474: - goto st_case_3474 - case 3475: - goto st_case_3475 - case 3476: - goto st_case_3476 - case 3477: - goto st_case_3477 - case 3478: - goto st_case_3478 - case 3479: - goto st_case_3479 - case 3480: - goto st_case_3480 - case 3481: - goto st_case_3481 - case 3482: - goto st_case_3482 - case 3483: - goto st_case_3483 - case 3484: - goto st_case_3484 - case 3485: - goto st_case_3485 - case 3486: - goto st_case_3486 - case 3487: - goto st_case_3487 - case 3488: - goto st_case_3488 - case 3489: - goto st_case_3489 - case 3490: - goto st_case_3490 - case 3491: - goto st_case_3491 - case 3492: - goto st_case_3492 - case 3493: - goto st_case_3493 - case 3494: - goto st_case_3494 - case 3495: - goto st_case_3495 - case 3496: - goto st_case_3496 - case 3497: - goto st_case_3497 - case 3498: - goto st_case_3498 - case 3499: - goto st_case_3499 - case 3500: - goto st_case_3500 - case 3501: - goto st_case_3501 - case 3502: - goto st_case_3502 - case 3503: - goto st_case_3503 - case 3504: - goto st_case_3504 - case 3505: - goto st_case_3505 - case 3506: - goto st_case_3506 - case 3507: - goto st_case_3507 - case 3508: - goto st_case_3508 - case 3509: - goto st_case_3509 - case 3510: - goto st_case_3510 - case 3511: - goto st_case_3511 - case 3512: - goto st_case_3512 - case 3513: - goto st_case_3513 - case 3514: - goto st_case_3514 - case 3515: - goto st_case_3515 - case 3516: - goto st_case_3516 - case 3517: - goto st_case_3517 - case 3518: - goto st_case_3518 - case 3519: - goto st_case_3519 - case 3520: - goto st_case_3520 - case 3521: - goto st_case_3521 - case 3522: - goto st_case_3522 - case 3523: - goto st_case_3523 - case 3524: - goto st_case_3524 - case 3525: - goto st_case_3525 - case 3526: - goto st_case_3526 - case 3527: - goto st_case_3527 - case 3528: - goto st_case_3528 - case 3529: - goto st_case_3529 - case 3530: - goto st_case_3530 - case 3531: - goto st_case_3531 - case 3532: - goto st_case_3532 - case 3533: - goto st_case_3533 - case 3534: - goto st_case_3534 - case 3535: - goto st_case_3535 - case 3536: - goto st_case_3536 - case 3537: - goto st_case_3537 - case 3538: - goto st_case_3538 - case 3539: - goto st_case_3539 - case 3540: - goto st_case_3540 - case 3541: - goto st_case_3541 - case 3542: - goto st_case_3542 - case 3543: - goto st_case_3543 - case 3544: - goto st_case_3544 - case 3545: - goto st_case_3545 - case 3546: - goto st_case_3546 - case 3547: - goto st_case_3547 - case 3548: - goto st_case_3548 - case 3549: - goto st_case_3549 - case 3550: - goto st_case_3550 - case 3551: - goto st_case_3551 - case 3552: - goto st_case_3552 - case 3553: - goto st_case_3553 - case 3554: - goto st_case_3554 - case 3555: - goto st_case_3555 - case 3556: - goto st_case_3556 - case 3557: - goto st_case_3557 - case 3558: - goto st_case_3558 - case 3559: - goto st_case_3559 - case 3560: - goto st_case_3560 - case 3561: - goto st_case_3561 - case 3562: - goto st_case_3562 - case 3563: - goto st_case_3563 - case 3564: - goto st_case_3564 - case 3565: - goto st_case_3565 - case 3566: - goto st_case_3566 - case 3567: - goto st_case_3567 - case 3568: - goto st_case_3568 - case 3569: - goto st_case_3569 - case 3570: - goto st_case_3570 - case 3571: - goto st_case_3571 - case 3572: - goto st_case_3572 - case 3573: - goto st_case_3573 - case 3574: - goto st_case_3574 - case 3575: - goto st_case_3575 - case 3576: - goto st_case_3576 - case 3577: - goto st_case_3577 - case 3578: - goto st_case_3578 - case 3579: - goto st_case_3579 - case 3580: - goto st_case_3580 - case 3581: - goto st_case_3581 - case 3582: - goto st_case_3582 - case 3583: - goto st_case_3583 - case 3584: - goto st_case_3584 - case 3585: - goto st_case_3585 - case 3586: - goto st_case_3586 - case 3587: - goto st_case_3587 - case 5075: - goto st_case_5075 - case 3588: - goto st_case_3588 - case 3589: - goto st_case_3589 - case 3590: - goto st_case_3590 - case 3591: - goto st_case_3591 - case 3592: - goto st_case_3592 - case 3593: - goto st_case_3593 - case 5076: - goto st_case_5076 - case 3594: - goto st_case_3594 - case 3595: - goto st_case_3595 - case 3596: - goto st_case_3596 - case 3597: - goto st_case_3597 - case 3598: - goto st_case_3598 - case 3599: - goto st_case_3599 - case 3600: - goto st_case_3600 - case 3601: - goto st_case_3601 - case 3602: - goto st_case_3602 - case 3603: - goto st_case_3603 - case 3604: - goto st_case_3604 - case 3605: - goto st_case_3605 - case 3606: - goto st_case_3606 - case 3607: - goto st_case_3607 - case 3608: - goto st_case_3608 - case 3609: - goto st_case_3609 - case 3610: - goto st_case_3610 - case 3611: - goto st_case_3611 - case 3612: - goto st_case_3612 - case 3613: - goto st_case_3613 - case 3614: - goto st_case_3614 - case 3615: - goto st_case_3615 - case 3616: - goto st_case_3616 - case 3617: - goto st_case_3617 - case 3618: - goto st_case_3618 - case 3619: - goto st_case_3619 - case 3620: - goto st_case_3620 - case 3621: - goto st_case_3621 - case 3622: - goto st_case_3622 - case 3623: - goto st_case_3623 - case 3624: - goto st_case_3624 - case 3625: - goto st_case_3625 - case 3626: - goto st_case_3626 - case 3627: - goto st_case_3627 - case 3628: - goto st_case_3628 - case 3629: - goto st_case_3629 - case 3630: - goto st_case_3630 - case 3631: - goto st_case_3631 - case 3632: - goto st_case_3632 - case 3633: - goto st_case_3633 - case 3634: - goto st_case_3634 - case 3635: - goto st_case_3635 - case 3636: - goto st_case_3636 - case 3637: - goto st_case_3637 - case 3638: - goto st_case_3638 - case 3639: - goto st_case_3639 - case 3640: - goto st_case_3640 - case 3641: - goto st_case_3641 - case 3642: - goto st_case_3642 - case 3643: - goto st_case_3643 - case 3644: - goto st_case_3644 - case 3645: - goto st_case_3645 - case 3646: - goto st_case_3646 - case 3647: - goto st_case_3647 - case 3648: - goto st_case_3648 - case 3649: - goto st_case_3649 - case 3650: - goto st_case_3650 - case 3651: - goto st_case_3651 - case 3652: - goto st_case_3652 - case 3653: - goto st_case_3653 - case 3654: - goto st_case_3654 - case 3655: - goto st_case_3655 - case 3656: - goto st_case_3656 - case 3657: - goto st_case_3657 - case 3658: - goto st_case_3658 - case 3659: - goto st_case_3659 - case 3660: - goto st_case_3660 - case 3661: - goto st_case_3661 - case 3662: - goto st_case_3662 - case 3663: - goto st_case_3663 - case 3664: - goto st_case_3664 - case 3665: - goto st_case_3665 - case 3666: - goto st_case_3666 - case 3667: - goto st_case_3667 - case 3668: - goto st_case_3668 - case 3669: - goto st_case_3669 - case 3670: - goto st_case_3670 - case 3671: - goto st_case_3671 - case 3672: - goto st_case_3672 - case 3673: - goto st_case_3673 - case 3674: - goto st_case_3674 - case 3675: - goto st_case_3675 - case 3676: - goto st_case_3676 - case 3677: - goto st_case_3677 - case 3678: - goto st_case_3678 - case 3679: - goto st_case_3679 - case 3680: - goto st_case_3680 - case 3681: - goto st_case_3681 - case 3682: - goto st_case_3682 - case 3683: - goto st_case_3683 - case 3684: - goto st_case_3684 - case 3685: - goto st_case_3685 - case 3686: - goto st_case_3686 - case 3687: - goto st_case_3687 - case 3688: - goto st_case_3688 - case 3689: - goto st_case_3689 - case 3690: - goto st_case_3690 - case 3691: - goto st_case_3691 - case 3692: - goto st_case_3692 - case 3693: - goto st_case_3693 - case 3694: - goto st_case_3694 - case 3695: - goto st_case_3695 - case 3696: - goto st_case_3696 - case 3697: - goto st_case_3697 - case 3698: - goto st_case_3698 - case 3699: - goto st_case_3699 - case 3700: - goto st_case_3700 - case 3701: - goto st_case_3701 - case 3702: - goto st_case_3702 - case 3703: - goto st_case_3703 - case 3704: - goto st_case_3704 - case 3705: - goto st_case_3705 - case 3706: - goto st_case_3706 - case 3707: - goto st_case_3707 - case 3708: - goto st_case_3708 - case 3709: - goto st_case_3709 - case 3710: - goto st_case_3710 - case 3711: - goto st_case_3711 - case 3712: - goto st_case_3712 - case 3713: - goto st_case_3713 - case 3714: - goto st_case_3714 - case 3715: - goto st_case_3715 - case 3716: - goto st_case_3716 - case 3717: - goto st_case_3717 - case 3718: - goto st_case_3718 - case 3719: - goto st_case_3719 - case 3720: - goto st_case_3720 - case 3721: - goto st_case_3721 - case 3722: - goto st_case_3722 - case 3723: - goto st_case_3723 - case 3724: - goto st_case_3724 - case 3725: - goto st_case_3725 - case 3726: - goto st_case_3726 - case 3727: - goto st_case_3727 - case 3728: - goto st_case_3728 - case 3729: - goto st_case_3729 - case 3730: - goto st_case_3730 - case 3731: - goto st_case_3731 - case 3732: - goto st_case_3732 - case 3733: - goto st_case_3733 - case 3734: - goto st_case_3734 - case 3735: - goto st_case_3735 - case 3736: - goto st_case_3736 - case 5077: - goto st_case_5077 - case 3737: - goto st_case_3737 - case 5078: - goto st_case_5078 - case 3738: - goto st_case_3738 - case 3739: - goto st_case_3739 - case 3740: - goto st_case_3740 - case 3741: - goto st_case_3741 - case 3742: - goto st_case_3742 - case 3743: - goto st_case_3743 - case 3744: - goto st_case_3744 - case 3745: - goto st_case_3745 - case 3746: - goto st_case_3746 - case 3747: - goto st_case_3747 - case 3748: - goto st_case_3748 - case 3749: - goto st_case_3749 - case 3750: - goto st_case_3750 - case 3751: - goto st_case_3751 - case 3752: - goto st_case_3752 - case 3753: - goto st_case_3753 - case 3754: - goto st_case_3754 - case 3755: - goto st_case_3755 - case 3756: - goto st_case_3756 - case 3757: - goto st_case_3757 - case 3758: - goto st_case_3758 - case 3759: - goto st_case_3759 - case 3760: - goto st_case_3760 - case 3761: - goto st_case_3761 - case 3762: - goto st_case_3762 - case 3763: - goto st_case_3763 - case 3764: - goto st_case_3764 - case 3765: - goto st_case_3765 - case 3766: - goto st_case_3766 - case 3767: - goto st_case_3767 - case 3768: - goto st_case_3768 - case 3769: - goto st_case_3769 - case 3770: - goto st_case_3770 - case 3771: - goto st_case_3771 - case 3772: - goto st_case_3772 - case 3773: - goto st_case_3773 - case 3774: - goto st_case_3774 - case 3775: - goto st_case_3775 - case 3776: - goto st_case_3776 - case 3777: - goto st_case_3777 - case 3778: - goto st_case_3778 - case 3779: - goto st_case_3779 - case 3780: - goto st_case_3780 - case 3781: - goto st_case_3781 - case 3782: - goto st_case_3782 - case 3783: - goto st_case_3783 - case 3784: - goto st_case_3784 - case 3785: - goto st_case_3785 - case 3786: - goto st_case_3786 - case 3787: - goto st_case_3787 - case 3788: - goto st_case_3788 - case 3789: - goto st_case_3789 - case 3790: - goto st_case_3790 - case 3791: - goto st_case_3791 - case 3792: - goto st_case_3792 - case 3793: - goto st_case_3793 - case 3794: - goto st_case_3794 - case 3795: - goto st_case_3795 - case 3796: - goto st_case_3796 - case 3797: - goto st_case_3797 - case 3798: - goto st_case_3798 - case 3799: - goto st_case_3799 - case 3800: - goto st_case_3800 - case 3801: - goto st_case_3801 - case 3802: - goto st_case_3802 - case 3803: - goto st_case_3803 - case 3804: - goto st_case_3804 - case 3805: - goto st_case_3805 - case 3806: - goto st_case_3806 - case 3807: - goto st_case_3807 - case 3808: - goto st_case_3808 - case 3809: - goto st_case_3809 - case 3810: - goto st_case_3810 - case 3811: - goto st_case_3811 - case 3812: - goto st_case_3812 - case 3813: - goto st_case_3813 - case 3814: - goto st_case_3814 - case 3815: - goto st_case_3815 - case 3816: - goto st_case_3816 - case 3817: - goto st_case_3817 - case 3818: - goto st_case_3818 - case 3819: - goto st_case_3819 - case 3820: - goto st_case_3820 - case 3821: - goto st_case_3821 - case 3822: - goto st_case_3822 - case 3823: - goto st_case_3823 - case 3824: - goto st_case_3824 - case 3825: - goto st_case_3825 - case 3826: - goto st_case_3826 - case 3827: - goto st_case_3827 - case 3828: - goto st_case_3828 - case 3829: - goto st_case_3829 - case 3830: - goto st_case_3830 - case 3831: - goto st_case_3831 - case 3832: - goto st_case_3832 - case 3833: - goto st_case_3833 - case 3834: - goto st_case_3834 - case 3835: - goto st_case_3835 - case 3836: - goto st_case_3836 - case 3837: - goto st_case_3837 - case 3838: - goto st_case_3838 - case 3839: - goto st_case_3839 - case 3840: - goto st_case_3840 - case 3841: - goto st_case_3841 - case 3842: - goto st_case_3842 - case 3843: - goto st_case_3843 - case 3844: - goto st_case_3844 - case 3845: - goto st_case_3845 - case 3846: - goto st_case_3846 - case 3847: - goto st_case_3847 - case 3848: - goto st_case_3848 - case 3849: - goto st_case_3849 - case 3850: - goto st_case_3850 - case 3851: - goto st_case_3851 - case 3852: - goto st_case_3852 - case 3853: - goto st_case_3853 - case 3854: - goto st_case_3854 - case 3855: - goto st_case_3855 - case 3856: - goto st_case_3856 - case 3857: - goto st_case_3857 - case 3858: - goto st_case_3858 - case 3859: - goto st_case_3859 - case 3860: - goto st_case_3860 - case 3861: - goto st_case_3861 - case 3862: - goto st_case_3862 - case 3863: - goto st_case_3863 - case 3864: - goto st_case_3864 - case 3865: - goto st_case_3865 - case 3866: - goto st_case_3866 - case 3867: - goto st_case_3867 - case 3868: - goto st_case_3868 - case 3869: - goto st_case_3869 - case 3870: - goto st_case_3870 - case 3871: - goto st_case_3871 - case 3872: - goto st_case_3872 - case 3873: - goto st_case_3873 - case 3874: - goto st_case_3874 - case 3875: - goto st_case_3875 - case 3876: - goto st_case_3876 - case 3877: - goto st_case_3877 - case 3878: - goto st_case_3878 - case 3879: - goto st_case_3879 - case 3880: - goto st_case_3880 - case 3881: - goto st_case_3881 - case 3882: - goto st_case_3882 - case 3883: - goto st_case_3883 - case 3884: - goto st_case_3884 - case 5079: - goto st_case_5079 - case 3885: - goto st_case_3885 - case 3886: - goto st_case_3886 - case 3887: - goto st_case_3887 - case 3888: - goto st_case_3888 - case 3889: - goto st_case_3889 - case 3890: - goto st_case_3890 - case 3891: - goto st_case_3891 - case 3892: - goto st_case_3892 - case 3893: - goto st_case_3893 - case 3894: - goto st_case_3894 - case 3895: - goto st_case_3895 - case 3896: - goto st_case_3896 - case 3897: - goto st_case_3897 - case 3898: - goto st_case_3898 - case 3899: - goto st_case_3899 - case 3900: - goto st_case_3900 - case 3901: - goto st_case_3901 - case 3902: - goto st_case_3902 - case 3903: - goto st_case_3903 - case 3904: - goto st_case_3904 - case 3905: - goto st_case_3905 - case 3906: - goto st_case_3906 - case 3907: - goto st_case_3907 - case 3908: - goto st_case_3908 - case 3909: - goto st_case_3909 - case 3910: - goto st_case_3910 - case 3911: - goto st_case_3911 - case 3912: - goto st_case_3912 - case 3913: - goto st_case_3913 - case 3914: - goto st_case_3914 - case 3915: - goto st_case_3915 - case 3916: - goto st_case_3916 - case 3917: - goto st_case_3917 - case 3918: - goto st_case_3918 - case 3919: - goto st_case_3919 - case 3920: - goto st_case_3920 - case 3921: - goto st_case_3921 - case 3922: - goto st_case_3922 - case 3923: - goto st_case_3923 - case 3924: - goto st_case_3924 - case 3925: - goto st_case_3925 - case 3926: - goto st_case_3926 - case 3927: - goto st_case_3927 - case 3928: - goto st_case_3928 - case 3929: - goto st_case_3929 - case 3930: - goto st_case_3930 - case 3931: - goto st_case_3931 - case 3932: - goto st_case_3932 - case 3933: - goto st_case_3933 - case 3934: - goto st_case_3934 - case 3935: - goto st_case_3935 - case 3936: - goto st_case_3936 - case 3937: - goto st_case_3937 - case 3938: - goto st_case_3938 - case 3939: - goto st_case_3939 - case 3940: - goto st_case_3940 - case 3941: - goto st_case_3941 - case 3942: - goto st_case_3942 - case 3943: - goto st_case_3943 - case 3944: - goto st_case_3944 - case 3945: - goto st_case_3945 - case 3946: - goto st_case_3946 - case 3947: - goto st_case_3947 - case 3948: - goto st_case_3948 - case 3949: - goto st_case_3949 - case 3950: - goto st_case_3950 - case 3951: - goto st_case_3951 - case 3952: - goto st_case_3952 - case 3953: - goto st_case_3953 - case 3954: - goto st_case_3954 - case 3955: - goto st_case_3955 - case 3956: - goto st_case_3956 - case 3957: - goto st_case_3957 - case 3958: - goto st_case_3958 - case 3959: - goto st_case_3959 - case 3960: - goto st_case_3960 - case 3961: - goto st_case_3961 - case 3962: - goto st_case_3962 - case 3963: - goto st_case_3963 - case 3964: - goto st_case_3964 - case 3965: - goto st_case_3965 - case 3966: - goto st_case_3966 - case 3967: - goto st_case_3967 - case 3968: - goto st_case_3968 - case 3969: - goto st_case_3969 - case 3970: - goto st_case_3970 - case 3971: - goto st_case_3971 - case 3972: - goto st_case_3972 - case 3973: - goto st_case_3973 - case 3974: - goto st_case_3974 - case 3975: - goto st_case_3975 - case 3976: - goto st_case_3976 - case 3977: - goto st_case_3977 - case 3978: - goto st_case_3978 - case 3979: - goto st_case_3979 - case 3980: - goto st_case_3980 - case 3981: - goto st_case_3981 - case 3982: - goto st_case_3982 - case 3983: - goto st_case_3983 - case 3984: - goto st_case_3984 - case 3985: - goto st_case_3985 - case 3986: - goto st_case_3986 - case 3987: - goto st_case_3987 - case 3988: - goto st_case_3988 - case 3989: - goto st_case_3989 - case 3990: - goto st_case_3990 - case 3991: - goto st_case_3991 - case 3992: - goto st_case_3992 - case 3993: - goto st_case_3993 - case 3994: - goto st_case_3994 - case 3995: - goto st_case_3995 - case 3996: - goto st_case_3996 - case 3997: - goto st_case_3997 - case 3998: - goto st_case_3998 - case 3999: - goto st_case_3999 - case 4000: - goto st_case_4000 - case 4001: - goto st_case_4001 - case 4002: - goto st_case_4002 - case 4003: - goto st_case_4003 - case 4004: - goto st_case_4004 - case 4005: - goto st_case_4005 - case 4006: - goto st_case_4006 - case 4007: - goto st_case_4007 - case 4008: - goto st_case_4008 - case 4009: - goto st_case_4009 - case 4010: - goto st_case_4010 - case 4011: - goto st_case_4011 - case 4012: - goto st_case_4012 - case 4013: - goto st_case_4013 - case 4014: - goto st_case_4014 - case 4015: - goto st_case_4015 - case 4016: - goto st_case_4016 - case 4017: - goto st_case_4017 - case 4018: - goto st_case_4018 - case 4019: - goto st_case_4019 - case 4020: - goto st_case_4020 - case 4021: - goto st_case_4021 - case 4022: - goto st_case_4022 - case 4023: - goto st_case_4023 - case 4024: - goto st_case_4024 - case 4025: - goto st_case_4025 - case 4026: - goto st_case_4026 - case 5080: - goto st_case_5080 - case 4027: - goto st_case_4027 - case 4028: - goto st_case_4028 - case 4029: - goto st_case_4029 - case 4030: - goto st_case_4030 - case 4031: - goto st_case_4031 - case 4032: - goto st_case_4032 - case 4033: - goto st_case_4033 - case 4034: - goto st_case_4034 - case 4035: - goto st_case_4035 - case 4036: - goto st_case_4036 - case 4037: - goto st_case_4037 - case 4038: - goto st_case_4038 - case 4039: - goto st_case_4039 - case 4040: - goto st_case_4040 - case 4041: - goto st_case_4041 - case 4042: - goto st_case_4042 - case 4043: - goto st_case_4043 - case 4044: - goto st_case_4044 - case 4045: - goto st_case_4045 - case 4046: - goto st_case_4046 - case 4047: - goto st_case_4047 - case 4048: - goto st_case_4048 - case 4049: - goto st_case_4049 - case 4050: - goto st_case_4050 - case 4051: - goto st_case_4051 - case 4052: - goto st_case_4052 - case 4053: - goto st_case_4053 - case 4054: - goto st_case_4054 - case 4055: - goto st_case_4055 - case 4056: - goto st_case_4056 - case 4057: - goto st_case_4057 - case 4058: - goto st_case_4058 - case 4059: - goto st_case_4059 - case 4060: - goto st_case_4060 - case 4061: - goto st_case_4061 - case 4062: - goto st_case_4062 - case 4063: - goto st_case_4063 - case 4064: - goto st_case_4064 - case 4065: - goto st_case_4065 - case 4066: - goto st_case_4066 - case 4067: - goto st_case_4067 - case 4068: - goto st_case_4068 - case 4069: - goto st_case_4069 - case 4070: - goto st_case_4070 - case 4071: - goto st_case_4071 - case 4072: - goto st_case_4072 - case 4073: - goto st_case_4073 - case 4074: - goto st_case_4074 - case 4075: - goto st_case_4075 - case 4076: - goto st_case_4076 - case 4077: - goto st_case_4077 - case 4078: - goto st_case_4078 - case 4079: - goto st_case_4079 - case 4080: - goto st_case_4080 - case 4081: - goto st_case_4081 - case 4082: - goto st_case_4082 - case 4083: - goto st_case_4083 - case 4084: - goto st_case_4084 - case 4085: - goto st_case_4085 - case 4086: - goto st_case_4086 - case 4087: - goto st_case_4087 - case 4088: - goto st_case_4088 - case 4089: - goto st_case_4089 - case 4090: - goto st_case_4090 - case 4091: - goto st_case_4091 - case 4092: - goto st_case_4092 - case 4093: - goto st_case_4093 - case 4094: - goto st_case_4094 - case 4095: - goto st_case_4095 - case 4096: - goto st_case_4096 - case 4097: - goto st_case_4097 - case 4098: - goto st_case_4098 - case 4099: - goto st_case_4099 - case 4100: - goto st_case_4100 - case 4101: - goto st_case_4101 - case 4102: - goto st_case_4102 - case 4103: - goto st_case_4103 - case 4104: - goto st_case_4104 - case 4105: - goto st_case_4105 - case 4106: - goto st_case_4106 - case 4107: - goto st_case_4107 - case 4108: - goto st_case_4108 - case 4109: - goto st_case_4109 - case 4110: - goto st_case_4110 - case 4111: - goto st_case_4111 - case 4112: - goto st_case_4112 - case 4113: - goto st_case_4113 - case 4114: - goto st_case_4114 - case 4115: - goto st_case_4115 - case 4116: - goto st_case_4116 - case 4117: - goto st_case_4117 - case 4118: - goto st_case_4118 - case 4119: - goto st_case_4119 - case 4120: - goto st_case_4120 - case 4121: - goto st_case_4121 - case 4122: - goto st_case_4122 - case 4123: - goto st_case_4123 - case 4124: - goto st_case_4124 - case 4125: - goto st_case_4125 - case 4126: - goto st_case_4126 - case 4127: - goto st_case_4127 - case 4128: - goto st_case_4128 - case 4129: - goto st_case_4129 - case 4130: - goto st_case_4130 - case 4131: - goto st_case_4131 - case 4132: - goto st_case_4132 - case 4133: - goto st_case_4133 - case 4134: - goto st_case_4134 - case 4135: - goto st_case_4135 - case 4136: - goto st_case_4136 - case 4137: - goto st_case_4137 - case 4138: - goto st_case_4138 - case 4139: - goto st_case_4139 - case 4140: - goto st_case_4140 - case 4141: - goto st_case_4141 - case 4142: - goto st_case_4142 - case 4143: - goto st_case_4143 - case 4144: - goto st_case_4144 - case 4145: - goto st_case_4145 - case 4146: - goto st_case_4146 - case 4147: - goto st_case_4147 - case 4148: - goto st_case_4148 - case 4149: - goto st_case_4149 - case 4150: - goto st_case_4150 - case 4151: - goto st_case_4151 - case 4152: - goto st_case_4152 - case 4153: - goto st_case_4153 - case 4154: - goto st_case_4154 - case 4155: - goto st_case_4155 - case 4156: - goto st_case_4156 - case 4157: - goto st_case_4157 - case 4158: - goto st_case_4158 - case 4159: - goto st_case_4159 - case 4160: - goto st_case_4160 - case 4161: - goto st_case_4161 - case 4162: - goto st_case_4162 - case 4163: - goto st_case_4163 - case 4164: - goto st_case_4164 - case 4165: - goto st_case_4165 - case 4166: - goto st_case_4166 - case 4167: - goto st_case_4167 - case 4168: - goto st_case_4168 - case 4169: - goto st_case_4169 - case 4170: - goto st_case_4170 - case 4171: - goto st_case_4171 - case 4172: - goto st_case_4172 - case 4173: - goto st_case_4173 - case 4174: - goto st_case_4174 - case 4175: - goto st_case_4175 - case 5081: - goto st_case_5081 - case 4176: - goto st_case_4176 - case 4177: - goto st_case_4177 - case 4178: - goto st_case_4178 - case 4179: - goto st_case_4179 - case 4180: - goto st_case_4180 - case 4181: - goto st_case_4181 - case 4182: - goto st_case_4182 - case 4183: - goto st_case_4183 - case 4184: - goto st_case_4184 - case 4185: - goto st_case_4185 - case 4186: - goto st_case_4186 - case 4187: - goto st_case_4187 - case 4188: - goto st_case_4188 - case 4189: - goto st_case_4189 - case 4190: - goto st_case_4190 - case 4191: - goto st_case_4191 - case 4192: - goto st_case_4192 - case 4193: - goto st_case_4193 - case 4194: - goto st_case_4194 - case 4195: - goto st_case_4195 - case 4196: - goto st_case_4196 - case 4197: - goto st_case_4197 - case 4198: - goto st_case_4198 - case 4199: - goto st_case_4199 - case 4200: - goto st_case_4200 - case 4201: - goto st_case_4201 - case 4202: - goto st_case_4202 - case 4203: - goto st_case_4203 - case 4204: - goto st_case_4204 - case 4205: - goto st_case_4205 - case 4206: - goto st_case_4206 - case 4207: - goto st_case_4207 - case 4208: - goto st_case_4208 - case 4209: - goto st_case_4209 - case 4210: - goto st_case_4210 - case 4211: - goto st_case_4211 - case 4212: - goto st_case_4212 - case 4213: - goto st_case_4213 - case 4214: - goto st_case_4214 - case 4215: - goto st_case_4215 - case 4216: - goto st_case_4216 - case 4217: - goto st_case_4217 - case 4218: - goto st_case_4218 - case 4219: - goto st_case_4219 - case 4220: - goto st_case_4220 - case 4221: - goto st_case_4221 - case 4222: - goto st_case_4222 - case 4223: - goto st_case_4223 - case 4224: - goto st_case_4224 - case 4225: - goto st_case_4225 - case 4226: - goto st_case_4226 - case 4227: - goto st_case_4227 - case 4228: - goto st_case_4228 - case 4229: - goto st_case_4229 - case 4230: - goto st_case_4230 - case 4231: - goto st_case_4231 - case 4232: - goto st_case_4232 - case 4233: - goto st_case_4233 - case 4234: - goto st_case_4234 - case 4235: - goto st_case_4235 - case 4236: - goto st_case_4236 - case 4237: - goto st_case_4237 - case 4238: - goto st_case_4238 - case 4239: - goto st_case_4239 - case 4240: - goto st_case_4240 - case 4241: - goto st_case_4241 - case 4242: - goto st_case_4242 - case 4243: - goto st_case_4243 - case 4244: - goto st_case_4244 - case 4245: - goto st_case_4245 - case 4246: - goto st_case_4246 - case 4247: - goto st_case_4247 - case 4248: - goto st_case_4248 - case 4249: - goto st_case_4249 - case 4250: - goto st_case_4250 - case 4251: - goto st_case_4251 - case 4252: - goto st_case_4252 - case 4253: - goto st_case_4253 - case 4254: - goto st_case_4254 - case 4255: - goto st_case_4255 - case 4256: - goto st_case_4256 - case 4257: - goto st_case_4257 - case 4258: - goto st_case_4258 - case 4259: - goto st_case_4259 - case 4260: - goto st_case_4260 - case 4261: - goto st_case_4261 - case 4262: - goto st_case_4262 - case 4263: - goto st_case_4263 - case 4264: - goto st_case_4264 - case 4265: - goto st_case_4265 - case 4266: - goto st_case_4266 - case 4267: - goto st_case_4267 - case 4268: - goto st_case_4268 - case 4269: - goto st_case_4269 - case 4270: - goto st_case_4270 - case 4271: - goto st_case_4271 - case 4272: - goto st_case_4272 - case 4273: - goto st_case_4273 - case 4274: - goto st_case_4274 - case 4275: - goto st_case_4275 - case 4276: - goto st_case_4276 - case 4277: - goto st_case_4277 - case 4278: - goto st_case_4278 - case 4279: - goto st_case_4279 - case 4280: - goto st_case_4280 - case 4281: - goto st_case_4281 - case 4282: - goto st_case_4282 - case 4283: - goto st_case_4283 - case 4284: - goto st_case_4284 - case 4285: - goto st_case_4285 - case 4286: - goto st_case_4286 - case 4287: - goto st_case_4287 - case 4288: - goto st_case_4288 - case 4289: - goto st_case_4289 - case 4290: - goto st_case_4290 - case 4291: - goto st_case_4291 - case 4292: - goto st_case_4292 - case 4293: - goto st_case_4293 - case 4294: - goto st_case_4294 - case 4295: - goto st_case_4295 - case 4296: - goto st_case_4296 - case 4297: - goto st_case_4297 - case 4298: - goto st_case_4298 - case 4299: - goto st_case_4299 - case 4300: - goto st_case_4300 - case 4301: - goto st_case_4301 - case 4302: - goto st_case_4302 - case 4303: - goto st_case_4303 - case 4304: - goto st_case_4304 - case 4305: - goto st_case_4305 - case 4306: - goto st_case_4306 - case 4307: - goto st_case_4307 - case 4308: - goto st_case_4308 - case 4309: - goto st_case_4309 - case 4310: - goto st_case_4310 - case 4311: - goto st_case_4311 - case 4312: - goto st_case_4312 - case 4313: - goto st_case_4313 - case 4314: - goto st_case_4314 - case 4315: - goto st_case_4315 - case 4316: - goto st_case_4316 - case 4317: - goto st_case_4317 - case 4318: - goto st_case_4318 - case 5082: - goto st_case_5082 - case 4319: - goto st_case_4319 - case 4320: - goto st_case_4320 - case 4321: - goto st_case_4321 - case 4322: - goto st_case_4322 - case 4323: - goto st_case_4323 - case 4324: - goto st_case_4324 - case 4325: - goto st_case_4325 - case 4326: - goto st_case_4326 - case 4327: - goto st_case_4327 - case 4328: - goto st_case_4328 - case 4329: - goto st_case_4329 - case 4330: - goto st_case_4330 - case 4331: - goto st_case_4331 - case 4332: - goto st_case_4332 - case 4333: - goto st_case_4333 - case 4334: - goto st_case_4334 - case 4335: - goto st_case_4335 - case 4336: - goto st_case_4336 - case 4337: - goto st_case_4337 - case 4338: - goto st_case_4338 - case 4339: - goto st_case_4339 - case 4340: - goto st_case_4340 - case 4341: - goto st_case_4341 - case 4342: - goto st_case_4342 - case 4343: - goto st_case_4343 - case 4344: - goto st_case_4344 - case 4345: - goto st_case_4345 - case 4346: - goto st_case_4346 - case 4347: - goto st_case_4347 - case 4348: - goto st_case_4348 - case 4349: - goto st_case_4349 - case 4350: - goto st_case_4350 - case 4351: - goto st_case_4351 - case 4352: - goto st_case_4352 - case 4353: - goto st_case_4353 - case 4354: - goto st_case_4354 - case 4355: - goto st_case_4355 - case 4356: - goto st_case_4356 - case 4357: - goto st_case_4357 - case 4358: - goto st_case_4358 - case 4359: - goto st_case_4359 - case 4360: - goto st_case_4360 - case 4361: - goto st_case_4361 - case 4362: - goto st_case_4362 - case 4363: - goto st_case_4363 - case 4364: - goto st_case_4364 - case 4365: - goto st_case_4365 - case 4366: - goto st_case_4366 - case 4367: - goto st_case_4367 - case 4368: - goto st_case_4368 - case 4369: - goto st_case_4369 - case 4370: - goto st_case_4370 - case 4371: - goto st_case_4371 - case 4372: - goto st_case_4372 - case 4373: - goto st_case_4373 - case 4374: - goto st_case_4374 - case 4375: - goto st_case_4375 - case 4376: - goto st_case_4376 - case 4377: - goto st_case_4377 - case 4378: - goto st_case_4378 - case 4379: - goto st_case_4379 - case 4380: - goto st_case_4380 - case 4381: - goto st_case_4381 - case 4382: - goto st_case_4382 - case 4383: - goto st_case_4383 - case 4384: - goto st_case_4384 - case 4385: - goto st_case_4385 - case 4386: - goto st_case_4386 - case 4387: - goto st_case_4387 - case 4388: - goto st_case_4388 - case 4389: - goto st_case_4389 - case 4390: - goto st_case_4390 - case 4391: - goto st_case_4391 - case 4392: - goto st_case_4392 - case 4393: - goto st_case_4393 - case 4394: - goto st_case_4394 - case 4395: - goto st_case_4395 - case 4396: - goto st_case_4396 - case 4397: - goto st_case_4397 - case 4398: - goto st_case_4398 - case 4399: - goto st_case_4399 - case 4400: - goto st_case_4400 - case 4401: - goto st_case_4401 - case 4402: - goto st_case_4402 - case 4403: - goto st_case_4403 - case 4404: - goto st_case_4404 - case 4405: - goto st_case_4405 - case 4406: - goto st_case_4406 - case 4407: - goto st_case_4407 - case 4408: - goto st_case_4408 - case 4409: - goto st_case_4409 - case 4410: - goto st_case_4410 - case 4411: - goto st_case_4411 - case 4412: - goto st_case_4412 - case 4413: - goto st_case_4413 - case 4414: - goto st_case_4414 - case 4415: - goto st_case_4415 - case 4416: - goto st_case_4416 - case 4417: - goto st_case_4417 - case 4418: - goto st_case_4418 - case 4419: - goto st_case_4419 - case 4420: - goto st_case_4420 - case 4421: - goto st_case_4421 - case 4422: - goto st_case_4422 - case 4423: - goto st_case_4423 - case 4424: - goto st_case_4424 - case 4425: - goto st_case_4425 - case 4426: - goto st_case_4426 - case 4427: - goto st_case_4427 - case 4428: - goto st_case_4428 - case 4429: - goto st_case_4429 - case 4430: - goto st_case_4430 - case 4431: - goto st_case_4431 - case 4432: - goto st_case_4432 - case 4433: - goto st_case_4433 - case 4434: - goto st_case_4434 - case 4435: - goto st_case_4435 - case 4436: - goto st_case_4436 - case 4437: - goto st_case_4437 - case 4438: - goto st_case_4438 - case 4439: - goto st_case_4439 - case 4440: - goto st_case_4440 - case 4441: - goto st_case_4441 - case 4442: - goto st_case_4442 - case 4443: - goto st_case_4443 - case 4444: - goto st_case_4444 - case 4445: - goto st_case_4445 - case 4446: - goto st_case_4446 - case 4447: - goto st_case_4447 - case 4448: - goto st_case_4448 - case 4449: - goto st_case_4449 - case 4450: - goto st_case_4450 - case 4451: - goto st_case_4451 - case 4452: - goto st_case_4452 - case 4453: - goto st_case_4453 - case 4454: - goto st_case_4454 - case 4455: - goto st_case_4455 - case 4456: - goto st_case_4456 - case 4457: - goto st_case_4457 - case 4458: - goto st_case_4458 - case 4459: - goto st_case_4459 - case 4460: - goto st_case_4460 - case 4461: - goto st_case_4461 - case 4462: - goto st_case_4462 - case 4463: - goto st_case_4463 - case 4464: - goto st_case_4464 - case 4465: - goto st_case_4465 - case 4466: - goto st_case_4466 - case 4467: - goto st_case_4467 - case 4468: - goto st_case_4468 - case 4469: - goto st_case_4469 - case 4470: - goto st_case_4470 - case 4471: - goto st_case_4471 - case 4472: - goto st_case_4472 - case 5083: - goto st_case_5083 - case 5084: - goto st_case_5084 - case 5085: - goto st_case_5085 - case 5086: - goto st_case_5086 - case 5087: - goto st_case_5087 - case 5088: - goto st_case_5088 - case 5089: - goto st_case_5089 - case 5090: - goto st_case_5090 - case 5091: - goto st_case_5091 - case 5092: - goto st_case_5092 - case 5093: - goto st_case_5093 - case 5094: - goto st_case_5094 - case 5095: - goto st_case_5095 - case 5096: - goto st_case_5096 - case 5097: - goto st_case_5097 - case 5098: - goto st_case_5098 - case 5099: - goto st_case_5099 - case 5100: - goto st_case_5100 - case 5101: - goto st_case_5101 - case 5102: - goto st_case_5102 - case 5103: - goto st_case_5103 - case 5104: - goto st_case_5104 - case 5105: - goto st_case_5105 - case 5106: - goto st_case_5106 - case 5107: - goto st_case_5107 - case 5108: - goto st_case_5108 - case 5109: - goto st_case_5109 - case 5110: - goto st_case_5110 - case 5111: - goto st_case_5111 - case 5112: - goto st_case_5112 - case 5113: - goto st_case_5113 - case 5114: - goto st_case_5114 - case 5115: - goto st_case_5115 - case 5116: - goto st_case_5116 - case 5117: - goto st_case_5117 - case 5118: - goto st_case_5118 - case 5119: - goto st_case_5119 - case 5120: - goto st_case_5120 - case 5121: - goto st_case_5121 - case 5122: - goto st_case_5122 - case 5123: - goto st_case_5123 - case 5124: - goto st_case_5124 - case 5125: - goto st_case_5125 - case 5126: - goto st_case_5126 - case 5127: - goto st_case_5127 - case 5128: - goto st_case_5128 - case 5129: - goto st_case_5129 - case 5130: - goto st_case_5130 - case 5131: - goto st_case_5131 - case 5132: - goto st_case_5132 - case 5133: - goto st_case_5133 - case 5134: - goto st_case_5134 - case 5135: - goto st_case_5135 - case 5136: - goto st_case_5136 - case 5137: - goto st_case_5137 - case 5138: - goto st_case_5138 - case 5139: - goto st_case_5139 - case 5140: - goto st_case_5140 - case 5141: - goto st_case_5141 - case 5142: - goto st_case_5142 - case 5143: - goto st_case_5143 - case 5144: - goto st_case_5144 - case 5145: - goto st_case_5145 - case 5146: - goto st_case_5146 - case 5147: - goto st_case_5147 - case 5148: - goto st_case_5148 - case 5149: - goto st_case_5149 - case 5150: - goto st_case_5150 - case 5151: - goto st_case_5151 - case 5152: - goto st_case_5152 - case 4473: - goto st_case_4473 - case 5153: - goto st_case_5153 - case 5154: - goto st_case_5154 - case 5155: - goto st_case_5155 - case 5156: - goto st_case_5156 - case 5157: - goto st_case_5157 - case 5158: - goto st_case_5158 - case 5159: - goto st_case_5159 - case 5160: - goto st_case_5160 - case 5161: - goto st_case_5161 - case 5162: - goto st_case_5162 - case 5163: - goto st_case_5163 - case 5164: - goto st_case_5164 - case 5165: - goto st_case_5165 - case 5166: - goto st_case_5166 - case 5167: - goto st_case_5167 - case 5168: - goto st_case_5168 - case 5169: - goto st_case_5169 - case 5170: - goto st_case_5170 - case 5171: - goto st_case_5171 - case 5172: - goto st_case_5172 - case 5173: - goto st_case_5173 - case 4474: - goto st_case_4474 - case 5174: - goto st_case_5174 - case 5175: - goto st_case_5175 - case 5176: - goto st_case_5176 - case 5177: - goto st_case_5177 - case 5178: - goto st_case_5178 - case 5179: - goto st_case_5179 - case 4475: - goto st_case_4475 - case 5180: - goto st_case_5180 - case 5181: - goto st_case_5181 - case 4476: - goto st_case_4476 - case 5182: - goto st_case_5182 - case 5183: - goto st_case_5183 - case 5184: - goto st_case_5184 - case 5185: - goto st_case_5185 - case 5186: - goto st_case_5186 - case 5187: - goto st_case_5187 - case 5188: - goto st_case_5188 - case 5189: - goto st_case_5189 - case 5190: - goto st_case_5190 - case 5191: - goto st_case_5191 - case 5192: - goto st_case_5192 - case 5193: - goto st_case_5193 - case 5194: - goto st_case_5194 - case 5195: - goto st_case_5195 - case 5196: - goto st_case_5196 - case 4477: - goto st_case_4477 - case 5197: - goto st_case_5197 - case 5198: - goto st_case_5198 - case 5199: - goto st_case_5199 - case 4478: - goto st_case_4478 - case 5200: - goto st_case_5200 - case 5201: - goto st_case_5201 - case 5202: - goto st_case_5202 - case 5203: - goto st_case_5203 - case 5204: - goto st_case_5204 - case 5205: - goto st_case_5205 - case 4479: - goto st_case_4479 - case 5206: - goto st_case_5206 - case 5207: - goto st_case_5207 - case 4480: - goto st_case_4480 - case 5208: - goto st_case_5208 - case 5209: - goto st_case_5209 - case 5210: - goto st_case_5210 - case 4481: - goto st_case_4481 - case 4482: - goto st_case_4482 - case 4483: - goto st_case_4483 - case 4484: - goto st_case_4484 - case 4485: - goto st_case_4485 - case 4486: - goto st_case_4486 - case 4487: - goto st_case_4487 - case 4488: - goto st_case_4488 - case 4489: - goto st_case_4489 - case 4490: - goto st_case_4490 - case 4491: - goto st_case_4491 - case 4492: - goto st_case_4492 - case 4493: - goto st_case_4493 - case 4494: - goto st_case_4494 - case 4495: - goto st_case_4495 - case 5211: - goto st_case_5211 - case 4496: - goto st_case_4496 - case 4497: - goto st_case_4497 - case 4498: - goto st_case_4498 - case 4499: - goto st_case_4499 - case 4500: - goto st_case_4500 - case 4501: - goto st_case_4501 - case 4502: - goto st_case_4502 - case 4503: - goto st_case_4503 - case 4504: - goto st_case_4504 - case 4505: - goto st_case_4505 - case 4506: - goto st_case_4506 - case 4507: - goto st_case_4507 - case 4508: - goto st_case_4508 - case 4509: - goto st_case_4509 - case 4510: - goto st_case_4510 - case 4511: - goto st_case_4511 - case 4512: - goto st_case_4512 - case 4513: - goto st_case_4513 - case 4514: - goto st_case_4514 - case 4515: - goto st_case_4515 - case 4516: - goto st_case_4516 - case 4517: - goto st_case_4517 - case 4518: - goto st_case_4518 - case 4519: - goto st_case_4519 - case 4520: - goto st_case_4520 - case 4521: - goto st_case_4521 - case 4522: - goto st_case_4522 - case 4523: - goto st_case_4523 - case 4524: - goto st_case_4524 - case 4525: - goto st_case_4525 - case 4526: - goto st_case_4526 - case 4527: - goto st_case_4527 - case 4528: - goto st_case_4528 - case 4529: - goto st_case_4529 - case 4530: - goto st_case_4530 - case 4531: - goto st_case_4531 - case 4532: - goto st_case_4532 - case 4533: - goto st_case_4533 - case 4534: - goto st_case_4534 - case 4535: - goto st_case_4535 - case 4536: - goto st_case_4536 - case 4537: - goto st_case_4537 - case 4538: - goto st_case_4538 - case 4539: - goto st_case_4539 - case 4540: - goto st_case_4540 - case 4541: - goto st_case_4541 - case 4542: - goto st_case_4542 - case 4543: - goto st_case_4543 - case 4544: - goto st_case_4544 - case 4545: - goto st_case_4545 - case 4546: - goto st_case_4546 - case 4547: - goto st_case_4547 - case 4548: - goto st_case_4548 - case 4549: - goto st_case_4549 - case 4550: - goto st_case_4550 - case 4551: - goto st_case_4551 - case 4552: - goto st_case_4552 - case 4553: - goto st_case_4553 - case 4554: - goto st_case_4554 - case 4555: - goto st_case_4555 - case 4556: - goto st_case_4556 - case 4557: - goto st_case_4557 - case 4558: - goto st_case_4558 - case 4559: - goto st_case_4559 - case 4560: - goto st_case_4560 - case 4561: - goto st_case_4561 - case 4562: - goto st_case_4562 - case 4563: - goto st_case_4563 - case 4564: - goto st_case_4564 - case 4565: - goto st_case_4565 - case 4566: - goto st_case_4566 - case 4567: - goto st_case_4567 - case 4568: - goto st_case_4568 - case 4569: - goto st_case_4569 - case 4570: - goto st_case_4570 - case 4571: - goto st_case_4571 - case 4572: - goto st_case_4572 - case 4573: - goto st_case_4573 - case 4574: - goto st_case_4574 - case 4575: - goto st_case_4575 - case 4576: - goto st_case_4576 - case 4577: - goto st_case_4577 - case 4578: - goto st_case_4578 - case 4579: - goto st_case_4579 - case 4580: - goto st_case_4580 - case 4581: - goto st_case_4581 - case 4582: - goto st_case_4582 - case 4583: - goto st_case_4583 - case 4584: - goto st_case_4584 - case 4585: - goto st_case_4585 - case 4586: - goto st_case_4586 - case 4587: - goto st_case_4587 - case 4588: - goto st_case_4588 - case 4589: - goto st_case_4589 - case 4590: - goto st_case_4590 - case 4591: - goto st_case_4591 - case 4592: - goto st_case_4592 - case 4593: - goto st_case_4593 - case 4594: - goto st_case_4594 - case 4595: - goto st_case_4595 - case 4596: - goto st_case_4596 - case 4597: - goto st_case_4597 - case 4598: - goto st_case_4598 - case 4599: - goto st_case_4599 - case 4600: - goto st_case_4600 - case 4601: - goto st_case_4601 - case 4602: - goto st_case_4602 - case 4603: - goto st_case_4603 - case 4604: - goto st_case_4604 - case 4605: - goto st_case_4605 - case 4606: - goto st_case_4606 - case 4607: - goto st_case_4607 - case 4608: - goto st_case_4608 - case 4609: - goto st_case_4609 - case 4610: - goto st_case_4610 - case 4611: - goto st_case_4611 - case 4612: - goto st_case_4612 - case 4613: - goto st_case_4613 - case 4614: - goto st_case_4614 - case 4615: - goto st_case_4615 - case 4616: - goto st_case_4616 - case 4617: - goto st_case_4617 - case 4618: - goto st_case_4618 - case 4619: - goto st_case_4619 - case 4620: - goto st_case_4620 - case 4621: - goto st_case_4621 - case 4622: - goto st_case_4622 - case 4623: - goto st_case_4623 - case 4624: - goto st_case_4624 - case 4625: - goto st_case_4625 - case 4626: - goto st_case_4626 - case 4627: - goto st_case_4627 - case 4628: - goto st_case_4628 - case 4629: - goto st_case_4629 - case 4630: - goto st_case_4630 - case 4631: - goto st_case_4631 - case 4632: - goto st_case_4632 - case 4633: - goto st_case_4633 - case 4634: - goto st_case_4634 - case 4635: - goto st_case_4635 - case 4636: - goto st_case_4636 - case 4637: - goto st_case_4637 - case 4638: - goto st_case_4638 - case 4639: - goto st_case_4639 - case 4640: - goto st_case_4640 - case 4641: - goto st_case_4641 - case 4642: - goto st_case_4642 - case 4643: - goto st_case_4643 - case 4644: - goto st_case_4644 - case 4645: - goto st_case_4645 - case 4646: - goto st_case_4646 - case 4647: - goto st_case_4647 - case 4648: - goto st_case_4648 - case 4649: - goto st_case_4649 - case 4650: - goto st_case_4650 - case 4651: - goto st_case_4651 - case 4652: - goto st_case_4652 - case 4653: - goto st_case_4653 - case 4654: - goto st_case_4654 - case 4655: - goto st_case_4655 - case 5212: - goto st_case_5212 - case 5213: - goto st_case_5213 - case 5214: - goto st_case_5214 - case 5215: - goto st_case_5215 - case 5216: - goto st_case_5216 - case 5217: - goto st_case_5217 - case 5218: - goto st_case_5218 - case 5219: - goto st_case_5219 - case 5220: - goto st_case_5220 - case 5221: - goto st_case_5221 - case 5222: - goto st_case_5222 - case 5223: - goto st_case_5223 - case 5224: - goto st_case_5224 - case 5225: - goto st_case_5225 - case 5226: - goto st_case_5226 - case 5227: - goto st_case_5227 - case 5228: - goto st_case_5228 - case 5229: - goto st_case_5229 - case 5230: - goto st_case_5230 - case 5231: - goto st_case_5231 - case 5232: - goto st_case_5232 - case 5233: - goto st_case_5233 - case 5234: - goto st_case_5234 - case 5235: - goto st_case_5235 - case 5236: - goto st_case_5236 - case 5237: - goto st_case_5237 - case 5238: - goto st_case_5238 - case 5239: - goto st_case_5239 - case 5240: - goto st_case_5240 - case 5241: - goto st_case_5241 - case 5242: - goto st_case_5242 - case 4656: - goto st_case_4656 - case 5243: - goto st_case_5243 - case 5244: - goto st_case_5244 - case 5245: - goto st_case_5245 - case 5246: - goto st_case_5246 - case 5247: - goto st_case_5247 - case 5248: - goto st_case_5248 - case 5249: - goto st_case_5249 - case 5250: - goto st_case_5250 - case 4657: - goto st_case_4657 - case 5251: - goto st_case_5251 - case 5252: - goto st_case_5252 - case 5253: - goto st_case_5253 - case 5254: - goto st_case_5254 - case 5255: - goto st_case_5255 - case 5256: - goto st_case_5256 - case 4658: - goto st_case_4658 - case 5257: - goto st_case_5257 - case 5258: - goto st_case_5258 - case 4659: - goto st_case_4659 - case 5259: - goto st_case_5259 - case 5260: - goto st_case_5260 - case 5261: - goto st_case_5261 - case 5262: - goto st_case_5262 - case 5263: - goto st_case_5263 - case 5264: - goto st_case_5264 - case 5265: - goto st_case_5265 - case 5266: - goto st_case_5266 - case 5267: - goto st_case_5267 - case 5268: - goto st_case_5268 - case 5269: - goto st_case_5269 - case 5270: - goto st_case_5270 - case 5271: - goto st_case_5271 - case 5272: - goto st_case_5272 - case 5273: - goto st_case_5273 - case 5274: - goto st_case_5274 - case 5275: - goto st_case_5275 - case 5276: - goto st_case_5276 - case 5277: - goto st_case_5277 - case 4660: - goto st_case_4660 - case 5278: - goto st_case_5278 - case 5279: - goto st_case_5279 - case 5280: - goto st_case_5280 - case 4661: - goto st_case_4661 - case 5281: - goto st_case_5281 - case 5282: - goto st_case_5282 - case 5283: - goto st_case_5283 - case 5284: - goto st_case_5284 - case 5285: - goto st_case_5285 - case 5286: - goto st_case_5286 - case 4662: - goto st_case_4662 - case 5287: - goto st_case_5287 - case 5288: - goto st_case_5288 - case 5289: - goto st_case_5289 - case 5290: - goto st_case_5290 - case 5291: - goto st_case_5291 - case 5292: - goto st_case_5292 - case 5293: - goto st_case_5293 - case 5294: - goto st_case_5294 - case 5295: - goto st_case_5295 - case 5296: - goto st_case_5296 - case 5297: - goto st_case_5297 - case 5298: - goto st_case_5298 - case 5299: - goto st_case_5299 - case 5300: - goto st_case_5300 - case 5301: - goto st_case_5301 - case 5302: - goto st_case_5302 - case 5303: - goto st_case_5303 - case 5304: - goto st_case_5304 - case 5305: - goto st_case_5305 - case 5306: - goto st_case_5306 - case 5307: - goto st_case_5307 - case 5308: - goto st_case_5308 - case 5309: - goto st_case_5309 - case 5310: - goto st_case_5310 - case 5311: - goto st_case_5311 - case 5312: - goto st_case_5312 - case 5313: - goto st_case_5313 - case 5314: - goto st_case_5314 - case 5315: - goto st_case_5315 - case 5316: - goto st_case_5316 - case 5317: - goto st_case_5317 - case 5318: - goto st_case_5318 - case 5319: - goto st_case_5319 - case 5320: - goto st_case_5320 - case 5321: - goto st_case_5321 - case 5322: - goto st_case_5322 - case 5323: - goto st_case_5323 - case 5324: - goto st_case_5324 - case 5325: - goto st_case_5325 - case 5326: - goto st_case_5326 - case 5327: - goto st_case_5327 - case 5328: - goto st_case_5328 - case 5329: - goto st_case_5329 - case 5330: - goto st_case_5330 - case 5331: - goto st_case_5331 - case 5332: - goto st_case_5332 - case 5333: - goto st_case_5333 - case 5334: - goto st_case_5334 - case 5335: - goto st_case_5335 - case 5336: - goto st_case_5336 - case 5337: - goto st_case_5337 - case 5338: - goto st_case_5338 - case 4663: - goto st_case_4663 - case 4664: - goto st_case_4664 - case 4665: - goto st_case_4665 - case 4666: - goto st_case_4666 - case 4667: - goto st_case_4667 - case 4668: - goto st_case_4668 - case 4669: - goto st_case_4669 - case 4670: - goto st_case_4670 - case 5339: - goto st_case_5339 - case 4671: - goto st_case_4671 - case 4672: - goto st_case_4672 - case 4673: - goto st_case_4673 - case 4674: - goto st_case_4674 - case 4675: - goto st_case_4675 - case 4676: - goto st_case_4676 - case 4677: - goto st_case_4677 - case 4678: - goto st_case_4678 - case 4679: - goto st_case_4679 - case 4680: - goto st_case_4680 - case 4681: - goto st_case_4681 - case 4682: - goto st_case_4682 - case 4683: - goto st_case_4683 - case 4684: - goto st_case_4684 - case 4685: - goto st_case_4685 - case 4686: - goto st_case_4686 - case 4687: - goto st_case_4687 - case 4688: - goto st_case_4688 - case 4689: - goto st_case_4689 - case 4690: - goto st_case_4690 - case 4691: - goto st_case_4691 - case 4692: - goto st_case_4692 - case 4693: - goto st_case_4693 - case 4694: - goto st_case_4694 - case 4695: - goto st_case_4695 - case 4696: - goto st_case_4696 - case 4697: - goto st_case_4697 - case 4698: - goto st_case_4698 - case 4699: - goto st_case_4699 - case 4700: - goto st_case_4700 - case 4701: - goto st_case_4701 - case 4702: - goto st_case_4702 - case 4703: - goto st_case_4703 - case 4704: - goto st_case_4704 - case 4705: - goto st_case_4705 - case 4706: - goto st_case_4706 - case 4707: - goto st_case_4707 - case 5340: - goto st_case_5340 - case 4708: - goto st_case_4708 - case 4709: - goto st_case_4709 - case 4710: - goto st_case_4710 - case 4711: - goto st_case_4711 - case 4712: - goto st_case_4712 - case 4713: - goto st_case_4713 - case 4714: - goto st_case_4714 - case 4715: - goto st_case_4715 - case 4716: - goto st_case_4716 - case 4717: - goto st_case_4717 - case 4718: - goto st_case_4718 - case 4719: - goto st_case_4719 - case 4720: - goto st_case_4720 - case 4721: - goto st_case_4721 - case 4722: - goto st_case_4722 - case 4723: - goto st_case_4723 - case 4724: - goto st_case_4724 - case 4725: - goto st_case_4725 - case 4726: - goto st_case_4726 - case 4727: - goto st_case_4727 - case 4728: - goto st_case_4728 - case 4729: - goto st_case_4729 - case 4730: - goto st_case_4730 - case 4731: - goto st_case_4731 - case 4732: - goto st_case_4732 - case 4733: - goto st_case_4733 - case 4734: - goto st_case_4734 - case 4735: - goto st_case_4735 - case 4736: - goto st_case_4736 - case 4737: - goto st_case_4737 - case 4738: - goto st_case_4738 - case 4739: - goto st_case_4739 - case 4740: - goto st_case_4740 - case 4741: - goto st_case_4741 - case 4742: - goto st_case_4742 - case 4743: - goto st_case_4743 - case 4744: - goto st_case_4744 - case 4745: - goto st_case_4745 - case 4746: - goto st_case_4746 - case 4747: - goto st_case_4747 - case 4748: - goto st_case_4748 - case 4749: - goto st_case_4749 - case 4750: - goto st_case_4750 - case 4751: - goto st_case_4751 - case 4752: - goto st_case_4752 - case 4753: - goto st_case_4753 - case 4754: - goto st_case_4754 - case 4755: - goto st_case_4755 - case 4756: - goto st_case_4756 - case 4757: - goto st_case_4757 - case 4758: - goto st_case_4758 - case 4759: - goto st_case_4759 - case 4760: - goto st_case_4760 - case 4761: - goto st_case_4761 - case 4762: - goto st_case_4762 - case 4763: - goto st_case_4763 - case 4764: - goto st_case_4764 - case 4765: - goto st_case_4765 - case 4766: - goto st_case_4766 - case 4767: - goto st_case_4767 - case 4768: - goto st_case_4768 - case 4769: - goto st_case_4769 - case 4770: - goto st_case_4770 - case 4771: - goto st_case_4771 - case 4772: - goto st_case_4772 - case 4773: - goto st_case_4773 - case 4774: - goto st_case_4774 - case 4775: - goto st_case_4775 - case 4776: - goto st_case_4776 - case 4777: - goto st_case_4777 - case 4778: - goto st_case_4778 - case 4779: - goto st_case_4779 - case 4780: - goto st_case_4780 - case 4781: - goto st_case_4781 - case 4782: - goto st_case_4782 - case 4783: - goto st_case_4783 - case 4784: - goto st_case_4784 - case 4785: - goto st_case_4785 - case 4786: - goto st_case_4786 - case 4787: - goto st_case_4787 - case 4788: - goto st_case_4788 - case 4789: - goto st_case_4789 - case 4790: - goto st_case_4790 - case 4791: - goto st_case_4791 - case 4792: - goto st_case_4792 - case 4793: - goto st_case_4793 - case 4794: - goto st_case_4794 - case 4795: - goto st_case_4795 - case 4796: - goto st_case_4796 - case 4797: - goto st_case_4797 - case 4798: - goto st_case_4798 - case 4799: - goto st_case_4799 - case 4800: - goto st_case_4800 - case 4801: - goto st_case_4801 - case 4802: - goto st_case_4802 - case 4803: - goto st_case_4803 - case 4804: - goto st_case_4804 - case 4805: - goto st_case_4805 - case 4806: - goto st_case_4806 - case 4807: - goto st_case_4807 - case 4808: - goto st_case_4808 - case 4809: - goto st_case_4809 - case 4810: - goto st_case_4810 - case 4811: - goto st_case_4811 - case 4812: - goto st_case_4812 - case 4813: - goto st_case_4813 - case 4814: - goto st_case_4814 - case 4815: - goto st_case_4815 - case 4816: - goto st_case_4816 - case 4817: - goto st_case_4817 - case 4818: - goto st_case_4818 - case 4819: - goto st_case_4819 - case 4820: - goto st_case_4820 - case 4821: - goto st_case_4821 - case 4822: - goto st_case_4822 - case 4823: - goto st_case_4823 - case 4824: - goto st_case_4824 - case 4825: - goto st_case_4825 - case 4826: - goto st_case_4826 - case 4827: - goto st_case_4827 - case 4828: - goto st_case_4828 - case 4829: - goto st_case_4829 - case 4830: - goto st_case_4830 - case 4831: - goto st_case_4831 - case 4832: - goto st_case_4832 - case 4833: - goto st_case_4833 - case 4834: - goto st_case_4834 - case 4835: - goto st_case_4835 - case 4836: - goto st_case_4836 - case 4837: - goto st_case_4837 - case 4838: - goto st_case_4838 - case 4839: - goto st_case_4839 - case 4840: - goto st_case_4840 - case 4841: - goto st_case_4841 - case 4842: - goto st_case_4842 - case 4843: - goto st_case_4843 - case 4844: - goto st_case_4844 - case 4845: - goto st_case_4845 - case 4846: - goto st_case_4846 - case 4847: - goto st_case_4847 - case 4848: - goto st_case_4848 - case 4849: - goto st_case_4849 - case 4850: - goto st_case_4850 - case 4851: - goto st_case_4851 - case 4852: - goto st_case_4852 - case 4853: - goto st_case_4853 - case 4854: - goto st_case_4854 - case 4855: - goto st_case_4855 - case 4856: - goto st_case_4856 - case 4857: - goto st_case_4857 - case 4858: - goto st_case_4858 - case 4859: - goto st_case_4859 - case 4860: - goto st_case_4860 - case 4861: - goto st_case_4861 - } - goto st_out -tr0: + if p == pe { + goto _test_eof + } + switch cs { + case 4862: + goto st_case_4862 + case 4863: + goto st_case_4863 + case 0: + goto st_case_0 + case 1: + goto st_case_1 + case 2: + goto st_case_2 + case 3: + goto st_case_3 + case 4: + goto st_case_4 + case 5: + goto st_case_5 + case 6: + goto st_case_6 + case 7: + goto st_case_7 + case 8: + goto st_case_8 + case 9: + goto st_case_9 + case 10: + goto st_case_10 + case 11: + goto st_case_11 + case 12: + goto st_case_12 + case 13: + goto st_case_13 + case 14: + goto st_case_14 + case 15: + goto st_case_15 + case 16: + goto st_case_16 + case 17: + goto st_case_17 + case 18: + goto st_case_18 + case 19: + goto st_case_19 + case 20: + goto st_case_20 + case 21: + goto st_case_21 + case 22: + goto st_case_22 + case 23: + goto st_case_23 + case 24: + goto st_case_24 + case 25: + goto st_case_25 + case 26: + goto st_case_26 + case 27: + goto st_case_27 + case 28: + goto st_case_28 + case 29: + goto st_case_29 + case 30: + goto st_case_30 + case 31: + goto st_case_31 + case 32: + goto st_case_32 + case 33: + goto st_case_33 + case 34: + goto st_case_34 + case 35: + goto st_case_35 + case 36: + goto st_case_36 + case 37: + goto st_case_37 + case 38: + goto st_case_38 + case 39: + goto st_case_39 + case 40: + goto st_case_40 + case 41: + goto st_case_41 + case 42: + goto st_case_42 + case 43: + goto st_case_43 + case 44: + goto st_case_44 + case 45: + goto st_case_45 + case 46: + goto st_case_46 + case 47: + goto st_case_47 + case 48: + goto st_case_48 + case 49: + goto st_case_49 + case 50: + goto st_case_50 + case 51: + goto st_case_51 + case 52: + goto st_case_52 + case 53: + goto st_case_53 + case 54: + goto st_case_54 + case 55: + goto st_case_55 + case 56: + goto st_case_56 + case 57: + goto st_case_57 + case 58: + goto st_case_58 + case 59: + goto st_case_59 + case 60: + goto st_case_60 + case 61: + goto st_case_61 + case 62: + goto st_case_62 + case 63: + goto st_case_63 + case 64: + goto st_case_64 + case 65: + goto st_case_65 + case 66: + goto st_case_66 + case 67: + goto st_case_67 + case 68: + goto st_case_68 + case 69: + goto st_case_69 + case 70: + goto st_case_70 + case 71: + goto st_case_71 + case 72: + goto st_case_72 + case 73: + goto st_case_73 + case 74: + goto st_case_74 + case 75: + goto st_case_75 + case 76: + goto st_case_76 + case 77: + goto st_case_77 + case 78: + goto st_case_78 + case 79: + goto st_case_79 + case 80: + goto st_case_80 + case 81: + goto st_case_81 + case 82: + goto st_case_82 + case 83: + goto st_case_83 + case 84: + goto st_case_84 + case 85: + goto st_case_85 + case 86: + goto st_case_86 + case 87: + goto st_case_87 + case 88: + goto st_case_88 + case 89: + goto st_case_89 + case 90: + goto st_case_90 + case 91: + goto st_case_91 + case 92: + goto st_case_92 + case 93: + goto st_case_93 + case 94: + goto st_case_94 + case 95: + goto st_case_95 + case 96: + goto st_case_96 + case 97: + goto st_case_97 + case 98: + goto st_case_98 + case 99: + goto st_case_99 + case 100: + goto st_case_100 + case 101: + goto st_case_101 + case 102: + goto st_case_102 + case 103: + goto st_case_103 + case 104: + goto st_case_104 + case 105: + goto st_case_105 + case 106: + goto st_case_106 + case 107: + goto st_case_107 + case 108: + goto st_case_108 + case 109: + goto st_case_109 + case 110: + goto st_case_110 + case 111: + goto st_case_111 + case 112: + goto st_case_112 + case 113: + goto st_case_113 + case 114: + goto st_case_114 + case 115: + goto st_case_115 + case 116: + goto st_case_116 + case 117: + goto st_case_117 + case 118: + goto st_case_118 + case 119: + goto st_case_119 + case 120: + goto st_case_120 + case 121: + goto st_case_121 + case 122: + goto st_case_122 + case 123: + goto st_case_123 + case 124: + goto st_case_124 + case 125: + goto st_case_125 + case 126: + goto st_case_126 + case 127: + goto st_case_127 + case 128: + goto st_case_128 + case 129: + goto st_case_129 + case 130: + goto st_case_130 + case 131: + goto st_case_131 + case 132: + goto st_case_132 + case 133: + goto st_case_133 + case 134: + goto st_case_134 + case 135: + goto st_case_135 + case 136: + goto st_case_136 + case 137: + goto st_case_137 + case 138: + goto st_case_138 + case 139: + goto st_case_139 + case 140: + goto st_case_140 + case 4864: + goto st_case_4864 + case 4865: + goto st_case_4865 + case 141: + goto st_case_141 + case 4866: + goto st_case_4866 + case 4867: + goto st_case_4867 + case 142: + goto st_case_142 + case 143: + goto st_case_143 + case 144: + goto st_case_144 + case 145: + goto st_case_145 + case 146: + goto st_case_146 + case 147: + goto st_case_147 + case 148: + goto st_case_148 + case 149: + goto st_case_149 + case 150: + goto st_case_150 + case 151: + goto st_case_151 + case 152: + goto st_case_152 + case 153: + goto st_case_153 + case 154: + goto st_case_154 + case 155: + goto st_case_155 + case 156: + goto st_case_156 + case 157: + goto st_case_157 + case 158: + goto st_case_158 + case 159: + goto st_case_159 + case 160: + goto st_case_160 + case 161: + goto st_case_161 + case 162: + goto st_case_162 + case 163: + goto st_case_163 + case 164: + goto st_case_164 + case 165: + goto st_case_165 + case 166: + goto st_case_166 + case 167: + goto st_case_167 + case 168: + goto st_case_168 + case 169: + goto st_case_169 + case 170: + goto st_case_170 + case 171: + goto st_case_171 + case 172: + goto st_case_172 + case 173: + goto st_case_173 + case 174: + goto st_case_174 + case 175: + goto st_case_175 + case 176: + goto st_case_176 + case 177: + goto st_case_177 + case 178: + goto st_case_178 + case 179: + goto st_case_179 + case 180: + goto st_case_180 + case 181: + goto st_case_181 + case 182: + goto st_case_182 + case 183: + goto st_case_183 + case 184: + goto st_case_184 + case 185: + goto st_case_185 + case 186: + goto st_case_186 + case 187: + goto st_case_187 + case 188: + goto st_case_188 + case 189: + goto st_case_189 + case 190: + goto st_case_190 + case 191: + goto st_case_191 + case 192: + goto st_case_192 + case 193: + goto st_case_193 + case 194: + goto st_case_194 + case 195: + goto st_case_195 + case 196: + goto st_case_196 + case 197: + goto st_case_197 + case 198: + goto st_case_198 + case 199: + goto st_case_199 + case 200: + goto st_case_200 + case 201: + goto st_case_201 + case 202: + goto st_case_202 + case 203: + goto st_case_203 + case 204: + goto st_case_204 + case 205: + goto st_case_205 + case 206: + goto st_case_206 + case 207: + goto st_case_207 + case 208: + goto st_case_208 + case 209: + goto st_case_209 + case 210: + goto st_case_210 + case 211: + goto st_case_211 + case 212: + goto st_case_212 + case 213: + goto st_case_213 + case 214: + goto st_case_214 + case 215: + goto st_case_215 + case 216: + goto st_case_216 + case 217: + goto st_case_217 + case 218: + goto st_case_218 + case 219: + goto st_case_219 + case 220: + goto st_case_220 + case 221: + goto st_case_221 + case 222: + goto st_case_222 + case 223: + goto st_case_223 + case 224: + goto st_case_224 + case 225: + goto st_case_225 + case 226: + goto st_case_226 + case 227: + goto st_case_227 + case 228: + goto st_case_228 + case 229: + goto st_case_229 + case 230: + goto st_case_230 + case 231: + goto st_case_231 + case 232: + goto st_case_232 + case 233: + goto st_case_233 + case 234: + goto st_case_234 + case 235: + goto st_case_235 + case 236: + goto st_case_236 + case 237: + goto st_case_237 + case 238: + goto st_case_238 + case 239: + goto st_case_239 + case 240: + goto st_case_240 + case 241: + goto st_case_241 + case 242: + goto st_case_242 + case 243: + goto st_case_243 + case 244: + goto st_case_244 + case 245: + goto st_case_245 + case 246: + goto st_case_246 + case 247: + goto st_case_247 + case 248: + goto st_case_248 + case 249: + goto st_case_249 + case 250: + goto st_case_250 + case 251: + goto st_case_251 + case 252: + goto st_case_252 + case 253: + goto st_case_253 + case 254: + goto st_case_254 + case 255: + goto st_case_255 + case 256: + goto st_case_256 + case 257: + goto st_case_257 + case 258: + goto st_case_258 + case 259: + goto st_case_259 + case 260: + goto st_case_260 + case 261: + goto st_case_261 + case 262: + goto st_case_262 + case 263: + goto st_case_263 + case 264: + goto st_case_264 + case 265: + goto st_case_265 + case 266: + goto st_case_266 + case 267: + goto st_case_267 + case 268: + goto st_case_268 + case 269: + goto st_case_269 + case 270: + goto st_case_270 + case 271: + goto st_case_271 + case 272: + goto st_case_272 + case 273: + goto st_case_273 + case 274: + goto st_case_274 + case 275: + goto st_case_275 + case 276: + goto st_case_276 + case 277: + goto st_case_277 + case 278: + goto st_case_278 + case 279: + goto st_case_279 + case 280: + goto st_case_280 + case 281: + goto st_case_281 + case 282: + goto st_case_282 + case 283: + goto st_case_283 + case 284: + goto st_case_284 + case 285: + goto st_case_285 + case 286: + goto st_case_286 + case 287: + goto st_case_287 + case 288: + goto st_case_288 + case 289: + goto st_case_289 + case 290: + goto st_case_290 + case 291: + goto st_case_291 + case 292: + goto st_case_292 + case 293: + goto st_case_293 + case 294: + goto st_case_294 + case 295: + goto st_case_295 + case 296: + goto st_case_296 + case 297: + goto st_case_297 + case 298: + goto st_case_298 + case 299: + goto st_case_299 + case 300: + goto st_case_300 + case 301: + goto st_case_301 + case 302: + goto st_case_302 + case 303: + goto st_case_303 + case 304: + goto st_case_304 + case 305: + goto st_case_305 + case 306: + goto st_case_306 + case 307: + goto st_case_307 + case 308: + goto st_case_308 + case 309: + goto st_case_309 + case 310: + goto st_case_310 + case 311: + goto st_case_311 + case 312: + goto st_case_312 + case 313: + goto st_case_313 + case 314: + goto st_case_314 + case 315: + goto st_case_315 + case 316: + goto st_case_316 + case 317: + goto st_case_317 + case 318: + goto st_case_318 + case 319: + goto st_case_319 + case 320: + goto st_case_320 + case 321: + goto st_case_321 + case 322: + goto st_case_322 + case 323: + goto st_case_323 + case 324: + goto st_case_324 + case 325: + goto st_case_325 + case 326: + goto st_case_326 + case 327: + goto st_case_327 + case 328: + goto st_case_328 + case 329: + goto st_case_329 + case 330: + goto st_case_330 + case 331: + goto st_case_331 + case 332: + goto st_case_332 + case 333: + goto st_case_333 + case 334: + goto st_case_334 + case 335: + goto st_case_335 + case 336: + goto st_case_336 + case 337: + goto st_case_337 + case 338: + goto st_case_338 + case 339: + goto st_case_339 + case 340: + goto st_case_340 + case 341: + goto st_case_341 + case 342: + goto st_case_342 + case 343: + goto st_case_343 + case 344: + goto st_case_344 + case 345: + goto st_case_345 + case 346: + goto st_case_346 + case 347: + goto st_case_347 + case 348: + goto st_case_348 + case 349: + goto st_case_349 + case 350: + goto st_case_350 + case 351: + goto st_case_351 + case 352: + goto st_case_352 + case 353: + goto st_case_353 + case 354: + goto st_case_354 + case 355: + goto st_case_355 + case 356: + goto st_case_356 + case 357: + goto st_case_357 + case 358: + goto st_case_358 + case 359: + goto st_case_359 + case 360: + goto st_case_360 + case 361: + goto st_case_361 + case 362: + goto st_case_362 + case 363: + goto st_case_363 + case 364: + goto st_case_364 + case 365: + goto st_case_365 + case 366: + goto st_case_366 + case 367: + goto st_case_367 + case 368: + goto st_case_368 + case 369: + goto st_case_369 + case 370: + goto st_case_370 + case 371: + goto st_case_371 + case 372: + goto st_case_372 + case 373: + goto st_case_373 + case 374: + goto st_case_374 + case 375: + goto st_case_375 + case 376: + goto st_case_376 + case 377: + goto st_case_377 + case 378: + goto st_case_378 + case 379: + goto st_case_379 + case 380: + goto st_case_380 + case 381: + goto st_case_381 + case 382: + goto st_case_382 + case 383: + goto st_case_383 + case 384: + goto st_case_384 + case 385: + goto st_case_385 + case 386: + goto st_case_386 + case 387: + goto st_case_387 + case 388: + goto st_case_388 + case 389: + goto st_case_389 + case 390: + goto st_case_390 + case 391: + goto st_case_391 + case 392: + goto st_case_392 + case 393: + goto st_case_393 + case 394: + goto st_case_394 + case 395: + goto st_case_395 + case 396: + goto st_case_396 + case 397: + goto st_case_397 + case 398: + goto st_case_398 + case 399: + goto st_case_399 + case 400: + goto st_case_400 + case 401: + goto st_case_401 + case 402: + goto st_case_402 + case 403: + goto st_case_403 + case 404: + goto st_case_404 + case 405: + goto st_case_405 + case 406: + goto st_case_406 + case 407: + goto st_case_407 + case 408: + goto st_case_408 + case 409: + goto st_case_409 + case 410: + goto st_case_410 + case 411: + goto st_case_411 + case 412: + goto st_case_412 + case 4868: + goto st_case_4868 + case 413: + goto st_case_413 + case 414: + goto st_case_414 + case 415: + goto st_case_415 + case 416: + goto st_case_416 + case 417: + goto st_case_417 + case 418: + goto st_case_418 + case 419: + goto st_case_419 + case 420: + goto st_case_420 + case 421: + goto st_case_421 + case 422: + goto st_case_422 + case 423: + goto st_case_423 + case 424: + goto st_case_424 + case 425: + goto st_case_425 + case 426: + goto st_case_426 + case 427: + goto st_case_427 + case 428: + goto st_case_428 + case 429: + goto st_case_429 + case 430: + goto st_case_430 + case 431: + goto st_case_431 + case 432: + goto st_case_432 + case 433: + goto st_case_433 + case 434: + goto st_case_434 + case 435: + goto st_case_435 + case 436: + goto st_case_436 + case 437: + goto st_case_437 + case 438: + goto st_case_438 + case 439: + goto st_case_439 + case 440: + goto st_case_440 + case 441: + goto st_case_441 + case 442: + goto st_case_442 + case 443: + goto st_case_443 + case 444: + goto st_case_444 + case 445: + goto st_case_445 + case 446: + goto st_case_446 + case 447: + goto st_case_447 + case 448: + goto st_case_448 + case 449: + goto st_case_449 + case 450: + goto st_case_450 + case 451: + goto st_case_451 + case 452: + goto st_case_452 + case 453: + goto st_case_453 + case 454: + goto st_case_454 + case 455: + goto st_case_455 + case 456: + goto st_case_456 + case 457: + goto st_case_457 + case 458: + goto st_case_458 + case 459: + goto st_case_459 + case 460: + goto st_case_460 + case 461: + goto st_case_461 + case 462: + goto st_case_462 + case 463: + goto st_case_463 + case 464: + goto st_case_464 + case 465: + goto st_case_465 + case 466: + goto st_case_466 + case 467: + goto st_case_467 + case 468: + goto st_case_468 + case 469: + goto st_case_469 + case 470: + goto st_case_470 + case 471: + goto st_case_471 + case 472: + goto st_case_472 + case 473: + goto st_case_473 + case 474: + goto st_case_474 + case 475: + goto st_case_475 + case 476: + goto st_case_476 + case 477: + goto st_case_477 + case 478: + goto st_case_478 + case 479: + goto st_case_479 + case 480: + goto st_case_480 + case 481: + goto st_case_481 + case 482: + goto st_case_482 + case 483: + goto st_case_483 + case 484: + goto st_case_484 + case 485: + goto st_case_485 + case 486: + goto st_case_486 + case 487: + goto st_case_487 + case 488: + goto st_case_488 + case 489: + goto st_case_489 + case 490: + goto st_case_490 + case 491: + goto st_case_491 + case 492: + goto st_case_492 + case 493: + goto st_case_493 + case 494: + goto st_case_494 + case 495: + goto st_case_495 + case 496: + goto st_case_496 + case 497: + goto st_case_497 + case 498: + goto st_case_498 + case 499: + goto st_case_499 + case 500: + goto st_case_500 + case 501: + goto st_case_501 + case 502: + goto st_case_502 + case 503: + goto st_case_503 + case 504: + goto st_case_504 + case 505: + goto st_case_505 + case 506: + goto st_case_506 + case 507: + goto st_case_507 + case 508: + goto st_case_508 + case 509: + goto st_case_509 + case 510: + goto st_case_510 + case 511: + goto st_case_511 + case 512: + goto st_case_512 + case 513: + goto st_case_513 + case 514: + goto st_case_514 + case 515: + goto st_case_515 + case 516: + goto st_case_516 + case 517: + goto st_case_517 + case 518: + goto st_case_518 + case 519: + goto st_case_519 + case 520: + goto st_case_520 + case 521: + goto st_case_521 + case 522: + goto st_case_522 + case 523: + goto st_case_523 + case 524: + goto st_case_524 + case 525: + goto st_case_525 + case 526: + goto st_case_526 + case 527: + goto st_case_527 + case 528: + goto st_case_528 + case 529: + goto st_case_529 + case 530: + goto st_case_530 + case 531: + goto st_case_531 + case 532: + goto st_case_532 + case 533: + goto st_case_533 + case 534: + goto st_case_534 + case 535: + goto st_case_535 + case 536: + goto st_case_536 + case 537: + goto st_case_537 + case 538: + goto st_case_538 + case 539: + goto st_case_539 + case 540: + goto st_case_540 + case 541: + goto st_case_541 + case 542: + goto st_case_542 + case 543: + goto st_case_543 + case 544: + goto st_case_544 + case 545: + goto st_case_545 + case 546: + goto st_case_546 + case 547: + goto st_case_547 + case 548: + goto st_case_548 + case 549: + goto st_case_549 + case 550: + goto st_case_550 + case 551: + goto st_case_551 + case 552: + goto st_case_552 + case 553: + goto st_case_553 + case 554: + goto st_case_554 + case 555: + goto st_case_555 + case 556: + goto st_case_556 + case 557: + goto st_case_557 + case 558: + goto st_case_558 + case 559: + goto st_case_559 + case 560: + goto st_case_560 + case 561: + goto st_case_561 + case 4869: + goto st_case_4869 + case 562: + goto st_case_562 + case 563: + goto st_case_563 + case 564: + goto st_case_564 + case 565: + goto st_case_565 + case 566: + goto st_case_566 + case 567: + goto st_case_567 + case 4870: + goto st_case_4870 + case 568: + goto st_case_568 + case 569: + goto st_case_569 + case 570: + goto st_case_570 + case 571: + goto st_case_571 + case 572: + goto st_case_572 + case 573: + goto st_case_573 + case 574: + goto st_case_574 + case 4871: + goto st_case_4871 + case 575: + goto st_case_575 + case 576: + goto st_case_576 + case 577: + goto st_case_577 + case 578: + goto st_case_578 + case 579: + goto st_case_579 + case 580: + goto st_case_580 + case 581: + goto st_case_581 + case 582: + goto st_case_582 + case 583: + goto st_case_583 + case 584: + goto st_case_584 + case 585: + goto st_case_585 + case 586: + goto st_case_586 + case 587: + goto st_case_587 + case 588: + goto st_case_588 + case 589: + goto st_case_589 + case 590: + goto st_case_590 + case 591: + goto st_case_591 + case 592: + goto st_case_592 + case 593: + goto st_case_593 + case 594: + goto st_case_594 + case 595: + goto st_case_595 + case 596: + goto st_case_596 + case 597: + goto st_case_597 + case 598: + goto st_case_598 + case 599: + goto st_case_599 + case 600: + goto st_case_600 + case 601: + goto st_case_601 + case 602: + goto st_case_602 + case 603: + goto st_case_603 + case 604: + goto st_case_604 + case 605: + goto st_case_605 + case 606: + goto st_case_606 + case 607: + goto st_case_607 + case 608: + goto st_case_608 + case 609: + goto st_case_609 + case 610: + goto st_case_610 + case 611: + goto st_case_611 + case 612: + goto st_case_612 + case 613: + goto st_case_613 + case 614: + goto st_case_614 + case 615: + goto st_case_615 + case 616: + goto st_case_616 + case 617: + goto st_case_617 + case 618: + goto st_case_618 + case 619: + goto st_case_619 + case 620: + goto st_case_620 + case 621: + goto st_case_621 + case 622: + goto st_case_622 + case 623: + goto st_case_623 + case 624: + goto st_case_624 + case 625: + goto st_case_625 + case 626: + goto st_case_626 + case 627: + goto st_case_627 + case 628: + goto st_case_628 + case 629: + goto st_case_629 + case 630: + goto st_case_630 + case 631: + goto st_case_631 + case 632: + goto st_case_632 + case 633: + goto st_case_633 + case 634: + goto st_case_634 + case 635: + goto st_case_635 + case 636: + goto st_case_636 + case 637: + goto st_case_637 + case 638: + goto st_case_638 + case 639: + goto st_case_639 + case 640: + goto st_case_640 + case 641: + goto st_case_641 + case 642: + goto st_case_642 + case 643: + goto st_case_643 + case 644: + goto st_case_644 + case 645: + goto st_case_645 + case 646: + goto st_case_646 + case 647: + goto st_case_647 + case 648: + goto st_case_648 + case 649: + goto st_case_649 + case 650: + goto st_case_650 + case 651: + goto st_case_651 + case 652: + goto st_case_652 + case 653: + goto st_case_653 + case 654: + goto st_case_654 + case 655: + goto st_case_655 + case 656: + goto st_case_656 + case 657: + goto st_case_657 + case 658: + goto st_case_658 + case 659: + goto st_case_659 + case 660: + goto st_case_660 + case 661: + goto st_case_661 + case 662: + goto st_case_662 + case 663: + goto st_case_663 + case 664: + goto st_case_664 + case 665: + goto st_case_665 + case 666: + goto st_case_666 + case 667: + goto st_case_667 + case 668: + goto st_case_668 + case 669: + goto st_case_669 + case 670: + goto st_case_670 + case 671: + goto st_case_671 + case 672: + goto st_case_672 + case 673: + goto st_case_673 + case 674: + goto st_case_674 + case 675: + goto st_case_675 + case 676: + goto st_case_676 + case 677: + goto st_case_677 + case 678: + goto st_case_678 + case 679: + goto st_case_679 + case 680: + goto st_case_680 + case 681: + goto st_case_681 + case 682: + goto st_case_682 + case 683: + goto st_case_683 + case 684: + goto st_case_684 + case 685: + goto st_case_685 + case 686: + goto st_case_686 + case 687: + goto st_case_687 + case 688: + goto st_case_688 + case 689: + goto st_case_689 + case 690: + goto st_case_690 + case 691: + goto st_case_691 + case 692: + goto st_case_692 + case 693: + goto st_case_693 + case 694: + goto st_case_694 + case 695: + goto st_case_695 + case 696: + goto st_case_696 + case 697: + goto st_case_697 + case 698: + goto st_case_698 + case 699: + goto st_case_699 + case 700: + goto st_case_700 + case 701: + goto st_case_701 + case 702: + goto st_case_702 + case 703: + goto st_case_703 + case 704: + goto st_case_704 + case 705: + goto st_case_705 + case 706: + goto st_case_706 + case 707: + goto st_case_707 + case 708: + goto st_case_708 + case 709: + goto st_case_709 + case 710: + goto st_case_710 + case 711: + goto st_case_711 + case 712: + goto st_case_712 + case 713: + goto st_case_713 + case 714: + goto st_case_714 + case 715: + goto st_case_715 + case 716: + goto st_case_716 + case 717: + goto st_case_717 + case 718: + goto st_case_718 + case 719: + goto st_case_719 + case 720: + goto st_case_720 + case 721: + goto st_case_721 + case 722: + goto st_case_722 + case 723: + goto st_case_723 + case 724: + goto st_case_724 + case 725: + goto st_case_725 + case 726: + goto st_case_726 + case 727: + goto st_case_727 + case 728: + goto st_case_728 + case 729: + goto st_case_729 + case 730: + goto st_case_730 + case 731: + goto st_case_731 + case 732: + goto st_case_732 + case 733: + goto st_case_733 + case 734: + goto st_case_734 + case 735: + goto st_case_735 + case 736: + goto st_case_736 + case 737: + goto st_case_737 + case 738: + goto st_case_738 + case 739: + goto st_case_739 + case 740: + goto st_case_740 + case 741: + goto st_case_741 + case 742: + goto st_case_742 + case 743: + goto st_case_743 + case 744: + goto st_case_744 + case 745: + goto st_case_745 + case 746: + goto st_case_746 + case 747: + goto st_case_747 + case 748: + goto st_case_748 + case 749: + goto st_case_749 + case 750: + goto st_case_750 + case 751: + goto st_case_751 + case 752: + goto st_case_752 + case 753: + goto st_case_753 + case 754: + goto st_case_754 + case 755: + goto st_case_755 + case 756: + goto st_case_756 + case 757: + goto st_case_757 + case 758: + goto st_case_758 + case 759: + goto st_case_759 + case 760: + goto st_case_760 + case 761: + goto st_case_761 + case 762: + goto st_case_762 + case 763: + goto st_case_763 + case 764: + goto st_case_764 + case 765: + goto st_case_765 + case 766: + goto st_case_766 + case 767: + goto st_case_767 + case 768: + goto st_case_768 + case 769: + goto st_case_769 + case 770: + goto st_case_770 + case 771: + goto st_case_771 + case 772: + goto st_case_772 + case 773: + goto st_case_773 + case 774: + goto st_case_774 + case 775: + goto st_case_775 + case 776: + goto st_case_776 + case 777: + goto st_case_777 + case 778: + goto st_case_778 + case 779: + goto st_case_779 + case 780: + goto st_case_780 + case 781: + goto st_case_781 + case 782: + goto st_case_782 + case 783: + goto st_case_783 + case 784: + goto st_case_784 + case 785: + goto st_case_785 + case 786: + goto st_case_786 + case 787: + goto st_case_787 + case 788: + goto st_case_788 + case 789: + goto st_case_789 + case 790: + goto st_case_790 + case 791: + goto st_case_791 + case 792: + goto st_case_792 + case 793: + goto st_case_793 + case 794: + goto st_case_794 + case 795: + goto st_case_795 + case 796: + goto st_case_796 + case 797: + goto st_case_797 + case 798: + goto st_case_798 + case 799: + goto st_case_799 + case 800: + goto st_case_800 + case 801: + goto st_case_801 + case 802: + goto st_case_802 + case 803: + goto st_case_803 + case 804: + goto st_case_804 + case 805: + goto st_case_805 + case 806: + goto st_case_806 + case 807: + goto st_case_807 + case 808: + goto st_case_808 + case 809: + goto st_case_809 + case 810: + goto st_case_810 + case 811: + goto st_case_811 + case 812: + goto st_case_812 + case 813: + goto st_case_813 + case 814: + goto st_case_814 + case 815: + goto st_case_815 + case 816: + goto st_case_816 + case 817: + goto st_case_817 + case 818: + goto st_case_818 + case 819: + goto st_case_819 + case 820: + goto st_case_820 + case 821: + goto st_case_821 + case 822: + goto st_case_822 + case 823: + goto st_case_823 + case 824: + goto st_case_824 + case 825: + goto st_case_825 + case 826: + goto st_case_826 + case 827: + goto st_case_827 + case 828: + goto st_case_828 + case 829: + goto st_case_829 + case 830: + goto st_case_830 + case 831: + goto st_case_831 + case 832: + goto st_case_832 + case 833: + goto st_case_833 + case 834: + goto st_case_834 + case 835: + goto st_case_835 + case 836: + goto st_case_836 + case 837: + goto st_case_837 + case 838: + goto st_case_838 + case 839: + goto st_case_839 + case 840: + goto st_case_840 + case 841: + goto st_case_841 + case 842: + goto st_case_842 + case 843: + goto st_case_843 + case 844: + goto st_case_844 + case 845: + goto st_case_845 + case 846: + goto st_case_846 + case 847: + goto st_case_847 + case 848: + goto st_case_848 + case 849: + goto st_case_849 + case 850: + goto st_case_850 + case 851: + goto st_case_851 + case 852: + goto st_case_852 + case 853: + goto st_case_853 + case 854: + goto st_case_854 + case 855: + goto st_case_855 + case 856: + goto st_case_856 + case 857: + goto st_case_857 + case 858: + goto st_case_858 + case 859: + goto st_case_859 + case 860: + goto st_case_860 + case 861: + goto st_case_861 + case 862: + goto st_case_862 + case 863: + goto st_case_863 + case 864: + goto st_case_864 + case 865: + goto st_case_865 + case 866: + goto st_case_866 + case 867: + goto st_case_867 + case 868: + goto st_case_868 + case 869: + goto st_case_869 + case 870: + goto st_case_870 + case 871: + goto st_case_871 + case 872: + goto st_case_872 + case 873: + goto st_case_873 + case 874: + goto st_case_874 + case 875: + goto st_case_875 + case 876: + goto st_case_876 + case 877: + goto st_case_877 + case 878: + goto st_case_878 + case 879: + goto st_case_879 + case 880: + goto st_case_880 + case 881: + goto st_case_881 + case 882: + goto st_case_882 + case 883: + goto st_case_883 + case 884: + goto st_case_884 + case 885: + goto st_case_885 + case 886: + goto st_case_886 + case 887: + goto st_case_887 + case 888: + goto st_case_888 + case 889: + goto st_case_889 + case 890: + goto st_case_890 + case 891: + goto st_case_891 + case 892: + goto st_case_892 + case 893: + goto st_case_893 + case 894: + goto st_case_894 + case 895: + goto st_case_895 + case 896: + goto st_case_896 + case 897: + goto st_case_897 + case 898: + goto st_case_898 + case 899: + goto st_case_899 + case 900: + goto st_case_900 + case 901: + goto st_case_901 + case 902: + goto st_case_902 + case 903: + goto st_case_903 + case 904: + goto st_case_904 + case 905: + goto st_case_905 + case 906: + goto st_case_906 + case 907: + goto st_case_907 + case 908: + goto st_case_908 + case 909: + goto st_case_909 + case 910: + goto st_case_910 + case 911: + goto st_case_911 + case 912: + goto st_case_912 + case 913: + goto st_case_913 + case 914: + goto st_case_914 + case 915: + goto st_case_915 + case 916: + goto st_case_916 + case 917: + goto st_case_917 + case 918: + goto st_case_918 + case 919: + goto st_case_919 + case 920: + goto st_case_920 + case 921: + goto st_case_921 + case 922: + goto st_case_922 + case 923: + goto st_case_923 + case 924: + goto st_case_924 + case 925: + goto st_case_925 + case 926: + goto st_case_926 + case 927: + goto st_case_927 + case 928: + goto st_case_928 + case 929: + goto st_case_929 + case 930: + goto st_case_930 + case 931: + goto st_case_931 + case 932: + goto st_case_932 + case 933: + goto st_case_933 + case 934: + goto st_case_934 + case 935: + goto st_case_935 + case 936: + goto st_case_936 + case 937: + goto st_case_937 + case 938: + goto st_case_938 + case 939: + goto st_case_939 + case 940: + goto st_case_940 + case 941: + goto st_case_941 + case 942: + goto st_case_942 + case 943: + goto st_case_943 + case 944: + goto st_case_944 + case 945: + goto st_case_945 + case 946: + goto st_case_946 + case 947: + goto st_case_947 + case 948: + goto st_case_948 + case 949: + goto st_case_949 + case 950: + goto st_case_950 + case 951: + goto st_case_951 + case 952: + goto st_case_952 + case 953: + goto st_case_953 + case 954: + goto st_case_954 + case 955: + goto st_case_955 + case 956: + goto st_case_956 + case 957: + goto st_case_957 + case 958: + goto st_case_958 + case 959: + goto st_case_959 + case 960: + goto st_case_960 + case 961: + goto st_case_961 + case 962: + goto st_case_962 + case 963: + goto st_case_963 + case 964: + goto st_case_964 + case 965: + goto st_case_965 + case 966: + goto st_case_966 + case 967: + goto st_case_967 + case 968: + goto st_case_968 + case 969: + goto st_case_969 + case 970: + goto st_case_970 + case 971: + goto st_case_971 + case 972: + goto st_case_972 + case 973: + goto st_case_973 + case 974: + goto st_case_974 + case 975: + goto st_case_975 + case 976: + goto st_case_976 + case 977: + goto st_case_977 + case 978: + goto st_case_978 + case 979: + goto st_case_979 + case 980: + goto st_case_980 + case 981: + goto st_case_981 + case 982: + goto st_case_982 + case 983: + goto st_case_983 + case 984: + goto st_case_984 + case 985: + goto st_case_985 + case 986: + goto st_case_986 + case 987: + goto st_case_987 + case 988: + goto st_case_988 + case 989: + goto st_case_989 + case 990: + goto st_case_990 + case 991: + goto st_case_991 + case 992: + goto st_case_992 + case 993: + goto st_case_993 + case 994: + goto st_case_994 + case 995: + goto st_case_995 + case 996: + goto st_case_996 + case 997: + goto st_case_997 + case 998: + goto st_case_998 + case 999: + goto st_case_999 + case 1000: + goto st_case_1000 + case 1001: + goto st_case_1001 + case 1002: + goto st_case_1002 + case 1003: + goto st_case_1003 + case 1004: + goto st_case_1004 + case 1005: + goto st_case_1005 + case 1006: + goto st_case_1006 + case 1007: + goto st_case_1007 + case 1008: + goto st_case_1008 + case 1009: + goto st_case_1009 + case 1010: + goto st_case_1010 + case 1011: + goto st_case_1011 + case 1012: + goto st_case_1012 + case 1013: + goto st_case_1013 + case 1014: + goto st_case_1014 + case 1015: + goto st_case_1015 + case 1016: + goto st_case_1016 + case 1017: + goto st_case_1017 + case 1018: + goto st_case_1018 + case 1019: + goto st_case_1019 + case 1020: + goto st_case_1020 + case 1021: + goto st_case_1021 + case 1022: + goto st_case_1022 + case 1023: + goto st_case_1023 + case 1024: + goto st_case_1024 + case 1025: + goto st_case_1025 + case 1026: + goto st_case_1026 + case 1027: + goto st_case_1027 + case 1028: + goto st_case_1028 + case 1029: + goto st_case_1029 + case 1030: + goto st_case_1030 + case 1031: + goto st_case_1031 + case 1032: + goto st_case_1032 + case 1033: + goto st_case_1033 + case 1034: + goto st_case_1034 + case 1035: + goto st_case_1035 + case 1036: + goto st_case_1036 + case 1037: + goto st_case_1037 + case 1038: + goto st_case_1038 + case 1039: + goto st_case_1039 + case 1040: + goto st_case_1040 + case 1041: + goto st_case_1041 + case 1042: + goto st_case_1042 + case 1043: + goto st_case_1043 + case 1044: + goto st_case_1044 + case 1045: + goto st_case_1045 + case 1046: + goto st_case_1046 + case 1047: + goto st_case_1047 + case 1048: + goto st_case_1048 + case 1049: + goto st_case_1049 + case 1050: + goto st_case_1050 + case 1051: + goto st_case_1051 + case 1052: + goto st_case_1052 + case 1053: + goto st_case_1053 + case 1054: + goto st_case_1054 + case 1055: + goto st_case_1055 + case 1056: + goto st_case_1056 + case 1057: + goto st_case_1057 + case 1058: + goto st_case_1058 + case 1059: + goto st_case_1059 + case 1060: + goto st_case_1060 + case 1061: + goto st_case_1061 + case 1062: + goto st_case_1062 + case 1063: + goto st_case_1063 + case 1064: + goto st_case_1064 + case 1065: + goto st_case_1065 + case 1066: + goto st_case_1066 + case 1067: + goto st_case_1067 + case 1068: + goto st_case_1068 + case 1069: + goto st_case_1069 + case 1070: + goto st_case_1070 + case 1071: + goto st_case_1071 + case 1072: + goto st_case_1072 + case 1073: + goto st_case_1073 + case 1074: + goto st_case_1074 + case 1075: + goto st_case_1075 + case 1076: + goto st_case_1076 + case 1077: + goto st_case_1077 + case 1078: + goto st_case_1078 + case 1079: + goto st_case_1079 + case 1080: + goto st_case_1080 + case 1081: + goto st_case_1081 + case 1082: + goto st_case_1082 + case 1083: + goto st_case_1083 + case 1084: + goto st_case_1084 + case 1085: + goto st_case_1085 + case 1086: + goto st_case_1086 + case 1087: + goto st_case_1087 + case 1088: + goto st_case_1088 + case 1089: + goto st_case_1089 + case 4872: + goto st_case_4872 + case 1090: + goto st_case_1090 + case 1091: + goto st_case_1091 + case 1092: + goto st_case_1092 + case 1093: + goto st_case_1093 + case 1094: + goto st_case_1094 + case 1095: + goto st_case_1095 + case 1096: + goto st_case_1096 + case 1097: + goto st_case_1097 + case 1098: + goto st_case_1098 + case 1099: + goto st_case_1099 + case 1100: + goto st_case_1100 + case 1101: + goto st_case_1101 + case 1102: + goto st_case_1102 + case 1103: + goto st_case_1103 + case 1104: + goto st_case_1104 + case 1105: + goto st_case_1105 + case 1106: + goto st_case_1106 + case 1107: + goto st_case_1107 + case 1108: + goto st_case_1108 + case 1109: + goto st_case_1109 + case 1110: + goto st_case_1110 + case 1111: + goto st_case_1111 + case 1112: + goto st_case_1112 + case 1113: + goto st_case_1113 + case 1114: + goto st_case_1114 + case 1115: + goto st_case_1115 + case 1116: + goto st_case_1116 + case 1117: + goto st_case_1117 + case 1118: + goto st_case_1118 + case 1119: + goto st_case_1119 + case 1120: + goto st_case_1120 + case 1121: + goto st_case_1121 + case 1122: + goto st_case_1122 + case 1123: + goto st_case_1123 + case 1124: + goto st_case_1124 + case 1125: + goto st_case_1125 + case 1126: + goto st_case_1126 + case 1127: + goto st_case_1127 + case 1128: + goto st_case_1128 + case 1129: + goto st_case_1129 + case 1130: + goto st_case_1130 + case 1131: + goto st_case_1131 + case 1132: + goto st_case_1132 + case 1133: + goto st_case_1133 + case 1134: + goto st_case_1134 + case 1135: + goto st_case_1135 + case 1136: + goto st_case_1136 + case 1137: + goto st_case_1137 + case 1138: + goto st_case_1138 + case 1139: + goto st_case_1139 + case 1140: + goto st_case_1140 + case 1141: + goto st_case_1141 + case 1142: + goto st_case_1142 + case 1143: + goto st_case_1143 + case 1144: + goto st_case_1144 + case 1145: + goto st_case_1145 + case 1146: + goto st_case_1146 + case 1147: + goto st_case_1147 + case 1148: + goto st_case_1148 + case 1149: + goto st_case_1149 + case 1150: + goto st_case_1150 + case 1151: + goto st_case_1151 + case 1152: + goto st_case_1152 + case 1153: + goto st_case_1153 + case 1154: + goto st_case_1154 + case 1155: + goto st_case_1155 + case 1156: + goto st_case_1156 + case 1157: + goto st_case_1157 + case 1158: + goto st_case_1158 + case 1159: + goto st_case_1159 + case 1160: + goto st_case_1160 + case 1161: + goto st_case_1161 + case 1162: + goto st_case_1162 + case 1163: + goto st_case_1163 + case 1164: + goto st_case_1164 + case 1165: + goto st_case_1165 + case 1166: + goto st_case_1166 + case 1167: + goto st_case_1167 + case 1168: + goto st_case_1168 + case 1169: + goto st_case_1169 + case 1170: + goto st_case_1170 + case 1171: + goto st_case_1171 + case 1172: + goto st_case_1172 + case 1173: + goto st_case_1173 + case 1174: + goto st_case_1174 + case 1175: + goto st_case_1175 + case 1176: + goto st_case_1176 + case 1177: + goto st_case_1177 + case 1178: + goto st_case_1178 + case 1179: + goto st_case_1179 + case 1180: + goto st_case_1180 + case 1181: + goto st_case_1181 + case 1182: + goto st_case_1182 + case 1183: + goto st_case_1183 + case 1184: + goto st_case_1184 + case 1185: + goto st_case_1185 + case 1186: + goto st_case_1186 + case 1187: + goto st_case_1187 + case 1188: + goto st_case_1188 + case 1189: + goto st_case_1189 + case 1190: + goto st_case_1190 + case 1191: + goto st_case_1191 + case 1192: + goto st_case_1192 + case 1193: + goto st_case_1193 + case 1194: + goto st_case_1194 + case 1195: + goto st_case_1195 + case 1196: + goto st_case_1196 + case 1197: + goto st_case_1197 + case 1198: + goto st_case_1198 + case 1199: + goto st_case_1199 + case 1200: + goto st_case_1200 + case 1201: + goto st_case_1201 + case 1202: + goto st_case_1202 + case 1203: + goto st_case_1203 + case 1204: + goto st_case_1204 + case 1205: + goto st_case_1205 + case 1206: + goto st_case_1206 + case 1207: + goto st_case_1207 + case 1208: + goto st_case_1208 + case 1209: + goto st_case_1209 + case 1210: + goto st_case_1210 + case 1211: + goto st_case_1211 + case 1212: + goto st_case_1212 + case 1213: + goto st_case_1213 + case 1214: + goto st_case_1214 + case 1215: + goto st_case_1215 + case 1216: + goto st_case_1216 + case 1217: + goto st_case_1217 + case 1218: + goto st_case_1218 + case 1219: + goto st_case_1219 + case 1220: + goto st_case_1220 + case 1221: + goto st_case_1221 + case 1222: + goto st_case_1222 + case 1223: + goto st_case_1223 + case 1224: + goto st_case_1224 + case 1225: + goto st_case_1225 + case 1226: + goto st_case_1226 + case 1227: + goto st_case_1227 + case 1228: + goto st_case_1228 + case 1229: + goto st_case_1229 + case 1230: + goto st_case_1230 + case 1231: + goto st_case_1231 + case 1232: + goto st_case_1232 + case 1233: + goto st_case_1233 + case 1234: + goto st_case_1234 + case 1235: + goto st_case_1235 + case 1236: + goto st_case_1236 + case 1237: + goto st_case_1237 + case 1238: + goto st_case_1238 + case 1239: + goto st_case_1239 + case 1240: + goto st_case_1240 + case 1241: + goto st_case_1241 + case 1242: + goto st_case_1242 + case 1243: + goto st_case_1243 + case 1244: + goto st_case_1244 + case 1245: + goto st_case_1245 + case 1246: + goto st_case_1246 + case 1247: + goto st_case_1247 + case 1248: + goto st_case_1248 + case 1249: + goto st_case_1249 + case 1250: + goto st_case_1250 + case 1251: + goto st_case_1251 + case 1252: + goto st_case_1252 + case 1253: + goto st_case_1253 + case 1254: + goto st_case_1254 + case 1255: + goto st_case_1255 + case 1256: + goto st_case_1256 + case 1257: + goto st_case_1257 + case 1258: + goto st_case_1258 + case 1259: + goto st_case_1259 + case 1260: + goto st_case_1260 + case 1261: + goto st_case_1261 + case 1262: + goto st_case_1262 + case 1263: + goto st_case_1263 + case 1264: + goto st_case_1264 + case 1265: + goto st_case_1265 + case 1266: + goto st_case_1266 + case 1267: + goto st_case_1267 + case 1268: + goto st_case_1268 + case 1269: + goto st_case_1269 + case 1270: + goto st_case_1270 + case 1271: + goto st_case_1271 + case 1272: + goto st_case_1272 + case 1273: + goto st_case_1273 + case 1274: + goto st_case_1274 + case 1275: + goto st_case_1275 + case 1276: + goto st_case_1276 + case 1277: + goto st_case_1277 + case 1278: + goto st_case_1278 + case 1279: + goto st_case_1279 + case 1280: + goto st_case_1280 + case 1281: + goto st_case_1281 + case 1282: + goto st_case_1282 + case 1283: + goto st_case_1283 + case 1284: + goto st_case_1284 + case 1285: + goto st_case_1285 + case 1286: + goto st_case_1286 + case 1287: + goto st_case_1287 + case 1288: + goto st_case_1288 + case 1289: + goto st_case_1289 + case 1290: + goto st_case_1290 + case 1291: + goto st_case_1291 + case 1292: + goto st_case_1292 + case 1293: + goto st_case_1293 + case 1294: + goto st_case_1294 + case 1295: + goto st_case_1295 + case 1296: + goto st_case_1296 + case 1297: + goto st_case_1297 + case 1298: + goto st_case_1298 + case 1299: + goto st_case_1299 + case 1300: + goto st_case_1300 + case 1301: + goto st_case_1301 + case 1302: + goto st_case_1302 + case 1303: + goto st_case_1303 + case 1304: + goto st_case_1304 + case 1305: + goto st_case_1305 + case 1306: + goto st_case_1306 + case 1307: + goto st_case_1307 + case 1308: + goto st_case_1308 + case 1309: + goto st_case_1309 + case 1310: + goto st_case_1310 + case 1311: + goto st_case_1311 + case 1312: + goto st_case_1312 + case 1313: + goto st_case_1313 + case 1314: + goto st_case_1314 + case 1315: + goto st_case_1315 + case 1316: + goto st_case_1316 + case 1317: + goto st_case_1317 + case 1318: + goto st_case_1318 + case 1319: + goto st_case_1319 + case 1320: + goto st_case_1320 + case 1321: + goto st_case_1321 + case 1322: + goto st_case_1322 + case 1323: + goto st_case_1323 + case 1324: + goto st_case_1324 + case 1325: + goto st_case_1325 + case 1326: + goto st_case_1326 + case 1327: + goto st_case_1327 + case 1328: + goto st_case_1328 + case 1329: + goto st_case_1329 + case 1330: + goto st_case_1330 + case 1331: + goto st_case_1331 + case 1332: + goto st_case_1332 + case 1333: + goto st_case_1333 + case 1334: + goto st_case_1334 + case 1335: + goto st_case_1335 + case 1336: + goto st_case_1336 + case 1337: + goto st_case_1337 + case 1338: + goto st_case_1338 + case 1339: + goto st_case_1339 + case 1340: + goto st_case_1340 + case 1341: + goto st_case_1341 + case 1342: + goto st_case_1342 + case 1343: + goto st_case_1343 + case 1344: + goto st_case_1344 + case 1345: + goto st_case_1345 + case 1346: + goto st_case_1346 + case 1347: + goto st_case_1347 + case 1348: + goto st_case_1348 + case 1349: + goto st_case_1349 + case 1350: + goto st_case_1350 + case 1351: + goto st_case_1351 + case 1352: + goto st_case_1352 + case 1353: + goto st_case_1353 + case 1354: + goto st_case_1354 + case 1355: + goto st_case_1355 + case 1356: + goto st_case_1356 + case 1357: + goto st_case_1357 + case 1358: + goto st_case_1358 + case 1359: + goto st_case_1359 + case 1360: + goto st_case_1360 + case 1361: + goto st_case_1361 + case 1362: + goto st_case_1362 + case 1363: + goto st_case_1363 + case 1364: + goto st_case_1364 + case 1365: + goto st_case_1365 + case 1366: + goto st_case_1366 + case 1367: + goto st_case_1367 + case 1368: + goto st_case_1368 + case 1369: + goto st_case_1369 + case 1370: + goto st_case_1370 + case 1371: + goto st_case_1371 + case 1372: + goto st_case_1372 + case 1373: + goto st_case_1373 + case 1374: + goto st_case_1374 + case 1375: + goto st_case_1375 + case 1376: + goto st_case_1376 + case 1377: + goto st_case_1377 + case 1378: + goto st_case_1378 + case 1379: + goto st_case_1379 + case 1380: + goto st_case_1380 + case 1381: + goto st_case_1381 + case 1382: + goto st_case_1382 + case 1383: + goto st_case_1383 + case 1384: + goto st_case_1384 + case 1385: + goto st_case_1385 + case 1386: + goto st_case_1386 + case 1387: + goto st_case_1387 + case 1388: + goto st_case_1388 + case 1389: + goto st_case_1389 + case 1390: + goto st_case_1390 + case 1391: + goto st_case_1391 + case 1392: + goto st_case_1392 + case 1393: + goto st_case_1393 + case 1394: + goto st_case_1394 + case 1395: + goto st_case_1395 + case 1396: + goto st_case_1396 + case 1397: + goto st_case_1397 + case 1398: + goto st_case_1398 + case 1399: + goto st_case_1399 + case 1400: + goto st_case_1400 + case 1401: + goto st_case_1401 + case 1402: + goto st_case_1402 + case 1403: + goto st_case_1403 + case 1404: + goto st_case_1404 + case 1405: + goto st_case_1405 + case 1406: + goto st_case_1406 + case 1407: + goto st_case_1407 + case 1408: + goto st_case_1408 + case 1409: + goto st_case_1409 + case 1410: + goto st_case_1410 + case 1411: + goto st_case_1411 + case 1412: + goto st_case_1412 + case 1413: + goto st_case_1413 + case 1414: + goto st_case_1414 + case 1415: + goto st_case_1415 + case 1416: + goto st_case_1416 + case 1417: + goto st_case_1417 + case 1418: + goto st_case_1418 + case 1419: + goto st_case_1419 + case 1420: + goto st_case_1420 + case 1421: + goto st_case_1421 + case 1422: + goto st_case_1422 + case 1423: + goto st_case_1423 + case 1424: + goto st_case_1424 + case 1425: + goto st_case_1425 + case 1426: + goto st_case_1426 + case 1427: + goto st_case_1427 + case 1428: + goto st_case_1428 + case 1429: + goto st_case_1429 + case 1430: + goto st_case_1430 + case 1431: + goto st_case_1431 + case 1432: + goto st_case_1432 + case 1433: + goto st_case_1433 + case 1434: + goto st_case_1434 + case 1435: + goto st_case_1435 + case 1436: + goto st_case_1436 + case 1437: + goto st_case_1437 + case 1438: + goto st_case_1438 + case 1439: + goto st_case_1439 + case 1440: + goto st_case_1440 + case 1441: + goto st_case_1441 + case 1442: + goto st_case_1442 + case 1443: + goto st_case_1443 + case 1444: + goto st_case_1444 + case 1445: + goto st_case_1445 + case 1446: + goto st_case_1446 + case 1447: + goto st_case_1447 + case 1448: + goto st_case_1448 + case 1449: + goto st_case_1449 + case 1450: + goto st_case_1450 + case 1451: + goto st_case_1451 + case 1452: + goto st_case_1452 + case 1453: + goto st_case_1453 + case 1454: + goto st_case_1454 + case 1455: + goto st_case_1455 + case 1456: + goto st_case_1456 + case 1457: + goto st_case_1457 + case 1458: + goto st_case_1458 + case 1459: + goto st_case_1459 + case 1460: + goto st_case_1460 + case 1461: + goto st_case_1461 + case 1462: + goto st_case_1462 + case 1463: + goto st_case_1463 + case 1464: + goto st_case_1464 + case 1465: + goto st_case_1465 + case 1466: + goto st_case_1466 + case 1467: + goto st_case_1467 + case 1468: + goto st_case_1468 + case 1469: + goto st_case_1469 + case 1470: + goto st_case_1470 + case 1471: + goto st_case_1471 + case 1472: + goto st_case_1472 + case 1473: + goto st_case_1473 + case 1474: + goto st_case_1474 + case 1475: + goto st_case_1475 + case 1476: + goto st_case_1476 + case 1477: + goto st_case_1477 + case 1478: + goto st_case_1478 + case 1479: + goto st_case_1479 + case 1480: + goto st_case_1480 + case 1481: + goto st_case_1481 + case 1482: + goto st_case_1482 + case 1483: + goto st_case_1483 + case 1484: + goto st_case_1484 + case 1485: + goto st_case_1485 + case 1486: + goto st_case_1486 + case 1487: + goto st_case_1487 + case 1488: + goto st_case_1488 + case 1489: + goto st_case_1489 + case 1490: + goto st_case_1490 + case 1491: + goto st_case_1491 + case 1492: + goto st_case_1492 + case 1493: + goto st_case_1493 + case 1494: + goto st_case_1494 + case 1495: + goto st_case_1495 + case 1496: + goto st_case_1496 + case 1497: + goto st_case_1497 + case 1498: + goto st_case_1498 + case 1499: + goto st_case_1499 + case 1500: + goto st_case_1500 + case 1501: + goto st_case_1501 + case 1502: + goto st_case_1502 + case 1503: + goto st_case_1503 + case 1504: + goto st_case_1504 + case 1505: + goto st_case_1505 + case 1506: + goto st_case_1506 + case 1507: + goto st_case_1507 + case 1508: + goto st_case_1508 + case 1509: + goto st_case_1509 + case 1510: + goto st_case_1510 + case 1511: + goto st_case_1511 + case 1512: + goto st_case_1512 + case 1513: + goto st_case_1513 + case 1514: + goto st_case_1514 + case 1515: + goto st_case_1515 + case 1516: + goto st_case_1516 + case 1517: + goto st_case_1517 + case 1518: + goto st_case_1518 + case 1519: + goto st_case_1519 + case 1520: + goto st_case_1520 + case 1521: + goto st_case_1521 + case 1522: + goto st_case_1522 + case 1523: + goto st_case_1523 + case 1524: + goto st_case_1524 + case 1525: + goto st_case_1525 + case 1526: + goto st_case_1526 + case 1527: + goto st_case_1527 + case 1528: + goto st_case_1528 + case 1529: + goto st_case_1529 + case 1530: + goto st_case_1530 + case 1531: + goto st_case_1531 + case 1532: + goto st_case_1532 + case 1533: + goto st_case_1533 + case 1534: + goto st_case_1534 + case 1535: + goto st_case_1535 + case 1536: + goto st_case_1536 + case 1537: + goto st_case_1537 + case 1538: + goto st_case_1538 + case 1539: + goto st_case_1539 + case 1540: + goto st_case_1540 + case 1541: + goto st_case_1541 + case 1542: + goto st_case_1542 + case 1543: + goto st_case_1543 + case 1544: + goto st_case_1544 + case 1545: + goto st_case_1545 + case 1546: + goto st_case_1546 + case 1547: + goto st_case_1547 + case 1548: + goto st_case_1548 + case 1549: + goto st_case_1549 + case 1550: + goto st_case_1550 + case 1551: + goto st_case_1551 + case 1552: + goto st_case_1552 + case 1553: + goto st_case_1553 + case 1554: + goto st_case_1554 + case 1555: + goto st_case_1555 + case 1556: + goto st_case_1556 + case 1557: + goto st_case_1557 + case 1558: + goto st_case_1558 + case 1559: + goto st_case_1559 + case 1560: + goto st_case_1560 + case 1561: + goto st_case_1561 + case 1562: + goto st_case_1562 + case 1563: + goto st_case_1563 + case 1564: + goto st_case_1564 + case 1565: + goto st_case_1565 + case 1566: + goto st_case_1566 + case 1567: + goto st_case_1567 + case 1568: + goto st_case_1568 + case 1569: + goto st_case_1569 + case 1570: + goto st_case_1570 + case 1571: + goto st_case_1571 + case 1572: + goto st_case_1572 + case 1573: + goto st_case_1573 + case 1574: + goto st_case_1574 + case 1575: + goto st_case_1575 + case 1576: + goto st_case_1576 + case 1577: + goto st_case_1577 + case 1578: + goto st_case_1578 + case 1579: + goto st_case_1579 + case 1580: + goto st_case_1580 + case 1581: + goto st_case_1581 + case 1582: + goto st_case_1582 + case 1583: + goto st_case_1583 + case 1584: + goto st_case_1584 + case 1585: + goto st_case_1585 + case 1586: + goto st_case_1586 + case 1587: + goto st_case_1587 + case 1588: + goto st_case_1588 + case 1589: + goto st_case_1589 + case 1590: + goto st_case_1590 + case 1591: + goto st_case_1591 + case 4873: + goto st_case_4873 + case 1592: + goto st_case_1592 + case 1593: + goto st_case_1593 + case 1594: + goto st_case_1594 + case 1595: + goto st_case_1595 + case 1596: + goto st_case_1596 + case 1597: + goto st_case_1597 + case 1598: + goto st_case_1598 + case 1599: + goto st_case_1599 + case 1600: + goto st_case_1600 + case 1601: + goto st_case_1601 + case 1602: + goto st_case_1602 + case 1603: + goto st_case_1603 + case 1604: + goto st_case_1604 + case 1605: + goto st_case_1605 + case 1606: + goto st_case_1606 + case 1607: + goto st_case_1607 + case 1608: + goto st_case_1608 + case 1609: + goto st_case_1609 + case 1610: + goto st_case_1610 + case 1611: + goto st_case_1611 + case 1612: + goto st_case_1612 + case 1613: + goto st_case_1613 + case 1614: + goto st_case_1614 + case 1615: + goto st_case_1615 + case 1616: + goto st_case_1616 + case 1617: + goto st_case_1617 + case 1618: + goto st_case_1618 + case 1619: + goto st_case_1619 + case 1620: + goto st_case_1620 + case 1621: + goto st_case_1621 + case 1622: + goto st_case_1622 + case 1623: + goto st_case_1623 + case 1624: + goto st_case_1624 + case 1625: + goto st_case_1625 + case 1626: + goto st_case_1626 + case 1627: + goto st_case_1627 + case 1628: + goto st_case_1628 + case 1629: + goto st_case_1629 + case 1630: + goto st_case_1630 + case 1631: + goto st_case_1631 + case 1632: + goto st_case_1632 + case 1633: + goto st_case_1633 + case 1634: + goto st_case_1634 + case 1635: + goto st_case_1635 + case 1636: + goto st_case_1636 + case 1637: + goto st_case_1637 + case 1638: + goto st_case_1638 + case 1639: + goto st_case_1639 + case 1640: + goto st_case_1640 + case 1641: + goto st_case_1641 + case 1642: + goto st_case_1642 + case 1643: + goto st_case_1643 + case 1644: + goto st_case_1644 + case 1645: + goto st_case_1645 + case 1646: + goto st_case_1646 + case 1647: + goto st_case_1647 + case 1648: + goto st_case_1648 + case 1649: + goto st_case_1649 + case 1650: + goto st_case_1650 + case 1651: + goto st_case_1651 + case 1652: + goto st_case_1652 + case 1653: + goto st_case_1653 + case 1654: + goto st_case_1654 + case 1655: + goto st_case_1655 + case 1656: + goto st_case_1656 + case 1657: + goto st_case_1657 + case 1658: + goto st_case_1658 + case 1659: + goto st_case_1659 + case 1660: + goto st_case_1660 + case 1661: + goto st_case_1661 + case 1662: + goto st_case_1662 + case 1663: + goto st_case_1663 + case 1664: + goto st_case_1664 + case 1665: + goto st_case_1665 + case 1666: + goto st_case_1666 + case 1667: + goto st_case_1667 + case 1668: + goto st_case_1668 + case 1669: + goto st_case_1669 + case 1670: + goto st_case_1670 + case 1671: + goto st_case_1671 + case 1672: + goto st_case_1672 + case 1673: + goto st_case_1673 + case 1674: + goto st_case_1674 + case 1675: + goto st_case_1675 + case 1676: + goto st_case_1676 + case 1677: + goto st_case_1677 + case 1678: + goto st_case_1678 + case 1679: + goto st_case_1679 + case 1680: + goto st_case_1680 + case 1681: + goto st_case_1681 + case 1682: + goto st_case_1682 + case 1683: + goto st_case_1683 + case 1684: + goto st_case_1684 + case 1685: + goto st_case_1685 + case 1686: + goto st_case_1686 + case 1687: + goto st_case_1687 + case 1688: + goto st_case_1688 + case 1689: + goto st_case_1689 + case 1690: + goto st_case_1690 + case 1691: + goto st_case_1691 + case 1692: + goto st_case_1692 + case 1693: + goto st_case_1693 + case 1694: + goto st_case_1694 + case 1695: + goto st_case_1695 + case 1696: + goto st_case_1696 + case 1697: + goto st_case_1697 + case 1698: + goto st_case_1698 + case 1699: + goto st_case_1699 + case 1700: + goto st_case_1700 + case 1701: + goto st_case_1701 + case 1702: + goto st_case_1702 + case 1703: + goto st_case_1703 + case 1704: + goto st_case_1704 + case 1705: + goto st_case_1705 + case 1706: + goto st_case_1706 + case 1707: + goto st_case_1707 + case 1708: + goto st_case_1708 + case 1709: + goto st_case_1709 + case 1710: + goto st_case_1710 + case 1711: + goto st_case_1711 + case 1712: + goto st_case_1712 + case 1713: + goto st_case_1713 + case 1714: + goto st_case_1714 + case 1715: + goto st_case_1715 + case 1716: + goto st_case_1716 + case 1717: + goto st_case_1717 + case 1718: + goto st_case_1718 + case 1719: + goto st_case_1719 + case 1720: + goto st_case_1720 + case 1721: + goto st_case_1721 + case 1722: + goto st_case_1722 + case 1723: + goto st_case_1723 + case 1724: + goto st_case_1724 + case 1725: + goto st_case_1725 + case 1726: + goto st_case_1726 + case 1727: + goto st_case_1727 + case 1728: + goto st_case_1728 + case 1729: + goto st_case_1729 + case 1730: + goto st_case_1730 + case 1731: + goto st_case_1731 + case 1732: + goto st_case_1732 + case 1733: + goto st_case_1733 + case 1734: + goto st_case_1734 + case 1735: + goto st_case_1735 + case 1736: + goto st_case_1736 + case 1737: + goto st_case_1737 + case 1738: + goto st_case_1738 + case 1739: + goto st_case_1739 + case 1740: + goto st_case_1740 + case 1741: + goto st_case_1741 + case 1742: + goto st_case_1742 + case 1743: + goto st_case_1743 + case 1744: + goto st_case_1744 + case 1745: + goto st_case_1745 + case 1746: + goto st_case_1746 + case 1747: + goto st_case_1747 + case 1748: + goto st_case_1748 + case 1749: + goto st_case_1749 + case 1750: + goto st_case_1750 + case 1751: + goto st_case_1751 + case 1752: + goto st_case_1752 + case 1753: + goto st_case_1753 + case 1754: + goto st_case_1754 + case 1755: + goto st_case_1755 + case 1756: + goto st_case_1756 + case 1757: + goto st_case_1757 + case 1758: + goto st_case_1758 + case 1759: + goto st_case_1759 + case 1760: + goto st_case_1760 + case 1761: + goto st_case_1761 + case 1762: + goto st_case_1762 + case 1763: + goto st_case_1763 + case 1764: + goto st_case_1764 + case 1765: + goto st_case_1765 + case 1766: + goto st_case_1766 + case 1767: + goto st_case_1767 + case 1768: + goto st_case_1768 + case 1769: + goto st_case_1769 + case 1770: + goto st_case_1770 + case 1771: + goto st_case_1771 + case 1772: + goto st_case_1772 + case 1773: + goto st_case_1773 + case 1774: + goto st_case_1774 + case 1775: + goto st_case_1775 + case 1776: + goto st_case_1776 + case 1777: + goto st_case_1777 + case 1778: + goto st_case_1778 + case 1779: + goto st_case_1779 + case 1780: + goto st_case_1780 + case 1781: + goto st_case_1781 + case 1782: + goto st_case_1782 + case 1783: + goto st_case_1783 + case 1784: + goto st_case_1784 + case 1785: + goto st_case_1785 + case 1786: + goto st_case_1786 + case 1787: + goto st_case_1787 + case 1788: + goto st_case_1788 + case 1789: + goto st_case_1789 + case 1790: + goto st_case_1790 + case 1791: + goto st_case_1791 + case 1792: + goto st_case_1792 + case 1793: + goto st_case_1793 + case 1794: + goto st_case_1794 + case 1795: + goto st_case_1795 + case 1796: + goto st_case_1796 + case 1797: + goto st_case_1797 + case 1798: + goto st_case_1798 + case 1799: + goto st_case_1799 + case 1800: + goto st_case_1800 + case 1801: + goto st_case_1801 + case 1802: + goto st_case_1802 + case 1803: + goto st_case_1803 + case 1804: + goto st_case_1804 + case 1805: + goto st_case_1805 + case 1806: + goto st_case_1806 + case 1807: + goto st_case_1807 + case 1808: + goto st_case_1808 + case 1809: + goto st_case_1809 + case 1810: + goto st_case_1810 + case 1811: + goto st_case_1811 + case 1812: + goto st_case_1812 + case 1813: + goto st_case_1813 + case 1814: + goto st_case_1814 + case 1815: + goto st_case_1815 + case 1816: + goto st_case_1816 + case 1817: + goto st_case_1817 + case 1818: + goto st_case_1818 + case 1819: + goto st_case_1819 + case 1820: + goto st_case_1820 + case 1821: + goto st_case_1821 + case 1822: + goto st_case_1822 + case 1823: + goto st_case_1823 + case 1824: + goto st_case_1824 + case 1825: + goto st_case_1825 + case 1826: + goto st_case_1826 + case 1827: + goto st_case_1827 + case 1828: + goto st_case_1828 + case 1829: + goto st_case_1829 + case 1830: + goto st_case_1830 + case 1831: + goto st_case_1831 + case 1832: + goto st_case_1832 + case 1833: + goto st_case_1833 + case 1834: + goto st_case_1834 + case 1835: + goto st_case_1835 + case 1836: + goto st_case_1836 + case 1837: + goto st_case_1837 + case 1838: + goto st_case_1838 + case 1839: + goto st_case_1839 + case 1840: + goto st_case_1840 + case 1841: + goto st_case_1841 + case 1842: + goto st_case_1842 + case 1843: + goto st_case_1843 + case 1844: + goto st_case_1844 + case 1845: + goto st_case_1845 + case 1846: + goto st_case_1846 + case 1847: + goto st_case_1847 + case 1848: + goto st_case_1848 + case 1849: + goto st_case_1849 + case 1850: + goto st_case_1850 + case 1851: + goto st_case_1851 + case 1852: + goto st_case_1852 + case 1853: + goto st_case_1853 + case 1854: + goto st_case_1854 + case 1855: + goto st_case_1855 + case 1856: + goto st_case_1856 + case 1857: + goto st_case_1857 + case 1858: + goto st_case_1858 + case 1859: + goto st_case_1859 + case 1860: + goto st_case_1860 + case 1861: + goto st_case_1861 + case 1862: + goto st_case_1862 + case 1863: + goto st_case_1863 + case 1864: + goto st_case_1864 + case 1865: + goto st_case_1865 + case 1866: + goto st_case_1866 + case 1867: + goto st_case_1867 + case 1868: + goto st_case_1868 + case 1869: + goto st_case_1869 + case 1870: + goto st_case_1870 + case 1871: + goto st_case_1871 + case 1872: + goto st_case_1872 + case 1873: + goto st_case_1873 + case 1874: + goto st_case_1874 + case 1875: + goto st_case_1875 + case 1876: + goto st_case_1876 + case 1877: + goto st_case_1877 + case 1878: + goto st_case_1878 + case 1879: + goto st_case_1879 + case 1880: + goto st_case_1880 + case 1881: + goto st_case_1881 + case 1882: + goto st_case_1882 + case 1883: + goto st_case_1883 + case 1884: + goto st_case_1884 + case 1885: + goto st_case_1885 + case 1886: + goto st_case_1886 + case 1887: + goto st_case_1887 + case 1888: + goto st_case_1888 + case 1889: + goto st_case_1889 + case 1890: + goto st_case_1890 + case 1891: + goto st_case_1891 + case 1892: + goto st_case_1892 + case 1893: + goto st_case_1893 + case 1894: + goto st_case_1894 + case 1895: + goto st_case_1895 + case 1896: + goto st_case_1896 + case 1897: + goto st_case_1897 + case 1898: + goto st_case_1898 + case 1899: + goto st_case_1899 + case 1900: + goto st_case_1900 + case 1901: + goto st_case_1901 + case 1902: + goto st_case_1902 + case 1903: + goto st_case_1903 + case 1904: + goto st_case_1904 + case 1905: + goto st_case_1905 + case 1906: + goto st_case_1906 + case 1907: + goto st_case_1907 + case 1908: + goto st_case_1908 + case 1909: + goto st_case_1909 + case 1910: + goto st_case_1910 + case 1911: + goto st_case_1911 + case 1912: + goto st_case_1912 + case 1913: + goto st_case_1913 + case 1914: + goto st_case_1914 + case 1915: + goto st_case_1915 + case 1916: + goto st_case_1916 + case 1917: + goto st_case_1917 + case 1918: + goto st_case_1918 + case 1919: + goto st_case_1919 + case 1920: + goto st_case_1920 + case 1921: + goto st_case_1921 + case 1922: + goto st_case_1922 + case 1923: + goto st_case_1923 + case 1924: + goto st_case_1924 + case 1925: + goto st_case_1925 + case 1926: + goto st_case_1926 + case 1927: + goto st_case_1927 + case 1928: + goto st_case_1928 + case 1929: + goto st_case_1929 + case 1930: + goto st_case_1930 + case 1931: + goto st_case_1931 + case 1932: + goto st_case_1932 + case 1933: + goto st_case_1933 + case 1934: + goto st_case_1934 + case 1935: + goto st_case_1935 + case 1936: + goto st_case_1936 + case 1937: + goto st_case_1937 + case 1938: + goto st_case_1938 + case 1939: + goto st_case_1939 + case 1940: + goto st_case_1940 + case 1941: + goto st_case_1941 + case 1942: + goto st_case_1942 + case 1943: + goto st_case_1943 + case 1944: + goto st_case_1944 + case 1945: + goto st_case_1945 + case 1946: + goto st_case_1946 + case 1947: + goto st_case_1947 + case 1948: + goto st_case_1948 + case 1949: + goto st_case_1949 + case 1950: + goto st_case_1950 + case 1951: + goto st_case_1951 + case 1952: + goto st_case_1952 + case 1953: + goto st_case_1953 + case 1954: + goto st_case_1954 + case 1955: + goto st_case_1955 + case 1956: + goto st_case_1956 + case 1957: + goto st_case_1957 + case 1958: + goto st_case_1958 + case 1959: + goto st_case_1959 + case 1960: + goto st_case_1960 + case 1961: + goto st_case_1961 + case 1962: + goto st_case_1962 + case 1963: + goto st_case_1963 + case 1964: + goto st_case_1964 + case 1965: + goto st_case_1965 + case 1966: + goto st_case_1966 + case 1967: + goto st_case_1967 + case 1968: + goto st_case_1968 + case 1969: + goto st_case_1969 + case 1970: + goto st_case_1970 + case 1971: + goto st_case_1971 + case 1972: + goto st_case_1972 + case 1973: + goto st_case_1973 + case 1974: + goto st_case_1974 + case 1975: + goto st_case_1975 + case 1976: + goto st_case_1976 + case 1977: + goto st_case_1977 + case 1978: + goto st_case_1978 + case 1979: + goto st_case_1979 + case 1980: + goto st_case_1980 + case 1981: + goto st_case_1981 + case 1982: + goto st_case_1982 + case 1983: + goto st_case_1983 + case 1984: + goto st_case_1984 + case 1985: + goto st_case_1985 + case 1986: + goto st_case_1986 + case 1987: + goto st_case_1987 + case 1988: + goto st_case_1988 + case 1989: + goto st_case_1989 + case 1990: + goto st_case_1990 + case 1991: + goto st_case_1991 + case 1992: + goto st_case_1992 + case 1993: + goto st_case_1993 + case 1994: + goto st_case_1994 + case 1995: + goto st_case_1995 + case 1996: + goto st_case_1996 + case 1997: + goto st_case_1997 + case 1998: + goto st_case_1998 + case 1999: + goto st_case_1999 + case 2000: + goto st_case_2000 + case 2001: + goto st_case_2001 + case 2002: + goto st_case_2002 + case 2003: + goto st_case_2003 + case 2004: + goto st_case_2004 + case 2005: + goto st_case_2005 + case 2006: + goto st_case_2006 + case 2007: + goto st_case_2007 + case 2008: + goto st_case_2008 + case 2009: + goto st_case_2009 + case 2010: + goto st_case_2010 + case 2011: + goto st_case_2011 + case 2012: + goto st_case_2012 + case 2013: + goto st_case_2013 + case 2014: + goto st_case_2014 + case 2015: + goto st_case_2015 + case 2016: + goto st_case_2016 + case 2017: + goto st_case_2017 + case 2018: + goto st_case_2018 + case 2019: + goto st_case_2019 + case 2020: + goto st_case_2020 + case 2021: + goto st_case_2021 + case 2022: + goto st_case_2022 + case 2023: + goto st_case_2023 + case 2024: + goto st_case_2024 + case 2025: + goto st_case_2025 + case 2026: + goto st_case_2026 + case 2027: + goto st_case_2027 + case 2028: + goto st_case_2028 + case 2029: + goto st_case_2029 + case 2030: + goto st_case_2030 + case 2031: + goto st_case_2031 + case 2032: + goto st_case_2032 + case 2033: + goto st_case_2033 + case 2034: + goto st_case_2034 + case 2035: + goto st_case_2035 + case 2036: + goto st_case_2036 + case 2037: + goto st_case_2037 + case 2038: + goto st_case_2038 + case 2039: + goto st_case_2039 + case 2040: + goto st_case_2040 + case 2041: + goto st_case_2041 + case 2042: + goto st_case_2042 + case 2043: + goto st_case_2043 + case 2044: + goto st_case_2044 + case 2045: + goto st_case_2045 + case 2046: + goto st_case_2046 + case 2047: + goto st_case_2047 + case 2048: + goto st_case_2048 + case 2049: + goto st_case_2049 + case 2050: + goto st_case_2050 + case 2051: + goto st_case_2051 + case 2052: + goto st_case_2052 + case 2053: + goto st_case_2053 + case 2054: + goto st_case_2054 + case 2055: + goto st_case_2055 + case 2056: + goto st_case_2056 + case 2057: + goto st_case_2057 + case 2058: + goto st_case_2058 + case 2059: + goto st_case_2059 + case 2060: + goto st_case_2060 + case 2061: + goto st_case_2061 + case 2062: + goto st_case_2062 + case 2063: + goto st_case_2063 + case 2064: + goto st_case_2064 + case 2065: + goto st_case_2065 + case 2066: + goto st_case_2066 + case 2067: + goto st_case_2067 + case 2068: + goto st_case_2068 + case 2069: + goto st_case_2069 + case 2070: + goto st_case_2070 + case 2071: + goto st_case_2071 + case 2072: + goto st_case_2072 + case 2073: + goto st_case_2073 + case 2074: + goto st_case_2074 + case 2075: + goto st_case_2075 + case 2076: + goto st_case_2076 + case 2077: + goto st_case_2077 + case 2078: + goto st_case_2078 + case 2079: + goto st_case_2079 + case 2080: + goto st_case_2080 + case 2081: + goto st_case_2081 + case 2082: + goto st_case_2082 + case 2083: + goto st_case_2083 + case 2084: + goto st_case_2084 + case 2085: + goto st_case_2085 + case 2086: + goto st_case_2086 + case 2087: + goto st_case_2087 + case 2088: + goto st_case_2088 + case 2089: + goto st_case_2089 + case 2090: + goto st_case_2090 + case 2091: + goto st_case_2091 + case 2092: + goto st_case_2092 + case 2093: + goto st_case_2093 + case 2094: + goto st_case_2094 + case 2095: + goto st_case_2095 + case 2096: + goto st_case_2096 + case 2097: + goto st_case_2097 + case 2098: + goto st_case_2098 + case 2099: + goto st_case_2099 + case 2100: + goto st_case_2100 + case 2101: + goto st_case_2101 + case 2102: + goto st_case_2102 + case 2103: + goto st_case_2103 + case 2104: + goto st_case_2104 + case 2105: + goto st_case_2105 + case 2106: + goto st_case_2106 + case 2107: + goto st_case_2107 + case 2108: + goto st_case_2108 + case 2109: + goto st_case_2109 + case 2110: + goto st_case_2110 + case 2111: + goto st_case_2111 + case 2112: + goto st_case_2112 + case 2113: + goto st_case_2113 + case 2114: + goto st_case_2114 + case 2115: + goto st_case_2115 + case 2116: + goto st_case_2116 + case 2117: + goto st_case_2117 + case 2118: + goto st_case_2118 + case 2119: + goto st_case_2119 + case 2120: + goto st_case_2120 + case 2121: + goto st_case_2121 + case 2122: + goto st_case_2122 + case 2123: + goto st_case_2123 + case 2124: + goto st_case_2124 + case 2125: + goto st_case_2125 + case 2126: + goto st_case_2126 + case 2127: + goto st_case_2127 + case 2128: + goto st_case_2128 + case 2129: + goto st_case_2129 + case 2130: + goto st_case_2130 + case 2131: + goto st_case_2131 + case 2132: + goto st_case_2132 + case 2133: + goto st_case_2133 + case 2134: + goto st_case_2134 + case 2135: + goto st_case_2135 + case 2136: + goto st_case_2136 + case 2137: + goto st_case_2137 + case 2138: + goto st_case_2138 + case 2139: + goto st_case_2139 + case 2140: + goto st_case_2140 + case 2141: + goto st_case_2141 + case 2142: + goto st_case_2142 + case 2143: + goto st_case_2143 + case 2144: + goto st_case_2144 + case 2145: + goto st_case_2145 + case 2146: + goto st_case_2146 + case 2147: + goto st_case_2147 + case 2148: + goto st_case_2148 + case 2149: + goto st_case_2149 + case 2150: + goto st_case_2150 + case 2151: + goto st_case_2151 + case 2152: + goto st_case_2152 + case 2153: + goto st_case_2153 + case 2154: + goto st_case_2154 + case 2155: + goto st_case_2155 + case 2156: + goto st_case_2156 + case 2157: + goto st_case_2157 + case 2158: + goto st_case_2158 + case 2159: + goto st_case_2159 + case 2160: + goto st_case_2160 + case 2161: + goto st_case_2161 + case 2162: + goto st_case_2162 + case 2163: + goto st_case_2163 + case 2164: + goto st_case_2164 + case 2165: + goto st_case_2165 + case 2166: + goto st_case_2166 + case 2167: + goto st_case_2167 + case 2168: + goto st_case_2168 + case 2169: + goto st_case_2169 + case 2170: + goto st_case_2170 + case 2171: + goto st_case_2171 + case 2172: + goto st_case_2172 + case 2173: + goto st_case_2173 + case 2174: + goto st_case_2174 + case 2175: + goto st_case_2175 + case 2176: + goto st_case_2176 + case 2177: + goto st_case_2177 + case 2178: + goto st_case_2178 + case 2179: + goto st_case_2179 + case 2180: + goto st_case_2180 + case 2181: + goto st_case_2181 + case 2182: + goto st_case_2182 + case 2183: + goto st_case_2183 + case 2184: + goto st_case_2184 + case 2185: + goto st_case_2185 + case 2186: + goto st_case_2186 + case 2187: + goto st_case_2187 + case 2188: + goto st_case_2188 + case 2189: + goto st_case_2189 + case 2190: + goto st_case_2190 + case 2191: + goto st_case_2191 + case 2192: + goto st_case_2192 + case 4874: + goto st_case_4874 + case 2193: + goto st_case_2193 + case 2194: + goto st_case_2194 + case 2195: + goto st_case_2195 + case 2196: + goto st_case_2196 + case 2197: + goto st_case_2197 + case 2198: + goto st_case_2198 + case 2199: + goto st_case_2199 + case 2200: + goto st_case_2200 + case 2201: + goto st_case_2201 + case 2202: + goto st_case_2202 + case 2203: + goto st_case_2203 + case 2204: + goto st_case_2204 + case 2205: + goto st_case_2205 + case 2206: + goto st_case_2206 + case 2207: + goto st_case_2207 + case 2208: + goto st_case_2208 + case 2209: + goto st_case_2209 + case 2210: + goto st_case_2210 + case 2211: + goto st_case_2211 + case 2212: + goto st_case_2212 + case 2213: + goto st_case_2213 + case 2214: + goto st_case_2214 + case 2215: + goto st_case_2215 + case 2216: + goto st_case_2216 + case 2217: + goto st_case_2217 + case 2218: + goto st_case_2218 + case 2219: + goto st_case_2219 + case 2220: + goto st_case_2220 + case 2221: + goto st_case_2221 + case 2222: + goto st_case_2222 + case 2223: + goto st_case_2223 + case 2224: + goto st_case_2224 + case 2225: + goto st_case_2225 + case 2226: + goto st_case_2226 + case 2227: + goto st_case_2227 + case 2228: + goto st_case_2228 + case 2229: + goto st_case_2229 + case 2230: + goto st_case_2230 + case 2231: + goto st_case_2231 + case 2232: + goto st_case_2232 + case 2233: + goto st_case_2233 + case 2234: + goto st_case_2234 + case 2235: + goto st_case_2235 + case 2236: + goto st_case_2236 + case 2237: + goto st_case_2237 + case 2238: + goto st_case_2238 + case 2239: + goto st_case_2239 + case 2240: + goto st_case_2240 + case 2241: + goto st_case_2241 + case 2242: + goto st_case_2242 + case 2243: + goto st_case_2243 + case 2244: + goto st_case_2244 + case 2245: + goto st_case_2245 + case 2246: + goto st_case_2246 + case 2247: + goto st_case_2247 + case 2248: + goto st_case_2248 + case 2249: + goto st_case_2249 + case 2250: + goto st_case_2250 + case 2251: + goto st_case_2251 + case 2252: + goto st_case_2252 + case 2253: + goto st_case_2253 + case 2254: + goto st_case_2254 + case 2255: + goto st_case_2255 + case 2256: + goto st_case_2256 + case 2257: + goto st_case_2257 + case 2258: + goto st_case_2258 + case 2259: + goto st_case_2259 + case 2260: + goto st_case_2260 + case 2261: + goto st_case_2261 + case 2262: + goto st_case_2262 + case 2263: + goto st_case_2263 + case 2264: + goto st_case_2264 + case 2265: + goto st_case_2265 + case 2266: + goto st_case_2266 + case 2267: + goto st_case_2267 + case 2268: + goto st_case_2268 + case 2269: + goto st_case_2269 + case 2270: + goto st_case_2270 + case 2271: + goto st_case_2271 + case 2272: + goto st_case_2272 + case 2273: + goto st_case_2273 + case 2274: + goto st_case_2274 + case 2275: + goto st_case_2275 + case 2276: + goto st_case_2276 + case 2277: + goto st_case_2277 + case 2278: + goto st_case_2278 + case 2279: + goto st_case_2279 + case 2280: + goto st_case_2280 + case 2281: + goto st_case_2281 + case 2282: + goto st_case_2282 + case 2283: + goto st_case_2283 + case 2284: + goto st_case_2284 + case 2285: + goto st_case_2285 + case 2286: + goto st_case_2286 + case 2287: + goto st_case_2287 + case 2288: + goto st_case_2288 + case 2289: + goto st_case_2289 + case 2290: + goto st_case_2290 + case 2291: + goto st_case_2291 + case 2292: + goto st_case_2292 + case 2293: + goto st_case_2293 + case 2294: + goto st_case_2294 + case 2295: + goto st_case_2295 + case 2296: + goto st_case_2296 + case 2297: + goto st_case_2297 + case 2298: + goto st_case_2298 + case 2299: + goto st_case_2299 + case 2300: + goto st_case_2300 + case 2301: + goto st_case_2301 + case 2302: + goto st_case_2302 + case 2303: + goto st_case_2303 + case 2304: + goto st_case_2304 + case 2305: + goto st_case_2305 + case 2306: + goto st_case_2306 + case 2307: + goto st_case_2307 + case 2308: + goto st_case_2308 + case 2309: + goto st_case_2309 + case 2310: + goto st_case_2310 + case 2311: + goto st_case_2311 + case 2312: + goto st_case_2312 + case 2313: + goto st_case_2313 + case 2314: + goto st_case_2314 + case 2315: + goto st_case_2315 + case 2316: + goto st_case_2316 + case 2317: + goto st_case_2317 + case 2318: + goto st_case_2318 + case 2319: + goto st_case_2319 + case 2320: + goto st_case_2320 + case 2321: + goto st_case_2321 + case 2322: + goto st_case_2322 + case 2323: + goto st_case_2323 + case 2324: + goto st_case_2324 + case 2325: + goto st_case_2325 + case 2326: + goto st_case_2326 + case 2327: + goto st_case_2327 + case 2328: + goto st_case_2328 + case 2329: + goto st_case_2329 + case 2330: + goto st_case_2330 + case 2331: + goto st_case_2331 + case 2332: + goto st_case_2332 + case 2333: + goto st_case_2333 + case 2334: + goto st_case_2334 + case 2335: + goto st_case_2335 + case 2336: + goto st_case_2336 + case 2337: + goto st_case_2337 + case 2338: + goto st_case_2338 + case 2339: + goto st_case_2339 + case 4875: + goto st_case_4875 + case 4876: + goto st_case_4876 + case 2340: + goto st_case_2340 + case 2341: + goto st_case_2341 + case 2342: + goto st_case_2342 + case 2343: + goto st_case_2343 + case 2344: + goto st_case_2344 + case 2345: + goto st_case_2345 + case 2346: + goto st_case_2346 + case 2347: + goto st_case_2347 + case 2348: + goto st_case_2348 + case 2349: + goto st_case_2349 + case 2350: + goto st_case_2350 + case 2351: + goto st_case_2351 + case 2352: + goto st_case_2352 + case 2353: + goto st_case_2353 + case 2354: + goto st_case_2354 + case 2355: + goto st_case_2355 + case 2356: + goto st_case_2356 + case 2357: + goto st_case_2357 + case 2358: + goto st_case_2358 + case 2359: + goto st_case_2359 + case 2360: + goto st_case_2360 + case 2361: + goto st_case_2361 + case 2362: + goto st_case_2362 + case 2363: + goto st_case_2363 + case 2364: + goto st_case_2364 + case 2365: + goto st_case_2365 + case 2366: + goto st_case_2366 + case 2367: + goto st_case_2367 + case 2368: + goto st_case_2368 + case 2369: + goto st_case_2369 + case 2370: + goto st_case_2370 + case 2371: + goto st_case_2371 + case 2372: + goto st_case_2372 + case 2373: + goto st_case_2373 + case 2374: + goto st_case_2374 + case 2375: + goto st_case_2375 + case 2376: + goto st_case_2376 + case 2377: + goto st_case_2377 + case 2378: + goto st_case_2378 + case 2379: + goto st_case_2379 + case 2380: + goto st_case_2380 + case 2381: + goto st_case_2381 + case 2382: + goto st_case_2382 + case 2383: + goto st_case_2383 + case 2384: + goto st_case_2384 + case 2385: + goto st_case_2385 + case 2386: + goto st_case_2386 + case 2387: + goto st_case_2387 + case 2388: + goto st_case_2388 + case 2389: + goto st_case_2389 + case 2390: + goto st_case_2390 + case 2391: + goto st_case_2391 + case 2392: + goto st_case_2392 + case 2393: + goto st_case_2393 + case 2394: + goto st_case_2394 + case 2395: + goto st_case_2395 + case 2396: + goto st_case_2396 + case 2397: + goto st_case_2397 + case 2398: + goto st_case_2398 + case 2399: + goto st_case_2399 + case 2400: + goto st_case_2400 + case 2401: + goto st_case_2401 + case 2402: + goto st_case_2402 + case 2403: + goto st_case_2403 + case 2404: + goto st_case_2404 + case 2405: + goto st_case_2405 + case 2406: + goto st_case_2406 + case 2407: + goto st_case_2407 + case 2408: + goto st_case_2408 + case 2409: + goto st_case_2409 + case 2410: + goto st_case_2410 + case 2411: + goto st_case_2411 + case 2412: + goto st_case_2412 + case 2413: + goto st_case_2413 + case 2414: + goto st_case_2414 + case 2415: + goto st_case_2415 + case 2416: + goto st_case_2416 + case 2417: + goto st_case_2417 + case 2418: + goto st_case_2418 + case 2419: + goto st_case_2419 + case 2420: + goto st_case_2420 + case 2421: + goto st_case_2421 + case 2422: + goto st_case_2422 + case 2423: + goto st_case_2423 + case 2424: + goto st_case_2424 + case 2425: + goto st_case_2425 + case 2426: + goto st_case_2426 + case 2427: + goto st_case_2427 + case 2428: + goto st_case_2428 + case 2429: + goto st_case_2429 + case 2430: + goto st_case_2430 + case 2431: + goto st_case_2431 + case 2432: + goto st_case_2432 + case 2433: + goto st_case_2433 + case 2434: + goto st_case_2434 + case 2435: + goto st_case_2435 + case 2436: + goto st_case_2436 + case 2437: + goto st_case_2437 + case 2438: + goto st_case_2438 + case 2439: + goto st_case_2439 + case 2440: + goto st_case_2440 + case 2441: + goto st_case_2441 + case 2442: + goto st_case_2442 + case 2443: + goto st_case_2443 + case 2444: + goto st_case_2444 + case 2445: + goto st_case_2445 + case 2446: + goto st_case_2446 + case 2447: + goto st_case_2447 + case 2448: + goto st_case_2448 + case 2449: + goto st_case_2449 + case 2450: + goto st_case_2450 + case 2451: + goto st_case_2451 + case 2452: + goto st_case_2452 + case 2453: + goto st_case_2453 + case 2454: + goto st_case_2454 + case 2455: + goto st_case_2455 + case 2456: + goto st_case_2456 + case 2457: + goto st_case_2457 + case 2458: + goto st_case_2458 + case 2459: + goto st_case_2459 + case 2460: + goto st_case_2460 + case 2461: + goto st_case_2461 + case 2462: + goto st_case_2462 + case 2463: + goto st_case_2463 + case 2464: + goto st_case_2464 + case 2465: + goto st_case_2465 + case 2466: + goto st_case_2466 + case 2467: + goto st_case_2467 + case 2468: + goto st_case_2468 + case 2469: + goto st_case_2469 + case 2470: + goto st_case_2470 + case 2471: + goto st_case_2471 + case 2472: + goto st_case_2472 + case 2473: + goto st_case_2473 + case 2474: + goto st_case_2474 + case 2475: + goto st_case_2475 + case 2476: + goto st_case_2476 + case 2477: + goto st_case_2477 + case 2478: + goto st_case_2478 + case 2479: + goto st_case_2479 + case 2480: + goto st_case_2480 + case 2481: + goto st_case_2481 + case 2482: + goto st_case_2482 + case 2483: + goto st_case_2483 + case 2484: + goto st_case_2484 + case 2485: + goto st_case_2485 + case 2486: + goto st_case_2486 + case 2487: + goto st_case_2487 + case 2488: + goto st_case_2488 + case 2489: + goto st_case_2489 + case 2490: + goto st_case_2490 + case 2491: + goto st_case_2491 + case 2492: + goto st_case_2492 + case 2493: + goto st_case_2493 + case 2494: + goto st_case_2494 + case 2495: + goto st_case_2495 + case 2496: + goto st_case_2496 + case 2497: + goto st_case_2497 + case 2498: + goto st_case_2498 + case 2499: + goto st_case_2499 + case 2500: + goto st_case_2500 + case 2501: + goto st_case_2501 + case 2502: + goto st_case_2502 + case 2503: + goto st_case_2503 + case 2504: + goto st_case_2504 + case 2505: + goto st_case_2505 + case 2506: + goto st_case_2506 + case 2507: + goto st_case_2507 + case 2508: + goto st_case_2508 + case 2509: + goto st_case_2509 + case 2510: + goto st_case_2510 + case 2511: + goto st_case_2511 + case 2512: + goto st_case_2512 + case 2513: + goto st_case_2513 + case 2514: + goto st_case_2514 + case 2515: + goto st_case_2515 + case 2516: + goto st_case_2516 + case 2517: + goto st_case_2517 + case 2518: + goto st_case_2518 + case 2519: + goto st_case_2519 + case 2520: + goto st_case_2520 + case 2521: + goto st_case_2521 + case 2522: + goto st_case_2522 + case 2523: + goto st_case_2523 + case 2524: + goto st_case_2524 + case 2525: + goto st_case_2525 + case 2526: + goto st_case_2526 + case 2527: + goto st_case_2527 + case 2528: + goto st_case_2528 + case 2529: + goto st_case_2529 + case 2530: + goto st_case_2530 + case 2531: + goto st_case_2531 + case 2532: + goto st_case_2532 + case 2533: + goto st_case_2533 + case 2534: + goto st_case_2534 + case 2535: + goto st_case_2535 + case 2536: + goto st_case_2536 + case 2537: + goto st_case_2537 + case 2538: + goto st_case_2538 + case 2539: + goto st_case_2539 + case 2540: + goto st_case_2540 + case 2541: + goto st_case_2541 + case 2542: + goto st_case_2542 + case 2543: + goto st_case_2543 + case 2544: + goto st_case_2544 + case 2545: + goto st_case_2545 + case 2546: + goto st_case_2546 + case 2547: + goto st_case_2547 + case 2548: + goto st_case_2548 + case 2549: + goto st_case_2549 + case 2550: + goto st_case_2550 + case 2551: + goto st_case_2551 + case 2552: + goto st_case_2552 + case 2553: + goto st_case_2553 + case 2554: + goto st_case_2554 + case 2555: + goto st_case_2555 + case 2556: + goto st_case_2556 + case 2557: + goto st_case_2557 + case 2558: + goto st_case_2558 + case 2559: + goto st_case_2559 + case 2560: + goto st_case_2560 + case 2561: + goto st_case_2561 + case 2562: + goto st_case_2562 + case 2563: + goto st_case_2563 + case 2564: + goto st_case_2564 + case 2565: + goto st_case_2565 + case 2566: + goto st_case_2566 + case 2567: + goto st_case_2567 + case 2568: + goto st_case_2568 + case 2569: + goto st_case_2569 + case 2570: + goto st_case_2570 + case 2571: + goto st_case_2571 + case 2572: + goto st_case_2572 + case 2573: + goto st_case_2573 + case 2574: + goto st_case_2574 + case 2575: + goto st_case_2575 + case 2576: + goto st_case_2576 + case 2577: + goto st_case_2577 + case 2578: + goto st_case_2578 + case 2579: + goto st_case_2579 + case 2580: + goto st_case_2580 + case 2581: + goto st_case_2581 + case 2582: + goto st_case_2582 + case 2583: + goto st_case_2583 + case 2584: + goto st_case_2584 + case 2585: + goto st_case_2585 + case 2586: + goto st_case_2586 + case 2587: + goto st_case_2587 + case 2588: + goto st_case_2588 + case 2589: + goto st_case_2589 + case 2590: + goto st_case_2590 + case 2591: + goto st_case_2591 + case 2592: + goto st_case_2592 + case 2593: + goto st_case_2593 + case 2594: + goto st_case_2594 + case 2595: + goto st_case_2595 + case 2596: + goto st_case_2596 + case 2597: + goto st_case_2597 + case 2598: + goto st_case_2598 + case 2599: + goto st_case_2599 + case 2600: + goto st_case_2600 + case 2601: + goto st_case_2601 + case 2602: + goto st_case_2602 + case 2603: + goto st_case_2603 + case 2604: + goto st_case_2604 + case 2605: + goto st_case_2605 + case 2606: + goto st_case_2606 + case 2607: + goto st_case_2607 + case 2608: + goto st_case_2608 + case 2609: + goto st_case_2609 + case 2610: + goto st_case_2610 + case 2611: + goto st_case_2611 + case 2612: + goto st_case_2612 + case 2613: + goto st_case_2613 + case 2614: + goto st_case_2614 + case 2615: + goto st_case_2615 + case 2616: + goto st_case_2616 + case 2617: + goto st_case_2617 + case 2618: + goto st_case_2618 + case 2619: + goto st_case_2619 + case 2620: + goto st_case_2620 + case 2621: + goto st_case_2621 + case 2622: + goto st_case_2622 + case 2623: + goto st_case_2623 + case 2624: + goto st_case_2624 + case 2625: + goto st_case_2625 + case 2626: + goto st_case_2626 + case 2627: + goto st_case_2627 + case 2628: + goto st_case_2628 + case 2629: + goto st_case_2629 + case 2630: + goto st_case_2630 + case 2631: + goto st_case_2631 + case 2632: + goto st_case_2632 + case 2633: + goto st_case_2633 + case 2634: + goto st_case_2634 + case 2635: + goto st_case_2635 + case 4877: + goto st_case_4877 + case 4878: + goto st_case_4878 + case 2636: + goto st_case_2636 + case 2637: + goto st_case_2637 + case 2638: + goto st_case_2638 + case 2639: + goto st_case_2639 + case 2640: + goto st_case_2640 + case 2641: + goto st_case_2641 + case 2642: + goto st_case_2642 + case 2643: + goto st_case_2643 + case 2644: + goto st_case_2644 + case 2645: + goto st_case_2645 + case 2646: + goto st_case_2646 + case 2647: + goto st_case_2647 + case 2648: + goto st_case_2648 + case 2649: + goto st_case_2649 + case 2650: + goto st_case_2650 + case 2651: + goto st_case_2651 + case 2652: + goto st_case_2652 + case 2653: + goto st_case_2653 + case 2654: + goto st_case_2654 + case 2655: + goto st_case_2655 + case 2656: + goto st_case_2656 + case 2657: + goto st_case_2657 + case 2658: + goto st_case_2658 + case 2659: + goto st_case_2659 + case 2660: + goto st_case_2660 + case 2661: + goto st_case_2661 + case 2662: + goto st_case_2662 + case 2663: + goto st_case_2663 + case 2664: + goto st_case_2664 + case 2665: + goto st_case_2665 + case 2666: + goto st_case_2666 + case 2667: + goto st_case_2667 + case 2668: + goto st_case_2668 + case 2669: + goto st_case_2669 + case 2670: + goto st_case_2670 + case 2671: + goto st_case_2671 + case 2672: + goto st_case_2672 + case 2673: + goto st_case_2673 + case 2674: + goto st_case_2674 + case 2675: + goto st_case_2675 + case 2676: + goto st_case_2676 + case 2677: + goto st_case_2677 + case 2678: + goto st_case_2678 + case 2679: + goto st_case_2679 + case 2680: + goto st_case_2680 + case 2681: + goto st_case_2681 + case 2682: + goto st_case_2682 + case 2683: + goto st_case_2683 + case 2684: + goto st_case_2684 + case 2685: + goto st_case_2685 + case 2686: + goto st_case_2686 + case 2687: + goto st_case_2687 + case 2688: + goto st_case_2688 + case 2689: + goto st_case_2689 + case 2690: + goto st_case_2690 + case 2691: + goto st_case_2691 + case 2692: + goto st_case_2692 + case 2693: + goto st_case_2693 + case 2694: + goto st_case_2694 + case 2695: + goto st_case_2695 + case 2696: + goto st_case_2696 + case 2697: + goto st_case_2697 + case 2698: + goto st_case_2698 + case 2699: + goto st_case_2699 + case 2700: + goto st_case_2700 + case 2701: + goto st_case_2701 + case 2702: + goto st_case_2702 + case 2703: + goto st_case_2703 + case 2704: + goto st_case_2704 + case 2705: + goto st_case_2705 + case 2706: + goto st_case_2706 + case 2707: + goto st_case_2707 + case 2708: + goto st_case_2708 + case 2709: + goto st_case_2709 + case 2710: + goto st_case_2710 + case 2711: + goto st_case_2711 + case 2712: + goto st_case_2712 + case 2713: + goto st_case_2713 + case 2714: + goto st_case_2714 + case 2715: + goto st_case_2715 + case 2716: + goto st_case_2716 + case 2717: + goto st_case_2717 + case 2718: + goto st_case_2718 + case 2719: + goto st_case_2719 + case 2720: + goto st_case_2720 + case 2721: + goto st_case_2721 + case 2722: + goto st_case_2722 + case 2723: + goto st_case_2723 + case 2724: + goto st_case_2724 + case 2725: + goto st_case_2725 + case 2726: + goto st_case_2726 + case 2727: + goto st_case_2727 + case 2728: + goto st_case_2728 + case 2729: + goto st_case_2729 + case 2730: + goto st_case_2730 + case 2731: + goto st_case_2731 + case 2732: + goto st_case_2732 + case 2733: + goto st_case_2733 + case 2734: + goto st_case_2734 + case 2735: + goto st_case_2735 + case 2736: + goto st_case_2736 + case 2737: + goto st_case_2737 + case 2738: + goto st_case_2738 + case 2739: + goto st_case_2739 + case 2740: + goto st_case_2740 + case 2741: + goto st_case_2741 + case 2742: + goto st_case_2742 + case 2743: + goto st_case_2743 + case 2744: + goto st_case_2744 + case 2745: + goto st_case_2745 + case 2746: + goto st_case_2746 + case 2747: + goto st_case_2747 + case 2748: + goto st_case_2748 + case 2749: + goto st_case_2749 + case 2750: + goto st_case_2750 + case 2751: + goto st_case_2751 + case 2752: + goto st_case_2752 + case 2753: + goto st_case_2753 + case 2754: + goto st_case_2754 + case 2755: + goto st_case_2755 + case 2756: + goto st_case_2756 + case 2757: + goto st_case_2757 + case 2758: + goto st_case_2758 + case 2759: + goto st_case_2759 + case 2760: + goto st_case_2760 + case 2761: + goto st_case_2761 + case 2762: + goto st_case_2762 + case 2763: + goto st_case_2763 + case 2764: + goto st_case_2764 + case 2765: + goto st_case_2765 + case 2766: + goto st_case_2766 + case 2767: + goto st_case_2767 + case 2768: + goto st_case_2768 + case 2769: + goto st_case_2769 + case 2770: + goto st_case_2770 + case 2771: + goto st_case_2771 + case 2772: + goto st_case_2772 + case 2773: + goto st_case_2773 + case 2774: + goto st_case_2774 + case 2775: + goto st_case_2775 + case 2776: + goto st_case_2776 + case 4879: + goto st_case_4879 + case 4880: + goto st_case_4880 + case 4881: + goto st_case_4881 + case 4882: + goto st_case_4882 + case 4883: + goto st_case_4883 + case 4884: + goto st_case_4884 + case 4885: + goto st_case_4885 + case 2777: + goto st_case_2777 + case 2778: + goto st_case_2778 + case 2779: + goto st_case_2779 + case 2780: + goto st_case_2780 + case 2781: + goto st_case_2781 + case 2782: + goto st_case_2782 + case 2783: + goto st_case_2783 + case 2784: + goto st_case_2784 + case 2785: + goto st_case_2785 + case 2786: + goto st_case_2786 + case 2787: + goto st_case_2787 + case 2788: + goto st_case_2788 + case 2789: + goto st_case_2789 + case 2790: + goto st_case_2790 + case 2791: + goto st_case_2791 + case 2792: + goto st_case_2792 + case 2793: + goto st_case_2793 + case 2794: + goto st_case_2794 + case 2795: + goto st_case_2795 + case 2796: + goto st_case_2796 + case 2797: + goto st_case_2797 + case 2798: + goto st_case_2798 + case 2799: + goto st_case_2799 + case 2800: + goto st_case_2800 + case 2801: + goto st_case_2801 + case 2802: + goto st_case_2802 + case 2803: + goto st_case_2803 + case 2804: + goto st_case_2804 + case 2805: + goto st_case_2805 + case 2806: + goto st_case_2806 + case 2807: + goto st_case_2807 + case 2808: + goto st_case_2808 + case 2809: + goto st_case_2809 + case 2810: + goto st_case_2810 + case 2811: + goto st_case_2811 + case 2812: + goto st_case_2812 + case 2813: + goto st_case_2813 + case 2814: + goto st_case_2814 + case 2815: + goto st_case_2815 + case 2816: + goto st_case_2816 + case 2817: + goto st_case_2817 + case 2818: + goto st_case_2818 + case 2819: + goto st_case_2819 + case 2820: + goto st_case_2820 + case 2821: + goto st_case_2821 + case 2822: + goto st_case_2822 + case 2823: + goto st_case_2823 + case 2824: + goto st_case_2824 + case 2825: + goto st_case_2825 + case 2826: + goto st_case_2826 + case 2827: + goto st_case_2827 + case 2828: + goto st_case_2828 + case 2829: + goto st_case_2829 + case 2830: + goto st_case_2830 + case 2831: + goto st_case_2831 + case 2832: + goto st_case_2832 + case 2833: + goto st_case_2833 + case 2834: + goto st_case_2834 + case 2835: + goto st_case_2835 + case 2836: + goto st_case_2836 + case 2837: + goto st_case_2837 + case 2838: + goto st_case_2838 + case 2839: + goto st_case_2839 + case 2840: + goto st_case_2840 + case 2841: + goto st_case_2841 + case 2842: + goto st_case_2842 + case 2843: + goto st_case_2843 + case 2844: + goto st_case_2844 + case 2845: + goto st_case_2845 + case 2846: + goto st_case_2846 + case 2847: + goto st_case_2847 + case 2848: + goto st_case_2848 + case 2849: + goto st_case_2849 + case 2850: + goto st_case_2850 + case 2851: + goto st_case_2851 + case 2852: + goto st_case_2852 + case 2853: + goto st_case_2853 + case 2854: + goto st_case_2854 + case 2855: + goto st_case_2855 + case 2856: + goto st_case_2856 + case 2857: + goto st_case_2857 + case 2858: + goto st_case_2858 + case 2859: + goto st_case_2859 + case 2860: + goto st_case_2860 + case 2861: + goto st_case_2861 + case 2862: + goto st_case_2862 + case 2863: + goto st_case_2863 + case 2864: + goto st_case_2864 + case 2865: + goto st_case_2865 + case 2866: + goto st_case_2866 + case 2867: + goto st_case_2867 + case 2868: + goto st_case_2868 + case 2869: + goto st_case_2869 + case 2870: + goto st_case_2870 + case 2871: + goto st_case_2871 + case 2872: + goto st_case_2872 + case 2873: + goto st_case_2873 + case 2874: + goto st_case_2874 + case 2875: + goto st_case_2875 + case 2876: + goto st_case_2876 + case 2877: + goto st_case_2877 + case 2878: + goto st_case_2878 + case 2879: + goto st_case_2879 + case 2880: + goto st_case_2880 + case 2881: + goto st_case_2881 + case 2882: + goto st_case_2882 + case 2883: + goto st_case_2883 + case 2884: + goto st_case_2884 + case 2885: + goto st_case_2885 + case 2886: + goto st_case_2886 + case 2887: + goto st_case_2887 + case 2888: + goto st_case_2888 + case 2889: + goto st_case_2889 + case 2890: + goto st_case_2890 + case 2891: + goto st_case_2891 + case 2892: + goto st_case_2892 + case 2893: + goto st_case_2893 + case 2894: + goto st_case_2894 + case 2895: + goto st_case_2895 + case 2896: + goto st_case_2896 + case 2897: + goto st_case_2897 + case 2898: + goto st_case_2898 + case 2899: + goto st_case_2899 + case 2900: + goto st_case_2900 + case 2901: + goto st_case_2901 + case 2902: + goto st_case_2902 + case 2903: + goto st_case_2903 + case 2904: + goto st_case_2904 + case 2905: + goto st_case_2905 + case 2906: + goto st_case_2906 + case 2907: + goto st_case_2907 + case 2908: + goto st_case_2908 + case 2909: + goto st_case_2909 + case 2910: + goto st_case_2910 + case 2911: + goto st_case_2911 + case 2912: + goto st_case_2912 + case 2913: + goto st_case_2913 + case 2914: + goto st_case_2914 + case 2915: + goto st_case_2915 + case 2916: + goto st_case_2916 + case 2917: + goto st_case_2917 + case 2918: + goto st_case_2918 + case 2919: + goto st_case_2919 + case 2920: + goto st_case_2920 + case 2921: + goto st_case_2921 + case 2922: + goto st_case_2922 + case 2923: + goto st_case_2923 + case 4886: + goto st_case_4886 + case 2924: + goto st_case_2924 + case 2925: + goto st_case_2925 + case 2926: + goto st_case_2926 + case 2927: + goto st_case_2927 + case 2928: + goto st_case_2928 + case 2929: + goto st_case_2929 + case 2930: + goto st_case_2930 + case 2931: + goto st_case_2931 + case 2932: + goto st_case_2932 + case 2933: + goto st_case_2933 + case 2934: + goto st_case_2934 + case 2935: + goto st_case_2935 + case 2936: + goto st_case_2936 + case 2937: + goto st_case_2937 + case 2938: + goto st_case_2938 + case 2939: + goto st_case_2939 + case 2940: + goto st_case_2940 + case 2941: + goto st_case_2941 + case 2942: + goto st_case_2942 + case 2943: + goto st_case_2943 + case 2944: + goto st_case_2944 + case 2945: + goto st_case_2945 + case 2946: + goto st_case_2946 + case 2947: + goto st_case_2947 + case 2948: + goto st_case_2948 + case 2949: + goto st_case_2949 + case 2950: + goto st_case_2950 + case 2951: + goto st_case_2951 + case 2952: + goto st_case_2952 + case 2953: + goto st_case_2953 + case 2954: + goto st_case_2954 + case 2955: + goto st_case_2955 + case 2956: + goto st_case_2956 + case 2957: + goto st_case_2957 + case 2958: + goto st_case_2958 + case 2959: + goto st_case_2959 + case 2960: + goto st_case_2960 + case 2961: + goto st_case_2961 + case 2962: + goto st_case_2962 + case 2963: + goto st_case_2963 + case 2964: + goto st_case_2964 + case 2965: + goto st_case_2965 + case 2966: + goto st_case_2966 + case 2967: + goto st_case_2967 + case 2968: + goto st_case_2968 + case 2969: + goto st_case_2969 + case 2970: + goto st_case_2970 + case 2971: + goto st_case_2971 + case 2972: + goto st_case_2972 + case 2973: + goto st_case_2973 + case 2974: + goto st_case_2974 + case 2975: + goto st_case_2975 + case 2976: + goto st_case_2976 + case 2977: + goto st_case_2977 + case 2978: + goto st_case_2978 + case 2979: + goto st_case_2979 + case 2980: + goto st_case_2980 + case 2981: + goto st_case_2981 + case 2982: + goto st_case_2982 + case 2983: + goto st_case_2983 + case 2984: + goto st_case_2984 + case 2985: + goto st_case_2985 + case 2986: + goto st_case_2986 + case 2987: + goto st_case_2987 + case 2988: + goto st_case_2988 + case 2989: + goto st_case_2989 + case 2990: + goto st_case_2990 + case 2991: + goto st_case_2991 + case 2992: + goto st_case_2992 + case 2993: + goto st_case_2993 + case 2994: + goto st_case_2994 + case 2995: + goto st_case_2995 + case 2996: + goto st_case_2996 + case 2997: + goto st_case_2997 + case 2998: + goto st_case_2998 + case 2999: + goto st_case_2999 + case 3000: + goto st_case_3000 + case 3001: + goto st_case_3001 + case 3002: + goto st_case_3002 + case 3003: + goto st_case_3003 + case 3004: + goto st_case_3004 + case 3005: + goto st_case_3005 + case 3006: + goto st_case_3006 + case 3007: + goto st_case_3007 + case 3008: + goto st_case_3008 + case 3009: + goto st_case_3009 + case 3010: + goto st_case_3010 + case 3011: + goto st_case_3011 + case 3012: + goto st_case_3012 + case 3013: + goto st_case_3013 + case 3014: + goto st_case_3014 + case 3015: + goto st_case_3015 + case 3016: + goto st_case_3016 + case 3017: + goto st_case_3017 + case 3018: + goto st_case_3018 + case 3019: + goto st_case_3019 + case 3020: + goto st_case_3020 + case 3021: + goto st_case_3021 + case 3022: + goto st_case_3022 + case 3023: + goto st_case_3023 + case 3024: + goto st_case_3024 + case 3025: + goto st_case_3025 + case 3026: + goto st_case_3026 + case 3027: + goto st_case_3027 + case 3028: + goto st_case_3028 + case 3029: + goto st_case_3029 + case 3030: + goto st_case_3030 + case 3031: + goto st_case_3031 + case 3032: + goto st_case_3032 + case 3033: + goto st_case_3033 + case 3034: + goto st_case_3034 + case 3035: + goto st_case_3035 + case 3036: + goto st_case_3036 + case 3037: + goto st_case_3037 + case 3038: + goto st_case_3038 + case 3039: + goto st_case_3039 + case 3040: + goto st_case_3040 + case 3041: + goto st_case_3041 + case 3042: + goto st_case_3042 + case 3043: + goto st_case_3043 + case 3044: + goto st_case_3044 + case 3045: + goto st_case_3045 + case 3046: + goto st_case_3046 + case 3047: + goto st_case_3047 + case 3048: + goto st_case_3048 + case 3049: + goto st_case_3049 + case 3050: + goto st_case_3050 + case 3051: + goto st_case_3051 + case 3052: + goto st_case_3052 + case 3053: + goto st_case_3053 + case 3054: + goto st_case_3054 + case 3055: + goto st_case_3055 + case 3056: + goto st_case_3056 + case 3057: + goto st_case_3057 + case 3058: + goto st_case_3058 + case 3059: + goto st_case_3059 + case 3060: + goto st_case_3060 + case 3061: + goto st_case_3061 + case 3062: + goto st_case_3062 + case 3063: + goto st_case_3063 + case 3064: + goto st_case_3064 + case 3065: + goto st_case_3065 + case 3066: + goto st_case_3066 + case 3067: + goto st_case_3067 + case 3068: + goto st_case_3068 + case 3069: + goto st_case_3069 + case 3070: + goto st_case_3070 + case 4887: + goto st_case_4887 + case 3071: + goto st_case_3071 + case 3072: + goto st_case_3072 + case 3073: + goto st_case_3073 + case 3074: + goto st_case_3074 + case 3075: + goto st_case_3075 + case 3076: + goto st_case_3076 + case 3077: + goto st_case_3077 + case 3078: + goto st_case_3078 + case 3079: + goto st_case_3079 + case 3080: + goto st_case_3080 + case 3081: + goto st_case_3081 + case 3082: + goto st_case_3082 + case 3083: + goto st_case_3083 + case 3084: + goto st_case_3084 + case 3085: + goto st_case_3085 + case 3086: + goto st_case_3086 + case 3087: + goto st_case_3087 + case 3088: + goto st_case_3088 + case 3089: + goto st_case_3089 + case 3090: + goto st_case_3090 + case 3091: + goto st_case_3091 + case 3092: + goto st_case_3092 + case 3093: + goto st_case_3093 + case 3094: + goto st_case_3094 + case 3095: + goto st_case_3095 + case 3096: + goto st_case_3096 + case 3097: + goto st_case_3097 + case 3098: + goto st_case_3098 + case 3099: + goto st_case_3099 + case 3100: + goto st_case_3100 + case 3101: + goto st_case_3101 + case 3102: + goto st_case_3102 + case 3103: + goto st_case_3103 + case 3104: + goto st_case_3104 + case 3105: + goto st_case_3105 + case 3106: + goto st_case_3106 + case 3107: + goto st_case_3107 + case 3108: + goto st_case_3108 + case 3109: + goto st_case_3109 + case 3110: + goto st_case_3110 + case 3111: + goto st_case_3111 + case 3112: + goto st_case_3112 + case 3113: + goto st_case_3113 + case 3114: + goto st_case_3114 + case 3115: + goto st_case_3115 + case 3116: + goto st_case_3116 + case 3117: + goto st_case_3117 + case 3118: + goto st_case_3118 + case 3119: + goto st_case_3119 + case 3120: + goto st_case_3120 + case 3121: + goto st_case_3121 + case 3122: + goto st_case_3122 + case 3123: + goto st_case_3123 + case 3124: + goto st_case_3124 + case 3125: + goto st_case_3125 + case 3126: + goto st_case_3126 + case 3127: + goto st_case_3127 + case 3128: + goto st_case_3128 + case 3129: + goto st_case_3129 + case 3130: + goto st_case_3130 + case 3131: + goto st_case_3131 + case 3132: + goto st_case_3132 + case 3133: + goto st_case_3133 + case 3134: + goto st_case_3134 + case 3135: + goto st_case_3135 + case 3136: + goto st_case_3136 + case 3137: + goto st_case_3137 + case 3138: + goto st_case_3138 + case 3139: + goto st_case_3139 + case 3140: + goto st_case_3140 + case 3141: + goto st_case_3141 + case 3142: + goto st_case_3142 + case 3143: + goto st_case_3143 + case 3144: + goto st_case_3144 + case 3145: + goto st_case_3145 + case 3146: + goto st_case_3146 + case 3147: + goto st_case_3147 + case 3148: + goto st_case_3148 + case 3149: + goto st_case_3149 + case 3150: + goto st_case_3150 + case 3151: + goto st_case_3151 + case 3152: + goto st_case_3152 + case 3153: + goto st_case_3153 + case 3154: + goto st_case_3154 + case 3155: + goto st_case_3155 + case 3156: + goto st_case_3156 + case 3157: + goto st_case_3157 + case 3158: + goto st_case_3158 + case 3159: + goto st_case_3159 + case 3160: + goto st_case_3160 + case 3161: + goto st_case_3161 + case 3162: + goto st_case_3162 + case 3163: + goto st_case_3163 + case 3164: + goto st_case_3164 + case 3165: + goto st_case_3165 + case 3166: + goto st_case_3166 + case 3167: + goto st_case_3167 + case 3168: + goto st_case_3168 + case 3169: + goto st_case_3169 + case 3170: + goto st_case_3170 + case 3171: + goto st_case_3171 + case 3172: + goto st_case_3172 + case 3173: + goto st_case_3173 + case 3174: + goto st_case_3174 + case 3175: + goto st_case_3175 + case 3176: + goto st_case_3176 + case 3177: + goto st_case_3177 + case 3178: + goto st_case_3178 + case 3179: + goto st_case_3179 + case 3180: + goto st_case_3180 + case 3181: + goto st_case_3181 + case 3182: + goto st_case_3182 + case 3183: + goto st_case_3183 + case 3184: + goto st_case_3184 + case 3185: + goto st_case_3185 + case 3186: + goto st_case_3186 + case 3187: + goto st_case_3187 + case 3188: + goto st_case_3188 + case 3189: + goto st_case_3189 + case 3190: + goto st_case_3190 + case 3191: + goto st_case_3191 + case 3192: + goto st_case_3192 + case 3193: + goto st_case_3193 + case 3194: + goto st_case_3194 + case 3195: + goto st_case_3195 + case 3196: + goto st_case_3196 + case 3197: + goto st_case_3197 + case 3198: + goto st_case_3198 + case 3199: + goto st_case_3199 + case 3200: + goto st_case_3200 + case 3201: + goto st_case_3201 + case 3202: + goto st_case_3202 + case 3203: + goto st_case_3203 + case 3204: + goto st_case_3204 + case 3205: + goto st_case_3205 + case 3206: + goto st_case_3206 + case 3207: + goto st_case_3207 + case 3208: + goto st_case_3208 + case 3209: + goto st_case_3209 + case 3210: + goto st_case_3210 + case 3211: + goto st_case_3211 + case 3212: + goto st_case_3212 + case 3213: + goto st_case_3213 + case 3214: + goto st_case_3214 + case 3215: + goto st_case_3215 + case 3216: + goto st_case_3216 + case 3217: + goto st_case_3217 + case 4888: + goto st_case_4888 + case 4889: + goto st_case_4889 + case 4890: + goto st_case_4890 + case 4891: + goto st_case_4891 + case 4892: + goto st_case_4892 + case 4893: + goto st_case_4893 + case 4894: + goto st_case_4894 + case 4895: + goto st_case_4895 + case 4896: + goto st_case_4896 + case 4897: + goto st_case_4897 + case 4898: + goto st_case_4898 + case 4899: + goto st_case_4899 + case 4900: + goto st_case_4900 + case 4901: + goto st_case_4901 + case 4902: + goto st_case_4902 + case 4903: + goto st_case_4903 + case 4904: + goto st_case_4904 + case 4905: + goto st_case_4905 + case 4906: + goto st_case_4906 + case 4907: + goto st_case_4907 + case 4908: + goto st_case_4908 + case 4909: + goto st_case_4909 + case 4910: + goto st_case_4910 + case 4911: + goto st_case_4911 + case 4912: + goto st_case_4912 + case 4913: + goto st_case_4913 + case 4914: + goto st_case_4914 + case 4915: + goto st_case_4915 + case 4916: + goto st_case_4916 + case 4917: + goto st_case_4917 + case 4918: + goto st_case_4918 + case 4919: + goto st_case_4919 + case 4920: + goto st_case_4920 + case 4921: + goto st_case_4921 + case 4922: + goto st_case_4922 + case 4923: + goto st_case_4923 + case 4924: + goto st_case_4924 + case 4925: + goto st_case_4925 + case 4926: + goto st_case_4926 + case 4927: + goto st_case_4927 + case 4928: + goto st_case_4928 + case 3218: + goto st_case_3218 + case 3219: + goto st_case_3219 + case 3220: + goto st_case_3220 + case 3221: + goto st_case_3221 + case 3222: + goto st_case_3222 + case 3223: + goto st_case_3223 + case 3224: + goto st_case_3224 + case 3225: + goto st_case_3225 + case 3226: + goto st_case_3226 + case 3227: + goto st_case_3227 + case 3228: + goto st_case_3228 + case 3229: + goto st_case_3229 + case 3230: + goto st_case_3230 + case 3231: + goto st_case_3231 + case 4929: + goto st_case_4929 + case 4930: + goto st_case_4930 + case 4931: + goto st_case_4931 + case 4932: + goto st_case_4932 + case 3232: + goto st_case_3232 + case 4933: + goto st_case_4933 + case 4934: + goto st_case_4934 + case 4935: + goto st_case_4935 + case 4936: + goto st_case_4936 + case 4937: + goto st_case_4937 + case 4938: + goto st_case_4938 + case 4939: + goto st_case_4939 + case 4940: + goto st_case_4940 + case 4941: + goto st_case_4941 + case 4942: + goto st_case_4942 + case 4943: + goto st_case_4943 + case 4944: + goto st_case_4944 + case 4945: + goto st_case_4945 + case 4946: + goto st_case_4946 + case 4947: + goto st_case_4947 + case 4948: + goto st_case_4948 + case 4949: + goto st_case_4949 + case 4950: + goto st_case_4950 + case 4951: + goto st_case_4951 + case 4952: + goto st_case_4952 + case 4953: + goto st_case_4953 + case 4954: + goto st_case_4954 + case 4955: + goto st_case_4955 + case 4956: + goto st_case_4956 + case 4957: + goto st_case_4957 + case 3233: + goto st_case_3233 + case 4958: + goto st_case_4958 + case 4959: + goto st_case_4959 + case 4960: + goto st_case_4960 + case 4961: + goto st_case_4961 + case 4962: + goto st_case_4962 + case 4963: + goto st_case_4963 + case 3234: + goto st_case_3234 + case 4964: + goto st_case_4964 + case 4965: + goto st_case_4965 + case 3235: + goto st_case_3235 + case 4966: + goto st_case_4966 + case 4967: + goto st_case_4967 + case 4968: + goto st_case_4968 + case 4969: + goto st_case_4969 + case 4970: + goto st_case_4970 + case 4971: + goto st_case_4971 + case 4972: + goto st_case_4972 + case 4973: + goto st_case_4973 + case 4974: + goto st_case_4974 + case 4975: + goto st_case_4975 + case 4976: + goto st_case_4976 + case 4977: + goto st_case_4977 + case 4978: + goto st_case_4978 + case 4979: + goto st_case_4979 + case 4980: + goto st_case_4980 + case 3236: + goto st_case_3236 + case 4981: + goto st_case_4981 + case 4982: + goto st_case_4982 + case 4983: + goto st_case_4983 + case 3237: + goto st_case_3237 + case 4984: + goto st_case_4984 + case 4985: + goto st_case_4985 + case 4986: + goto st_case_4986 + case 4987: + goto st_case_4987 + case 4988: + goto st_case_4988 + case 4989: + goto st_case_4989 + case 3238: + goto st_case_3238 + case 4990: + goto st_case_4990 + case 4991: + goto st_case_4991 + case 4992: + goto st_case_4992 + case 4993: + goto st_case_4993 + case 4994: + goto st_case_4994 + case 4995: + goto st_case_4995 + case 4996: + goto st_case_4996 + case 4997: + goto st_case_4997 + case 4998: + goto st_case_4998 + case 4999: + goto st_case_4999 + case 5000: + goto st_case_5000 + case 5001: + goto st_case_5001 + case 5002: + goto st_case_5002 + case 5003: + goto st_case_5003 + case 5004: + goto st_case_5004 + case 5005: + goto st_case_5005 + case 5006: + goto st_case_5006 + case 5007: + goto st_case_5007 + case 5008: + goto st_case_5008 + case 5009: + goto st_case_5009 + case 5010: + goto st_case_5010 + case 5011: + goto st_case_5011 + case 5012: + goto st_case_5012 + case 5013: + goto st_case_5013 + case 5014: + goto st_case_5014 + case 5015: + goto st_case_5015 + case 5016: + goto st_case_5016 + case 5017: + goto st_case_5017 + case 5018: + goto st_case_5018 + case 5019: + goto st_case_5019 + case 5020: + goto st_case_5020 + case 5021: + goto st_case_5021 + case 5022: + goto st_case_5022 + case 5023: + goto st_case_5023 + case 5024: + goto st_case_5024 + case 5025: + goto st_case_5025 + case 5026: + goto st_case_5026 + case 5027: + goto st_case_5027 + case 5028: + goto st_case_5028 + case 5029: + goto st_case_5029 + case 5030: + goto st_case_5030 + case 5031: + goto st_case_5031 + case 5032: + goto st_case_5032 + case 5033: + goto st_case_5033 + case 5034: + goto st_case_5034 + case 5035: + goto st_case_5035 + case 5036: + goto st_case_5036 + case 5037: + goto st_case_5037 + case 5038: + goto st_case_5038 + case 5039: + goto st_case_5039 + case 5040: + goto st_case_5040 + case 5041: + goto st_case_5041 + case 5042: + goto st_case_5042 + case 5043: + goto st_case_5043 + case 5044: + goto st_case_5044 + case 5045: + goto st_case_5045 + case 5046: + goto st_case_5046 + case 5047: + goto st_case_5047 + case 5048: + goto st_case_5048 + case 5049: + goto st_case_5049 + case 5050: + goto st_case_5050 + case 5051: + goto st_case_5051 + case 5052: + goto st_case_5052 + case 5053: + goto st_case_5053 + case 5054: + goto st_case_5054 + case 5055: + goto st_case_5055 + case 5056: + goto st_case_5056 + case 5057: + goto st_case_5057 + case 5058: + goto st_case_5058 + case 5059: + goto st_case_5059 + case 5060: + goto st_case_5060 + case 5061: + goto st_case_5061 + case 5062: + goto st_case_5062 + case 5063: + goto st_case_5063 + case 5064: + goto st_case_5064 + case 5065: + goto st_case_5065 + case 5066: + goto st_case_5066 + case 5067: + goto st_case_5067 + case 5068: + goto st_case_5068 + case 5069: + goto st_case_5069 + case 5070: + goto st_case_5070 + case 5071: + goto st_case_5071 + case 3239: + goto st_case_3239 + case 3240: + goto st_case_3240 + case 3241: + goto st_case_3241 + case 3242: + goto st_case_3242 + case 3243: + goto st_case_3243 + case 3244: + goto st_case_3244 + case 3245: + goto st_case_3245 + case 3246: + goto st_case_3246 + case 3247: + goto st_case_3247 + case 3248: + goto st_case_3248 + case 3249: + goto st_case_3249 + case 3250: + goto st_case_3250 + case 3251: + goto st_case_3251 + case 3252: + goto st_case_3252 + case 3253: + goto st_case_3253 + case 3254: + goto st_case_3254 + case 3255: + goto st_case_3255 + case 3256: + goto st_case_3256 + case 3257: + goto st_case_3257 + case 3258: + goto st_case_3258 + case 3259: + goto st_case_3259 + case 3260: + goto st_case_3260 + case 3261: + goto st_case_3261 + case 3262: + goto st_case_3262 + case 3263: + goto st_case_3263 + case 3264: + goto st_case_3264 + case 3265: + goto st_case_3265 + case 5072: + goto st_case_5072 + case 3266: + goto st_case_3266 + case 3267: + goto st_case_3267 + case 3268: + goto st_case_3268 + case 5073: + goto st_case_5073 + case 3269: + goto st_case_3269 + case 3270: + goto st_case_3270 + case 3271: + goto st_case_3271 + case 3272: + goto st_case_3272 + case 3273: + goto st_case_3273 + case 3274: + goto st_case_3274 + case 3275: + goto st_case_3275 + case 3276: + goto st_case_3276 + case 3277: + goto st_case_3277 + case 3278: + goto st_case_3278 + case 3279: + goto st_case_3279 + case 3280: + goto st_case_3280 + case 3281: + goto st_case_3281 + case 3282: + goto st_case_3282 + case 3283: + goto st_case_3283 + case 3284: + goto st_case_3284 + case 3285: + goto st_case_3285 + case 3286: + goto st_case_3286 + case 3287: + goto st_case_3287 + case 3288: + goto st_case_3288 + case 3289: + goto st_case_3289 + case 3290: + goto st_case_3290 + case 3291: + goto st_case_3291 + case 3292: + goto st_case_3292 + case 3293: + goto st_case_3293 + case 3294: + goto st_case_3294 + case 3295: + goto st_case_3295 + case 3296: + goto st_case_3296 + case 3297: + goto st_case_3297 + case 3298: + goto st_case_3298 + case 3299: + goto st_case_3299 + case 3300: + goto st_case_3300 + case 3301: + goto st_case_3301 + case 3302: + goto st_case_3302 + case 3303: + goto st_case_3303 + case 3304: + goto st_case_3304 + case 3305: + goto st_case_3305 + case 3306: + goto st_case_3306 + case 3307: + goto st_case_3307 + case 3308: + goto st_case_3308 + case 3309: + goto st_case_3309 + case 3310: + goto st_case_3310 + case 3311: + goto st_case_3311 + case 3312: + goto st_case_3312 + case 3313: + goto st_case_3313 + case 3314: + goto st_case_3314 + case 3315: + goto st_case_3315 + case 3316: + goto st_case_3316 + case 3317: + goto st_case_3317 + case 3318: + goto st_case_3318 + case 3319: + goto st_case_3319 + case 3320: + goto st_case_3320 + case 3321: + goto st_case_3321 + case 3322: + goto st_case_3322 + case 3323: + goto st_case_3323 + case 3324: + goto st_case_3324 + case 3325: + goto st_case_3325 + case 3326: + goto st_case_3326 + case 3327: + goto st_case_3327 + case 3328: + goto st_case_3328 + case 3329: + goto st_case_3329 + case 3330: + goto st_case_3330 + case 3331: + goto st_case_3331 + case 3332: + goto st_case_3332 + case 3333: + goto st_case_3333 + case 3334: + goto st_case_3334 + case 3335: + goto st_case_3335 + case 3336: + goto st_case_3336 + case 3337: + goto st_case_3337 + case 3338: + goto st_case_3338 + case 3339: + goto st_case_3339 + case 3340: + goto st_case_3340 + case 3341: + goto st_case_3341 + case 3342: + goto st_case_3342 + case 3343: + goto st_case_3343 + case 3344: + goto st_case_3344 + case 3345: + goto st_case_3345 + case 3346: + goto st_case_3346 + case 3347: + goto st_case_3347 + case 3348: + goto st_case_3348 + case 3349: + goto st_case_3349 + case 3350: + goto st_case_3350 + case 5074: + goto st_case_5074 + case 3351: + goto st_case_3351 + case 3352: + goto st_case_3352 + case 3353: + goto st_case_3353 + case 3354: + goto st_case_3354 + case 3355: + goto st_case_3355 + case 3356: + goto st_case_3356 + case 3357: + goto st_case_3357 + case 3358: + goto st_case_3358 + case 3359: + goto st_case_3359 + case 3360: + goto st_case_3360 + case 3361: + goto st_case_3361 + case 3362: + goto st_case_3362 + case 3363: + goto st_case_3363 + case 3364: + goto st_case_3364 + case 3365: + goto st_case_3365 + case 3366: + goto st_case_3366 + case 3367: + goto st_case_3367 + case 3368: + goto st_case_3368 + case 3369: + goto st_case_3369 + case 3370: + goto st_case_3370 + case 3371: + goto st_case_3371 + case 3372: + goto st_case_3372 + case 3373: + goto st_case_3373 + case 3374: + goto st_case_3374 + case 3375: + goto st_case_3375 + case 3376: + goto st_case_3376 + case 3377: + goto st_case_3377 + case 3378: + goto st_case_3378 + case 3379: + goto st_case_3379 + case 3380: + goto st_case_3380 + case 3381: + goto st_case_3381 + case 3382: + goto st_case_3382 + case 3383: + goto st_case_3383 + case 3384: + goto st_case_3384 + case 3385: + goto st_case_3385 + case 3386: + goto st_case_3386 + case 3387: + goto st_case_3387 + case 3388: + goto st_case_3388 + case 3389: + goto st_case_3389 + case 3390: + goto st_case_3390 + case 3391: + goto st_case_3391 + case 3392: + goto st_case_3392 + case 3393: + goto st_case_3393 + case 3394: + goto st_case_3394 + case 3395: + goto st_case_3395 + case 3396: + goto st_case_3396 + case 3397: + goto st_case_3397 + case 3398: + goto st_case_3398 + case 3399: + goto st_case_3399 + case 3400: + goto st_case_3400 + case 3401: + goto st_case_3401 + case 3402: + goto st_case_3402 + case 3403: + goto st_case_3403 + case 3404: + goto st_case_3404 + case 3405: + goto st_case_3405 + case 3406: + goto st_case_3406 + case 3407: + goto st_case_3407 + case 3408: + goto st_case_3408 + case 3409: + goto st_case_3409 + case 3410: + goto st_case_3410 + case 3411: + goto st_case_3411 + case 3412: + goto st_case_3412 + case 3413: + goto st_case_3413 + case 3414: + goto st_case_3414 + case 3415: + goto st_case_3415 + case 3416: + goto st_case_3416 + case 3417: + goto st_case_3417 + case 3418: + goto st_case_3418 + case 3419: + goto st_case_3419 + case 3420: + goto st_case_3420 + case 3421: + goto st_case_3421 + case 3422: + goto st_case_3422 + case 3423: + goto st_case_3423 + case 3424: + goto st_case_3424 + case 3425: + goto st_case_3425 + case 3426: + goto st_case_3426 + case 3427: + goto st_case_3427 + case 3428: + goto st_case_3428 + case 3429: + goto st_case_3429 + case 3430: + goto st_case_3430 + case 3431: + goto st_case_3431 + case 3432: + goto st_case_3432 + case 3433: + goto st_case_3433 + case 3434: + goto st_case_3434 + case 3435: + goto st_case_3435 + case 3436: + goto st_case_3436 + case 3437: + goto st_case_3437 + case 3438: + goto st_case_3438 + case 3439: + goto st_case_3439 + case 3440: + goto st_case_3440 + case 3441: + goto st_case_3441 + case 3442: + goto st_case_3442 + case 3443: + goto st_case_3443 + case 3444: + goto st_case_3444 + case 3445: + goto st_case_3445 + case 3446: + goto st_case_3446 + case 3447: + goto st_case_3447 + case 3448: + goto st_case_3448 + case 3449: + goto st_case_3449 + case 3450: + goto st_case_3450 + case 3451: + goto st_case_3451 + case 3452: + goto st_case_3452 + case 3453: + goto st_case_3453 + case 3454: + goto st_case_3454 + case 3455: + goto st_case_3455 + case 3456: + goto st_case_3456 + case 3457: + goto st_case_3457 + case 3458: + goto st_case_3458 + case 3459: + goto st_case_3459 + case 3460: + goto st_case_3460 + case 3461: + goto st_case_3461 + case 3462: + goto st_case_3462 + case 3463: + goto st_case_3463 + case 3464: + goto st_case_3464 + case 3465: + goto st_case_3465 + case 3466: + goto st_case_3466 + case 3467: + goto st_case_3467 + case 3468: + goto st_case_3468 + case 3469: + goto st_case_3469 + case 3470: + goto st_case_3470 + case 3471: + goto st_case_3471 + case 3472: + goto st_case_3472 + case 3473: + goto st_case_3473 + case 3474: + goto st_case_3474 + case 3475: + goto st_case_3475 + case 3476: + goto st_case_3476 + case 3477: + goto st_case_3477 + case 3478: + goto st_case_3478 + case 3479: + goto st_case_3479 + case 3480: + goto st_case_3480 + case 3481: + goto st_case_3481 + case 3482: + goto st_case_3482 + case 3483: + goto st_case_3483 + case 3484: + goto st_case_3484 + case 3485: + goto st_case_3485 + case 3486: + goto st_case_3486 + case 3487: + goto st_case_3487 + case 3488: + goto st_case_3488 + case 3489: + goto st_case_3489 + case 3490: + goto st_case_3490 + case 3491: + goto st_case_3491 + case 3492: + goto st_case_3492 + case 3493: + goto st_case_3493 + case 3494: + goto st_case_3494 + case 3495: + goto st_case_3495 + case 3496: + goto st_case_3496 + case 3497: + goto st_case_3497 + case 3498: + goto st_case_3498 + case 3499: + goto st_case_3499 + case 3500: + goto st_case_3500 + case 3501: + goto st_case_3501 + case 3502: + goto st_case_3502 + case 3503: + goto st_case_3503 + case 3504: + goto st_case_3504 + case 3505: + goto st_case_3505 + case 3506: + goto st_case_3506 + case 3507: + goto st_case_3507 + case 3508: + goto st_case_3508 + case 3509: + goto st_case_3509 + case 3510: + goto st_case_3510 + case 3511: + goto st_case_3511 + case 3512: + goto st_case_3512 + case 3513: + goto st_case_3513 + case 3514: + goto st_case_3514 + case 3515: + goto st_case_3515 + case 3516: + goto st_case_3516 + case 3517: + goto st_case_3517 + case 3518: + goto st_case_3518 + case 3519: + goto st_case_3519 + case 3520: + goto st_case_3520 + case 3521: + goto st_case_3521 + case 3522: + goto st_case_3522 + case 3523: + goto st_case_3523 + case 3524: + goto st_case_3524 + case 3525: + goto st_case_3525 + case 3526: + goto st_case_3526 + case 3527: + goto st_case_3527 + case 3528: + goto st_case_3528 + case 3529: + goto st_case_3529 + case 3530: + goto st_case_3530 + case 3531: + goto st_case_3531 + case 3532: + goto st_case_3532 + case 3533: + goto st_case_3533 + case 3534: + goto st_case_3534 + case 3535: + goto st_case_3535 + case 3536: + goto st_case_3536 + case 3537: + goto st_case_3537 + case 3538: + goto st_case_3538 + case 3539: + goto st_case_3539 + case 3540: + goto st_case_3540 + case 3541: + goto st_case_3541 + case 3542: + goto st_case_3542 + case 3543: + goto st_case_3543 + case 3544: + goto st_case_3544 + case 3545: + goto st_case_3545 + case 3546: + goto st_case_3546 + case 3547: + goto st_case_3547 + case 3548: + goto st_case_3548 + case 3549: + goto st_case_3549 + case 3550: + goto st_case_3550 + case 3551: + goto st_case_3551 + case 3552: + goto st_case_3552 + case 3553: + goto st_case_3553 + case 3554: + goto st_case_3554 + case 3555: + goto st_case_3555 + case 3556: + goto st_case_3556 + case 3557: + goto st_case_3557 + case 3558: + goto st_case_3558 + case 3559: + goto st_case_3559 + case 3560: + goto st_case_3560 + case 3561: + goto st_case_3561 + case 3562: + goto st_case_3562 + case 3563: + goto st_case_3563 + case 3564: + goto st_case_3564 + case 3565: + goto st_case_3565 + case 3566: + goto st_case_3566 + case 3567: + goto st_case_3567 + case 3568: + goto st_case_3568 + case 3569: + goto st_case_3569 + case 3570: + goto st_case_3570 + case 3571: + goto st_case_3571 + case 3572: + goto st_case_3572 + case 3573: + goto st_case_3573 + case 3574: + goto st_case_3574 + case 3575: + goto st_case_3575 + case 3576: + goto st_case_3576 + case 3577: + goto st_case_3577 + case 3578: + goto st_case_3578 + case 3579: + goto st_case_3579 + case 3580: + goto st_case_3580 + case 3581: + goto st_case_3581 + case 3582: + goto st_case_3582 + case 3583: + goto st_case_3583 + case 3584: + goto st_case_3584 + case 3585: + goto st_case_3585 + case 3586: + goto st_case_3586 + case 3587: + goto st_case_3587 + case 5075: + goto st_case_5075 + case 3588: + goto st_case_3588 + case 3589: + goto st_case_3589 + case 3590: + goto st_case_3590 + case 3591: + goto st_case_3591 + case 3592: + goto st_case_3592 + case 3593: + goto st_case_3593 + case 5076: + goto st_case_5076 + case 3594: + goto st_case_3594 + case 3595: + goto st_case_3595 + case 3596: + goto st_case_3596 + case 3597: + goto st_case_3597 + case 3598: + goto st_case_3598 + case 3599: + goto st_case_3599 + case 3600: + goto st_case_3600 + case 3601: + goto st_case_3601 + case 3602: + goto st_case_3602 + case 3603: + goto st_case_3603 + case 3604: + goto st_case_3604 + case 3605: + goto st_case_3605 + case 3606: + goto st_case_3606 + case 3607: + goto st_case_3607 + case 3608: + goto st_case_3608 + case 3609: + goto st_case_3609 + case 3610: + goto st_case_3610 + case 3611: + goto st_case_3611 + case 3612: + goto st_case_3612 + case 3613: + goto st_case_3613 + case 3614: + goto st_case_3614 + case 3615: + goto st_case_3615 + case 3616: + goto st_case_3616 + case 3617: + goto st_case_3617 + case 3618: + goto st_case_3618 + case 3619: + goto st_case_3619 + case 3620: + goto st_case_3620 + case 3621: + goto st_case_3621 + case 3622: + goto st_case_3622 + case 3623: + goto st_case_3623 + case 3624: + goto st_case_3624 + case 3625: + goto st_case_3625 + case 3626: + goto st_case_3626 + case 3627: + goto st_case_3627 + case 3628: + goto st_case_3628 + case 3629: + goto st_case_3629 + case 3630: + goto st_case_3630 + case 3631: + goto st_case_3631 + case 3632: + goto st_case_3632 + case 3633: + goto st_case_3633 + case 3634: + goto st_case_3634 + case 3635: + goto st_case_3635 + case 3636: + goto st_case_3636 + case 3637: + goto st_case_3637 + case 3638: + goto st_case_3638 + case 3639: + goto st_case_3639 + case 3640: + goto st_case_3640 + case 3641: + goto st_case_3641 + case 3642: + goto st_case_3642 + case 3643: + goto st_case_3643 + case 3644: + goto st_case_3644 + case 3645: + goto st_case_3645 + case 3646: + goto st_case_3646 + case 3647: + goto st_case_3647 + case 3648: + goto st_case_3648 + case 3649: + goto st_case_3649 + case 3650: + goto st_case_3650 + case 3651: + goto st_case_3651 + case 3652: + goto st_case_3652 + case 3653: + goto st_case_3653 + case 3654: + goto st_case_3654 + case 3655: + goto st_case_3655 + case 3656: + goto st_case_3656 + case 3657: + goto st_case_3657 + case 3658: + goto st_case_3658 + case 3659: + goto st_case_3659 + case 3660: + goto st_case_3660 + case 3661: + goto st_case_3661 + case 3662: + goto st_case_3662 + case 3663: + goto st_case_3663 + case 3664: + goto st_case_3664 + case 3665: + goto st_case_3665 + case 3666: + goto st_case_3666 + case 3667: + goto st_case_3667 + case 3668: + goto st_case_3668 + case 3669: + goto st_case_3669 + case 3670: + goto st_case_3670 + case 3671: + goto st_case_3671 + case 3672: + goto st_case_3672 + case 3673: + goto st_case_3673 + case 3674: + goto st_case_3674 + case 3675: + goto st_case_3675 + case 3676: + goto st_case_3676 + case 3677: + goto st_case_3677 + case 3678: + goto st_case_3678 + case 3679: + goto st_case_3679 + case 3680: + goto st_case_3680 + case 3681: + goto st_case_3681 + case 3682: + goto st_case_3682 + case 3683: + goto st_case_3683 + case 3684: + goto st_case_3684 + case 3685: + goto st_case_3685 + case 3686: + goto st_case_3686 + case 3687: + goto st_case_3687 + case 3688: + goto st_case_3688 + case 3689: + goto st_case_3689 + case 3690: + goto st_case_3690 + case 3691: + goto st_case_3691 + case 3692: + goto st_case_3692 + case 3693: + goto st_case_3693 + case 3694: + goto st_case_3694 + case 3695: + goto st_case_3695 + case 3696: + goto st_case_3696 + case 3697: + goto st_case_3697 + case 3698: + goto st_case_3698 + case 3699: + goto st_case_3699 + case 3700: + goto st_case_3700 + case 3701: + goto st_case_3701 + case 3702: + goto st_case_3702 + case 3703: + goto st_case_3703 + case 3704: + goto st_case_3704 + case 3705: + goto st_case_3705 + case 3706: + goto st_case_3706 + case 3707: + goto st_case_3707 + case 3708: + goto st_case_3708 + case 3709: + goto st_case_3709 + case 3710: + goto st_case_3710 + case 3711: + goto st_case_3711 + case 3712: + goto st_case_3712 + case 3713: + goto st_case_3713 + case 3714: + goto st_case_3714 + case 3715: + goto st_case_3715 + case 3716: + goto st_case_3716 + case 3717: + goto st_case_3717 + case 3718: + goto st_case_3718 + case 3719: + goto st_case_3719 + case 3720: + goto st_case_3720 + case 3721: + goto st_case_3721 + case 3722: + goto st_case_3722 + case 3723: + goto st_case_3723 + case 3724: + goto st_case_3724 + case 3725: + goto st_case_3725 + case 3726: + goto st_case_3726 + case 3727: + goto st_case_3727 + case 3728: + goto st_case_3728 + case 3729: + goto st_case_3729 + case 3730: + goto st_case_3730 + case 3731: + goto st_case_3731 + case 3732: + goto st_case_3732 + case 3733: + goto st_case_3733 + case 3734: + goto st_case_3734 + case 3735: + goto st_case_3735 + case 3736: + goto st_case_3736 + case 5077: + goto st_case_5077 + case 3737: + goto st_case_3737 + case 5078: + goto st_case_5078 + case 3738: + goto st_case_3738 + case 3739: + goto st_case_3739 + case 3740: + goto st_case_3740 + case 3741: + goto st_case_3741 + case 3742: + goto st_case_3742 + case 3743: + goto st_case_3743 + case 3744: + goto st_case_3744 + case 3745: + goto st_case_3745 + case 3746: + goto st_case_3746 + case 3747: + goto st_case_3747 + case 3748: + goto st_case_3748 + case 3749: + goto st_case_3749 + case 3750: + goto st_case_3750 + case 3751: + goto st_case_3751 + case 3752: + goto st_case_3752 + case 3753: + goto st_case_3753 + case 3754: + goto st_case_3754 + case 3755: + goto st_case_3755 + case 3756: + goto st_case_3756 + case 3757: + goto st_case_3757 + case 3758: + goto st_case_3758 + case 3759: + goto st_case_3759 + case 3760: + goto st_case_3760 + case 3761: + goto st_case_3761 + case 3762: + goto st_case_3762 + case 3763: + goto st_case_3763 + case 3764: + goto st_case_3764 + case 3765: + goto st_case_3765 + case 3766: + goto st_case_3766 + case 3767: + goto st_case_3767 + case 3768: + goto st_case_3768 + case 3769: + goto st_case_3769 + case 3770: + goto st_case_3770 + case 3771: + goto st_case_3771 + case 3772: + goto st_case_3772 + case 3773: + goto st_case_3773 + case 3774: + goto st_case_3774 + case 3775: + goto st_case_3775 + case 3776: + goto st_case_3776 + case 3777: + goto st_case_3777 + case 3778: + goto st_case_3778 + case 3779: + goto st_case_3779 + case 3780: + goto st_case_3780 + case 3781: + goto st_case_3781 + case 3782: + goto st_case_3782 + case 3783: + goto st_case_3783 + case 3784: + goto st_case_3784 + case 3785: + goto st_case_3785 + case 3786: + goto st_case_3786 + case 3787: + goto st_case_3787 + case 3788: + goto st_case_3788 + case 3789: + goto st_case_3789 + case 3790: + goto st_case_3790 + case 3791: + goto st_case_3791 + case 3792: + goto st_case_3792 + case 3793: + goto st_case_3793 + case 3794: + goto st_case_3794 + case 3795: + goto st_case_3795 + case 3796: + goto st_case_3796 + case 3797: + goto st_case_3797 + case 3798: + goto st_case_3798 + case 3799: + goto st_case_3799 + case 3800: + goto st_case_3800 + case 3801: + goto st_case_3801 + case 3802: + goto st_case_3802 + case 3803: + goto st_case_3803 + case 3804: + goto st_case_3804 + case 3805: + goto st_case_3805 + case 3806: + goto st_case_3806 + case 3807: + goto st_case_3807 + case 3808: + goto st_case_3808 + case 3809: + goto st_case_3809 + case 3810: + goto st_case_3810 + case 3811: + goto st_case_3811 + case 3812: + goto st_case_3812 + case 3813: + goto st_case_3813 + case 3814: + goto st_case_3814 + case 3815: + goto st_case_3815 + case 3816: + goto st_case_3816 + case 3817: + goto st_case_3817 + case 3818: + goto st_case_3818 + case 3819: + goto st_case_3819 + case 3820: + goto st_case_3820 + case 3821: + goto st_case_3821 + case 3822: + goto st_case_3822 + case 3823: + goto st_case_3823 + case 3824: + goto st_case_3824 + case 3825: + goto st_case_3825 + case 3826: + goto st_case_3826 + case 3827: + goto st_case_3827 + case 3828: + goto st_case_3828 + case 3829: + goto st_case_3829 + case 3830: + goto st_case_3830 + case 3831: + goto st_case_3831 + case 3832: + goto st_case_3832 + case 3833: + goto st_case_3833 + case 3834: + goto st_case_3834 + case 3835: + goto st_case_3835 + case 3836: + goto st_case_3836 + case 3837: + goto st_case_3837 + case 3838: + goto st_case_3838 + case 3839: + goto st_case_3839 + case 3840: + goto st_case_3840 + case 3841: + goto st_case_3841 + case 3842: + goto st_case_3842 + case 3843: + goto st_case_3843 + case 3844: + goto st_case_3844 + case 3845: + goto st_case_3845 + case 3846: + goto st_case_3846 + case 3847: + goto st_case_3847 + case 3848: + goto st_case_3848 + case 3849: + goto st_case_3849 + case 3850: + goto st_case_3850 + case 3851: + goto st_case_3851 + case 3852: + goto st_case_3852 + case 3853: + goto st_case_3853 + case 3854: + goto st_case_3854 + case 3855: + goto st_case_3855 + case 3856: + goto st_case_3856 + case 3857: + goto st_case_3857 + case 3858: + goto st_case_3858 + case 3859: + goto st_case_3859 + case 3860: + goto st_case_3860 + case 3861: + goto st_case_3861 + case 3862: + goto st_case_3862 + case 3863: + goto st_case_3863 + case 3864: + goto st_case_3864 + case 3865: + goto st_case_3865 + case 3866: + goto st_case_3866 + case 3867: + goto st_case_3867 + case 3868: + goto st_case_3868 + case 3869: + goto st_case_3869 + case 3870: + goto st_case_3870 + case 3871: + goto st_case_3871 + case 3872: + goto st_case_3872 + case 3873: + goto st_case_3873 + case 3874: + goto st_case_3874 + case 3875: + goto st_case_3875 + case 3876: + goto st_case_3876 + case 3877: + goto st_case_3877 + case 3878: + goto st_case_3878 + case 3879: + goto st_case_3879 + case 3880: + goto st_case_3880 + case 3881: + goto st_case_3881 + case 3882: + goto st_case_3882 + case 3883: + goto st_case_3883 + case 3884: + goto st_case_3884 + case 5079: + goto st_case_5079 + case 3885: + goto st_case_3885 + case 3886: + goto st_case_3886 + case 3887: + goto st_case_3887 + case 3888: + goto st_case_3888 + case 3889: + goto st_case_3889 + case 3890: + goto st_case_3890 + case 3891: + goto st_case_3891 + case 3892: + goto st_case_3892 + case 3893: + goto st_case_3893 + case 3894: + goto st_case_3894 + case 3895: + goto st_case_3895 + case 3896: + goto st_case_3896 + case 3897: + goto st_case_3897 + case 3898: + goto st_case_3898 + case 3899: + goto st_case_3899 + case 3900: + goto st_case_3900 + case 3901: + goto st_case_3901 + case 3902: + goto st_case_3902 + case 3903: + goto st_case_3903 + case 3904: + goto st_case_3904 + case 3905: + goto st_case_3905 + case 3906: + goto st_case_3906 + case 3907: + goto st_case_3907 + case 3908: + goto st_case_3908 + case 3909: + goto st_case_3909 + case 3910: + goto st_case_3910 + case 3911: + goto st_case_3911 + case 3912: + goto st_case_3912 + case 3913: + goto st_case_3913 + case 3914: + goto st_case_3914 + case 3915: + goto st_case_3915 + case 3916: + goto st_case_3916 + case 3917: + goto st_case_3917 + case 3918: + goto st_case_3918 + case 3919: + goto st_case_3919 + case 3920: + goto st_case_3920 + case 3921: + goto st_case_3921 + case 3922: + goto st_case_3922 + case 3923: + goto st_case_3923 + case 3924: + goto st_case_3924 + case 3925: + goto st_case_3925 + case 3926: + goto st_case_3926 + case 3927: + goto st_case_3927 + case 3928: + goto st_case_3928 + case 3929: + goto st_case_3929 + case 3930: + goto st_case_3930 + case 3931: + goto st_case_3931 + case 3932: + goto st_case_3932 + case 3933: + goto st_case_3933 + case 3934: + goto st_case_3934 + case 3935: + goto st_case_3935 + case 3936: + goto st_case_3936 + case 3937: + goto st_case_3937 + case 3938: + goto st_case_3938 + case 3939: + goto st_case_3939 + case 3940: + goto st_case_3940 + case 3941: + goto st_case_3941 + case 3942: + goto st_case_3942 + case 3943: + goto st_case_3943 + case 3944: + goto st_case_3944 + case 3945: + goto st_case_3945 + case 3946: + goto st_case_3946 + case 3947: + goto st_case_3947 + case 3948: + goto st_case_3948 + case 3949: + goto st_case_3949 + case 3950: + goto st_case_3950 + case 3951: + goto st_case_3951 + case 3952: + goto st_case_3952 + case 3953: + goto st_case_3953 + case 3954: + goto st_case_3954 + case 3955: + goto st_case_3955 + case 3956: + goto st_case_3956 + case 3957: + goto st_case_3957 + case 3958: + goto st_case_3958 + case 3959: + goto st_case_3959 + case 3960: + goto st_case_3960 + case 3961: + goto st_case_3961 + case 3962: + goto st_case_3962 + case 3963: + goto st_case_3963 + case 3964: + goto st_case_3964 + case 3965: + goto st_case_3965 + case 3966: + goto st_case_3966 + case 3967: + goto st_case_3967 + case 3968: + goto st_case_3968 + case 3969: + goto st_case_3969 + case 3970: + goto st_case_3970 + case 3971: + goto st_case_3971 + case 3972: + goto st_case_3972 + case 3973: + goto st_case_3973 + case 3974: + goto st_case_3974 + case 3975: + goto st_case_3975 + case 3976: + goto st_case_3976 + case 3977: + goto st_case_3977 + case 3978: + goto st_case_3978 + case 3979: + goto st_case_3979 + case 3980: + goto st_case_3980 + case 3981: + goto st_case_3981 + case 3982: + goto st_case_3982 + case 3983: + goto st_case_3983 + case 3984: + goto st_case_3984 + case 3985: + goto st_case_3985 + case 3986: + goto st_case_3986 + case 3987: + goto st_case_3987 + case 3988: + goto st_case_3988 + case 3989: + goto st_case_3989 + case 3990: + goto st_case_3990 + case 3991: + goto st_case_3991 + case 3992: + goto st_case_3992 + case 3993: + goto st_case_3993 + case 3994: + goto st_case_3994 + case 3995: + goto st_case_3995 + case 3996: + goto st_case_3996 + case 3997: + goto st_case_3997 + case 3998: + goto st_case_3998 + case 3999: + goto st_case_3999 + case 4000: + goto st_case_4000 + case 4001: + goto st_case_4001 + case 4002: + goto st_case_4002 + case 4003: + goto st_case_4003 + case 4004: + goto st_case_4004 + case 4005: + goto st_case_4005 + case 4006: + goto st_case_4006 + case 4007: + goto st_case_4007 + case 4008: + goto st_case_4008 + case 4009: + goto st_case_4009 + case 4010: + goto st_case_4010 + case 4011: + goto st_case_4011 + case 4012: + goto st_case_4012 + case 4013: + goto st_case_4013 + case 4014: + goto st_case_4014 + case 4015: + goto st_case_4015 + case 4016: + goto st_case_4016 + case 4017: + goto st_case_4017 + case 4018: + goto st_case_4018 + case 4019: + goto st_case_4019 + case 4020: + goto st_case_4020 + case 4021: + goto st_case_4021 + case 4022: + goto st_case_4022 + case 4023: + goto st_case_4023 + case 4024: + goto st_case_4024 + case 4025: + goto st_case_4025 + case 4026: + goto st_case_4026 + case 5080: + goto st_case_5080 + case 4027: + goto st_case_4027 + case 4028: + goto st_case_4028 + case 4029: + goto st_case_4029 + case 4030: + goto st_case_4030 + case 4031: + goto st_case_4031 + case 4032: + goto st_case_4032 + case 4033: + goto st_case_4033 + case 4034: + goto st_case_4034 + case 4035: + goto st_case_4035 + case 4036: + goto st_case_4036 + case 4037: + goto st_case_4037 + case 4038: + goto st_case_4038 + case 4039: + goto st_case_4039 + case 4040: + goto st_case_4040 + case 4041: + goto st_case_4041 + case 4042: + goto st_case_4042 + case 4043: + goto st_case_4043 + case 4044: + goto st_case_4044 + case 4045: + goto st_case_4045 + case 4046: + goto st_case_4046 + case 4047: + goto st_case_4047 + case 4048: + goto st_case_4048 + case 4049: + goto st_case_4049 + case 4050: + goto st_case_4050 + case 4051: + goto st_case_4051 + case 4052: + goto st_case_4052 + case 4053: + goto st_case_4053 + case 4054: + goto st_case_4054 + case 4055: + goto st_case_4055 + case 4056: + goto st_case_4056 + case 4057: + goto st_case_4057 + case 4058: + goto st_case_4058 + case 4059: + goto st_case_4059 + case 4060: + goto st_case_4060 + case 4061: + goto st_case_4061 + case 4062: + goto st_case_4062 + case 4063: + goto st_case_4063 + case 4064: + goto st_case_4064 + case 4065: + goto st_case_4065 + case 4066: + goto st_case_4066 + case 4067: + goto st_case_4067 + case 4068: + goto st_case_4068 + case 4069: + goto st_case_4069 + case 4070: + goto st_case_4070 + case 4071: + goto st_case_4071 + case 4072: + goto st_case_4072 + case 4073: + goto st_case_4073 + case 4074: + goto st_case_4074 + case 4075: + goto st_case_4075 + case 4076: + goto st_case_4076 + case 4077: + goto st_case_4077 + case 4078: + goto st_case_4078 + case 4079: + goto st_case_4079 + case 4080: + goto st_case_4080 + case 4081: + goto st_case_4081 + case 4082: + goto st_case_4082 + case 4083: + goto st_case_4083 + case 4084: + goto st_case_4084 + case 4085: + goto st_case_4085 + case 4086: + goto st_case_4086 + case 4087: + goto st_case_4087 + case 4088: + goto st_case_4088 + case 4089: + goto st_case_4089 + case 4090: + goto st_case_4090 + case 4091: + goto st_case_4091 + case 4092: + goto st_case_4092 + case 4093: + goto st_case_4093 + case 4094: + goto st_case_4094 + case 4095: + goto st_case_4095 + case 4096: + goto st_case_4096 + case 4097: + goto st_case_4097 + case 4098: + goto st_case_4098 + case 4099: + goto st_case_4099 + case 4100: + goto st_case_4100 + case 4101: + goto st_case_4101 + case 4102: + goto st_case_4102 + case 4103: + goto st_case_4103 + case 4104: + goto st_case_4104 + case 4105: + goto st_case_4105 + case 4106: + goto st_case_4106 + case 4107: + goto st_case_4107 + case 4108: + goto st_case_4108 + case 4109: + goto st_case_4109 + case 4110: + goto st_case_4110 + case 4111: + goto st_case_4111 + case 4112: + goto st_case_4112 + case 4113: + goto st_case_4113 + case 4114: + goto st_case_4114 + case 4115: + goto st_case_4115 + case 4116: + goto st_case_4116 + case 4117: + goto st_case_4117 + case 4118: + goto st_case_4118 + case 4119: + goto st_case_4119 + case 4120: + goto st_case_4120 + case 4121: + goto st_case_4121 + case 4122: + goto st_case_4122 + case 4123: + goto st_case_4123 + case 4124: + goto st_case_4124 + case 4125: + goto st_case_4125 + case 4126: + goto st_case_4126 + case 4127: + goto st_case_4127 + case 4128: + goto st_case_4128 + case 4129: + goto st_case_4129 + case 4130: + goto st_case_4130 + case 4131: + goto st_case_4131 + case 4132: + goto st_case_4132 + case 4133: + goto st_case_4133 + case 4134: + goto st_case_4134 + case 4135: + goto st_case_4135 + case 4136: + goto st_case_4136 + case 4137: + goto st_case_4137 + case 4138: + goto st_case_4138 + case 4139: + goto st_case_4139 + case 4140: + goto st_case_4140 + case 4141: + goto st_case_4141 + case 4142: + goto st_case_4142 + case 4143: + goto st_case_4143 + case 4144: + goto st_case_4144 + case 4145: + goto st_case_4145 + case 4146: + goto st_case_4146 + case 4147: + goto st_case_4147 + case 4148: + goto st_case_4148 + case 4149: + goto st_case_4149 + case 4150: + goto st_case_4150 + case 4151: + goto st_case_4151 + case 4152: + goto st_case_4152 + case 4153: + goto st_case_4153 + case 4154: + goto st_case_4154 + case 4155: + goto st_case_4155 + case 4156: + goto st_case_4156 + case 4157: + goto st_case_4157 + case 4158: + goto st_case_4158 + case 4159: + goto st_case_4159 + case 4160: + goto st_case_4160 + case 4161: + goto st_case_4161 + case 4162: + goto st_case_4162 + case 4163: + goto st_case_4163 + case 4164: + goto st_case_4164 + case 4165: + goto st_case_4165 + case 4166: + goto st_case_4166 + case 4167: + goto st_case_4167 + case 4168: + goto st_case_4168 + case 4169: + goto st_case_4169 + case 4170: + goto st_case_4170 + case 4171: + goto st_case_4171 + case 4172: + goto st_case_4172 + case 4173: + goto st_case_4173 + case 4174: + goto st_case_4174 + case 4175: + goto st_case_4175 + case 5081: + goto st_case_5081 + case 4176: + goto st_case_4176 + case 4177: + goto st_case_4177 + case 4178: + goto st_case_4178 + case 4179: + goto st_case_4179 + case 4180: + goto st_case_4180 + case 4181: + goto st_case_4181 + case 4182: + goto st_case_4182 + case 4183: + goto st_case_4183 + case 4184: + goto st_case_4184 + case 4185: + goto st_case_4185 + case 4186: + goto st_case_4186 + case 4187: + goto st_case_4187 + case 4188: + goto st_case_4188 + case 4189: + goto st_case_4189 + case 4190: + goto st_case_4190 + case 4191: + goto st_case_4191 + case 4192: + goto st_case_4192 + case 4193: + goto st_case_4193 + case 4194: + goto st_case_4194 + case 4195: + goto st_case_4195 + case 4196: + goto st_case_4196 + case 4197: + goto st_case_4197 + case 4198: + goto st_case_4198 + case 4199: + goto st_case_4199 + case 4200: + goto st_case_4200 + case 4201: + goto st_case_4201 + case 4202: + goto st_case_4202 + case 4203: + goto st_case_4203 + case 4204: + goto st_case_4204 + case 4205: + goto st_case_4205 + case 4206: + goto st_case_4206 + case 4207: + goto st_case_4207 + case 4208: + goto st_case_4208 + case 4209: + goto st_case_4209 + case 4210: + goto st_case_4210 + case 4211: + goto st_case_4211 + case 4212: + goto st_case_4212 + case 4213: + goto st_case_4213 + case 4214: + goto st_case_4214 + case 4215: + goto st_case_4215 + case 4216: + goto st_case_4216 + case 4217: + goto st_case_4217 + case 4218: + goto st_case_4218 + case 4219: + goto st_case_4219 + case 4220: + goto st_case_4220 + case 4221: + goto st_case_4221 + case 4222: + goto st_case_4222 + case 4223: + goto st_case_4223 + case 4224: + goto st_case_4224 + case 4225: + goto st_case_4225 + case 4226: + goto st_case_4226 + case 4227: + goto st_case_4227 + case 4228: + goto st_case_4228 + case 4229: + goto st_case_4229 + case 4230: + goto st_case_4230 + case 4231: + goto st_case_4231 + case 4232: + goto st_case_4232 + case 4233: + goto st_case_4233 + case 4234: + goto st_case_4234 + case 4235: + goto st_case_4235 + case 4236: + goto st_case_4236 + case 4237: + goto st_case_4237 + case 4238: + goto st_case_4238 + case 4239: + goto st_case_4239 + case 4240: + goto st_case_4240 + case 4241: + goto st_case_4241 + case 4242: + goto st_case_4242 + case 4243: + goto st_case_4243 + case 4244: + goto st_case_4244 + case 4245: + goto st_case_4245 + case 4246: + goto st_case_4246 + case 4247: + goto st_case_4247 + case 4248: + goto st_case_4248 + case 4249: + goto st_case_4249 + case 4250: + goto st_case_4250 + case 4251: + goto st_case_4251 + case 4252: + goto st_case_4252 + case 4253: + goto st_case_4253 + case 4254: + goto st_case_4254 + case 4255: + goto st_case_4255 + case 4256: + goto st_case_4256 + case 4257: + goto st_case_4257 + case 4258: + goto st_case_4258 + case 4259: + goto st_case_4259 + case 4260: + goto st_case_4260 + case 4261: + goto st_case_4261 + case 4262: + goto st_case_4262 + case 4263: + goto st_case_4263 + case 4264: + goto st_case_4264 + case 4265: + goto st_case_4265 + case 4266: + goto st_case_4266 + case 4267: + goto st_case_4267 + case 4268: + goto st_case_4268 + case 4269: + goto st_case_4269 + case 4270: + goto st_case_4270 + case 4271: + goto st_case_4271 + case 4272: + goto st_case_4272 + case 4273: + goto st_case_4273 + case 4274: + goto st_case_4274 + case 4275: + goto st_case_4275 + case 4276: + goto st_case_4276 + case 4277: + goto st_case_4277 + case 4278: + goto st_case_4278 + case 4279: + goto st_case_4279 + case 4280: + goto st_case_4280 + case 4281: + goto st_case_4281 + case 4282: + goto st_case_4282 + case 4283: + goto st_case_4283 + case 4284: + goto st_case_4284 + case 4285: + goto st_case_4285 + case 4286: + goto st_case_4286 + case 4287: + goto st_case_4287 + case 4288: + goto st_case_4288 + case 4289: + goto st_case_4289 + case 4290: + goto st_case_4290 + case 4291: + goto st_case_4291 + case 4292: + goto st_case_4292 + case 4293: + goto st_case_4293 + case 4294: + goto st_case_4294 + case 4295: + goto st_case_4295 + case 4296: + goto st_case_4296 + case 4297: + goto st_case_4297 + case 4298: + goto st_case_4298 + case 4299: + goto st_case_4299 + case 4300: + goto st_case_4300 + case 4301: + goto st_case_4301 + case 4302: + goto st_case_4302 + case 4303: + goto st_case_4303 + case 4304: + goto st_case_4304 + case 4305: + goto st_case_4305 + case 4306: + goto st_case_4306 + case 4307: + goto st_case_4307 + case 4308: + goto st_case_4308 + case 4309: + goto st_case_4309 + case 4310: + goto st_case_4310 + case 4311: + goto st_case_4311 + case 4312: + goto st_case_4312 + case 4313: + goto st_case_4313 + case 4314: + goto st_case_4314 + case 4315: + goto st_case_4315 + case 4316: + goto st_case_4316 + case 4317: + goto st_case_4317 + case 4318: + goto st_case_4318 + case 5082: + goto st_case_5082 + case 4319: + goto st_case_4319 + case 4320: + goto st_case_4320 + case 4321: + goto st_case_4321 + case 4322: + goto st_case_4322 + case 4323: + goto st_case_4323 + case 4324: + goto st_case_4324 + case 4325: + goto st_case_4325 + case 4326: + goto st_case_4326 + case 4327: + goto st_case_4327 + case 4328: + goto st_case_4328 + case 4329: + goto st_case_4329 + case 4330: + goto st_case_4330 + case 4331: + goto st_case_4331 + case 4332: + goto st_case_4332 + case 4333: + goto st_case_4333 + case 4334: + goto st_case_4334 + case 4335: + goto st_case_4335 + case 4336: + goto st_case_4336 + case 4337: + goto st_case_4337 + case 4338: + goto st_case_4338 + case 4339: + goto st_case_4339 + case 4340: + goto st_case_4340 + case 4341: + goto st_case_4341 + case 4342: + goto st_case_4342 + case 4343: + goto st_case_4343 + case 4344: + goto st_case_4344 + case 4345: + goto st_case_4345 + case 4346: + goto st_case_4346 + case 4347: + goto st_case_4347 + case 4348: + goto st_case_4348 + case 4349: + goto st_case_4349 + case 4350: + goto st_case_4350 + case 4351: + goto st_case_4351 + case 4352: + goto st_case_4352 + case 4353: + goto st_case_4353 + case 4354: + goto st_case_4354 + case 4355: + goto st_case_4355 + case 4356: + goto st_case_4356 + case 4357: + goto st_case_4357 + case 4358: + goto st_case_4358 + case 4359: + goto st_case_4359 + case 4360: + goto st_case_4360 + case 4361: + goto st_case_4361 + case 4362: + goto st_case_4362 + case 4363: + goto st_case_4363 + case 4364: + goto st_case_4364 + case 4365: + goto st_case_4365 + case 4366: + goto st_case_4366 + case 4367: + goto st_case_4367 + case 4368: + goto st_case_4368 + case 4369: + goto st_case_4369 + case 4370: + goto st_case_4370 + case 4371: + goto st_case_4371 + case 4372: + goto st_case_4372 + case 4373: + goto st_case_4373 + case 4374: + goto st_case_4374 + case 4375: + goto st_case_4375 + case 4376: + goto st_case_4376 + case 4377: + goto st_case_4377 + case 4378: + goto st_case_4378 + case 4379: + goto st_case_4379 + case 4380: + goto st_case_4380 + case 4381: + goto st_case_4381 + case 4382: + goto st_case_4382 + case 4383: + goto st_case_4383 + case 4384: + goto st_case_4384 + case 4385: + goto st_case_4385 + case 4386: + goto st_case_4386 + case 4387: + goto st_case_4387 + case 4388: + goto st_case_4388 + case 4389: + goto st_case_4389 + case 4390: + goto st_case_4390 + case 4391: + goto st_case_4391 + case 4392: + goto st_case_4392 + case 4393: + goto st_case_4393 + case 4394: + goto st_case_4394 + case 4395: + goto st_case_4395 + case 4396: + goto st_case_4396 + case 4397: + goto st_case_4397 + case 4398: + goto st_case_4398 + case 4399: + goto st_case_4399 + case 4400: + goto st_case_4400 + case 4401: + goto st_case_4401 + case 4402: + goto st_case_4402 + case 4403: + goto st_case_4403 + case 4404: + goto st_case_4404 + case 4405: + goto st_case_4405 + case 4406: + goto st_case_4406 + case 4407: + goto st_case_4407 + case 4408: + goto st_case_4408 + case 4409: + goto st_case_4409 + case 4410: + goto st_case_4410 + case 4411: + goto st_case_4411 + case 4412: + goto st_case_4412 + case 4413: + goto st_case_4413 + case 4414: + goto st_case_4414 + case 4415: + goto st_case_4415 + case 4416: + goto st_case_4416 + case 4417: + goto st_case_4417 + case 4418: + goto st_case_4418 + case 4419: + goto st_case_4419 + case 4420: + goto st_case_4420 + case 4421: + goto st_case_4421 + case 4422: + goto st_case_4422 + case 4423: + goto st_case_4423 + case 4424: + goto st_case_4424 + case 4425: + goto st_case_4425 + case 4426: + goto st_case_4426 + case 4427: + goto st_case_4427 + case 4428: + goto st_case_4428 + case 4429: + goto st_case_4429 + case 4430: + goto st_case_4430 + case 4431: + goto st_case_4431 + case 4432: + goto st_case_4432 + case 4433: + goto st_case_4433 + case 4434: + goto st_case_4434 + case 4435: + goto st_case_4435 + case 4436: + goto st_case_4436 + case 4437: + goto st_case_4437 + case 4438: + goto st_case_4438 + case 4439: + goto st_case_4439 + case 4440: + goto st_case_4440 + case 4441: + goto st_case_4441 + case 4442: + goto st_case_4442 + case 4443: + goto st_case_4443 + case 4444: + goto st_case_4444 + case 4445: + goto st_case_4445 + case 4446: + goto st_case_4446 + case 4447: + goto st_case_4447 + case 4448: + goto st_case_4448 + case 4449: + goto st_case_4449 + case 4450: + goto st_case_4450 + case 4451: + goto st_case_4451 + case 4452: + goto st_case_4452 + case 4453: + goto st_case_4453 + case 4454: + goto st_case_4454 + case 4455: + goto st_case_4455 + case 4456: + goto st_case_4456 + case 4457: + goto st_case_4457 + case 4458: + goto st_case_4458 + case 4459: + goto st_case_4459 + case 4460: + goto st_case_4460 + case 4461: + goto st_case_4461 + case 4462: + goto st_case_4462 + case 4463: + goto st_case_4463 + case 4464: + goto st_case_4464 + case 4465: + goto st_case_4465 + case 4466: + goto st_case_4466 + case 4467: + goto st_case_4467 + case 4468: + goto st_case_4468 + case 4469: + goto st_case_4469 + case 4470: + goto st_case_4470 + case 4471: + goto st_case_4471 + case 4472: + goto st_case_4472 + case 5083: + goto st_case_5083 + case 5084: + goto st_case_5084 + case 5085: + goto st_case_5085 + case 5086: + goto st_case_5086 + case 5087: + goto st_case_5087 + case 5088: + goto st_case_5088 + case 5089: + goto st_case_5089 + case 5090: + goto st_case_5090 + case 5091: + goto st_case_5091 + case 5092: + goto st_case_5092 + case 5093: + goto st_case_5093 + case 5094: + goto st_case_5094 + case 5095: + goto st_case_5095 + case 5096: + goto st_case_5096 + case 5097: + goto st_case_5097 + case 5098: + goto st_case_5098 + case 5099: + goto st_case_5099 + case 5100: + goto st_case_5100 + case 5101: + goto st_case_5101 + case 5102: + goto st_case_5102 + case 5103: + goto st_case_5103 + case 5104: + goto st_case_5104 + case 5105: + goto st_case_5105 + case 5106: + goto st_case_5106 + case 5107: + goto st_case_5107 + case 5108: + goto st_case_5108 + case 5109: + goto st_case_5109 + case 5110: + goto st_case_5110 + case 5111: + goto st_case_5111 + case 5112: + goto st_case_5112 + case 5113: + goto st_case_5113 + case 5114: + goto st_case_5114 + case 5115: + goto st_case_5115 + case 5116: + goto st_case_5116 + case 5117: + goto st_case_5117 + case 5118: + goto st_case_5118 + case 5119: + goto st_case_5119 + case 5120: + goto st_case_5120 + case 5121: + goto st_case_5121 + case 5122: + goto st_case_5122 + case 5123: + goto st_case_5123 + case 5124: + goto st_case_5124 + case 5125: + goto st_case_5125 + case 5126: + goto st_case_5126 + case 5127: + goto st_case_5127 + case 5128: + goto st_case_5128 + case 5129: + goto st_case_5129 + case 5130: + goto st_case_5130 + case 5131: + goto st_case_5131 + case 5132: + goto st_case_5132 + case 5133: + goto st_case_5133 + case 5134: + goto st_case_5134 + case 5135: + goto st_case_5135 + case 5136: + goto st_case_5136 + case 5137: + goto st_case_5137 + case 5138: + goto st_case_5138 + case 5139: + goto st_case_5139 + case 5140: + goto st_case_5140 + case 5141: + goto st_case_5141 + case 5142: + goto st_case_5142 + case 5143: + goto st_case_5143 + case 5144: + goto st_case_5144 + case 5145: + goto st_case_5145 + case 5146: + goto st_case_5146 + case 5147: + goto st_case_5147 + case 5148: + goto st_case_5148 + case 5149: + goto st_case_5149 + case 5150: + goto st_case_5150 + case 5151: + goto st_case_5151 + case 5152: + goto st_case_5152 + case 4473: + goto st_case_4473 + case 5153: + goto st_case_5153 + case 5154: + goto st_case_5154 + case 5155: + goto st_case_5155 + case 5156: + goto st_case_5156 + case 5157: + goto st_case_5157 + case 5158: + goto st_case_5158 + case 5159: + goto st_case_5159 + case 5160: + goto st_case_5160 + case 5161: + goto st_case_5161 + case 5162: + goto st_case_5162 + case 5163: + goto st_case_5163 + case 5164: + goto st_case_5164 + case 5165: + goto st_case_5165 + case 5166: + goto st_case_5166 + case 5167: + goto st_case_5167 + case 5168: + goto st_case_5168 + case 5169: + goto st_case_5169 + case 5170: + goto st_case_5170 + case 5171: + goto st_case_5171 + case 5172: + goto st_case_5172 + case 5173: + goto st_case_5173 + case 4474: + goto st_case_4474 + case 5174: + goto st_case_5174 + case 5175: + goto st_case_5175 + case 5176: + goto st_case_5176 + case 5177: + goto st_case_5177 + case 5178: + goto st_case_5178 + case 5179: + goto st_case_5179 + case 4475: + goto st_case_4475 + case 5180: + goto st_case_5180 + case 5181: + goto st_case_5181 + case 4476: + goto st_case_4476 + case 5182: + goto st_case_5182 + case 5183: + goto st_case_5183 + case 5184: + goto st_case_5184 + case 5185: + goto st_case_5185 + case 5186: + goto st_case_5186 + case 5187: + goto st_case_5187 + case 5188: + goto st_case_5188 + case 5189: + goto st_case_5189 + case 5190: + goto st_case_5190 + case 5191: + goto st_case_5191 + case 5192: + goto st_case_5192 + case 5193: + goto st_case_5193 + case 5194: + goto st_case_5194 + case 5195: + goto st_case_5195 + case 5196: + goto st_case_5196 + case 4477: + goto st_case_4477 + case 5197: + goto st_case_5197 + case 5198: + goto st_case_5198 + case 5199: + goto st_case_5199 + case 4478: + goto st_case_4478 + case 5200: + goto st_case_5200 + case 5201: + goto st_case_5201 + case 5202: + goto st_case_5202 + case 5203: + goto st_case_5203 + case 5204: + goto st_case_5204 + case 5205: + goto st_case_5205 + case 4479: + goto st_case_4479 + case 5206: + goto st_case_5206 + case 5207: + goto st_case_5207 + case 4480: + goto st_case_4480 + case 5208: + goto st_case_5208 + case 5209: + goto st_case_5209 + case 5210: + goto st_case_5210 + case 4481: + goto st_case_4481 + case 4482: + goto st_case_4482 + case 4483: + goto st_case_4483 + case 4484: + goto st_case_4484 + case 4485: + goto st_case_4485 + case 4486: + goto st_case_4486 + case 4487: + goto st_case_4487 + case 4488: + goto st_case_4488 + case 4489: + goto st_case_4489 + case 4490: + goto st_case_4490 + case 4491: + goto st_case_4491 + case 4492: + goto st_case_4492 + case 4493: + goto st_case_4493 + case 4494: + goto st_case_4494 + case 4495: + goto st_case_4495 + case 5211: + goto st_case_5211 + case 4496: + goto st_case_4496 + case 4497: + goto st_case_4497 + case 4498: + goto st_case_4498 + case 4499: + goto st_case_4499 + case 4500: + goto st_case_4500 + case 4501: + goto st_case_4501 + case 4502: + goto st_case_4502 + case 4503: + goto st_case_4503 + case 4504: + goto st_case_4504 + case 4505: + goto st_case_4505 + case 4506: + goto st_case_4506 + case 4507: + goto st_case_4507 + case 4508: + goto st_case_4508 + case 4509: + goto st_case_4509 + case 4510: + goto st_case_4510 + case 4511: + goto st_case_4511 + case 4512: + goto st_case_4512 + case 4513: + goto st_case_4513 + case 4514: + goto st_case_4514 + case 4515: + goto st_case_4515 + case 4516: + goto st_case_4516 + case 4517: + goto st_case_4517 + case 4518: + goto st_case_4518 + case 4519: + goto st_case_4519 + case 4520: + goto st_case_4520 + case 4521: + goto st_case_4521 + case 4522: + goto st_case_4522 + case 4523: + goto st_case_4523 + case 4524: + goto st_case_4524 + case 4525: + goto st_case_4525 + case 4526: + goto st_case_4526 + case 4527: + goto st_case_4527 + case 4528: + goto st_case_4528 + case 4529: + goto st_case_4529 + case 4530: + goto st_case_4530 + case 4531: + goto st_case_4531 + case 4532: + goto st_case_4532 + case 4533: + goto st_case_4533 + case 4534: + goto st_case_4534 + case 4535: + goto st_case_4535 + case 4536: + goto st_case_4536 + case 4537: + goto st_case_4537 + case 4538: + goto st_case_4538 + case 4539: + goto st_case_4539 + case 4540: + goto st_case_4540 + case 4541: + goto st_case_4541 + case 4542: + goto st_case_4542 + case 4543: + goto st_case_4543 + case 4544: + goto st_case_4544 + case 4545: + goto st_case_4545 + case 4546: + goto st_case_4546 + case 4547: + goto st_case_4547 + case 4548: + goto st_case_4548 + case 4549: + goto st_case_4549 + case 4550: + goto st_case_4550 + case 4551: + goto st_case_4551 + case 4552: + goto st_case_4552 + case 4553: + goto st_case_4553 + case 4554: + goto st_case_4554 + case 4555: + goto st_case_4555 + case 4556: + goto st_case_4556 + case 4557: + goto st_case_4557 + case 4558: + goto st_case_4558 + case 4559: + goto st_case_4559 + case 4560: + goto st_case_4560 + case 4561: + goto st_case_4561 + case 4562: + goto st_case_4562 + case 4563: + goto st_case_4563 + case 4564: + goto st_case_4564 + case 4565: + goto st_case_4565 + case 4566: + goto st_case_4566 + case 4567: + goto st_case_4567 + case 4568: + goto st_case_4568 + case 4569: + goto st_case_4569 + case 4570: + goto st_case_4570 + case 4571: + goto st_case_4571 + case 4572: + goto st_case_4572 + case 4573: + goto st_case_4573 + case 4574: + goto st_case_4574 + case 4575: + goto st_case_4575 + case 4576: + goto st_case_4576 + case 4577: + goto st_case_4577 + case 4578: + goto st_case_4578 + case 4579: + goto st_case_4579 + case 4580: + goto st_case_4580 + case 4581: + goto st_case_4581 + case 4582: + goto st_case_4582 + case 4583: + goto st_case_4583 + case 4584: + goto st_case_4584 + case 4585: + goto st_case_4585 + case 4586: + goto st_case_4586 + case 4587: + goto st_case_4587 + case 4588: + goto st_case_4588 + case 4589: + goto st_case_4589 + case 4590: + goto st_case_4590 + case 4591: + goto st_case_4591 + case 4592: + goto st_case_4592 + case 4593: + goto st_case_4593 + case 4594: + goto st_case_4594 + case 4595: + goto st_case_4595 + case 4596: + goto st_case_4596 + case 4597: + goto st_case_4597 + case 4598: + goto st_case_4598 + case 4599: + goto st_case_4599 + case 4600: + goto st_case_4600 + case 4601: + goto st_case_4601 + case 4602: + goto st_case_4602 + case 4603: + goto st_case_4603 + case 4604: + goto st_case_4604 + case 4605: + goto st_case_4605 + case 4606: + goto st_case_4606 + case 4607: + goto st_case_4607 + case 4608: + goto st_case_4608 + case 4609: + goto st_case_4609 + case 4610: + goto st_case_4610 + case 4611: + goto st_case_4611 + case 4612: + goto st_case_4612 + case 4613: + goto st_case_4613 + case 4614: + goto st_case_4614 + case 4615: + goto st_case_4615 + case 4616: + goto st_case_4616 + case 4617: + goto st_case_4617 + case 4618: + goto st_case_4618 + case 4619: + goto st_case_4619 + case 4620: + goto st_case_4620 + case 4621: + goto st_case_4621 + case 4622: + goto st_case_4622 + case 4623: + goto st_case_4623 + case 4624: + goto st_case_4624 + case 4625: + goto st_case_4625 + case 4626: + goto st_case_4626 + case 4627: + goto st_case_4627 + case 4628: + goto st_case_4628 + case 4629: + goto st_case_4629 + case 4630: + goto st_case_4630 + case 4631: + goto st_case_4631 + case 4632: + goto st_case_4632 + case 4633: + goto st_case_4633 + case 4634: + goto st_case_4634 + case 4635: + goto st_case_4635 + case 4636: + goto st_case_4636 + case 4637: + goto st_case_4637 + case 4638: + goto st_case_4638 + case 4639: + goto st_case_4639 + case 4640: + goto st_case_4640 + case 4641: + goto st_case_4641 + case 4642: + goto st_case_4642 + case 4643: + goto st_case_4643 + case 4644: + goto st_case_4644 + case 4645: + goto st_case_4645 + case 4646: + goto st_case_4646 + case 4647: + goto st_case_4647 + case 4648: + goto st_case_4648 + case 4649: + goto st_case_4649 + case 4650: + goto st_case_4650 + case 4651: + goto st_case_4651 + case 4652: + goto st_case_4652 + case 4653: + goto st_case_4653 + case 4654: + goto st_case_4654 + case 4655: + goto st_case_4655 + case 5212: + goto st_case_5212 + case 5213: + goto st_case_5213 + case 5214: + goto st_case_5214 + case 5215: + goto st_case_5215 + case 5216: + goto st_case_5216 + case 5217: + goto st_case_5217 + case 5218: + goto st_case_5218 + case 5219: + goto st_case_5219 + case 5220: + goto st_case_5220 + case 5221: + goto st_case_5221 + case 5222: + goto st_case_5222 + case 5223: + goto st_case_5223 + case 5224: + goto st_case_5224 + case 5225: + goto st_case_5225 + case 5226: + goto st_case_5226 + case 5227: + goto st_case_5227 + case 5228: + goto st_case_5228 + case 5229: + goto st_case_5229 + case 5230: + goto st_case_5230 + case 5231: + goto st_case_5231 + case 5232: + goto st_case_5232 + case 5233: + goto st_case_5233 + case 5234: + goto st_case_5234 + case 5235: + goto st_case_5235 + case 5236: + goto st_case_5236 + case 5237: + goto st_case_5237 + case 5238: + goto st_case_5238 + case 5239: + goto st_case_5239 + case 5240: + goto st_case_5240 + case 5241: + goto st_case_5241 + case 5242: + goto st_case_5242 + case 4656: + goto st_case_4656 + case 5243: + goto st_case_5243 + case 5244: + goto st_case_5244 + case 5245: + goto st_case_5245 + case 5246: + goto st_case_5246 + case 5247: + goto st_case_5247 + case 5248: + goto st_case_5248 + case 5249: + goto st_case_5249 + case 5250: + goto st_case_5250 + case 4657: + goto st_case_4657 + case 5251: + goto st_case_5251 + case 5252: + goto st_case_5252 + case 5253: + goto st_case_5253 + case 5254: + goto st_case_5254 + case 5255: + goto st_case_5255 + case 5256: + goto st_case_5256 + case 4658: + goto st_case_4658 + case 5257: + goto st_case_5257 + case 5258: + goto st_case_5258 + case 4659: + goto st_case_4659 + case 5259: + goto st_case_5259 + case 5260: + goto st_case_5260 + case 5261: + goto st_case_5261 + case 5262: + goto st_case_5262 + case 5263: + goto st_case_5263 + case 5264: + goto st_case_5264 + case 5265: + goto st_case_5265 + case 5266: + goto st_case_5266 + case 5267: + goto st_case_5267 + case 5268: + goto st_case_5268 + case 5269: + goto st_case_5269 + case 5270: + goto st_case_5270 + case 5271: + goto st_case_5271 + case 5272: + goto st_case_5272 + case 5273: + goto st_case_5273 + case 5274: + goto st_case_5274 + case 5275: + goto st_case_5275 + case 5276: + goto st_case_5276 + case 5277: + goto st_case_5277 + case 4660: + goto st_case_4660 + case 5278: + goto st_case_5278 + case 5279: + goto st_case_5279 + case 5280: + goto st_case_5280 + case 4661: + goto st_case_4661 + case 5281: + goto st_case_5281 + case 5282: + goto st_case_5282 + case 5283: + goto st_case_5283 + case 5284: + goto st_case_5284 + case 5285: + goto st_case_5285 + case 5286: + goto st_case_5286 + case 4662: + goto st_case_4662 + case 5287: + goto st_case_5287 + case 5288: + goto st_case_5288 + case 5289: + goto st_case_5289 + case 5290: + goto st_case_5290 + case 5291: + goto st_case_5291 + case 5292: + goto st_case_5292 + case 5293: + goto st_case_5293 + case 5294: + goto st_case_5294 + case 5295: + goto st_case_5295 + case 5296: + goto st_case_5296 + case 5297: + goto st_case_5297 + case 5298: + goto st_case_5298 + case 5299: + goto st_case_5299 + case 5300: + goto st_case_5300 + case 5301: + goto st_case_5301 + case 5302: + goto st_case_5302 + case 5303: + goto st_case_5303 + case 5304: + goto st_case_5304 + case 5305: + goto st_case_5305 + case 5306: + goto st_case_5306 + case 5307: + goto st_case_5307 + case 5308: + goto st_case_5308 + case 5309: + goto st_case_5309 + case 5310: + goto st_case_5310 + case 5311: + goto st_case_5311 + case 5312: + goto st_case_5312 + case 5313: + goto st_case_5313 + case 5314: + goto st_case_5314 + case 5315: + goto st_case_5315 + case 5316: + goto st_case_5316 + case 5317: + goto st_case_5317 + case 5318: + goto st_case_5318 + case 5319: + goto st_case_5319 + case 5320: + goto st_case_5320 + case 5321: + goto st_case_5321 + case 5322: + goto st_case_5322 + case 5323: + goto st_case_5323 + case 5324: + goto st_case_5324 + case 5325: + goto st_case_5325 + case 5326: + goto st_case_5326 + case 5327: + goto st_case_5327 + case 5328: + goto st_case_5328 + case 5329: + goto st_case_5329 + case 5330: + goto st_case_5330 + case 5331: + goto st_case_5331 + case 5332: + goto st_case_5332 + case 5333: + goto st_case_5333 + case 5334: + goto st_case_5334 + case 5335: + goto st_case_5335 + case 5336: + goto st_case_5336 + case 5337: + goto st_case_5337 + case 5338: + goto st_case_5338 + case 4663: + goto st_case_4663 + case 4664: + goto st_case_4664 + case 4665: + goto st_case_4665 + case 4666: + goto st_case_4666 + case 4667: + goto st_case_4667 + case 4668: + goto st_case_4668 + case 4669: + goto st_case_4669 + case 4670: + goto st_case_4670 + case 5339: + goto st_case_5339 + case 4671: + goto st_case_4671 + case 4672: + goto st_case_4672 + case 4673: + goto st_case_4673 + case 4674: + goto st_case_4674 + case 4675: + goto st_case_4675 + case 4676: + goto st_case_4676 + case 4677: + goto st_case_4677 + case 4678: + goto st_case_4678 + case 4679: + goto st_case_4679 + case 4680: + goto st_case_4680 + case 4681: + goto st_case_4681 + case 4682: + goto st_case_4682 + case 4683: + goto st_case_4683 + case 4684: + goto st_case_4684 + case 4685: + goto st_case_4685 + case 4686: + goto st_case_4686 + case 4687: + goto st_case_4687 + case 4688: + goto st_case_4688 + case 4689: + goto st_case_4689 + case 4690: + goto st_case_4690 + case 4691: + goto st_case_4691 + case 4692: + goto st_case_4692 + case 4693: + goto st_case_4693 + case 4694: + goto st_case_4694 + case 4695: + goto st_case_4695 + case 4696: + goto st_case_4696 + case 4697: + goto st_case_4697 + case 4698: + goto st_case_4698 + case 4699: + goto st_case_4699 + case 4700: + goto st_case_4700 + case 4701: + goto st_case_4701 + case 4702: + goto st_case_4702 + case 4703: + goto st_case_4703 + case 4704: + goto st_case_4704 + case 4705: + goto st_case_4705 + case 4706: + goto st_case_4706 + case 4707: + goto st_case_4707 + case 5340: + goto st_case_5340 + case 4708: + goto st_case_4708 + case 4709: + goto st_case_4709 + case 4710: + goto st_case_4710 + case 4711: + goto st_case_4711 + case 4712: + goto st_case_4712 + case 4713: + goto st_case_4713 + case 4714: + goto st_case_4714 + case 4715: + goto st_case_4715 + case 4716: + goto st_case_4716 + case 4717: + goto st_case_4717 + case 4718: + goto st_case_4718 + case 4719: + goto st_case_4719 + case 4720: + goto st_case_4720 + case 4721: + goto st_case_4721 + case 4722: + goto st_case_4722 + case 4723: + goto st_case_4723 + case 4724: + goto st_case_4724 + case 4725: + goto st_case_4725 + case 4726: + goto st_case_4726 + case 4727: + goto st_case_4727 + case 4728: + goto st_case_4728 + case 4729: + goto st_case_4729 + case 4730: + goto st_case_4730 + case 4731: + goto st_case_4731 + case 4732: + goto st_case_4732 + case 4733: + goto st_case_4733 + case 4734: + goto st_case_4734 + case 4735: + goto st_case_4735 + case 4736: + goto st_case_4736 + case 4737: + goto st_case_4737 + case 4738: + goto st_case_4738 + case 4739: + goto st_case_4739 + case 4740: + goto st_case_4740 + case 4741: + goto st_case_4741 + case 4742: + goto st_case_4742 + case 4743: + goto st_case_4743 + case 4744: + goto st_case_4744 + case 4745: + goto st_case_4745 + case 4746: + goto st_case_4746 + case 4747: + goto st_case_4747 + case 4748: + goto st_case_4748 + case 4749: + goto st_case_4749 + case 4750: + goto st_case_4750 + case 4751: + goto st_case_4751 + case 4752: + goto st_case_4752 + case 4753: + goto st_case_4753 + case 4754: + goto st_case_4754 + case 4755: + goto st_case_4755 + case 4756: + goto st_case_4756 + case 4757: + goto st_case_4757 + case 4758: + goto st_case_4758 + case 4759: + goto st_case_4759 + case 4760: + goto st_case_4760 + case 4761: + goto st_case_4761 + case 4762: + goto st_case_4762 + case 4763: + goto st_case_4763 + case 4764: + goto st_case_4764 + case 4765: + goto st_case_4765 + case 4766: + goto st_case_4766 + case 4767: + goto st_case_4767 + case 4768: + goto st_case_4768 + case 4769: + goto st_case_4769 + case 4770: + goto st_case_4770 + case 4771: + goto st_case_4771 + case 4772: + goto st_case_4772 + case 4773: + goto st_case_4773 + case 4774: + goto st_case_4774 + case 4775: + goto st_case_4775 + case 4776: + goto st_case_4776 + case 4777: + goto st_case_4777 + case 4778: + goto st_case_4778 + case 4779: + goto st_case_4779 + case 4780: + goto st_case_4780 + case 4781: + goto st_case_4781 + case 4782: + goto st_case_4782 + case 4783: + goto st_case_4783 + case 4784: + goto st_case_4784 + case 4785: + goto st_case_4785 + case 4786: + goto st_case_4786 + case 4787: + goto st_case_4787 + case 4788: + goto st_case_4788 + case 4789: + goto st_case_4789 + case 4790: + goto st_case_4790 + case 4791: + goto st_case_4791 + case 4792: + goto st_case_4792 + case 4793: + goto st_case_4793 + case 4794: + goto st_case_4794 + case 4795: + goto st_case_4795 + case 4796: + goto st_case_4796 + case 4797: + goto st_case_4797 + case 4798: + goto st_case_4798 + case 4799: + goto st_case_4799 + case 4800: + goto st_case_4800 + case 4801: + goto st_case_4801 + case 4802: + goto st_case_4802 + case 4803: + goto st_case_4803 + case 4804: + goto st_case_4804 + case 4805: + goto st_case_4805 + case 4806: + goto st_case_4806 + case 4807: + goto st_case_4807 + case 4808: + goto st_case_4808 + case 4809: + goto st_case_4809 + case 4810: + goto st_case_4810 + case 4811: + goto st_case_4811 + case 4812: + goto st_case_4812 + case 4813: + goto st_case_4813 + case 4814: + goto st_case_4814 + case 4815: + goto st_case_4815 + case 4816: + goto st_case_4816 + case 4817: + goto st_case_4817 + case 4818: + goto st_case_4818 + case 4819: + goto st_case_4819 + case 4820: + goto st_case_4820 + case 4821: + goto st_case_4821 + case 4822: + goto st_case_4822 + case 4823: + goto st_case_4823 + case 4824: + goto st_case_4824 + case 4825: + goto st_case_4825 + case 4826: + goto st_case_4826 + case 4827: + goto st_case_4827 + case 4828: + goto st_case_4828 + case 4829: + goto st_case_4829 + case 4830: + goto st_case_4830 + case 4831: + goto st_case_4831 + case 4832: + goto st_case_4832 + case 4833: + goto st_case_4833 + case 4834: + goto st_case_4834 + case 4835: + goto st_case_4835 + case 4836: + goto st_case_4836 + case 4837: + goto st_case_4837 + case 4838: + goto st_case_4838 + case 4839: + goto st_case_4839 + case 4840: + goto st_case_4840 + case 4841: + goto st_case_4841 + case 4842: + goto st_case_4842 + case 4843: + goto st_case_4843 + case 4844: + goto st_case_4844 + case 4845: + goto st_case_4845 + case 4846: + goto st_case_4846 + case 4847: + goto st_case_4847 + case 4848: + goto st_case_4848 + case 4849: + goto st_case_4849 + case 4850: + goto st_case_4850 + case 4851: + goto st_case_4851 + case 4852: + goto st_case_4852 + case 4853: + goto st_case_4853 + case 4854: + goto st_case_4854 + case 4855: + goto st_case_4855 + case 4856: + goto st_case_4856 + case 4857: + goto st_case_4857 + case 4858: + goto st_case_4858 + case 4859: + goto st_case_4859 + case 4860: + goto st_case_4860 + case 4861: + goto st_case_4861 + } + goto st_out + tr0: //line segment_words.rl:161 -p = (te) - 1 -{ - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + p = (te) - 1 + { + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - goto st4862 -tr2: + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + goto st4862 + tr2: //line NONE:1 - switch act { - case 1: - {p = (te) - 1 + switch act { + case 1: + { + p = (te) - 1 - if !atEOF { - return val, types, totalConsumed, nil - } + if !atEOF { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Number) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - case 2: - {p = (te) - 1 + val = append(val, data[startPos:endPos+1]) + types = append(types, Number) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + case 2: + { + p = (te) - 1 - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Letter) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - case 3: - {p = (te) - 1 + val = append(val, data[startPos:endPos+1]) + types = append(types, Letter) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + case 3: + { + p = (te) - 1 - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Ideo) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - case 4: - {p = (te) - 1 + val = append(val, data[startPos:endPos+1]) + types = append(types, Ideo) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + case 4: + { + p = (te) - 1 - if !atEOF { - return val, types, totalConsumed, nil - } - val = append(val, data[startPos:endPos+1]) - types = append(types, Letter) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - case 5: - {p = (te) - 1 + if !atEOF { + return val, types, totalConsumed, nil + } + val = append(val, data[startPos:endPos+1]) + types = append(types, Letter) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + case 5: + { + p = (te) - 1 - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Ideo) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - case 7: - {p = (te) - 1 + val = append(val, data[startPos:endPos+1]) + types = append(types, Ideo) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + case 7: + { + p = (te) - 1 - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - case 12: - {p = (te) - 1 + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + case 12: + { + p = (te) - 1 - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - case 13: - {p = (te) - 1 + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + case 13: + { + p = (te) - 1 - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - } - - goto st4862 -tr125: + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + } + + goto st4862 + tr125: //line segment_words.rl:76 -p = (te) - 1 -{ - if !atEOF { - return val, types, totalConsumed, nil - } + p = (te) - 1 + { + if !atEOF { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Number) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - goto st4862 -tr420: + val = append(val, data[startPos:endPos+1]) + types = append(types, Number) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + goto st4862 + tr420: //line segment_words.rl:119 -p = (te) - 1 -{ - if !atEOF { - return val, types, totalConsumed, nil - } - val = append(val, data[startPos:endPos+1]) - types = append(types, Letter) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - goto st4862 -tr2394: + p = (te) - 1 + { + if !atEOF { + return val, types, totalConsumed, nil + } + val = append(val, data[startPos:endPos+1]) + types = append(types, Letter) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + goto st4862 + tr2394: //line segment_words.rl:161 -p = (te) - 1 -{ - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + p = (te) - 1 + { + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - goto st4862 -tr2985: + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + goto st4862 + tr2985: //line segment_words.rl:89 -p = (te) - 1 -{ - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } + p = (te) - 1 + { + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Letter) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - goto st4862 -tr3249: + val = append(val, data[startPos:endPos+1]) + types = append(types, Letter) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + goto st4862 + tr3249: //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -te = p+1 -{ - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + te = p + 1 + { + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - goto st4862 -tr3251: + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + goto st4862 + tr3251: //line segment_words.rl:131 -p = (te) - 1 -{ - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } + p = (te) - 1 + { + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Ideo) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - goto st4862 -tr3627: + val = append(val, data[startPos:endPos+1]) + types = append(types, Ideo) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + goto st4862 + tr3627: //line segment_words.rl:104 -p = (te) - 1 -{ - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } + p = (te) - 1 + { + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Ideo) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - goto st4862 -tr3758: + val = append(val, data[startPos:endPos+1]) + types = append(types, Ideo) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + goto st4862 + tr3758: //line segment_words.rl:146 -p = (te) - 1 -{ - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } + p = (te) - 1 + { + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Ideo) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - goto st4862 -tr4328: + val = append(val, data[startPos:endPos+1]) + types = append(types, Ideo) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + goto st4862 + tr4328: //line segment_words.rl:161 -p = (te) - 1 -{ - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + p = (te) - 1 + { + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - goto st4862 -tr4458: + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + goto st4862 + tr4458: //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -te = p+1 -{ - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + te = p + 1 + { + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - goto st4862 -tr4459: + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + goto st4862 + tr4459: //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -te = p+1 -{ - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + te = p + 1 + { + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - goto st4862 -tr4499: + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + goto st4862 + tr4499: //line segment_words.rl:161 -te = p -p-- -{ - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + te = p + p-- + { + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - goto st4862 -tr4519: + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + goto st4862 + tr4519: //line segment_words.rl:161 -te = p -p-- -{ - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + te = p + p-- + { + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - goto st4862 -tr4520: + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + goto st4862 + tr4520: //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -te = p+1 -{ - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + te = p + 1 + { + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - goto st4862 -tr4521: + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + goto st4862 + tr4521: //line segment_words.rl:76 -te = p -p-- -{ - if !atEOF { - return val, types, totalConsumed, nil - } + te = p + p-- + { + if !atEOF { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Number) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - goto st4862 -tr4562: + val = append(val, data[startPos:endPos+1]) + types = append(types, Number) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + goto st4862 + tr4562: //line segment_words.rl:119 -te = p -p-- -{ - if !atEOF { - return val, types, totalConsumed, nil - } - val = append(val, data[startPos:endPos+1]) - types = append(types, Letter) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - goto st4862 -tr4763: + te = p + p-- + { + if !atEOF { + return val, types, totalConsumed, nil + } + val = append(val, data[startPos:endPos+1]) + types = append(types, Letter) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + goto st4862 + tr4763: //line segment_words.rl:161 -te = p -p-- -{ - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + te = p + p-- + { + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - goto st4862 -tr5002: + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + goto st4862 + tr5002: //line segment_words.rl:89 -te = p -p-- -{ - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } + te = p + p-- + { + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Letter) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - goto st4862 -tr5054: + val = append(val, data[startPos:endPos+1]) + types = append(types, Letter) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + goto st4862 + tr5054: //line segment_words.rl:131 -te = p -p-- -{ - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } + te = p + p-- + { + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Ideo) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - goto st4862 -tr5137: + val = append(val, data[startPos:endPos+1]) + types = append(types, Ideo) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + goto st4862 + tr5137: //line segment_words.rl:104 -te = p -p-- -{ - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } + te = p + p-- + { + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Ideo) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - goto st4862 -tr5157: + val = append(val, data[startPos:endPos+1]) + types = append(types, Ideo) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + goto st4862 + tr5157: //line segment_words.rl:146 -te = p -p-- -{ - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } + te = p + p-- + { + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } - val = append(val, data[startPos:endPos+1]) - types = append(types, Ideo) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - goto st4862 -tr5359: + val = append(val, data[startPos:endPos+1]) + types = append(types, Ideo) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + goto st4862 + tr5359: //line segment_words.rl:161 -te = p -p-- -{ - lastPos := startPos - for lastPos <= endPos { - _, size := utf8.DecodeRune(data[lastPos:]) - lastPos += size - } - endPos = lastPos -1 - p = endPos + te = p + p-- + { + lastPos := startPos + for lastPos <= endPos { + _, size := utf8.DecodeRune(data[lastPos:]) + lastPos += size + } + endPos = lastPos - 1 + p = endPos - if endPos+1 == pe && !atEOF { - return val, types, totalConsumed, nil - } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { - return val, types, totalConsumed, nil - } - // otherwise, consume this as well - val = append(val, data[startPos:endPos+1]) - types = append(types, None) - totalConsumed = endPos+1 - if maxTokens > 0 && len(val) >= maxTokens { - return val, types, totalConsumed, nil - } - } - goto st4862 + if endPos+1 == pe && !atEOF { + return val, types, totalConsumed, nil + } else if dr, size := utf8.DecodeRune(data[endPos+1:]); dr == utf8.RuneError && size == 1 { + return val, types, totalConsumed, nil + } + // otherwise, consume this as well + val = append(val, data[startPos:endPos+1]) + types = append(types, None) + totalConsumed = endPos + 1 + if maxTokens > 0 && len(val) >= maxTokens { + return val, types, totalConsumed, nil + } + } + goto st4862 st4862: //line NONE:1 -ts = 0 + ts = 0 if p++; p == pe { goto _test_eof4862 } st_case_4862: //line NONE:1 -ts = p + ts = p //line segment_words_prod.go:11462 switch data[p] { @@ -11562,32 +11560,29 @@ ts = p goto tr4462 } goto tr4457 -tr1: + tr1: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st4863 -tr4457: + act = 13 + goto st4863 + tr4457: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st4863 + act = 13 + goto st4863 st4863: if p++; p == pe { goto _test_eof4863 @@ -13727,16 +13722,14 @@ act = 13; } st_case_140: goto tr1 -tr4460: + tr4460: //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - - goto st4864 + goto st4864 st4864: if p++; p == pe { goto _test_eof4864 @@ -13747,32 +13740,29 @@ tr4460: goto tr4520 } goto tr4519 -tr1880: + tr1880: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:76 -act = 1; - goto st4865 -tr4461: + act = 1 + goto st4865 + tr4461: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:76 -act = 1; - goto st4865 + act = 1 + goto st4865 st4865: if p++; p == pe { goto _test_eof4865 @@ -13927,17 +13917,16 @@ act = 1; goto tr126 } goto tr125 -tr126: + tr126: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:76 -act = 1; - goto st4866 + act = 1 + goto st4866 st4866: if p++; p == pe { goto _test_eof4866 @@ -14039,17 +14028,16 @@ act = 1; goto tr148 } goto tr4521 -tr148: + tr148: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4867 + act = 4 + goto st4867 st4867: if p++; p == pe { goto _test_eof4867 @@ -19416,17 +19404,16 @@ act = 4; goto tr2 } goto st142 -tr421: + tr421: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4868 + act = 4 + goto st4868 st4868: if p++; p == pe { goto _test_eof4868 @@ -21993,17 +21980,16 @@ act = 4; } st_case_561: goto st413 -tr571: + tr571: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4869 + act = 4 + goto st4869 st4869: if p++; p == pe { goto _test_eof4869 @@ -22213,17 +22199,16 @@ act = 4; goto tr571 } goto tr420 -tr572: + tr572: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4870 + act = 4 + goto st4870 st4870: if p++; p == pe { goto _test_eof4870 @@ -22449,17 +22434,16 @@ act = 4; goto st568 } goto tr420 -tr595: + tr595: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4871 + act = 4 + goto st4871 st4871: if p++; p == pe { goto _test_eof4871 @@ -34163,17 +34147,16 @@ act = 4; goto tr1049 } goto tr420 -tr1049: + tr1049: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4872 + act = 4 + goto st4872 st4872: if p++; p == pe { goto _test_eof4872 @@ -44744,17 +44727,16 @@ act = 4; goto tr2 } goto tr148 -tr1485: + tr1485: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:76 -act = 1; - goto st4873 + act = 1 + goto st4873 st4873: if p++; p == pe { goto _test_eof4873 @@ -58417,32 +58399,29 @@ act = 1; goto tr125 } goto tr1880 -tr2008: + tr2008: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4874 -tr4462: + act = 4 + goto st4874 + tr4462: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4874 + act = 4 + goto st4874 st4874: if p++; p == pe { goto _test_eof4874 @@ -62204,32 +62183,29 @@ act = 4; goto tr420 } goto tr2008 -tr2266: + tr2266: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4875 -tr4463: + act = 4 + goto st4875 + tr4463: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4875 + act = 4 + goto st4875 st4875: if p++; p == pe { goto _test_eof4875 @@ -62323,17 +62299,16 @@ act = 4; goto tr148 } goto tr4562 -tr2136: + tr2136: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4876 + act = 4 + goto st4876 st4876: if p++; p == pe { goto _test_eof4876 @@ -69798,21 +69773,19 @@ act = 4; goto tr420 } goto tr2266 -tr4464: + tr4464: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st4877 + act = 13 + goto st4877 st4877: if p++; p == pe { goto _test_eof4877 @@ -69874,17 +69847,16 @@ act = 13; goto st136 } goto tr4499 -tr2395: + tr2395: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 12; - goto st4878 + act = 12 + goto st4878 st4878: if p++; p == pe { goto _test_eof4878 @@ -72024,22 +71996,19 @@ act = 12; } st_case_2776: goto tr2395 -tr4805: + tr4805: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st4879 -tr4465: + goto st4879 + tr4465: //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - - goto st4879 + goto st4879 st4879: if p++; p == pe { goto _test_eof4879 @@ -72103,17 +72072,16 @@ tr4465: goto tr148 } goto tr4499 -tr4783: + tr4783: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4880 + act = 4 + goto st4880 st4880: if p++; p == pe { goto _test_eof4880 @@ -72215,17 +72183,16 @@ act = 4; goto tr148 } goto tr4562 -tr4784: + tr4784: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4881 + act = 4 + goto st4881 st4881: if p++; p == pe { goto _test_eof4881 @@ -72343,17 +72310,16 @@ act = 4; goto tr4562 } goto tr1 -tr4804: + tr4804: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st4882 + act = 13 + goto st4882 st4882: if p++; p == pe { goto _test_eof4882 @@ -72415,22 +72381,19 @@ act = 13; goto st136 } goto tr4499 -tr4806: + tr4806: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st4883 -tr4466: + goto st4883 + tr4466: //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - - goto st4883 + goto st4883 st4883: if p++; p == pe { goto _test_eof4883 @@ -72482,17 +72445,16 @@ tr4466: goto tr4803 } goto tr148 -tr4785: + tr4785: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4884 + act = 4 + goto st4884 st4884: if p++; p == pe { goto _test_eof4884 @@ -72605,17 +72567,16 @@ act = 4; goto tr4562 } goto tr1 -tr2518: + tr2518: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st4885 + act = 13 + goto st4885 st4885: if p++; p == pe { goto _test_eof4885 @@ -76081,17 +76042,16 @@ act = 13; goto tr0 } goto tr2518 -tr2646: + tr2646: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4886 + act = 4 + goto st4886 st4886: if p++; p == pe { goto _test_eof4886 @@ -79866,17 +79826,16 @@ act = 4; goto tr420 } goto tr2646 -tr2774: + tr2774: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4887 + act = 4 + goto st4887 st4887: if p++; p == pe { goto _test_eof4887 @@ -83643,17 +83602,16 @@ act = 4; goto tr420 } goto tr2774 -tr4786: + tr4786: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4888 + act = 4 + goto st4888 st4888: if p++; p == pe { goto _test_eof4888 @@ -83757,17 +83715,16 @@ act = 4; goto tr148 } goto tr4562 -tr4787: + tr4787: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4889 + act = 4 + goto st4889 st4889: if p++; p == pe { goto _test_eof4889 @@ -83873,17 +83830,16 @@ act = 4; goto tr148 } goto tr4562 -tr4788: + tr4788: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4890 + act = 4 + goto st4890 st4890: if p++; p == pe { goto _test_eof4890 @@ -83993,17 +83949,16 @@ act = 4; goto tr1 } goto tr4562 -tr4789: + tr4789: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4891 + act = 4 + goto st4891 st4891: if p++; p == pe { goto _test_eof4891 @@ -84113,17 +84068,16 @@ act = 4; goto tr1 } goto tr4562 -tr4790: + tr4790: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4892 + act = 4 + goto st4892 st4892: if p++; p == pe { goto _test_eof4892 @@ -84229,17 +84183,16 @@ act = 4; goto tr148 } goto tr4562 -tr4791: + tr4791: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4893 + act = 4 + goto st4893 st4893: if p++; p == pe { goto _test_eof4893 @@ -84357,17 +84310,16 @@ act = 4; goto tr1 } goto tr4562 -tr4792: + tr4792: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4894 + act = 4 + goto st4894 st4894: if p++; p == pe { goto _test_eof4894 @@ -84484,32 +84436,29 @@ act = 4; goto tr1 } goto tr4562 -tr4807: + tr4807: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st4895 -tr4467: + act = 13 + goto st4895 + tr4467: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st4895 + act = 13 + goto st4895 st4895: if p++; p == pe { goto _test_eof4895 @@ -84564,22 +84513,19 @@ act = 13; goto tr4499 } goto tr148 -tr4808: + tr4808: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st4896 -tr4468: + goto st4896 + tr4468: //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - - goto st4896 + goto st4896 st4896: if p++; p == pe { goto _test_eof4896 @@ -84634,17 +84580,16 @@ tr4468: goto tr148 } goto tr4499 -tr4793: + tr4793: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4897 + act = 4 + goto st4897 st4897: if p++; p == pe { goto _test_eof4897 @@ -84762,17 +84707,16 @@ act = 4; goto tr1 } goto tr4562 -tr4794: + tr4794: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4898 + act = 4 + goto st4898 st4898: if p++; p == pe { goto _test_eof4898 @@ -84876,17 +84820,16 @@ act = 4; goto tr148 } goto tr4562 -tr4795: + tr4795: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4899 + act = 4 + goto st4899 st4899: if p++; p == pe { goto _test_eof4899 @@ -84990,17 +84933,16 @@ act = 4; goto tr148 } goto tr4562 -tr4796: + tr4796: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4900 + act = 4 + goto st4900 st4900: if p++; p == pe { goto _test_eof4900 @@ -85160,17 +85102,16 @@ act = 4; goto st19 } goto tr4562 -tr4797: + tr4797: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4901 + act = 4 + goto st4901 st4901: if p++; p == pe { goto _test_eof4901 @@ -85312,17 +85253,16 @@ act = 4; goto tr148 } goto tr4562 -tr4798: + tr4798: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4902 + act = 4 + goto st4902 st4902: if p++; p == pe { goto _test_eof4902 @@ -85434,17 +85374,16 @@ act = 4; goto tr148 } goto tr4562 -tr4799: + tr4799: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4903 + act = 4 + goto st4903 st4903: if p++; p == pe { goto _test_eof4903 @@ -85548,17 +85487,16 @@ act = 4; goto tr148 } goto tr4562 -tr4800: + tr4800: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4904 + act = 4 + goto st4904 st4904: if p++; p == pe { goto _test_eof4904 @@ -85688,17 +85626,16 @@ act = 4; goto tr148 } goto tr4562 -tr4801: + tr4801: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4905 + act = 4 + goto st4905 st4905: if p++; p == pe { goto _test_eof4905 @@ -85808,17 +85745,16 @@ act = 4; goto tr148 } goto tr4562 -tr4802: + tr4802: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4906 + act = 4 + goto st4906 st4906: if p++; p == pe { goto _test_eof4906 @@ -85930,17 +85866,16 @@ act = 4; goto tr148 } goto tr4562 -tr4803: + tr4803: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4907 + act = 4 + goto st4907 st4907: if p++; p == pe { goto _test_eof4907 @@ -86042,17 +85977,16 @@ act = 4; goto tr148 } goto tr4562 -tr4809: + tr4809: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st4908 + act = 13 + goto st4908 st4908: if p++; p == pe { goto _test_eof4908 @@ -86125,17 +86059,16 @@ act = 13; goto tr4499 } goto tr148 -tr4810: + tr4810: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st4909 + act = 13 + goto st4909 st4909: if p++; p == pe { goto _test_eof4909 @@ -86199,17 +86132,16 @@ act = 13; goto tr4499 } goto tr148 -tr4811: + tr4811: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st4910 + act = 13 + goto st4910 st4910: if p++; p == pe { goto _test_eof4910 @@ -86277,22 +86209,19 @@ act = 13; goto tr148 } goto tr4499 -tr4812: + tr4812: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st4911 -tr4473: + goto st4911 + tr4473: //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - - goto st4911 + goto st4911 st4911: if p++; p == pe { goto _test_eof4911 @@ -86346,12 +86275,11 @@ tr4473: goto tr4803 } goto tr148 -tr4813: + tr4813: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st4912 + goto st4912 st4912: if p++; p == pe { goto _test_eof4912 @@ -86405,22 +86333,19 @@ tr4813: goto tr4803 } goto tr148 -tr4814: + tr4814: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st4913 -tr4475: + goto st4913 + tr4475: //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - - goto st4913 + goto st4913 st4913: if p++; p == pe { goto _test_eof4913 @@ -86474,22 +86399,19 @@ tr4475: goto tr4803 } goto tr148 -tr4815: + tr4815: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st4914 -tr4476: + goto st4914 + tr4476: //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - - goto st4914 + goto st4914 st4914: if p++; p == pe { goto _test_eof4914 @@ -86549,17 +86471,16 @@ tr4476: goto tr4499 } goto tr148 -tr4816: + tr4816: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st4915 + act = 13 + goto st4915 st4915: if p++; p == pe { goto _test_eof4915 @@ -86621,17 +86542,16 @@ act = 13; goto tr4499 } goto tr148 -tr4817: + tr4817: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st4916 + act = 13 + goto st4916 st4916: if p++; p == pe { goto _test_eof4916 @@ -86706,17 +86626,16 @@ act = 13; goto tr148 } goto tr4499 -tr4818: + tr4818: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st4917 + act = 13 + goto st4917 st4917: if p++; p == pe { goto _test_eof4917 @@ -86782,12 +86701,11 @@ act = 13; goto tr148 } goto tr4499 -tr4819: + tr4819: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st4918 + goto st4918 st4918: if p++; p == pe { goto _test_eof4918 @@ -86853,17 +86771,16 @@ tr4819: goto tr421 } goto tr4499 -tr4820: + tr4820: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st4919 + act = 13 + goto st4919 st4919: if p++; p == pe { goto _test_eof4919 @@ -86933,12 +86850,11 @@ act = 13; goto tr4499 } goto tr148 -tr4821: + tr4821: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st4920 + goto st4920 st4920: if p++; p == pe { goto _test_eof4920 @@ -86993,12 +86909,11 @@ tr4821: goto tr148 } goto tr4499 -tr4822: + tr4822: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st4921 + goto st4921 st4921: if p++; p == pe { goto _test_eof4921 @@ -87053,17 +86968,16 @@ tr4822: goto tr4499 } goto tr148 -tr4823: + tr4823: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st4922 + act = 13 + goto st4922 st4922: if p++; p == pe { goto _test_eof4922 @@ -87118,17 +87032,16 @@ act = 13; goto tr4499 } goto tr148 -tr4824: + tr4824: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st4923 + act = 13 + goto st4923 st4923: if p++; p == pe { goto _test_eof4923 @@ -87190,17 +87103,16 @@ act = 13; goto tr421 } goto tr4499 -tr4825: + tr4825: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st4924 + act = 13 + goto st4924 st4924: if p++; p == pe { goto _test_eof4924 @@ -87316,17 +87228,16 @@ act = 13; goto st136 } goto tr4499 -tr4826: + tr4826: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st4925 + act = 13 + goto st4925 st4925: if p++; p == pe { goto _test_eof4925 @@ -87476,17 +87387,16 @@ act = 13; goto st147 } goto tr4499 -tr4827: + tr4827: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st4926 + act = 13 + goto st4926 st4926: if p++; p == pe { goto _test_eof4926 @@ -87574,17 +87484,16 @@ act = 13; goto st136 } goto tr4499 -tr4828: + tr4828: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st4927 + act = 13 + goto st4927 st4927: if p++; p == pe { goto _test_eof4927 @@ -87646,17 +87555,16 @@ act = 13; goto st136 } goto tr4499 -tr4829: + tr4829: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st4928 + act = 13 + goto st4928 st4928: if p++; p == pe { goto _test_eof4928 @@ -87994,17 +87902,16 @@ act = 13; goto tr2907 } goto tr148 -tr2902: + tr2902: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4929 + act = 4 + goto st4929 st4929: if p++; p == pe { goto _test_eof4929 @@ -88122,17 +88029,16 @@ act = 4; goto tr1 } goto tr4562 -tr2903: + tr2903: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4930 + act = 4 + goto st4930 st4930: if p++; p == pe { goto _test_eof4930 @@ -88236,17 +88142,16 @@ act = 4; goto tr148 } goto tr4562 -tr2904: + tr2904: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4931 + act = 4 + goto st4931 st4931: if p++; p == pe { goto _test_eof4931 @@ -88359,17 +88264,16 @@ act = 4; goto tr1 } goto tr4562 -tr4830: + tr4830: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st4932 + act = 13 + goto st4932 st4932: if p++; p == pe { goto _test_eof4932 @@ -88471,17 +88375,16 @@ act = 13; goto tr2950 } goto tr148 -tr2930: + tr2930: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4933 + act = 4 + goto st4933 st4933: if p++; p == pe { goto _test_eof4933 @@ -88585,17 +88488,16 @@ act = 4; goto tr148 } goto tr4562 -tr2931: + tr2931: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4934 + act = 4 + goto st4934 st4934: if p++; p == pe { goto _test_eof4934 @@ -88718,17 +88620,16 @@ act = 4; goto tr1 } goto tr4562 -tr2932: + tr2932: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4935 + act = 4 + goto st4935 st4935: if p++; p == pe { goto _test_eof4935 @@ -88838,17 +88739,16 @@ act = 4; goto tr1 } goto tr4562 -tr2933: + tr2933: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4936 + act = 4 + goto st4936 st4936: if p++; p == pe { goto _test_eof4936 @@ -88952,17 +88852,16 @@ act = 4; goto tr148 } goto tr4562 -tr2934: + tr2934: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4937 + act = 4 + goto st4937 st4937: if p++; p == pe { goto _test_eof4937 @@ -89070,17 +88969,16 @@ act = 4; goto tr1 } goto tr4562 -tr2935: + tr2935: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4938 + act = 4 + goto st4938 st4938: if p++; p == pe { goto _test_eof4938 @@ -89188,17 +89086,16 @@ act = 4; goto tr1 } goto tr4562 -tr2936: + tr2936: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4939 + act = 4 + goto st4939 st4939: if p++; p == pe { goto _test_eof4939 @@ -89311,17 +89208,16 @@ act = 4; goto tr1 } goto tr4562 -tr4831: + tr4831: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st4940 + act = 13 + goto st4940 st4940: if p++; p == pe { goto _test_eof4940 @@ -89380,17 +89276,16 @@ act = 13; goto tr4499 } goto st145 -tr4832: + tr4832: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st4941 + act = 13 + goto st4941 st4941: if p++; p == pe { goto _test_eof4941 @@ -89475,17 +89370,16 @@ act = 13; goto st145 } goto tr4499 -tr4833: + tr4833: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st4942 + act = 13 + goto st4942 st4942: if p++; p == pe { goto _test_eof4942 @@ -89557,17 +89451,16 @@ act = 13; goto st136 } goto tr4499 -tr4834: + tr4834: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st4943 + act = 13 + goto st4943 st4943: if p++; p == pe { goto _test_eof4943 @@ -89621,17 +89514,16 @@ act = 13; goto st136 } goto tr4499 -tr2937: + tr2937: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4944 + act = 4 + goto st4944 st4944: if p++; p == pe { goto _test_eof4944 @@ -89749,17 +89641,16 @@ act = 4; goto tr4562 } goto tr1 -tr2938: + tr2938: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4945 + act = 4 + goto st4945 st4945: if p++; p == pe { goto _test_eof4945 @@ -89863,17 +89754,16 @@ act = 4; goto tr148 } goto tr4562 -tr2939: + tr2939: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4946 + act = 4 + goto st4946 st4946: if p++; p == pe { goto _test_eof4946 @@ -89975,17 +89865,16 @@ act = 4; goto tr148 } goto tr4562 -tr2940: + tr2940: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4947 + act = 4 + goto st4947 st4947: if p++; p == pe { goto _test_eof4947 @@ -90093,17 +89982,16 @@ act = 4; goto tr1 } goto tr4562 -tr2941: + tr2941: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4948 + act = 4 + goto st4948 st4948: if p++; p == pe { goto _test_eof4948 @@ -90207,17 +90095,16 @@ act = 4; goto tr148 } goto tr4562 -tr2942: + tr2942: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4949 + act = 4 + goto st4949 st4949: if p++; p == pe { goto _test_eof4949 @@ -90327,17 +90214,16 @@ act = 4; goto tr1 } goto tr4562 -tr2943: + tr2943: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4950 + act = 4 + goto st4950 st4950: if p++; p == pe { goto _test_eof4950 @@ -90441,17 +90327,16 @@ act = 4; goto tr148 } goto tr4562 -tr2944: + tr2944: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4951 + act = 4 + goto st4951 st4951: if p++; p == pe { goto _test_eof4951 @@ -90569,17 +90454,16 @@ act = 4; goto tr1 } goto tr4562 -tr2945: + tr2945: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4952 + act = 4 + goto st4952 st4952: if p++; p == pe { goto _test_eof4952 @@ -90697,17 +90581,16 @@ act = 4; goto tr4562 } goto tr1 -tr2946: + tr2946: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4953 + act = 4 + goto st4953 st4953: if p++; p == pe { goto _test_eof4953 @@ -90815,17 +90698,16 @@ act = 4; goto tr1 } goto tr4562 -tr2947: + tr2947: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4954 + act = 4 + goto st4954 st4954: if p++; p == pe { goto _test_eof4954 @@ -90929,17 +90811,16 @@ act = 4; goto tr148 } goto tr4562 -tr2948: + tr2948: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4955 + act = 4 + goto st4955 st4955: if p++; p == pe { goto _test_eof4955 @@ -91043,17 +90924,16 @@ act = 4; goto tr148 } goto tr4562 -tr2949: + tr2949: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4956 + act = 4 + goto st4956 st4956: if p++; p == pe { goto _test_eof4956 @@ -91173,17 +91053,16 @@ act = 4; goto tr1 } goto tr4562 -tr2950: + tr2950: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4957 + act = 4 + goto st4957 st4957: if p++; p == pe { goto _test_eof4957 @@ -91311,17 +91190,16 @@ act = 4; goto tr2956 } goto tr148 -tr2951: + tr2951: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4958 + act = 4 + goto st4958 st4958: if p++; p == pe { goto _test_eof4958 @@ -91429,17 +91307,16 @@ act = 4; goto tr1 } goto tr4562 -tr2952: + tr2952: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4959 + act = 4 + goto st4959 st4959: if p++; p == pe { goto _test_eof4959 @@ -91547,17 +91424,16 @@ act = 4; goto tr1 } goto tr4562 -tr2953: + tr2953: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4960 + act = 4 + goto st4960 st4960: if p++; p == pe { goto _test_eof4960 @@ -91661,17 +91537,16 @@ act = 4; goto tr148 } goto tr4562 -tr2954: + tr2954: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4961 + act = 4 + goto st4961 st4961: if p++; p == pe { goto _test_eof4961 @@ -91775,17 +91650,16 @@ act = 4; goto tr148 } goto tr4562 -tr2955: + tr2955: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4962 + act = 4 + goto st4962 st4962: if p++; p == pe { goto _test_eof4962 @@ -91887,17 +91761,16 @@ act = 4; goto tr148 } goto tr4562 -tr2956: + tr2956: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4963 + act = 4 + goto st4963 st4963: if p++; p == pe { goto _test_eof4963 @@ -92013,17 +91886,16 @@ act = 4; goto tr2958 } goto tr148 -tr2957: + tr2957: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4964 + act = 4 + goto st4964 st4964: if p++; p == pe { goto _test_eof4964 @@ -92127,17 +91999,16 @@ act = 4; goto tr148 } goto tr4562 -tr2958: + tr2958: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4965 + act = 4 + goto st4965 st4965: if p++; p == pe { goto _test_eof4965 @@ -92279,17 +92150,16 @@ act = 4; goto tr2973 } goto tr148 -tr2959: + tr2959: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4966 + act = 4 + goto st4966 st4966: if p++; p == pe { goto _test_eof4966 @@ -92397,17 +92267,16 @@ act = 4; goto tr1 } goto tr4562 -tr2960: + tr2960: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4967 + act = 4 + goto st4967 st4967: if p++; p == pe { goto _test_eof4967 @@ -92511,17 +92380,16 @@ act = 4; goto tr148 } goto tr4562 -tr2961: + tr2961: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4968 + act = 4 + goto st4968 st4968: if p++; p == pe { goto _test_eof4968 @@ -92625,17 +92493,16 @@ act = 4; goto tr148 } goto tr4562 -tr2962: + tr2962: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4969 + act = 4 + goto st4969 st4969: if p++; p == pe { goto _test_eof4969 @@ -92745,17 +92612,16 @@ act = 4; goto tr148 } goto tr4562 -tr2963: + tr2963: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4970 + act = 4 + goto st4970 st4970: if p++; p == pe { goto _test_eof4970 @@ -92873,17 +92739,16 @@ act = 4; goto tr1 } goto tr4562 -tr2964: + tr2964: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4971 + act = 4 + goto st4971 st4971: if p++; p == pe { goto _test_eof4971 @@ -93001,17 +92866,16 @@ act = 4; goto tr4562 } goto tr1 -tr2965: + tr2965: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4972 + act = 4 + goto st4972 st4972: if p++; p == pe { goto _test_eof4972 @@ -93115,17 +92979,16 @@ act = 4; goto tr148 } goto tr4562 -tr2966: + tr2966: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4973 + act = 4 + goto st4973 st4973: if p++; p == pe { goto _test_eof4973 @@ -93229,17 +93092,16 @@ act = 4; goto tr148 } goto tr4562 -tr2967: + tr2967: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4974 + act = 4 + goto st4974 st4974: if p++; p == pe { goto _test_eof4974 @@ -93357,17 +93219,16 @@ act = 4; goto tr1 } goto tr4562 -tr2968: + tr2968: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4975 + act = 4 + goto st4975 st4975: if p++; p == pe { goto _test_eof4975 @@ -93487,17 +93348,16 @@ act = 4; goto tr1 } goto tr4562 -tr2969: + tr2969: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4976 + act = 4 + goto st4976 st4976: if p++; p == pe { goto _test_eof4976 @@ -93601,17 +93461,16 @@ act = 4; goto tr148 } goto tr4562 -tr2970: + tr2970: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4977 + act = 4 + goto st4977 st4977: if p++; p == pe { goto _test_eof4977 @@ -93721,17 +93580,16 @@ act = 4; goto tr1 } goto tr4562 -tr2971: + tr2971: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4978 + act = 4 + goto st4978 st4978: if p++; p == pe { goto _test_eof4978 @@ -93846,17 +93704,16 @@ act = 4; goto tr1 } goto tr4562 -tr2972: + tr2972: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4979 + act = 4 + goto st4979 st4979: if p++; p == pe { goto _test_eof4979 @@ -93966,17 +93823,16 @@ act = 4; goto tr1 } goto tr4562 -tr2973: + tr2973: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4980 + act = 4 + goto st4980 st4980: if p++; p == pe { goto _test_eof4980 @@ -94102,17 +93958,16 @@ act = 4; goto tr2976 } goto tr148 -tr2974: + tr2974: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4981 + act = 4 + goto st4981 st4981: if p++; p == pe { goto _test_eof4981 @@ -94214,17 +94069,16 @@ act = 4; goto tr148 } goto tr4562 -tr2975: + tr2975: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4982 + act = 4 + goto st4982 st4982: if p++; p == pe { goto _test_eof4982 @@ -94332,17 +94186,16 @@ act = 4; goto tr1 } goto tr4562 -tr2976: + tr2976: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4983 + act = 4 + goto st4983 st4983: if p++; p == pe { goto _test_eof4983 @@ -94466,17 +94319,16 @@ act = 4; goto tr2982 } goto tr148 -tr2977: + tr2977: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4984 + act = 4 + goto st4984 st4984: if p++; p == pe { goto _test_eof4984 @@ -94586,17 +94438,16 @@ act = 4; goto tr148 } goto tr4562 -tr2978: + tr2978: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4985 + act = 4 + goto st4985 st4985: if p++; p == pe { goto _test_eof4985 @@ -94734,17 +94585,16 @@ act = 4; goto tr148 } goto tr4562 -tr2979: + tr2979: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4986 + act = 4 + goto st4986 st4986: if p++; p == pe { goto _test_eof4986 @@ -94852,17 +94702,16 @@ act = 4; goto tr148 } goto tr4562 -tr2980: + tr2980: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4987 + act = 4 + goto st4987 st4987: if p++; p == pe { goto _test_eof4987 @@ -94964,17 +94813,16 @@ act = 4; goto tr148 } goto tr4562 -tr2981: + tr2981: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4988 + act = 4 + goto st4988 st4988: if p++; p == pe { goto _test_eof4988 @@ -95086,17 +94934,16 @@ act = 4; goto tr148 } goto tr4562 -tr2982: + tr2982: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4989 + act = 4 + goto st4989 st4989: if p++; p == pe { goto _test_eof4989 @@ -95207,17 +95054,16 @@ act = 4; goto tr2983 } goto tr148 -tr2983: + tr2983: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4990 + act = 4 + goto st4990 st4990: if p++; p == pe { goto _test_eof4990 @@ -95329,12 +95175,11 @@ act = 4; goto tr148 } goto tr4562 -tr2905: + tr2905: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st4991 + goto st4991 st4991: if p++; p == pe { goto _test_eof4991 @@ -95440,17 +95285,16 @@ tr2905: goto tr2008 } goto tr1 -tr2906: + tr2906: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4992 + act = 4 + goto st4992 st4992: if p++; p == pe { goto _test_eof4992 @@ -95570,17 +95414,16 @@ act = 4; goto tr4562 } goto tr1 -tr2907: + tr2907: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4993 + act = 4 + goto st4993 st4993: if p++; p == pe { goto _test_eof4993 @@ -95700,17 +95543,16 @@ act = 4; goto tr1 } goto tr4562 -tr2908: + tr2908: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4994 + act = 4 + goto st4994 st4994: if p++; p == pe { goto _test_eof4994 @@ -95842,17 +95684,16 @@ act = 4; goto tr4562 } goto tr1 -tr2909: + tr2909: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4995 + act = 4 + goto st4995 st4995: if p++; p == pe { goto _test_eof4995 @@ -95988,17 +95829,16 @@ act = 4; goto tr2008 } goto tr4562 -tr2910: + tr2910: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4996 + act = 4 + goto st4996 st4996: if p++; p == pe { goto _test_eof4996 @@ -96120,17 +95960,16 @@ act = 4; goto tr4562 } goto tr1 -tr2911: + tr2911: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4997 + act = 4 + goto st4997 st4997: if p++; p == pe { goto _test_eof4997 @@ -96240,17 +96079,16 @@ act = 4; goto tr1 } goto tr4562 -tr2912: + tr2912: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4998 + act = 4 + goto st4998 st4998: if p++; p == pe { goto _test_eof4998 @@ -96373,17 +96211,16 @@ act = 4; goto tr1 } goto tr4562 -tr2913: + tr2913: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st4999 + act = 4 + goto st4999 st4999: if p++; p == pe { goto _test_eof4999 @@ -96489,17 +96326,16 @@ act = 4; goto tr148 } goto tr4562 -tr2914: + tr2914: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st5000 + act = 4 + goto st5000 st5000: if p++; p == pe { goto _test_eof5000 @@ -96614,17 +96450,16 @@ act = 4; goto tr1 } goto tr4562 -tr2915: + tr2915: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st5001 + act = 4 + goto st5001 st5001: if p++; p == pe { goto _test_eof5001 @@ -96742,17 +96577,16 @@ act = 4; goto tr1 } goto tr4562 -tr2916: + tr2916: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st5002 + act = 4 + goto st5002 st5002: if p++; p == pe { goto _test_eof5002 @@ -96879,17 +96713,16 @@ act = 4; goto tr4562 } goto tr1 -tr2917: + tr2917: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st5003 + act = 4 + goto st5003 st5003: if p++; p == pe { goto _test_eof5003 @@ -97012,17 +96845,16 @@ act = 4; goto tr1 } goto tr4562 -tr2918: + tr2918: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st5004 + act = 4 + goto st5004 st5004: if p++; p == pe { goto _test_eof5004 @@ -97140,17 +96972,16 @@ act = 4; goto tr1 } goto tr4562 -tr2919: + tr2919: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st5005 + act = 4 + goto st5005 st5005: if p++; p == pe { goto _test_eof5005 @@ -97277,17 +97108,16 @@ act = 4; goto tr4562 } goto tr1 -tr2920: + tr2920: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st5006 + act = 4 + goto st5006 st5006: if p++; p == pe { goto _test_eof5006 @@ -97391,17 +97221,16 @@ act = 4; goto tr148 } goto tr4562 -tr2921: + tr2921: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st5007 + act = 4 + goto st5007 st5007: if p++; p == pe { goto _test_eof5007 @@ -97518,17 +97347,16 @@ act = 4; goto tr1 } goto tr4562 -tr2922: + tr2922: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st5008 + act = 4 + goto st5008 st5008: if p++; p == pe { goto _test_eof5008 @@ -97634,17 +97462,16 @@ act = 4; goto tr148 } goto tr4562 -tr2923: + tr2923: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st5009 + act = 4 + goto st5009 st5009: if p++; p == pe { goto _test_eof5009 @@ -97748,17 +97575,16 @@ act = 4; goto tr148 } goto tr4562 -tr2924: + tr2924: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st5010 + act = 4 + goto st5010 st5010: if p++; p == pe { goto _test_eof5010 @@ -97868,17 +97694,16 @@ act = 4; goto tr1 } goto tr4562 -tr2925: + tr2925: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st5011 + act = 4 + goto st5011 st5011: if p++; p == pe { goto _test_eof5011 @@ -97982,17 +97807,16 @@ act = 4; goto tr148 } goto tr4562 -tr2926: + tr2926: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st5012 + act = 4 + goto st5012 st5012: if p++; p == pe { goto _test_eof5012 @@ -98106,17 +97930,16 @@ act = 4; goto tr1 } goto tr4562 -tr2927: + tr2927: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st5013 + act = 4 + goto st5013 st5013: if p++; p == pe { goto _test_eof5013 @@ -98220,17 +98043,16 @@ act = 4; goto tr148 } goto tr4562 -tr2928: + tr2928: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st5014 + act = 4 + goto st5014 st5014: if p++; p == pe { goto _test_eof5014 @@ -98348,17 +98170,16 @@ act = 4; goto tr1 } goto tr4562 -tr2929: + tr2929: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st5015 + act = 4 + goto st5015 st5015: if p++; p == pe { goto _test_eof5015 @@ -98460,21 +98281,19 @@ act = 4; goto tr148 } goto tr4562 -tr4469: + tr4469: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5016 + act = 13 + goto st5016 st5016: if p++; p == pe { goto _test_eof5016 @@ -98545,22 +98364,19 @@ act = 13; goto tr4499 } goto tr148 -tr4938: + tr4938: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5017 -tr4470: + goto st5017 + tr4470: //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5017 + goto st5017 st5017: if p++; p == pe { goto _test_eof5017 @@ -98615,17 +98431,16 @@ tr4470: goto tr2395 } goto tr4499 -tr4916: + tr4916: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 12; - goto st5018 + act = 12 + goto st5018 st5018: if p++; p == pe { goto _test_eof5018 @@ -98679,12 +98494,11 @@ act = 12; goto st2772 } goto tr4763 -tr4917: + tr4917: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5019 + goto st5019 st5019: if p++; p == pe { goto _test_eof5019 @@ -98739,17 +98553,16 @@ tr4917: goto tr1 } goto tr4763 -tr4937: + tr4937: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5020 + act = 13 + goto st5020 st5020: if p++; p == pe { goto _test_eof5020 @@ -98803,17 +98616,16 @@ act = 13; goto st136 } goto tr4499 -tr4939: + tr4939: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5021 + act = 13 + goto st5021 st5021: if p++; p == pe { goto _test_eof5021 @@ -98868,17 +98680,16 @@ act = 13; goto tr4499 } goto tr2395 -tr4940: + tr4940: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5022 + act = 13 + goto st5022 st5022: if p++; p == pe { goto _test_eof5022 @@ -98933,17 +98744,16 @@ act = 13; goto tr2395 } goto tr4499 -tr4941: + tr4941: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5023 + act = 13 + goto st5023 st5023: if p++; p == pe { goto _test_eof5023 @@ -99000,17 +98810,16 @@ act = 13; goto tr2395 } goto tr4499 -tr4942: + tr4942: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5024 + act = 13 + goto st5024 st5024: if p++; p == pe { goto _test_eof5024 @@ -99072,17 +98881,16 @@ act = 13; goto tr2395 } goto tr4499 -tr4943: + tr4943: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5025 + act = 13 + goto st5025 st5025: if p++; p == pe { goto _test_eof5025 @@ -99144,17 +98952,16 @@ act = 13; goto tr2395 } goto tr4499 -tr4944: + tr4944: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5026 + act = 13 + goto st5026 st5026: if p++; p == pe { goto _test_eof5026 @@ -99211,17 +99018,16 @@ act = 13; goto tr2395 } goto tr4499 -tr4945: + tr4945: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5027 + act = 13 + goto st5027 st5027: if p++; p == pe { goto _test_eof5027 @@ -99290,12 +99096,11 @@ act = 13; goto tr2395 } goto tr4499 -tr4946: + tr4946: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5028 + goto st5028 st5028: if p++; p == pe { goto _test_eof5028 @@ -99354,17 +99159,16 @@ tr4946: goto tr2395 } goto tr4499 -tr4918: + tr4918: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 12; - goto st5029 + act = 12 + goto st5029 st5029: if p++; p == pe { goto _test_eof5029 @@ -99419,17 +99223,16 @@ act = 12; goto tr4763 } goto tr1 -tr4919: + tr4919: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 12; - goto st5030 + act = 12 + goto st5030 st5030: if p++; p == pe { goto _test_eof5030 @@ -99484,17 +99287,16 @@ act = 12; goto tr1 } goto tr4763 -tr4920: + tr4920: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 12; - goto st5031 + act = 12 + goto st5031 st5031: if p++; p == pe { goto _test_eof5031 @@ -99551,17 +99353,16 @@ act = 12; goto tr1 } goto tr4763 -tr4921: + tr4921: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 12; - goto st5032 + act = 12 + goto st5032 st5032: if p++; p == pe { goto _test_eof5032 @@ -99623,17 +99424,16 @@ act = 12; goto tr1 } goto tr4763 -tr4922: + tr4922: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 12; - goto st5033 + act = 12 + goto st5033 st5033: if p++; p == pe { goto _test_eof5033 @@ -99695,17 +99495,16 @@ act = 12; goto tr1 } goto tr4763 -tr4923: + tr4923: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 12; - goto st5034 + act = 12 + goto st5034 st5034: if p++; p == pe { goto _test_eof5034 @@ -99762,17 +99561,16 @@ act = 12; goto tr1 } goto tr4763 -tr4924: + tr4924: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 12; - goto st5035 + act = 12 + goto st5035 st5035: if p++; p == pe { goto _test_eof5035 @@ -99841,12 +99639,11 @@ act = 12; goto tr1 } goto tr4763 -tr4925: + tr4925: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5036 + goto st5036 st5036: if p++; p == pe { goto _test_eof5036 @@ -99905,17 +99702,16 @@ tr4925: goto tr1 } goto tr4763 -tr4947: + tr4947: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5037 + act = 13 + goto st5037 st5037: if p++; p == pe { goto _test_eof5037 @@ -99970,17 +99766,16 @@ act = 13; goto tr4499 } goto tr2395 -tr4948: + tr4948: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5038 + act = 13 + goto st5038 st5038: if p++; p == pe { goto _test_eof5038 @@ -100035,17 +99830,16 @@ act = 13; goto tr2395 } goto tr4499 -tr4949: + tr4949: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5039 + act = 13 + goto st5039 st5039: if p++; p == pe { goto _test_eof5039 @@ -100100,17 +99894,16 @@ act = 13; goto tr2395 } goto tr4499 -tr4950: + tr4950: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5040 + act = 13 + goto st5040 st5040: if p++; p == pe { goto _test_eof5040 @@ -100222,17 +100015,16 @@ act = 13; goto st2655 } goto tr4499 -tr4951: + tr4951: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5041 + act = 13 + goto st5041 st5041: if p++; p == pe { goto _test_eof5041 @@ -100326,17 +100118,16 @@ act = 13; goto st136 } goto tr4499 -tr4952: + tr4952: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5042 + act = 13 + goto st5042 st5042: if p++; p == pe { goto _test_eof5042 @@ -100400,17 +100191,16 @@ act = 13; goto st136 } goto tr4499 -tr4953: + tr4953: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5043 + act = 13 + goto st5043 st5043: if p++; p == pe { goto _test_eof5043 @@ -100466,17 +100256,16 @@ act = 13; goto st136 } goto tr4499 -tr4954: + tr4954: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5044 + act = 13 + goto st5044 st5044: if p++; p == pe { goto _test_eof5044 @@ -100558,17 +100347,16 @@ act = 13; goto st136 } goto tr4499 -tr4955: + tr4955: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5045 + act = 13 + goto st5045 st5045: if p++; p == pe { goto _test_eof5045 @@ -100630,17 +100418,16 @@ act = 13; goto st136 } goto tr4499 -tr4956: + tr4956: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5046 + act = 13 + goto st5046 st5046: if p++; p == pe { goto _test_eof5046 @@ -100704,32 +100491,29 @@ act = 13; goto st136 } goto tr4499 -tr4957: + tr4957: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5047 -tr4498: + act = 13 + goto st5047 + tr4498: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5047 + act = 13 + goto st5047 st5047: if p++; p == pe { goto _test_eof5047 @@ -100783,17 +100567,16 @@ act = 13; goto st136 } goto tr4499 -tr4926: + tr4926: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 12; - goto st5048 + act = 12 + goto st5048 st5048: if p++; p == pe { goto _test_eof5048 @@ -100848,17 +100631,16 @@ act = 12; goto tr4763 } goto tr1 -tr4927: + tr4927: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 12; - goto st5049 + act = 12 + goto st5049 st5049: if p++; p == pe { goto _test_eof5049 @@ -100913,17 +100695,16 @@ act = 12; goto tr1 } goto tr4763 -tr4928: + tr4928: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 12; - goto st5050 + act = 12 + goto st5050 st5050: if p++; p == pe { goto _test_eof5050 @@ -100978,17 +100759,16 @@ act = 12; goto tr1 } goto tr4763 -tr4929: + tr4929: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 12; - goto st5051 + act = 12 + goto st5051 st5051: if p++; p == pe { goto _test_eof5051 @@ -101100,17 +100880,16 @@ act = 12; goto st19 } goto tr4763 -tr4930: + tr4930: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 12; - goto st5052 + act = 12 + goto st5052 st5052: if p++; p == pe { goto _test_eof5052 @@ -101204,17 +100983,16 @@ act = 12; goto st2772 } goto tr4763 -tr4931: + tr4931: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 12; - goto st5053 + act = 12 + goto st5053 st5053: if p++; p == pe { goto _test_eof5053 @@ -101278,17 +101056,16 @@ act = 12; goto st2772 } goto tr4763 -tr4932: + tr4932: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 12; - goto st5054 + act = 12 + goto st5054 st5054: if p++; p == pe { goto _test_eof5054 @@ -101344,17 +101121,16 @@ act = 12; goto st2772 } goto tr4763 -tr4933: + tr4933: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 12; - goto st5055 + act = 12 + goto st5055 st5055: if p++; p == pe { goto _test_eof5055 @@ -101436,17 +101212,16 @@ act = 12; goto st2772 } goto tr4763 -tr4934: + tr4934: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 12; - goto st5056 + act = 12 + goto st5056 st5056: if p++; p == pe { goto _test_eof5056 @@ -101508,17 +101283,16 @@ act = 12; goto st2772 } goto tr4763 -tr4935: + tr4935: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 12; - goto st5057 + act = 12 + goto st5057 st5057: if p++; p == pe { goto _test_eof5057 @@ -101582,17 +101356,16 @@ act = 12; goto st2772 } goto tr4763 -tr4936: + tr4936: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 12; - goto st5058 + act = 12 + goto st5058 st5058: if p++; p == pe { goto _test_eof5058 @@ -101646,21 +101419,19 @@ act = 12; goto st2772 } goto tr4763 -tr4471: + tr4471: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5059 + act = 13 + goto st5059 st5059: if p++; p == pe { goto _test_eof5059 @@ -101733,16 +101504,14 @@ act = 13; goto tr4499 } goto tr2395 -tr4472: + tr4472: //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5060 + goto st5060 st5060: if p++; p == pe { goto _test_eof5060 @@ -101810,16 +101579,14 @@ tr4472: goto tr148 } goto tr4499 -tr4474: + tr4474: //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5061 + goto st5061 st5061: if p++; p == pe { goto _test_eof5061 @@ -101876,21 +101643,19 @@ tr4474: goto tr2395 } goto tr148 -tr4477: + tr4477: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5062 + act = 13 + goto st5062 st5062: if p++; p == pe { goto _test_eof5062 @@ -101956,21 +101721,19 @@ act = 13; goto tr2395 } goto tr148 -tr4478: + tr4478: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5063 + act = 13 + goto st5063 st5063: if p++; p == pe { goto _test_eof5063 @@ -102043,21 +101806,19 @@ act = 13; goto tr2395 } goto tr4499 -tr4479: + tr4479: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5064 + act = 13 + goto st5064 st5064: if p++; p == pe { goto _test_eof5064 @@ -102123,16 +101884,14 @@ act = 13; goto tr2395 } goto tr4499 -tr4480: + tr4480: //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5065 + goto st5065 st5065: if p++; p == pe { goto _test_eof5065 @@ -102205,21 +101964,19 @@ tr4480: goto tr2395 } goto tr4499 -tr4481: + tr4481: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5066 + act = 13 + goto st5066 st5066: if p++; p == pe { goto _test_eof5066 @@ -102299,16 +102056,14 @@ act = 13; goto tr126 } goto tr148 -tr4482: + tr4482: //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5067 + goto st5067 st5067: if p++; p == pe { goto _test_eof5067 @@ -102374,16 +102129,14 @@ tr4482: goto tr148 } goto tr4499 -tr4483: + tr4483: //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5068 + goto st5068 st5068: if p++; p == pe { goto _test_eof5068 @@ -102443,21 +102196,19 @@ tr4483: goto tr4499 } goto tr2395 -tr4484: + tr4484: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5069 + act = 13 + goto st5069 st5069: if p++; p == pe { goto _test_eof5069 @@ -102517,21 +102268,19 @@ act = 13; goto tr2395 } goto tr148 -tr4485: + tr4485: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5070 + act = 13 + goto st5070 st5070: if p++; p == pe { goto _test_eof5070 @@ -102602,21 +102351,19 @@ act = 13; goto tr148 } goto tr4499 -tr4486: + tr4486: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5071 + act = 13 + goto st5071 st5071: if p++; p == pe { goto _test_eof5071 @@ -103658,21 +103405,19 @@ act = 13; goto tr148 } goto tr0 -tr4487: + tr4487: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5072 + act = 13 + goto st5072 st5072: if p++; p == pe { goto _test_eof5072 @@ -103898,17 +103643,16 @@ act = 13; goto tr2984 } goto tr148 -tr2984: + tr2984: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5073 + act = 2 + goto st5073 st5073: if p++; p == pe { goto _test_eof5073 @@ -106159,17 +105903,16 @@ act = 2; goto tr3053 } goto tr2 -tr3053: + tr3053: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5074 + act = 2 + goto st5074 st5074: if p++; p == pe { goto _test_eof5074 @@ -110386,21 +110129,19 @@ act = 2; goto tr148 } goto tr0 -tr4488: + tr4488: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5075 + act = 13 + goto st5075 st5075: if p++; p == pe { goto _test_eof5075 @@ -110630,17 +110371,16 @@ act = 13; goto tr3250 } goto tr0 -tr3250: + tr3250: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5076 + act = 5 + goto st5076 st5076: if p++; p == pe { goto _test_eof5076 @@ -112798,21 +112538,19 @@ act = 5; goto tr0 } goto tr3250 -tr4489: + tr4489: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5077 + act = 13 + goto st5077 st5077: if p++; p == pe { goto _test_eof5077 @@ -112933,17 +112671,16 @@ act = 13; goto tr3375 } goto tr0 -tr3374: + tr3374: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:119 -act = 4; - goto st5078 + act = 4 + goto st5078 st5078: if p++; p == pe { goto _test_eof5078 @@ -116705,17 +116442,16 @@ act = 4; goto tr420 } goto tr3374 -tr3375: + tr3375: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5079 + act = 2 + goto st5079 st5079: if p++; p == pe { goto _test_eof5079 @@ -118920,17 +118656,16 @@ act = 2; } st_case_4026: goto tr3375 -tr3376: + tr3376: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:104 -act = 3; - goto st5080 + act = 3 + goto st5080 st5080: if p++; p == pe { goto _test_eof5080 @@ -121196,15 +120931,14 @@ act = 3; goto tr3757 } goto tr0 -tr3757: + tr3757: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5081 + goto st5081 st5081: if p++; p == pe { goto _test_eof5081 @@ -123376,15 +123110,14 @@ te = p+1 goto tr3881 } goto tr3250 -tr3881: + tr3881: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5082 + goto st5082 st5082: if p++; p == pe { goto _test_eof5082 @@ -125742,17 +125475,16 @@ te = p+1 goto tr4009 } goto tr3250 -tr4004: + tr4004: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5083 + act = 5 + goto st5083 st5083: if p++; p == pe { goto _test_eof5083 @@ -125821,17 +125553,16 @@ act = 5; goto tr1 } goto tr5054 -tr4005: + tr4005: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5084 + act = 5 + goto st5084 st5084: if p++; p == pe { goto _test_eof5084 @@ -125886,12 +125617,11 @@ act = 5; goto tr1 } goto tr5054 -tr4006: + tr4006: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5085 + goto st5085 st5085: if p++; p == pe { goto _test_eof5085 @@ -125946,17 +125676,16 @@ tr4006: goto tr1 } goto tr5054 -tr5196: + tr5196: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5086 + act = 13 + goto st5086 st5086: if p++; p == pe { goto _test_eof5086 @@ -126010,12 +125739,11 @@ act = 13; goto st136 } goto tr4499 -tr5197: + tr5197: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5087 + goto st5087 st5087: if p++; p == pe { goto _test_eof5087 @@ -126070,17 +125798,16 @@ tr5197: goto tr3250 } goto tr4499 -tr5217: + tr5217: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5088 + act = 5 + goto st5088 st5088: if p++; p == pe { goto _test_eof5088 @@ -126134,12 +125861,11 @@ act = 5; goto st3730 } goto tr5054 -tr5218: + tr5218: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5089 + goto st5089 st5089: if p++; p == pe { goto _test_eof5089 @@ -126194,17 +125920,16 @@ tr5218: goto tr1 } goto tr5054 -tr5198: + tr5198: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5090 + act = 13 + goto st5090 st5090: if p++; p == pe { goto _test_eof5090 @@ -126259,17 +125984,16 @@ act = 13; goto tr4499 } goto tr3250 -tr5199: + tr5199: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5091 + act = 13 + goto st5091 st5091: if p++; p == pe { goto _test_eof5091 @@ -126324,17 +126048,16 @@ act = 13; goto tr3250 } goto tr4499 -tr5200: + tr5200: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5092 + act = 13 + goto st5092 st5092: if p++; p == pe { goto _test_eof5092 @@ -126391,17 +126114,16 @@ act = 13; goto tr3250 } goto tr4499 -tr5201: + tr5201: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5093 + act = 13 + goto st5093 st5093: if p++; p == pe { goto _test_eof5093 @@ -126463,17 +126185,16 @@ act = 13; goto tr3250 } goto tr4499 -tr5202: + tr5202: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5094 + act = 13 + goto st5094 st5094: if p++; p == pe { goto _test_eof5094 @@ -126535,17 +126256,16 @@ act = 13; goto tr3250 } goto tr4499 -tr5203: + tr5203: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5095 + act = 13 + goto st5095 st5095: if p++; p == pe { goto _test_eof5095 @@ -126602,17 +126322,16 @@ act = 13; goto tr3250 } goto tr4499 -tr5204: + tr5204: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5096 + act = 13 + goto st5096 st5096: if p++; p == pe { goto _test_eof5096 @@ -126681,12 +126400,11 @@ act = 13; goto tr3250 } goto tr4499 -tr5205: + tr5205: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5097 + goto st5097 st5097: if p++; p == pe { goto _test_eof5097 @@ -126745,17 +126463,16 @@ tr5205: goto tr3250 } goto tr4499 -tr5219: + tr5219: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5098 + act = 5 + goto st5098 st5098: if p++; p == pe { goto _test_eof5098 @@ -126810,17 +126527,16 @@ act = 5; goto tr5054 } goto tr1 -tr5220: + tr5220: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5099 + act = 5 + goto st5099 st5099: if p++; p == pe { goto _test_eof5099 @@ -126875,17 +126591,16 @@ act = 5; goto tr1 } goto tr5054 -tr5221: + tr5221: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5100 + act = 5 + goto st5100 st5100: if p++; p == pe { goto _test_eof5100 @@ -126942,17 +126657,16 @@ act = 5; goto tr1 } goto tr5054 -tr5222: + tr5222: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5101 + act = 5 + goto st5101 st5101: if p++; p == pe { goto _test_eof5101 @@ -127014,17 +126728,16 @@ act = 5; goto tr1 } goto tr5054 -tr5223: + tr5223: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5102 + act = 5 + goto st5102 st5102: if p++; p == pe { goto _test_eof5102 @@ -127086,17 +126799,16 @@ act = 5; goto tr1 } goto tr5054 -tr5224: + tr5224: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5103 + act = 5 + goto st5103 st5103: if p++; p == pe { goto _test_eof5103 @@ -127153,17 +126865,16 @@ act = 5; goto tr1 } goto tr5054 -tr5225: + tr5225: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5104 + act = 5 + goto st5104 st5104: if p++; p == pe { goto _test_eof5104 @@ -127232,12 +126943,11 @@ act = 5; goto tr1 } goto tr5054 -tr5226: + tr5226: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5105 + goto st5105 st5105: if p++; p == pe { goto _test_eof5105 @@ -127296,17 +127006,16 @@ tr5226: goto tr1 } goto tr5054 -tr5206: + tr5206: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5106 + act = 13 + goto st5106 st5106: if p++; p == pe { goto _test_eof5106 @@ -127361,17 +127070,16 @@ act = 13; goto tr4499 } goto tr3250 -tr5207: + tr5207: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5107 + act = 13 + goto st5107 st5107: if p++; p == pe { goto _test_eof5107 @@ -127426,17 +127134,16 @@ act = 13; goto tr3250 } goto tr4499 -tr5208: + tr5208: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5108 + act = 13 + goto st5108 st5108: if p++; p == pe { goto _test_eof5108 @@ -127491,17 +127198,16 @@ act = 13; goto tr3250 } goto tr4499 -tr5209: + tr5209: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5109 + act = 13 + goto st5109 st5109: if p++; p == pe { goto _test_eof5109 @@ -127613,17 +127319,16 @@ act = 13; goto st3613 } goto tr4499 -tr5210: + tr5210: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5110 + act = 13 + goto st5110 st5110: if p++; p == pe { goto _test_eof5110 @@ -127717,17 +127422,16 @@ act = 13; goto st136 } goto tr4499 -tr5211: + tr5211: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5111 + act = 13 + goto st5111 st5111: if p++; p == pe { goto _test_eof5111 @@ -127791,17 +127495,16 @@ act = 13; goto st136 } goto tr4499 -tr5212: + tr5212: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5112 + act = 13 + goto st5112 st5112: if p++; p == pe { goto _test_eof5112 @@ -127857,17 +127560,16 @@ act = 13; goto st136 } goto tr4499 -tr5213: + tr5213: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5113 + act = 13 + goto st5113 st5113: if p++; p == pe { goto _test_eof5113 @@ -127949,17 +127651,16 @@ act = 13; goto st136 } goto tr4499 -tr5214: + tr5214: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5114 + act = 13 + goto st5114 st5114: if p++; p == pe { goto _test_eof5114 @@ -128021,17 +127722,16 @@ act = 13; goto st136 } goto tr4499 -tr5215: + tr5215: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5115 + act = 13 + goto st5115 st5115: if p++; p == pe { goto _test_eof5115 @@ -128095,17 +127795,16 @@ act = 13; goto st136 } goto tr4499 -tr5216: + tr5216: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5116 + act = 13 + goto st5116 st5116: if p++; p == pe { goto _test_eof5116 @@ -128159,17 +127858,16 @@ act = 13; goto st136 } goto tr4499 -tr5227: + tr5227: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5117 + act = 5 + goto st5117 st5117: if p++; p == pe { goto _test_eof5117 @@ -128224,17 +127922,16 @@ act = 5; goto tr5054 } goto tr1 -tr5228: + tr5228: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5118 + act = 5 + goto st5118 st5118: if p++; p == pe { goto _test_eof5118 @@ -128289,17 +127986,16 @@ act = 5; goto tr1 } goto tr5054 -tr5229: + tr5229: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5119 + act = 5 + goto st5119 st5119: if p++; p == pe { goto _test_eof5119 @@ -128354,17 +128050,16 @@ act = 5; goto tr1 } goto tr5054 -tr5230: + tr5230: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5120 + act = 5 + goto st5120 st5120: if p++; p == pe { goto _test_eof5120 @@ -128476,17 +128171,16 @@ act = 5; goto st19 } goto tr5054 -tr5231: + tr5231: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5121 + act = 5 + goto st5121 st5121: if p++; p == pe { goto _test_eof5121 @@ -128580,17 +128274,16 @@ act = 5; goto st3730 } goto tr5054 -tr5232: + tr5232: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5122 + act = 5 + goto st5122 st5122: if p++; p == pe { goto _test_eof5122 @@ -128654,17 +128347,16 @@ act = 5; goto st3730 } goto tr5054 -tr5233: + tr5233: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5123 + act = 5 + goto st5123 st5123: if p++; p == pe { goto _test_eof5123 @@ -128720,17 +128412,16 @@ act = 5; goto st3730 } goto tr5054 -tr5234: + tr5234: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5124 + act = 5 + goto st5124 st5124: if p++; p == pe { goto _test_eof5124 @@ -128812,17 +128503,16 @@ act = 5; goto st3730 } goto tr5054 -tr5235: + tr5235: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5125 + act = 5 + goto st5125 st5125: if p++; p == pe { goto _test_eof5125 @@ -128884,17 +128574,16 @@ act = 5; goto st3730 } goto tr5054 -tr5236: + tr5236: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5126 + act = 5 + goto st5126 st5126: if p++; p == pe { goto _test_eof5126 @@ -128958,17 +128647,16 @@ act = 5; goto st3730 } goto tr5054 -tr5237: + tr5237: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5127 + act = 5 + goto st5127 st5127: if p++; p == pe { goto _test_eof5127 @@ -129022,12 +128710,11 @@ act = 5; goto st3730 } goto tr5054 -tr4007: + tr4007: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5128 + goto st5128 st5128: if p++; p == pe { goto _test_eof5128 @@ -129084,17 +128771,16 @@ tr4007: goto tr5054 } goto tr1 -tr4008: + tr4008: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5129 + act = 5 + goto st5129 st5129: if p++; p == pe { goto _test_eof5129 @@ -129156,12 +128842,11 @@ act = 5; goto tr5054 } goto tr1 -tr4009: + tr4009: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5130 + goto st5130 st5130: if p++; p == pe { goto _test_eof5130 @@ -129223,17 +128908,16 @@ tr4009: goto tr1 } goto tr5054 -tr4010: + tr4010: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5131 + act = 5 + goto st5131 st5131: if p++; p == pe { goto _test_eof5131 @@ -129307,17 +128991,16 @@ act = 5; goto tr5054 } goto tr1 -tr4011: + tr4011: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5132 + act = 5 + goto st5132 st5132: if p++; p == pe { goto _test_eof5132 @@ -129395,17 +129078,16 @@ act = 5; goto tr5054 } goto tr1 -tr4012: + tr4012: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5133 + act = 5 + goto st5133 st5133: if p++; p == pe { goto _test_eof5133 @@ -129469,17 +129151,16 @@ act = 5; goto tr5054 } goto tr1 -tr4013: + tr4013: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5134 + act = 5 + goto st5134 st5134: if p++; p == pe { goto _test_eof5134 @@ -129541,17 +129222,16 @@ act = 5; goto tr1 } goto tr5054 -tr4014: + tr4014: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5135 + act = 5 + goto st5135 st5135: if p++; p == pe { goto _test_eof5135 @@ -129625,17 +129305,16 @@ act = 5; goto tr1 } goto tr5054 -tr4015: + tr4015: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5136 + act = 5 + goto st5136 st5136: if p++; p == pe { goto _test_eof5136 @@ -129692,17 +129371,16 @@ act = 5; goto tr1 } goto tr5054 -tr4016: + tr4016: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5137 + act = 5 + goto st5137 st5137: if p++; p == pe { goto _test_eof5137 @@ -129768,12 +129446,11 @@ act = 5; goto tr1 } goto tr5054 -tr4017: + tr4017: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5138 + goto st5138 st5138: if p++; p == pe { goto _test_eof5138 @@ -129833,17 +129510,16 @@ tr4017: goto tr1 } goto tr5054 -tr4018: + tr4018: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5139 + act = 5 + goto st5139 st5139: if p++; p == pe { goto _test_eof5139 @@ -129911,17 +129587,16 @@ act = 5; goto tr5054 } goto tr1 -tr4019: + tr4019: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5140 + act = 5 + goto st5140 st5140: if p++; p == pe { goto _test_eof5140 @@ -129995,12 +129670,11 @@ act = 5; goto tr1 } goto tr5054 -tr4020: + tr4020: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5141 + goto st5141 st5141: if p++; p == pe { goto _test_eof5141 @@ -130060,17 +129734,16 @@ tr4020: goto tr1 } goto tr5054 -tr4021: + tr4021: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5142 + act = 5 + goto st5142 st5142: if p++; p == pe { goto _test_eof5142 @@ -130138,17 +129811,16 @@ act = 5; goto tr5054 } goto tr1 -tr4022: + tr4022: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5143 + act = 5 + goto st5143 st5143: if p++; p == pe { goto _test_eof5143 @@ -130203,17 +129875,16 @@ act = 5; goto tr1 } goto tr5054 -tr4023: + tr4023: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5144 + act = 5 + goto st5144 st5144: if p++; p == pe { goto _test_eof5144 @@ -130281,17 +129952,16 @@ act = 5; goto tr1 } goto tr5054 -tr4024: + tr4024: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5145 + act = 5 + goto st5145 st5145: if p++; p == pe { goto _test_eof5145 @@ -130348,17 +130018,16 @@ act = 5; goto tr1 } goto tr5054 -tr4025: + tr4025: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5146 + act = 5 + goto st5146 st5146: if p++; p == pe { goto _test_eof5146 @@ -130413,17 +130082,16 @@ act = 5; goto tr1 } goto tr5054 -tr4026: + tr4026: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5147 + act = 5 + goto st5147 st5147: if p++; p == pe { goto _test_eof5147 @@ -130485,17 +130153,16 @@ act = 5; goto tr1 } goto tr5054 -tr4027: + tr4027: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5148 + act = 5 + goto st5148 st5148: if p++; p == pe { goto _test_eof5148 @@ -130550,17 +130217,16 @@ act = 5; goto tr1 } goto tr5054 -tr4028: + tr4028: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5149 + act = 5 + goto st5149 st5149: if p++; p == pe { goto _test_eof5149 @@ -130626,17 +130292,16 @@ act = 5; goto tr1 } goto tr5054 -tr4029: + tr4029: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5150 + act = 5 + goto st5150 st5150: if p++; p == pe { goto _test_eof5150 @@ -130691,17 +130356,16 @@ act = 5; goto tr1 } goto tr5054 -tr4030: + tr4030: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5151 + act = 5 + goto st5151 st5151: if p++; p == pe { goto _test_eof5151 @@ -130770,17 +130434,16 @@ act = 5; goto tr1 } goto tr5054 -tr4031: + tr4031: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5152 + act = 5 + goto st5152 st5152: if p++; p == pe { goto _test_eof5152 @@ -130884,17 +130547,16 @@ act = 5; goto tr4052 } goto tr3250 -tr4032: + tr4032: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5153 + act = 5 + goto st5153 st5153: if p++; p == pe { goto _test_eof5153 @@ -130949,17 +130611,16 @@ act = 5; goto tr1 } goto tr5054 -tr4033: + tr4033: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5154 + act = 5 + goto st5154 st5154: if p++; p == pe { goto _test_eof5154 @@ -131033,17 +130694,16 @@ act = 5; goto tr1 } goto tr5054 -tr4034: + tr4034: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5155 + act = 5 + goto st5155 st5155: if p++; p == pe { goto _test_eof5155 @@ -131105,17 +130765,16 @@ act = 5; goto tr1 } goto tr5054 -tr4035: + tr4035: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5156 + act = 5 + goto st5156 st5156: if p++; p == pe { goto _test_eof5156 @@ -131170,17 +130829,16 @@ act = 5; goto tr1 } goto tr5054 -tr4036: + tr4036: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5157 + act = 5 + goto st5157 st5157: if p++; p == pe { goto _test_eof5157 @@ -131240,17 +130898,16 @@ act = 5; goto tr1 } goto tr5054 -tr4037: + tr4037: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5158 + act = 5 + goto st5158 st5158: if p++; p == pe { goto _test_eof5158 @@ -131310,12 +130967,11 @@ act = 5; goto tr1 } goto tr5054 -tr4038: + tr4038: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5159 + goto st5159 st5159: if p++; p == pe { goto _test_eof5159 @@ -131370,17 +131026,16 @@ tr4038: goto tr1 } goto tr5054 -tr4039: + tr4039: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5160 + act = 5 + goto st5160 st5160: if p++; p == pe { goto _test_eof5160 @@ -131440,17 +131095,16 @@ act = 5; goto tr5054 } goto tr1 -tr4040: + tr4040: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5161 + act = 5 + goto st5161 st5161: if p++; p == pe { goto _test_eof5161 @@ -131505,17 +131159,16 @@ act = 5; goto tr1 } goto tr5054 -tr4041: + tr4041: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5162 + act = 5 + goto st5162 st5162: if p++; p == pe { goto _test_eof5162 @@ -131569,17 +131222,16 @@ act = 5; goto st3730 } goto tr5054 -tr4042: + tr4042: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5163 + act = 5 + goto st5163 st5163: if p++; p == pe { goto _test_eof5163 @@ -131639,17 +131291,16 @@ act = 5; goto tr1 } goto tr5054 -tr4043: + tr4043: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5164 + act = 5 + goto st5164 st5164: if p++; p == pe { goto _test_eof5164 @@ -131704,17 +131355,16 @@ act = 5; goto tr1 } goto tr5054 -tr4044: + tr4044: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5165 + act = 5 + goto st5165 st5165: if p++; p == pe { goto _test_eof5165 @@ -131776,17 +131426,16 @@ act = 5; goto tr1 } goto tr5054 -tr4045: + tr4045: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5166 + act = 5 + goto st5166 st5166: if p++; p == pe { goto _test_eof5166 @@ -131841,12 +131490,11 @@ act = 5; goto tr1 } goto tr5054 -tr4046: + tr4046: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5167 + goto st5167 st5167: if p++; p == pe { goto _test_eof5167 @@ -131906,17 +131554,16 @@ tr4046: goto tr1 } goto tr5054 -tr4047: + tr4047: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5168 + act = 5 + goto st5168 st5168: if p++; p == pe { goto _test_eof5168 @@ -131976,17 +131623,16 @@ act = 5; goto tr5054 } goto tr1 -tr4048: + tr4048: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5169 + act = 5 + goto st5169 st5169: if p++; p == pe { goto _test_eof5169 @@ -132046,17 +131692,16 @@ act = 5; goto tr1 } goto tr5054 -tr4049: + tr4049: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5170 + act = 5 + goto st5170 st5170: if p++; p == pe { goto _test_eof5170 @@ -132111,17 +131756,16 @@ act = 5; goto tr1 } goto tr5054 -tr4050: + tr4050: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5171 + act = 5 + goto st5171 st5171: if p++; p == pe { goto _test_eof5171 @@ -132176,17 +131820,16 @@ act = 5; goto tr1 } goto tr5054 -tr4051: + tr4051: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5172 + act = 5 + goto st5172 st5172: if p++; p == pe { goto _test_eof5172 @@ -132257,17 +131900,16 @@ act = 5; goto tr1 } goto tr5054 -tr4052: + tr4052: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5173 + act = 5 + goto st5173 st5173: if p++; p == pe { goto _test_eof5173 @@ -132347,17 +131989,16 @@ act = 5; goto tr4058 } goto tr3250 -tr4053: + tr4053: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5174 + act = 5 + goto st5174 st5174: if p++; p == pe { goto _test_eof5174 @@ -132417,17 +132058,16 @@ act = 5; goto tr1 } goto tr5054 -tr4054: + tr4054: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5175 + act = 5 + goto st5175 st5175: if p++; p == pe { goto _test_eof5175 @@ -132487,17 +132127,16 @@ act = 5; goto tr1 } goto tr5054 -tr4055: + tr4055: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5176 + act = 5 + goto st5176 st5176: if p++; p == pe { goto _test_eof5176 @@ -132552,17 +132191,16 @@ act = 5; goto tr1 } goto tr5054 -tr4056: + tr4056: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5177 + act = 5 + goto st5177 st5177: if p++; p == pe { goto _test_eof5177 @@ -132617,17 +132255,16 @@ act = 5; goto tr1 } goto tr5054 -tr4057: + tr4057: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5178 + act = 5 + goto st5178 st5178: if p++; p == pe { goto _test_eof5178 @@ -132681,17 +132318,16 @@ act = 5; goto st3730 } goto tr5054 -tr4058: + tr4058: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5179 + act = 5 + goto st5179 st5179: if p++; p == pe { goto _test_eof5179 @@ -132758,17 +132394,16 @@ act = 5; goto tr4060 } goto tr3250 -tr4059: + tr4059: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5180 + act = 5 + goto st5180 st5180: if p++; p == pe { goto _test_eof5180 @@ -132823,17 +132458,16 @@ act = 5; goto tr1 } goto tr5054 -tr4060: + tr4060: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5181 + act = 5 + goto st5181 st5181: if p++; p == pe { goto _test_eof5181 @@ -132926,17 +132560,16 @@ act = 5; goto tr4075 } goto tr3250 -tr4061: + tr4061: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5182 + act = 5 + goto st5182 st5182: if p++; p == pe { goto _test_eof5182 @@ -132996,17 +132629,16 @@ act = 5; goto tr1 } goto tr5054 -tr4062: + tr4062: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5183 + act = 5 + goto st5183 st5183: if p++; p == pe { goto _test_eof5183 @@ -133061,17 +132693,16 @@ act = 5; goto tr1 } goto tr5054 -tr4063: + tr4063: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5184 + act = 5 + goto st5184 st5184: if p++; p == pe { goto _test_eof5184 @@ -133126,17 +132757,16 @@ act = 5; goto tr1 } goto tr5054 -tr4064: + tr4064: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5185 + act = 5 + goto st5185 st5185: if p++; p == pe { goto _test_eof5185 @@ -133197,12 +132827,11 @@ act = 5; goto tr1 } goto tr5054 -tr4065: + tr4065: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5186 + goto st5186 st5186: if p++; p == pe { goto _test_eof5186 @@ -133262,17 +132891,16 @@ tr4065: goto tr1 } goto tr5054 -tr4066: + tr4066: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5187 + act = 5 + goto st5187 st5187: if p++; p == pe { goto _test_eof5187 @@ -133332,17 +132960,16 @@ act = 5; goto tr5054 } goto tr1 -tr4067: + tr4067: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5188 + act = 5 + goto st5188 st5188: if p++; p == pe { goto _test_eof5188 @@ -133397,17 +133024,16 @@ act = 5; goto tr1 } goto tr5054 -tr4068: + tr4068: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5189 + act = 5 + goto st5189 st5189: if p++; p == pe { goto _test_eof5189 @@ -133462,12 +133088,11 @@ act = 5; goto tr1 } goto tr5054 -tr4069: + tr4069: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5190 + goto st5190 st5190: if p++; p == pe { goto _test_eof5190 @@ -133527,17 +133152,16 @@ tr4069: goto tr1 } goto tr5054 -tr4070: + tr4070: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5191 + act = 5 + goto st5191 st5191: if p++; p == pe { goto _test_eof5191 @@ -133597,17 +133221,16 @@ act = 5; goto tr5054 } goto tr1 -tr4071: + tr4071: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5192 + act = 5 + goto st5192 st5192: if p++; p == pe { goto _test_eof5192 @@ -133662,17 +133285,16 @@ act = 5; goto tr1 } goto tr5054 -tr4072: + tr4072: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5193 + act = 5 + goto st5193 st5193: if p++; p == pe { goto _test_eof5193 @@ -133734,17 +133356,16 @@ act = 5; goto tr1 } goto tr5054 -tr4073: + tr4073: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5194 + act = 5 + goto st5194 st5194: if p++; p == pe { goto _test_eof5194 @@ -133810,17 +133431,16 @@ act = 5; goto tr1 } goto tr5054 -tr4074: + tr4074: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5195 + act = 5 + goto st5195 st5195: if p++; p == pe { goto _test_eof5195 @@ -133882,17 +133502,16 @@ act = 5; goto tr1 } goto tr5054 -tr4075: + tr4075: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5196 + act = 5 + goto st5196 st5196: if p++; p == pe { goto _test_eof5196 @@ -133970,17 +133589,16 @@ act = 5; goto tr4078 } goto tr3250 -tr4076: + tr4076: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5197 + act = 5 + goto st5197 st5197: if p++; p == pe { goto _test_eof5197 @@ -134034,17 +133652,16 @@ act = 5; goto st3730 } goto tr5054 -tr4077: + tr4077: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5198 + act = 5 + goto st5198 st5198: if p++; p == pe { goto _test_eof5198 @@ -134104,17 +133721,16 @@ act = 5; goto tr1 } goto tr5054 -tr4078: + tr4078: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5199 + act = 5 + goto st5199 st5199: if p++; p == pe { goto _test_eof5199 @@ -134189,17 +133805,16 @@ act = 5; goto tr4084 } goto tr3250 -tr4079: + tr4079: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5200 + act = 5 + goto st5200 st5200: if p++; p == pe { goto _test_eof5200 @@ -134261,17 +133876,16 @@ act = 5; goto st3730 } goto tr5054 -tr4080: + tr4080: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5201 + act = 5 + goto st5201 st5201: if p++; p == pe { goto _test_eof5201 @@ -134361,17 +133975,16 @@ act = 5; goto st3730 } goto tr5054 -tr4081: + tr4081: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5202 + act = 5 + goto st5202 st5202: if p++; p == pe { goto _test_eof5202 @@ -134431,17 +134044,16 @@ act = 5; goto st3730 } goto tr5054 -tr4082: + tr4082: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5203 + act = 5 + goto st5203 st5203: if p++; p == pe { goto _test_eof5203 @@ -134495,17 +134107,16 @@ act = 5; goto st3730 } goto tr5054 -tr4083: + tr4083: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5204 + act = 5 + goto st5204 st5204: if p++; p == pe { goto _test_eof5204 @@ -134569,17 +134180,16 @@ act = 5; goto st3730 } goto tr5054 -tr4084: + tr4084: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5205 + act = 5 + goto st5205 st5205: if p++; p == pe { goto _test_eof5205 @@ -134642,17 +134252,16 @@ act = 5; goto tr4085 } goto tr3250 -tr4085: + tr4085: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:131 -act = 5; - goto st5206 + act = 5 + goto st5206 st5206: if p++; p == pe { goto _test_eof5206 @@ -134715,21 +134324,19 @@ act = 5; goto st140 } goto tr5054 -tr4490: + tr4490: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5207 + act = 13 + goto st5207 st5207: if p++; p == pe { goto _test_eof5207 @@ -134796,21 +134403,19 @@ act = 13; goto tr0 } goto tr3250 -tr4491: + tr4491: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5208 + act = 13 + goto st5208 st5208: if p++; p == pe { goto _test_eof5208 @@ -134862,21 +134467,19 @@ act = 13; goto st4479 } goto st3734 -tr4492: + tr4492: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5209 + act = 13 + goto st5209 st5209: if p++; p == pe { goto _test_eof5209 @@ -134933,21 +134536,19 @@ act = 13; goto tr4499 } goto st3734 -tr4493: + tr4493: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5210 + act = 13 + goto st5210 st5210: if p++; p == pe { goto _test_eof5210 @@ -135387,17 +134988,16 @@ act = 13; goto tr4086 } goto tr2984 -tr4086: + tr4086: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5211 + act = 2 + goto st5211 st5211: if p++; p == pe { goto _test_eof5211 @@ -139400,17 +139000,16 @@ act = 2; goto tr4219 } goto tr2984 -tr4214: + tr4214: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5212 + act = 2 + goto st5212 st5212: if p++; p == pe { goto _test_eof5212 @@ -139528,17 +139127,16 @@ act = 2; goto tr1 } goto tr5002 -tr4215: + tr4215: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5213 + act = 2 + goto st5213 st5213: if p++; p == pe { goto _test_eof5213 @@ -139642,17 +139240,16 @@ act = 2; goto tr148 } goto tr5002 -tr4216: + tr4216: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5214 + act = 2 + goto st5214 st5214: if p++; p == pe { goto _test_eof5214 @@ -139765,17 +139362,16 @@ act = 2; goto tr1 } goto tr5002 -tr5294: + tr5294: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5215 + act = 13 + goto st5215 st5215: if p++; p == pe { goto _test_eof5215 @@ -139837,12 +139433,11 @@ act = 13; goto st136 } goto tr4499 -tr5295: + tr5295: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5216 + goto st5216 st5216: if p++; p == pe { goto _test_eof5216 @@ -139897,17 +139492,16 @@ tr5295: goto tr2984 } goto tr4499 -tr5317: + tr5317: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5217 + act = 2 + goto st5217 st5217: if p++; p == pe { goto _test_eof5217 @@ -140009,17 +139603,16 @@ act = 2; goto tr148 } goto tr5002 -tr5318: + tr5318: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5218 + act = 2 + goto st5218 st5218: if p++; p == pe { goto _test_eof5218 @@ -140137,17 +139730,16 @@ act = 2; goto tr5002 } goto tr1 -tr5296: + tr5296: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5219 + act = 13 + goto st5219 st5219: if p++; p == pe { goto _test_eof5219 @@ -140220,12 +139812,11 @@ act = 13; goto tr4499 } goto tr2984 -tr5297: + tr5297: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5220 + goto st5220 st5220: if p++; p == pe { goto _test_eof5220 @@ -140282,17 +139873,16 @@ tr5297: goto tr2984 } goto tr148 -tr5298: + tr5298: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5221 + act = 13 + goto st5221 st5221: if p++; p == pe { goto _test_eof5221 @@ -140358,17 +139948,16 @@ act = 13; goto tr2984 } goto tr148 -tr5299: + tr5299: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5222 + act = 13 + goto st5222 st5222: if p++; p == pe { goto _test_eof5222 @@ -140443,17 +140032,16 @@ act = 13; goto tr2984 } goto tr4499 -tr5300: + tr5300: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5223 + act = 13 + goto st5223 st5223: if p++; p == pe { goto _test_eof5223 @@ -140519,12 +140107,11 @@ act = 13; goto tr2984 } goto tr4499 -tr5301: + tr5301: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5224 + goto st5224 st5224: if p++; p == pe { goto _test_eof5224 @@ -140597,17 +140184,16 @@ tr5301: goto tr2984 } goto tr4499 -tr5302: + tr5302: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5225 + act = 13 + goto st5225 st5225: if p++; p == pe { goto _test_eof5225 @@ -140687,12 +140273,11 @@ act = 13; goto tr421 } goto tr148 -tr5303: + tr5303: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5226 + goto st5226 st5226: if p++; p == pe { goto _test_eof5226 @@ -140758,17 +140343,16 @@ tr5303: goto tr148 } goto tr4499 -tr5319: + tr5319: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5227 + act = 2 + goto st5227 st5227: if p++; p == pe { goto _test_eof5227 @@ -140881,17 +140465,16 @@ act = 2; goto tr5002 } goto tr1 -tr5320: + tr5320: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5228 + act = 2 + goto st5228 st5228: if p++; p == pe { goto _test_eof5228 @@ -140995,17 +140578,16 @@ act = 2; goto tr148 } goto tr5002 -tr5321: + tr5321: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5229 + act = 2 + goto st5229 st5229: if p++; p == pe { goto _test_eof5229 @@ -141111,17 +140693,16 @@ act = 2; goto tr148 } goto tr5002 -tr5322: + tr5322: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5230 + act = 2 + goto st5230 st5230: if p++; p == pe { goto _test_eof5230 @@ -141231,17 +140812,16 @@ act = 2; goto tr1 } goto tr5002 -tr5323: + tr5323: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5231 + act = 2 + goto st5231 st5231: if p++; p == pe { goto _test_eof5231 @@ -141351,17 +140931,16 @@ act = 2; goto tr1 } goto tr5002 -tr5324: + tr5324: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5232 + act = 2 + goto st5232 st5232: if p++; p == pe { goto _test_eof5232 @@ -141467,17 +141046,16 @@ act = 2; goto tr148 } goto tr5002 -tr5325: + tr5325: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5233 + act = 2 + goto st5233 st5233: if p++; p == pe { goto _test_eof5233 @@ -141595,17 +141173,16 @@ act = 2; goto tr1 } goto tr5002 -tr5326: + tr5326: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5234 + act = 2 + goto st5234 st5234: if p++; p == pe { goto _test_eof5234 @@ -141722,12 +141299,11 @@ act = 2; goto tr1 } goto tr5002 -tr5304: + tr5304: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5235 + goto st5235 st5235: if p++; p == pe { goto _test_eof5235 @@ -141787,17 +141363,16 @@ tr5304: goto tr4499 } goto tr2984 -tr5305: + tr5305: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5236 + act = 13 + goto st5236 st5236: if p++; p == pe { goto _test_eof5236 @@ -141857,17 +141432,16 @@ act = 13; goto tr2984 } goto tr148 -tr5306: + tr5306: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5237 + act = 13 + goto st5237 st5237: if p++; p == pe { goto _test_eof5237 @@ -141938,17 +141512,16 @@ act = 13; goto tr148 } goto tr4499 -tr5307: + tr5307: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5238 + act = 13 + goto st5238 st5238: if p++; p == pe { goto _test_eof5238 @@ -142064,17 +141637,16 @@ act = 13; goto st136 } goto tr4499 -tr5308: + tr5308: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5239 + act = 13 + goto st5239 st5239: if p++; p == pe { goto _test_eof5239 @@ -142233,17 +141805,16 @@ act = 13; goto st145 } goto tr4499 -tr5309: + tr5309: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5240 + act = 13 + goto st5240 st5240: if p++; p == pe { goto _test_eof5240 @@ -142331,17 +141902,16 @@ act = 13; goto st136 } goto tr4499 -tr5310: + tr5310: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5241 + act = 13 + goto st5241 st5241: if p++; p == pe { goto _test_eof5241 @@ -142407,17 +141977,16 @@ act = 13; goto st136 } goto tr4499 -tr5311: + tr5311: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5242 + act = 13 + goto st5242 st5242: if p++; p == pe { goto _test_eof5242 @@ -142583,17 +142152,16 @@ act = 13; goto tr4262 } goto tr2984 -tr4242: + tr4242: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5243 + act = 2 + goto st5243 st5243: if p++; p == pe { goto _test_eof5243 @@ -142697,17 +142265,16 @@ act = 2; goto tr148 } goto tr5002 -tr4243: + tr4243: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5244 + act = 2 + goto st5244 st5244: if p++; p == pe { goto _test_eof5244 @@ -142830,17 +142397,16 @@ act = 2; goto tr1 } goto tr5002 -tr4244: + tr4244: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5245 + act = 2 + goto st5245 st5245: if p++; p == pe { goto _test_eof5245 @@ -142950,17 +142516,16 @@ act = 2; goto tr1 } goto tr5002 -tr4245: + tr4245: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5246 + act = 2 + goto st5246 st5246: if p++; p == pe { goto _test_eof5246 @@ -143064,17 +142629,16 @@ act = 2; goto tr148 } goto tr5002 -tr4246: + tr4246: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5247 + act = 2 + goto st5247 st5247: if p++; p == pe { goto _test_eof5247 @@ -143182,17 +142746,16 @@ act = 2; goto tr1 } goto tr5002 -tr4247: + tr4247: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5248 + act = 2 + goto st5248 st5248: if p++; p == pe { goto _test_eof5248 @@ -143300,17 +142863,16 @@ act = 2; goto tr1 } goto tr5002 -tr4248: + tr4248: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5249 + act = 2 + goto st5249 st5249: if p++; p == pe { goto _test_eof5249 @@ -143423,32 +142985,29 @@ act = 2; goto tr1 } goto tr5002 -tr5312: + tr5312: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5250 -tr4494: + act = 13 + goto st5250 + tr4494: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5250 + act = 13 + goto st5250 st5250: if p++; p == pe { goto _test_eof5250 @@ -143520,17 +143079,16 @@ act = 13; goto tr4268 } goto tr2984 -tr4263: + tr4263: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5251 + act = 2 + goto st5251 st5251: if p++; p == pe { goto _test_eof5251 @@ -143638,17 +143196,16 @@ act = 2; goto tr1 } goto tr5002 -tr4264: + tr4264: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5252 + act = 2 + goto st5252 st5252: if p++; p == pe { goto _test_eof5252 @@ -143756,17 +143313,16 @@ act = 2; goto tr1 } goto tr5002 -tr4265: + tr4265: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5253 + act = 2 + goto st5253 st5253: if p++; p == pe { goto _test_eof5253 @@ -143870,17 +143426,16 @@ act = 2; goto tr148 } goto tr5002 -tr4266: + tr4266: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5254 + act = 2 + goto st5254 st5254: if p++; p == pe { goto _test_eof5254 @@ -143984,17 +143539,16 @@ act = 2; goto tr148 } goto tr5002 -tr4267: + tr4267: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5255 + act = 2 + goto st5255 st5255: if p++; p == pe { goto _test_eof5255 @@ -144096,17 +143650,16 @@ act = 2; goto tr148 } goto tr5002 -tr4268: + tr4268: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5256 + act = 2 + goto st5256 st5256: if p++; p == pe { goto _test_eof5256 @@ -144222,17 +143775,16 @@ act = 2; goto tr4270 } goto tr2984 -tr4269: + tr4269: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5257 + act = 2 + goto st5257 st5257: if p++; p == pe { goto _test_eof5257 @@ -144336,17 +143888,16 @@ act = 2; goto tr148 } goto tr5002 -tr4270: + tr4270: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5258 + act = 2 + goto st5258 st5258: if p++; p == pe { goto _test_eof5258 @@ -144488,17 +144039,16 @@ act = 2; goto tr4285 } goto tr2984 -tr4271: + tr4271: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5259 + act = 2 + goto st5259 st5259: if p++; p == pe { goto _test_eof5259 @@ -144606,17 +144156,16 @@ act = 2; goto tr1 } goto tr5002 -tr4272: + tr4272: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5260 + act = 2 + goto st5260 st5260: if p++; p == pe { goto _test_eof5260 @@ -144720,17 +144269,16 @@ act = 2; goto tr148 } goto tr5002 -tr4273: + tr4273: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5261 + act = 2 + goto st5261 st5261: if p++; p == pe { goto _test_eof5261 @@ -144834,17 +144382,16 @@ act = 2; goto tr148 } goto tr5002 -tr4274: + tr4274: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5262 + act = 2 + goto st5262 st5262: if p++; p == pe { goto _test_eof5262 @@ -144954,17 +144501,16 @@ act = 2; goto tr148 } goto tr5002 -tr4275: + tr4275: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5263 + act = 2 + goto st5263 st5263: if p++; p == pe { goto _test_eof5263 @@ -145082,32 +144628,29 @@ act = 2; goto tr1 } goto tr5002 -tr5313: + tr5313: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5264 -tr4495: + act = 13 + goto st5264 + tr4495: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5264 + act = 13 + goto st5264 st5264: if p++; p == pe { goto _test_eof5264 @@ -145166,17 +144709,16 @@ act = 13; goto tr4499 } goto st3318 -tr5314: + tr5314: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5265 + act = 13 + goto st5265 st5265: if p++; p == pe { goto _test_eof5265 @@ -145261,17 +144803,16 @@ act = 13; goto st145 } goto tr4499 -tr5315: + tr5315: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5266 + act = 13 + goto st5266 st5266: if p++; p == pe { goto _test_eof5266 @@ -145343,17 +144884,16 @@ act = 13; goto st136 } goto tr4499 -tr5316: + tr5316: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5267 + act = 13 + goto st5267 st5267: if p++; p == pe { goto _test_eof5267 @@ -145407,17 +144947,16 @@ act = 13; goto st136 } goto tr4499 -tr4276: + tr4276: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5268 + act = 2 + goto st5268 st5268: if p++; p == pe { goto _test_eof5268 @@ -145535,17 +145074,16 @@ act = 2; goto tr5002 } goto tr1 -tr4277: + tr4277: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5269 + act = 2 + goto st5269 st5269: if p++; p == pe { goto _test_eof5269 @@ -145649,17 +145187,16 @@ act = 2; goto tr148 } goto tr5002 -tr4278: + tr4278: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5270 + act = 2 + goto st5270 st5270: if p++; p == pe { goto _test_eof5270 @@ -145763,17 +145300,16 @@ act = 2; goto tr148 } goto tr5002 -tr4279: + tr4279: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5271 + act = 2 + goto st5271 st5271: if p++; p == pe { goto _test_eof5271 @@ -145891,17 +145427,16 @@ act = 2; goto tr1 } goto tr5002 -tr4280: + tr4280: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5272 + act = 2 + goto st5272 st5272: if p++; p == pe { goto _test_eof5272 @@ -146021,17 +145556,16 @@ act = 2; goto tr1 } goto tr5002 -tr4281: + tr4281: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5273 + act = 2 + goto st5273 st5273: if p++; p == pe { goto _test_eof5273 @@ -146135,17 +145669,16 @@ act = 2; goto tr148 } goto tr5002 -tr4282: + tr4282: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5274 + act = 2 + goto st5274 st5274: if p++; p == pe { goto _test_eof5274 @@ -146255,17 +145788,16 @@ act = 2; goto tr1 } goto tr5002 -tr4283: + tr4283: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5275 + act = 2 + goto st5275 st5275: if p++; p == pe { goto _test_eof5275 @@ -146380,17 +145912,16 @@ act = 2; goto tr1 } goto tr5002 -tr4284: + tr4284: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5276 + act = 2 + goto st5276 st5276: if p++; p == pe { goto _test_eof5276 @@ -146500,17 +146031,16 @@ act = 2; goto tr1 } goto tr5002 -tr4285: + tr4285: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5277 + act = 2 + goto st5277 st5277: if p++; p == pe { goto _test_eof5277 @@ -146636,17 +146166,16 @@ act = 2; goto tr4288 } goto tr2984 -tr4286: + tr4286: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5278 + act = 2 + goto st5278 st5278: if p++; p == pe { goto _test_eof5278 @@ -146748,17 +146277,16 @@ act = 2; goto tr148 } goto tr5002 -tr4287: + tr4287: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5279 + act = 2 + goto st5279 st5279: if p++; p == pe { goto _test_eof5279 @@ -146866,17 +146394,16 @@ act = 2; goto tr1 } goto tr5002 -tr4288: + tr4288: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5280 + act = 2 + goto st5280 st5280: if p++; p == pe { goto _test_eof5280 @@ -147000,17 +146527,16 @@ act = 2; goto tr4294 } goto tr2984 -tr4289: + tr4289: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5281 + act = 2 + goto st5281 st5281: if p++; p == pe { goto _test_eof5281 @@ -147120,17 +146646,16 @@ act = 2; goto tr148 } goto tr5002 -tr4290: + tr4290: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5282 + act = 2 + goto st5282 st5282: if p++; p == pe { goto _test_eof5282 @@ -147268,17 +146793,16 @@ act = 2; goto tr148 } goto tr5002 -tr4291: + tr4291: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5283 + act = 2 + goto st5283 st5283: if p++; p == pe { goto _test_eof5283 @@ -147386,17 +146910,16 @@ act = 2; goto tr148 } goto tr5002 -tr4292: + tr4292: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5284 + act = 2 + goto st5284 st5284: if p++; p == pe { goto _test_eof5284 @@ -147498,17 +147021,16 @@ act = 2; goto tr148 } goto tr5002 -tr4293: + tr4293: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5285 + act = 2 + goto st5285 st5285: if p++; p == pe { goto _test_eof5285 @@ -147620,17 +147142,16 @@ act = 2; goto tr148 } goto tr5002 -tr4294: + tr4294: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5286 + act = 2 + goto st5286 st5286: if p++; p == pe { goto _test_eof5286 @@ -147741,17 +147262,16 @@ act = 2; goto tr4295 } goto tr2984 -tr4295: + tr4295: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5287 + act = 2 + goto st5287 st5287: if p++; p == pe { goto _test_eof5287 @@ -147863,17 +147383,16 @@ act = 2; goto tr148 } goto tr5002 -tr4249: + tr4249: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5288 + act = 2 + goto st5288 st5288: if p++; p == pe { goto _test_eof5288 @@ -147991,17 +147510,16 @@ act = 2; goto tr5002 } goto tr1 -tr4250: + tr4250: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5289 + act = 2 + goto st5289 st5289: if p++; p == pe { goto _test_eof5289 @@ -148105,17 +147623,16 @@ act = 2; goto tr148 } goto tr5002 -tr4251: + tr4251: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5290 + act = 2 + goto st5290 st5290: if p++; p == pe { goto _test_eof5290 @@ -148217,17 +147734,16 @@ act = 2; goto tr148 } goto tr5002 -tr4252: + tr4252: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5291 + act = 2 + goto st5291 st5291: if p++; p == pe { goto _test_eof5291 @@ -148335,17 +147851,16 @@ act = 2; goto tr1 } goto tr5002 -tr4253: + tr4253: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5292 + act = 2 + goto st5292 st5292: if p++; p == pe { goto _test_eof5292 @@ -148449,17 +147964,16 @@ act = 2; goto tr148 } goto tr5002 -tr4254: + tr4254: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5293 + act = 2 + goto st5293 st5293: if p++; p == pe { goto _test_eof5293 @@ -148569,17 +148083,16 @@ act = 2; goto tr1 } goto tr5002 -tr4255: + tr4255: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5294 + act = 2 + goto st5294 st5294: if p++; p == pe { goto _test_eof5294 @@ -148683,17 +148196,16 @@ act = 2; goto tr148 } goto tr5002 -tr4256: + tr4256: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5295 + act = 2 + goto st5295 st5295: if p++; p == pe { goto _test_eof5295 @@ -148811,17 +148323,16 @@ act = 2; goto tr1 } goto tr5002 -tr4257: + tr4257: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5296 + act = 2 + goto st5296 st5296: if p++; p == pe { goto _test_eof5296 @@ -148939,17 +148450,16 @@ act = 2; goto tr5002 } goto tr1 -tr4258: + tr4258: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5297 + act = 2 + goto st5297 st5297: if p++; p == pe { goto _test_eof5297 @@ -149057,17 +148567,16 @@ act = 2; goto tr1 } goto tr5002 -tr4259: + tr4259: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5298 + act = 2 + goto st5298 st5298: if p++; p == pe { goto _test_eof5298 @@ -149171,17 +148680,16 @@ act = 2; goto tr148 } goto tr5002 -tr4260: + tr4260: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5299 + act = 2 + goto st5299 st5299: if p++; p == pe { goto _test_eof5299 @@ -149285,17 +148793,16 @@ act = 2; goto tr148 } goto tr5002 -tr4261: + tr4261: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5300 + act = 2 + goto st5300 st5300: if p++; p == pe { goto _test_eof5300 @@ -149415,17 +148922,16 @@ act = 2; goto tr1 } goto tr5002 -tr4262: + tr4262: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5301 + act = 2 + goto st5301 st5301: if p++; p == pe { goto _test_eof5301 @@ -149533,17 +149039,16 @@ act = 2; goto tr1 } goto tr5002 -tr5327: + tr5327: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5302 + act = 2 + goto st5302 st5302: if p++; p == pe { goto _test_eof5302 @@ -149661,17 +149166,16 @@ act = 2; goto tr1 } goto tr5002 -tr5328: + tr5328: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5303 + act = 2 + goto st5303 st5303: if p++; p == pe { goto _test_eof5303 @@ -149775,17 +149279,16 @@ act = 2; goto tr148 } goto tr5002 -tr5329: + tr5329: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5304 + act = 2 + goto st5304 st5304: if p++; p == pe { goto _test_eof5304 @@ -149889,17 +149392,16 @@ act = 2; goto tr148 } goto tr5002 -tr5330: + tr5330: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5305 + act = 2 + goto st5305 st5305: if p++; p == pe { goto _test_eof5305 @@ -150059,17 +149561,16 @@ act = 2; goto st19 } goto tr5002 -tr5331: + tr5331: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5306 + act = 2 + goto st5306 st5306: if p++; p == pe { goto _test_eof5306 @@ -150211,17 +149712,16 @@ act = 2; goto tr148 } goto tr5002 -tr5332: + tr5332: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5307 + act = 2 + goto st5307 st5307: if p++; p == pe { goto _test_eof5307 @@ -150333,17 +149833,16 @@ act = 2; goto tr148 } goto tr5002 -tr5333: + tr5333: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5308 + act = 2 + goto st5308 st5308: if p++; p == pe { goto _test_eof5308 @@ -150447,17 +149946,16 @@ act = 2; goto tr148 } goto tr5002 -tr5334: + tr5334: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5309 + act = 2 + goto st5309 st5309: if p++; p == pe { goto _test_eof5309 @@ -150587,17 +150085,16 @@ act = 2; goto tr148 } goto tr5002 -tr5335: + tr5335: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5310 + act = 2 + goto st5310 st5310: if p++; p == pe { goto _test_eof5310 @@ -150707,17 +150204,16 @@ act = 2; goto tr148 } goto tr5002 -tr5336: + tr5336: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5311 + act = 2 + goto st5311 st5311: if p++; p == pe { goto _test_eof5311 @@ -150829,17 +150325,16 @@ act = 2; goto tr148 } goto tr5002 -tr5337: + tr5337: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5312 + act = 2 + goto st5312 st5312: if p++; p == pe { goto _test_eof5312 @@ -150941,12 +150436,11 @@ act = 2; goto tr148 } goto tr5002 -tr4217: + tr4217: //line segment_words.rl:72 + endPos = p - endPos = p - - goto st5313 + goto st5313 st5313: if p++; p == pe { goto _test_eof5313 @@ -151052,17 +150546,16 @@ tr4217: goto tr2008 } goto tr1 -tr4218: + tr4218: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5314 + act = 2 + goto st5314 st5314: if p++; p == pe { goto _test_eof5314 @@ -151182,17 +150675,16 @@ act = 2; goto tr5002 } goto tr1 -tr4219: + tr4219: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5315 + act = 2 + goto st5315 st5315: if p++; p == pe { goto _test_eof5315 @@ -151312,17 +150804,16 @@ act = 2; goto tr1 } goto tr5002 -tr4220: + tr4220: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5316 + act = 2 + goto st5316 st5316: if p++; p == pe { goto _test_eof5316 @@ -151454,17 +150945,16 @@ act = 2; goto tr5002 } goto tr1 -tr4221: + tr4221: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5317 + act = 2 + goto st5317 st5317: if p++; p == pe { goto _test_eof5317 @@ -151600,17 +151090,16 @@ act = 2; goto tr2008 } goto tr5002 -tr4222: + tr4222: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5318 + act = 2 + goto st5318 st5318: if p++; p == pe { goto _test_eof5318 @@ -151732,17 +151221,16 @@ act = 2; goto tr5002 } goto tr1 -tr4223: + tr4223: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5319 + act = 2 + goto st5319 st5319: if p++; p == pe { goto _test_eof5319 @@ -151852,17 +151340,16 @@ act = 2; goto tr1 } goto tr5002 -tr4224: + tr4224: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5320 + act = 2 + goto st5320 st5320: if p++; p == pe { goto _test_eof5320 @@ -151985,17 +151472,16 @@ act = 2; goto tr1 } goto tr5002 -tr4225: + tr4225: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5321 + act = 2 + goto st5321 st5321: if p++; p == pe { goto _test_eof5321 @@ -152101,17 +151587,16 @@ act = 2; goto tr148 } goto tr5002 -tr4226: + tr4226: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5322 + act = 2 + goto st5322 st5322: if p++; p == pe { goto _test_eof5322 @@ -152226,17 +151711,16 @@ act = 2; goto tr1 } goto tr5002 -tr4227: + tr4227: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5323 + act = 2 + goto st5323 st5323: if p++; p == pe { goto _test_eof5323 @@ -152354,17 +151838,16 @@ act = 2; goto tr1 } goto tr5002 -tr4228: + tr4228: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5324 + act = 2 + goto st5324 st5324: if p++; p == pe { goto _test_eof5324 @@ -152491,17 +151974,16 @@ act = 2; goto tr5002 } goto tr1 -tr4229: + tr4229: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5325 + act = 2 + goto st5325 st5325: if p++; p == pe { goto _test_eof5325 @@ -152624,17 +152106,16 @@ act = 2; goto tr1 } goto tr5002 -tr4230: + tr4230: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5326 + act = 2 + goto st5326 st5326: if p++; p == pe { goto _test_eof5326 @@ -152752,17 +152233,16 @@ act = 2; goto tr1 } goto tr5002 -tr4231: + tr4231: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5327 + act = 2 + goto st5327 st5327: if p++; p == pe { goto _test_eof5327 @@ -152889,17 +152369,16 @@ act = 2; goto tr5002 } goto tr1 -tr4232: + tr4232: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5328 + act = 2 + goto st5328 st5328: if p++; p == pe { goto _test_eof5328 @@ -153003,17 +152482,16 @@ act = 2; goto tr148 } goto tr5002 -tr4233: + tr4233: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5329 + act = 2 + goto st5329 st5329: if p++; p == pe { goto _test_eof5329 @@ -153130,17 +152608,16 @@ act = 2; goto tr1 } goto tr5002 -tr4234: + tr4234: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5330 + act = 2 + goto st5330 st5330: if p++; p == pe { goto _test_eof5330 @@ -153246,17 +152723,16 @@ act = 2; goto tr148 } goto tr5002 -tr4235: + tr4235: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5331 + act = 2 + goto st5331 st5331: if p++; p == pe { goto _test_eof5331 @@ -153360,17 +152836,16 @@ act = 2; goto tr148 } goto tr5002 -tr4236: + tr4236: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5332 + act = 2 + goto st5332 st5332: if p++; p == pe { goto _test_eof5332 @@ -153480,17 +152955,16 @@ act = 2; goto tr1 } goto tr5002 -tr4237: + tr4237: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5333 + act = 2 + goto st5333 st5333: if p++; p == pe { goto _test_eof5333 @@ -153594,17 +153068,16 @@ act = 2; goto tr148 } goto tr5002 -tr4238: + tr4238: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5334 + act = 2 + goto st5334 st5334: if p++; p == pe { goto _test_eof5334 @@ -153718,17 +153191,16 @@ act = 2; goto tr1 } goto tr5002 -tr4239: + tr4239: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5335 + act = 2 + goto st5335 st5335: if p++; p == pe { goto _test_eof5335 @@ -153832,17 +153304,16 @@ act = 2; goto tr148 } goto tr5002 -tr4240: + tr4240: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5336 + act = 2 + goto st5336 st5336: if p++; p == pe { goto _test_eof5336 @@ -153960,17 +153431,16 @@ act = 2; goto tr1 } goto tr5002 -tr4241: + tr4241: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:89 -act = 2; - goto st5337 + act = 2 + goto st5337 st5337: if p++; p == pe { goto _test_eof5337 @@ -154072,21 +153542,19 @@ act = 2; goto tr148 } goto tr5002 -tr4496: + tr4496: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5338 + act = 13 + goto st5338 st5338: if p++; p == pe { goto _test_eof5338 @@ -154324,21 +153792,19 @@ act = 13; goto tr2984 } goto tr0 -tr4497: + tr4497: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:68 + startPos = p - startPos = p - //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 13; - goto st5339 + act = 13 + goto st5339 st5339: if p++; p == pe { goto _test_eof5339 @@ -155309,17 +154775,16 @@ act = 13; goto tr4327 } goto tr2 -tr4327: + tr4327: //line NONE:1 -te = p+1 + te = p + 1 //line segment_words.rl:72 + endPos = p - endPos = p - //line segment_words.rl:161 -act = 7; - goto st5340 + act = 7 + goto st5340 st5340: if p++; p == pe { goto _test_eof5340 @@ -157596,16048 +157061,26729 @@ act = 7; } goto tr3250 st_out: - _test_eof4862: cs = 4862; goto _test_eof - _test_eof4863: cs = 4863; goto _test_eof - _test_eof0: cs = 0; goto _test_eof - _test_eof1: cs = 1; goto _test_eof - _test_eof2: cs = 2; goto _test_eof - _test_eof3: cs = 3; goto _test_eof - _test_eof4: cs = 4; goto _test_eof - _test_eof5: cs = 5; goto _test_eof - _test_eof6: cs = 6; goto _test_eof - _test_eof7: cs = 7; goto _test_eof - _test_eof8: cs = 8; goto _test_eof - _test_eof9: cs = 9; goto _test_eof - _test_eof10: cs = 10; goto _test_eof - _test_eof11: cs = 11; goto _test_eof - _test_eof12: cs = 12; goto _test_eof - _test_eof13: cs = 13; goto _test_eof - _test_eof14: cs = 14; goto _test_eof - _test_eof15: cs = 15; goto _test_eof - _test_eof16: cs = 16; goto _test_eof - _test_eof17: cs = 17; goto _test_eof - _test_eof18: cs = 18; goto _test_eof - _test_eof19: cs = 19; goto _test_eof - _test_eof20: cs = 20; goto _test_eof - _test_eof21: cs = 21; goto _test_eof - _test_eof22: cs = 22; goto _test_eof - _test_eof23: cs = 23; goto _test_eof - _test_eof24: cs = 24; goto _test_eof - _test_eof25: cs = 25; goto _test_eof - _test_eof26: cs = 26; goto _test_eof - _test_eof27: cs = 27; goto _test_eof - _test_eof28: cs = 28; goto _test_eof - _test_eof29: cs = 29; goto _test_eof - _test_eof30: cs = 30; goto _test_eof - _test_eof31: cs = 31; goto _test_eof - _test_eof32: cs = 32; goto _test_eof - _test_eof33: cs = 33; goto _test_eof - _test_eof34: cs = 34; goto _test_eof - _test_eof35: cs = 35; goto _test_eof - _test_eof36: cs = 36; goto _test_eof - _test_eof37: cs = 37; goto _test_eof - _test_eof38: cs = 38; goto _test_eof - _test_eof39: cs = 39; goto _test_eof - _test_eof40: cs = 40; goto _test_eof - _test_eof41: cs = 41; goto _test_eof - _test_eof42: cs = 42; goto _test_eof - _test_eof43: cs = 43; goto _test_eof - _test_eof44: cs = 44; goto _test_eof - _test_eof45: cs = 45; goto _test_eof - _test_eof46: cs = 46; goto _test_eof - _test_eof47: cs = 47; goto _test_eof - _test_eof48: cs = 48; goto _test_eof - _test_eof49: cs = 49; goto _test_eof - _test_eof50: cs = 50; goto _test_eof - _test_eof51: cs = 51; goto _test_eof - _test_eof52: cs = 52; goto _test_eof - _test_eof53: cs = 53; goto _test_eof - _test_eof54: cs = 54; goto _test_eof - _test_eof55: cs = 55; goto _test_eof - _test_eof56: cs = 56; goto _test_eof - _test_eof57: cs = 57; goto _test_eof - _test_eof58: cs = 58; goto _test_eof - _test_eof59: cs = 59; goto _test_eof - _test_eof60: cs = 60; goto _test_eof - _test_eof61: cs = 61; goto _test_eof - _test_eof62: cs = 62; goto _test_eof - _test_eof63: cs = 63; goto _test_eof - _test_eof64: cs = 64; goto _test_eof - _test_eof65: cs = 65; goto _test_eof - _test_eof66: cs = 66; goto _test_eof - _test_eof67: cs = 67; goto _test_eof - _test_eof68: cs = 68; goto _test_eof - _test_eof69: cs = 69; goto _test_eof - _test_eof70: cs = 70; goto _test_eof - _test_eof71: cs = 71; goto _test_eof - _test_eof72: cs = 72; goto _test_eof - _test_eof73: cs = 73; goto _test_eof - _test_eof74: cs = 74; goto _test_eof - _test_eof75: cs = 75; goto _test_eof - _test_eof76: cs = 76; goto _test_eof - _test_eof77: cs = 77; goto _test_eof - _test_eof78: cs = 78; goto _test_eof - _test_eof79: cs = 79; goto _test_eof - _test_eof80: cs = 80; goto _test_eof - _test_eof81: cs = 81; goto _test_eof - _test_eof82: cs = 82; goto _test_eof - _test_eof83: cs = 83; goto _test_eof - _test_eof84: cs = 84; goto _test_eof - _test_eof85: cs = 85; goto _test_eof - _test_eof86: cs = 86; goto _test_eof - _test_eof87: cs = 87; goto _test_eof - _test_eof88: cs = 88; goto _test_eof - _test_eof89: cs = 89; goto _test_eof - _test_eof90: cs = 90; goto _test_eof - _test_eof91: cs = 91; goto _test_eof - _test_eof92: cs = 92; goto _test_eof - _test_eof93: cs = 93; goto _test_eof - _test_eof94: cs = 94; goto _test_eof - _test_eof95: cs = 95; goto _test_eof - _test_eof96: cs = 96; goto _test_eof - _test_eof97: cs = 97; goto _test_eof - _test_eof98: cs = 98; goto _test_eof - _test_eof99: cs = 99; goto _test_eof - _test_eof100: cs = 100; goto _test_eof - _test_eof101: cs = 101; goto _test_eof - _test_eof102: cs = 102; goto _test_eof - _test_eof103: cs = 103; goto _test_eof - _test_eof104: cs = 104; goto _test_eof - _test_eof105: cs = 105; goto _test_eof - _test_eof106: cs = 106; goto _test_eof - _test_eof107: cs = 107; goto _test_eof - _test_eof108: cs = 108; goto _test_eof - _test_eof109: cs = 109; goto _test_eof - _test_eof110: cs = 110; goto _test_eof - _test_eof111: cs = 111; goto _test_eof - _test_eof112: cs = 112; goto _test_eof - _test_eof113: cs = 113; goto _test_eof - _test_eof114: cs = 114; goto _test_eof - _test_eof115: cs = 115; goto _test_eof - _test_eof116: cs = 116; goto _test_eof - _test_eof117: cs = 117; goto _test_eof - _test_eof118: cs = 118; goto _test_eof - _test_eof119: cs = 119; goto _test_eof - _test_eof120: cs = 120; goto _test_eof - _test_eof121: cs = 121; goto _test_eof - _test_eof122: cs = 122; goto _test_eof - _test_eof123: cs = 123; goto _test_eof - _test_eof124: cs = 124; goto _test_eof - _test_eof125: cs = 125; goto _test_eof - _test_eof126: cs = 126; goto _test_eof - _test_eof127: cs = 127; goto _test_eof - _test_eof128: cs = 128; goto _test_eof - _test_eof129: cs = 129; goto _test_eof - _test_eof130: cs = 130; goto _test_eof - _test_eof131: cs = 131; goto _test_eof - _test_eof132: cs = 132; goto _test_eof - _test_eof133: cs = 133; goto _test_eof - _test_eof134: cs = 134; goto _test_eof - _test_eof135: cs = 135; goto _test_eof - _test_eof136: cs = 136; goto _test_eof - _test_eof137: cs = 137; goto _test_eof - _test_eof138: cs = 138; goto _test_eof - _test_eof139: cs = 139; goto _test_eof - _test_eof140: cs = 140; goto _test_eof - _test_eof4864: cs = 4864; goto _test_eof - _test_eof4865: cs = 4865; goto _test_eof - _test_eof141: cs = 141; goto _test_eof - _test_eof4866: cs = 4866; goto _test_eof - _test_eof4867: cs = 4867; goto _test_eof - _test_eof142: cs = 142; goto _test_eof - _test_eof143: cs = 143; goto _test_eof - _test_eof144: cs = 144; goto _test_eof - _test_eof145: cs = 145; goto _test_eof - _test_eof146: cs = 146; goto _test_eof - _test_eof147: cs = 147; goto _test_eof - _test_eof148: cs = 148; goto _test_eof - _test_eof149: cs = 149; goto _test_eof - _test_eof150: cs = 150; goto _test_eof - _test_eof151: cs = 151; goto _test_eof - _test_eof152: cs = 152; goto _test_eof - _test_eof153: cs = 153; goto _test_eof - _test_eof154: cs = 154; goto _test_eof - _test_eof155: cs = 155; goto _test_eof - _test_eof156: cs = 156; goto _test_eof - _test_eof157: cs = 157; goto _test_eof - _test_eof158: cs = 158; goto _test_eof - _test_eof159: cs = 159; goto _test_eof - _test_eof160: cs = 160; goto _test_eof - _test_eof161: cs = 161; goto _test_eof - _test_eof162: cs = 162; goto _test_eof - _test_eof163: cs = 163; goto _test_eof - _test_eof164: cs = 164; goto _test_eof - _test_eof165: cs = 165; goto _test_eof - _test_eof166: cs = 166; goto _test_eof - _test_eof167: cs = 167; goto _test_eof - _test_eof168: cs = 168; goto _test_eof - _test_eof169: cs = 169; goto _test_eof - _test_eof170: cs = 170; goto _test_eof - _test_eof171: cs = 171; goto _test_eof - _test_eof172: cs = 172; goto _test_eof - _test_eof173: cs = 173; goto _test_eof - _test_eof174: cs = 174; goto _test_eof - _test_eof175: cs = 175; goto _test_eof - _test_eof176: cs = 176; goto _test_eof - _test_eof177: cs = 177; goto _test_eof - _test_eof178: cs = 178; goto _test_eof - _test_eof179: cs = 179; goto _test_eof - _test_eof180: cs = 180; goto _test_eof - _test_eof181: cs = 181; goto _test_eof - _test_eof182: cs = 182; goto _test_eof - _test_eof183: cs = 183; goto _test_eof - _test_eof184: cs = 184; goto _test_eof - _test_eof185: cs = 185; goto _test_eof - _test_eof186: cs = 186; goto _test_eof - _test_eof187: cs = 187; goto _test_eof - _test_eof188: cs = 188; goto _test_eof - _test_eof189: cs = 189; goto _test_eof - _test_eof190: cs = 190; goto _test_eof - _test_eof191: cs = 191; goto _test_eof - _test_eof192: cs = 192; goto _test_eof - _test_eof193: cs = 193; goto _test_eof - _test_eof194: cs = 194; goto _test_eof - _test_eof195: cs = 195; goto _test_eof - _test_eof196: cs = 196; goto _test_eof - _test_eof197: cs = 197; goto _test_eof - _test_eof198: cs = 198; goto _test_eof - _test_eof199: cs = 199; goto _test_eof - _test_eof200: cs = 200; goto _test_eof - _test_eof201: cs = 201; goto _test_eof - _test_eof202: cs = 202; goto _test_eof - _test_eof203: cs = 203; goto _test_eof - _test_eof204: cs = 204; goto _test_eof - _test_eof205: cs = 205; goto _test_eof - _test_eof206: cs = 206; goto _test_eof - _test_eof207: cs = 207; goto _test_eof - _test_eof208: cs = 208; goto _test_eof - _test_eof209: cs = 209; goto _test_eof - _test_eof210: cs = 210; goto _test_eof - _test_eof211: cs = 211; goto _test_eof - _test_eof212: cs = 212; goto _test_eof - _test_eof213: cs = 213; goto _test_eof - _test_eof214: cs = 214; goto _test_eof - _test_eof215: cs = 215; goto _test_eof - _test_eof216: cs = 216; goto _test_eof - _test_eof217: cs = 217; goto _test_eof - _test_eof218: cs = 218; goto _test_eof - _test_eof219: cs = 219; goto _test_eof - _test_eof220: cs = 220; goto _test_eof - _test_eof221: cs = 221; goto _test_eof - _test_eof222: cs = 222; goto _test_eof - _test_eof223: cs = 223; goto _test_eof - _test_eof224: cs = 224; goto _test_eof - _test_eof225: cs = 225; goto _test_eof - _test_eof226: cs = 226; goto _test_eof - _test_eof227: cs = 227; goto _test_eof - _test_eof228: cs = 228; goto _test_eof - _test_eof229: cs = 229; goto _test_eof - _test_eof230: cs = 230; goto _test_eof - _test_eof231: cs = 231; goto _test_eof - _test_eof232: cs = 232; goto _test_eof - _test_eof233: cs = 233; goto _test_eof - _test_eof234: cs = 234; goto _test_eof - _test_eof235: cs = 235; goto _test_eof - _test_eof236: cs = 236; goto _test_eof - _test_eof237: cs = 237; goto _test_eof - _test_eof238: cs = 238; goto _test_eof - _test_eof239: cs = 239; goto _test_eof - _test_eof240: cs = 240; goto _test_eof - _test_eof241: cs = 241; goto _test_eof - _test_eof242: cs = 242; goto _test_eof - _test_eof243: cs = 243; goto _test_eof - _test_eof244: cs = 244; goto _test_eof - _test_eof245: cs = 245; goto _test_eof - _test_eof246: cs = 246; goto _test_eof - _test_eof247: cs = 247; goto _test_eof - _test_eof248: cs = 248; goto _test_eof - _test_eof249: cs = 249; goto _test_eof - _test_eof250: cs = 250; goto _test_eof - _test_eof251: cs = 251; goto _test_eof - _test_eof252: cs = 252; goto _test_eof - _test_eof253: cs = 253; goto _test_eof - _test_eof254: cs = 254; goto _test_eof - _test_eof255: cs = 255; goto _test_eof - _test_eof256: cs = 256; goto _test_eof - _test_eof257: cs = 257; goto _test_eof - _test_eof258: cs = 258; goto _test_eof - _test_eof259: cs = 259; goto _test_eof - _test_eof260: cs = 260; goto _test_eof - _test_eof261: cs = 261; goto _test_eof - _test_eof262: cs = 262; goto _test_eof - _test_eof263: cs = 263; goto _test_eof - _test_eof264: cs = 264; goto _test_eof - _test_eof265: cs = 265; goto _test_eof - _test_eof266: cs = 266; goto _test_eof - _test_eof267: cs = 267; goto _test_eof - _test_eof268: cs = 268; goto _test_eof - _test_eof269: cs = 269; goto _test_eof - _test_eof270: cs = 270; goto _test_eof - _test_eof271: cs = 271; goto _test_eof - _test_eof272: cs = 272; goto _test_eof - _test_eof273: cs = 273; goto _test_eof - _test_eof274: cs = 274; goto _test_eof - _test_eof275: cs = 275; goto _test_eof - _test_eof276: cs = 276; goto _test_eof - _test_eof277: cs = 277; goto _test_eof - _test_eof278: cs = 278; goto _test_eof - _test_eof279: cs = 279; goto _test_eof - _test_eof280: cs = 280; goto _test_eof - _test_eof281: cs = 281; goto _test_eof - _test_eof282: cs = 282; goto _test_eof - _test_eof283: cs = 283; goto _test_eof - _test_eof284: cs = 284; goto _test_eof - _test_eof285: cs = 285; goto _test_eof - _test_eof286: cs = 286; goto _test_eof - _test_eof287: cs = 287; goto _test_eof - _test_eof288: cs = 288; goto _test_eof - _test_eof289: cs = 289; goto _test_eof - _test_eof290: cs = 290; goto _test_eof - _test_eof291: cs = 291; goto _test_eof - _test_eof292: cs = 292; goto _test_eof - _test_eof293: cs = 293; goto _test_eof - _test_eof294: cs = 294; goto _test_eof - _test_eof295: cs = 295; goto _test_eof - _test_eof296: cs = 296; goto _test_eof - _test_eof297: cs = 297; goto _test_eof - _test_eof298: cs = 298; goto _test_eof - _test_eof299: cs = 299; goto _test_eof - _test_eof300: cs = 300; goto _test_eof - _test_eof301: cs = 301; goto _test_eof - _test_eof302: cs = 302; goto _test_eof - _test_eof303: cs = 303; goto _test_eof - _test_eof304: cs = 304; goto _test_eof - _test_eof305: cs = 305; goto _test_eof - _test_eof306: cs = 306; goto _test_eof - _test_eof307: cs = 307; goto _test_eof - _test_eof308: cs = 308; goto _test_eof - _test_eof309: cs = 309; goto _test_eof - _test_eof310: cs = 310; goto _test_eof - _test_eof311: cs = 311; goto _test_eof - _test_eof312: cs = 312; goto _test_eof - _test_eof313: cs = 313; goto _test_eof - _test_eof314: cs = 314; goto _test_eof - _test_eof315: cs = 315; goto _test_eof - _test_eof316: cs = 316; goto _test_eof - _test_eof317: cs = 317; goto _test_eof - _test_eof318: cs = 318; goto _test_eof - _test_eof319: cs = 319; goto _test_eof - _test_eof320: cs = 320; goto _test_eof - _test_eof321: cs = 321; goto _test_eof - _test_eof322: cs = 322; goto _test_eof - _test_eof323: cs = 323; goto _test_eof - _test_eof324: cs = 324; goto _test_eof - _test_eof325: cs = 325; goto _test_eof - _test_eof326: cs = 326; goto _test_eof - _test_eof327: cs = 327; goto _test_eof - _test_eof328: cs = 328; goto _test_eof - _test_eof329: cs = 329; goto _test_eof - _test_eof330: cs = 330; goto _test_eof - _test_eof331: cs = 331; goto _test_eof - _test_eof332: cs = 332; goto _test_eof - _test_eof333: cs = 333; goto _test_eof - _test_eof334: cs = 334; goto _test_eof - _test_eof335: cs = 335; goto _test_eof - _test_eof336: cs = 336; goto _test_eof - _test_eof337: cs = 337; goto _test_eof - _test_eof338: cs = 338; goto _test_eof - _test_eof339: cs = 339; goto _test_eof - _test_eof340: cs = 340; goto _test_eof - _test_eof341: cs = 341; goto _test_eof - _test_eof342: cs = 342; goto _test_eof - _test_eof343: cs = 343; goto _test_eof - _test_eof344: cs = 344; goto _test_eof - _test_eof345: cs = 345; goto _test_eof - _test_eof346: cs = 346; goto _test_eof - _test_eof347: cs = 347; goto _test_eof - _test_eof348: cs = 348; goto _test_eof - _test_eof349: cs = 349; goto _test_eof - _test_eof350: cs = 350; goto _test_eof - _test_eof351: cs = 351; goto _test_eof - _test_eof352: cs = 352; goto _test_eof - _test_eof353: cs = 353; goto _test_eof - _test_eof354: cs = 354; goto _test_eof - _test_eof355: cs = 355; goto _test_eof - _test_eof356: cs = 356; goto _test_eof - _test_eof357: cs = 357; goto _test_eof - _test_eof358: cs = 358; goto _test_eof - _test_eof359: cs = 359; goto _test_eof - _test_eof360: cs = 360; goto _test_eof - _test_eof361: cs = 361; goto _test_eof - _test_eof362: cs = 362; goto _test_eof - _test_eof363: cs = 363; goto _test_eof - _test_eof364: cs = 364; goto _test_eof - _test_eof365: cs = 365; goto _test_eof - _test_eof366: cs = 366; goto _test_eof - _test_eof367: cs = 367; goto _test_eof - _test_eof368: cs = 368; goto _test_eof - _test_eof369: cs = 369; goto _test_eof - _test_eof370: cs = 370; goto _test_eof - _test_eof371: cs = 371; goto _test_eof - _test_eof372: cs = 372; goto _test_eof - _test_eof373: cs = 373; goto _test_eof - _test_eof374: cs = 374; goto _test_eof - _test_eof375: cs = 375; goto _test_eof - _test_eof376: cs = 376; goto _test_eof - _test_eof377: cs = 377; goto _test_eof - _test_eof378: cs = 378; goto _test_eof - _test_eof379: cs = 379; goto _test_eof - _test_eof380: cs = 380; goto _test_eof - _test_eof381: cs = 381; goto _test_eof - _test_eof382: cs = 382; goto _test_eof - _test_eof383: cs = 383; goto _test_eof - _test_eof384: cs = 384; goto _test_eof - _test_eof385: cs = 385; goto _test_eof - _test_eof386: cs = 386; goto _test_eof - _test_eof387: cs = 387; goto _test_eof - _test_eof388: cs = 388; goto _test_eof - _test_eof389: cs = 389; goto _test_eof - _test_eof390: cs = 390; goto _test_eof - _test_eof391: cs = 391; goto _test_eof - _test_eof392: cs = 392; goto _test_eof - _test_eof393: cs = 393; goto _test_eof - _test_eof394: cs = 394; goto _test_eof - _test_eof395: cs = 395; goto _test_eof - _test_eof396: cs = 396; goto _test_eof - _test_eof397: cs = 397; goto _test_eof - _test_eof398: cs = 398; goto _test_eof - _test_eof399: cs = 399; goto _test_eof - _test_eof400: cs = 400; goto _test_eof - _test_eof401: cs = 401; goto _test_eof - _test_eof402: cs = 402; goto _test_eof - _test_eof403: cs = 403; goto _test_eof - _test_eof404: cs = 404; goto _test_eof - _test_eof405: cs = 405; goto _test_eof - _test_eof406: cs = 406; goto _test_eof - _test_eof407: cs = 407; goto _test_eof - _test_eof408: cs = 408; goto _test_eof - _test_eof409: cs = 409; goto _test_eof - _test_eof410: cs = 410; goto _test_eof - _test_eof411: cs = 411; goto _test_eof - _test_eof412: cs = 412; goto _test_eof - _test_eof4868: cs = 4868; goto _test_eof - _test_eof413: cs = 413; goto _test_eof - _test_eof414: cs = 414; goto _test_eof - _test_eof415: cs = 415; goto _test_eof - _test_eof416: cs = 416; goto _test_eof - _test_eof417: cs = 417; goto _test_eof - _test_eof418: cs = 418; goto _test_eof - _test_eof419: cs = 419; goto _test_eof - _test_eof420: cs = 420; goto _test_eof - _test_eof421: cs = 421; goto _test_eof - _test_eof422: cs = 422; goto _test_eof - _test_eof423: cs = 423; goto _test_eof - _test_eof424: cs = 424; goto _test_eof - _test_eof425: cs = 425; goto _test_eof - _test_eof426: cs = 426; goto _test_eof - _test_eof427: cs = 427; goto _test_eof - _test_eof428: cs = 428; goto _test_eof - _test_eof429: cs = 429; goto _test_eof - _test_eof430: cs = 430; goto _test_eof - _test_eof431: cs = 431; goto _test_eof - _test_eof432: cs = 432; goto _test_eof - _test_eof433: cs = 433; goto _test_eof - _test_eof434: cs = 434; goto _test_eof - _test_eof435: cs = 435; goto _test_eof - _test_eof436: cs = 436; goto _test_eof - _test_eof437: cs = 437; goto _test_eof - _test_eof438: cs = 438; goto _test_eof - _test_eof439: cs = 439; goto _test_eof - _test_eof440: cs = 440; goto _test_eof - _test_eof441: cs = 441; goto _test_eof - _test_eof442: cs = 442; goto _test_eof - _test_eof443: cs = 443; goto _test_eof - _test_eof444: cs = 444; goto _test_eof - _test_eof445: cs = 445; goto _test_eof - _test_eof446: cs = 446; goto _test_eof - _test_eof447: cs = 447; goto _test_eof - _test_eof448: cs = 448; goto _test_eof - _test_eof449: cs = 449; goto _test_eof - _test_eof450: cs = 450; goto _test_eof - _test_eof451: cs = 451; goto _test_eof - _test_eof452: cs = 452; goto _test_eof - _test_eof453: cs = 453; goto _test_eof - _test_eof454: cs = 454; goto _test_eof - _test_eof455: cs = 455; goto _test_eof - _test_eof456: cs = 456; goto _test_eof - _test_eof457: cs = 457; goto _test_eof - _test_eof458: cs = 458; goto _test_eof - _test_eof459: cs = 459; goto _test_eof - _test_eof460: cs = 460; goto _test_eof - _test_eof461: cs = 461; goto _test_eof - _test_eof462: cs = 462; goto _test_eof - _test_eof463: cs = 463; goto _test_eof - _test_eof464: cs = 464; goto _test_eof - _test_eof465: cs = 465; goto _test_eof - _test_eof466: cs = 466; goto _test_eof - _test_eof467: cs = 467; goto _test_eof - _test_eof468: cs = 468; goto _test_eof - _test_eof469: cs = 469; goto _test_eof - _test_eof470: cs = 470; goto _test_eof - _test_eof471: cs = 471; goto _test_eof - _test_eof472: cs = 472; goto _test_eof - _test_eof473: cs = 473; goto _test_eof - _test_eof474: cs = 474; goto _test_eof - _test_eof475: cs = 475; goto _test_eof - _test_eof476: cs = 476; goto _test_eof - _test_eof477: cs = 477; goto _test_eof - _test_eof478: cs = 478; goto _test_eof - _test_eof479: cs = 479; goto _test_eof - _test_eof480: cs = 480; goto _test_eof - _test_eof481: cs = 481; goto _test_eof - _test_eof482: cs = 482; goto _test_eof - _test_eof483: cs = 483; goto _test_eof - _test_eof484: cs = 484; goto _test_eof - _test_eof485: cs = 485; goto _test_eof - _test_eof486: cs = 486; goto _test_eof - _test_eof487: cs = 487; goto _test_eof - _test_eof488: cs = 488; goto _test_eof - _test_eof489: cs = 489; goto _test_eof - _test_eof490: cs = 490; goto _test_eof - _test_eof491: cs = 491; goto _test_eof - _test_eof492: cs = 492; goto _test_eof - _test_eof493: cs = 493; goto _test_eof - _test_eof494: cs = 494; goto _test_eof - _test_eof495: cs = 495; goto _test_eof - _test_eof496: cs = 496; goto _test_eof - _test_eof497: cs = 497; goto _test_eof - _test_eof498: cs = 498; goto _test_eof - _test_eof499: cs = 499; goto _test_eof - _test_eof500: cs = 500; goto _test_eof - _test_eof501: cs = 501; goto _test_eof - _test_eof502: cs = 502; goto _test_eof - _test_eof503: cs = 503; goto _test_eof - _test_eof504: cs = 504; goto _test_eof - _test_eof505: cs = 505; goto _test_eof - _test_eof506: cs = 506; goto _test_eof - _test_eof507: cs = 507; goto _test_eof - _test_eof508: cs = 508; goto _test_eof - _test_eof509: cs = 509; goto _test_eof - _test_eof510: cs = 510; goto _test_eof - _test_eof511: cs = 511; goto _test_eof - _test_eof512: cs = 512; goto _test_eof - _test_eof513: cs = 513; goto _test_eof - _test_eof514: cs = 514; goto _test_eof - _test_eof515: cs = 515; goto _test_eof - _test_eof516: cs = 516; goto _test_eof - _test_eof517: cs = 517; goto _test_eof - _test_eof518: cs = 518; goto _test_eof - _test_eof519: cs = 519; goto _test_eof - _test_eof520: cs = 520; goto _test_eof - _test_eof521: cs = 521; goto _test_eof - _test_eof522: cs = 522; goto _test_eof - _test_eof523: cs = 523; goto _test_eof - _test_eof524: cs = 524; goto _test_eof - _test_eof525: cs = 525; goto _test_eof - _test_eof526: cs = 526; goto _test_eof - _test_eof527: cs = 527; goto _test_eof - _test_eof528: cs = 528; goto _test_eof - _test_eof529: cs = 529; goto _test_eof - _test_eof530: cs = 530; goto _test_eof - _test_eof531: cs = 531; goto _test_eof - _test_eof532: cs = 532; goto _test_eof - _test_eof533: cs = 533; goto _test_eof - _test_eof534: cs = 534; goto _test_eof - _test_eof535: cs = 535; goto _test_eof - _test_eof536: cs = 536; goto _test_eof - _test_eof537: cs = 537; goto _test_eof - _test_eof538: cs = 538; goto _test_eof - _test_eof539: cs = 539; goto _test_eof - _test_eof540: cs = 540; goto _test_eof - _test_eof541: cs = 541; goto _test_eof - _test_eof542: cs = 542; goto _test_eof - _test_eof543: cs = 543; goto _test_eof - _test_eof544: cs = 544; goto _test_eof - _test_eof545: cs = 545; goto _test_eof - _test_eof546: cs = 546; goto _test_eof - _test_eof547: cs = 547; goto _test_eof - _test_eof548: cs = 548; goto _test_eof - _test_eof549: cs = 549; goto _test_eof - _test_eof550: cs = 550; goto _test_eof - _test_eof551: cs = 551; goto _test_eof - _test_eof552: cs = 552; goto _test_eof - _test_eof553: cs = 553; goto _test_eof - _test_eof554: cs = 554; goto _test_eof - _test_eof555: cs = 555; goto _test_eof - _test_eof556: cs = 556; goto _test_eof - _test_eof557: cs = 557; goto _test_eof - _test_eof558: cs = 558; goto _test_eof - _test_eof559: cs = 559; goto _test_eof - _test_eof560: cs = 560; goto _test_eof - _test_eof561: cs = 561; goto _test_eof - _test_eof4869: cs = 4869; goto _test_eof - _test_eof562: cs = 562; goto _test_eof - _test_eof563: cs = 563; goto _test_eof - _test_eof564: cs = 564; goto _test_eof - _test_eof565: cs = 565; goto _test_eof - _test_eof566: cs = 566; goto _test_eof - _test_eof567: cs = 567; goto _test_eof - _test_eof4870: cs = 4870; goto _test_eof - _test_eof568: cs = 568; goto _test_eof - _test_eof569: cs = 569; goto _test_eof - _test_eof570: cs = 570; goto _test_eof - _test_eof571: cs = 571; goto _test_eof - _test_eof572: cs = 572; goto _test_eof - _test_eof573: cs = 573; goto _test_eof - _test_eof574: cs = 574; goto _test_eof - _test_eof4871: cs = 4871; goto _test_eof - _test_eof575: cs = 575; goto _test_eof - _test_eof576: cs = 576; goto _test_eof - _test_eof577: cs = 577; goto _test_eof - _test_eof578: cs = 578; goto _test_eof - _test_eof579: cs = 579; goto _test_eof - _test_eof580: cs = 580; goto _test_eof - _test_eof581: cs = 581; goto _test_eof - _test_eof582: cs = 582; goto _test_eof - _test_eof583: cs = 583; goto _test_eof - _test_eof584: cs = 584; goto _test_eof - _test_eof585: cs = 585; goto _test_eof - _test_eof586: cs = 586; goto _test_eof - _test_eof587: cs = 587; goto _test_eof - _test_eof588: cs = 588; goto _test_eof - _test_eof589: cs = 589; goto _test_eof - _test_eof590: cs = 590; goto _test_eof - _test_eof591: cs = 591; goto _test_eof - _test_eof592: cs = 592; goto _test_eof - _test_eof593: cs = 593; goto _test_eof - _test_eof594: cs = 594; goto _test_eof - _test_eof595: cs = 595; goto _test_eof - _test_eof596: cs = 596; goto _test_eof - _test_eof597: cs = 597; goto _test_eof - _test_eof598: cs = 598; goto _test_eof - _test_eof599: cs = 599; goto _test_eof - _test_eof600: cs = 600; goto _test_eof - _test_eof601: cs = 601; goto _test_eof - _test_eof602: cs = 602; goto _test_eof - _test_eof603: cs = 603; goto _test_eof - _test_eof604: cs = 604; goto _test_eof - _test_eof605: cs = 605; goto _test_eof - _test_eof606: cs = 606; goto _test_eof - _test_eof607: cs = 607; goto _test_eof - _test_eof608: cs = 608; goto _test_eof - _test_eof609: cs = 609; goto _test_eof - _test_eof610: cs = 610; goto _test_eof - _test_eof611: cs = 611; goto _test_eof - _test_eof612: cs = 612; goto _test_eof - _test_eof613: cs = 613; goto _test_eof - _test_eof614: cs = 614; goto _test_eof - _test_eof615: cs = 615; goto _test_eof - _test_eof616: cs = 616; goto _test_eof - _test_eof617: cs = 617; goto _test_eof - _test_eof618: cs = 618; goto _test_eof - _test_eof619: cs = 619; goto _test_eof - _test_eof620: cs = 620; goto _test_eof - _test_eof621: cs = 621; goto _test_eof - _test_eof622: cs = 622; goto _test_eof - _test_eof623: cs = 623; goto _test_eof - _test_eof624: cs = 624; goto _test_eof - _test_eof625: cs = 625; goto _test_eof - _test_eof626: cs = 626; goto _test_eof - _test_eof627: cs = 627; goto _test_eof - _test_eof628: cs = 628; goto _test_eof - _test_eof629: cs = 629; goto _test_eof - _test_eof630: cs = 630; goto _test_eof - _test_eof631: cs = 631; goto _test_eof - _test_eof632: cs = 632; goto _test_eof - _test_eof633: cs = 633; goto _test_eof - _test_eof634: cs = 634; goto _test_eof - _test_eof635: cs = 635; goto _test_eof - _test_eof636: cs = 636; goto _test_eof - _test_eof637: cs = 637; goto _test_eof - _test_eof638: cs = 638; goto _test_eof - _test_eof639: cs = 639; goto _test_eof - _test_eof640: cs = 640; goto _test_eof - _test_eof641: cs = 641; goto _test_eof - _test_eof642: cs = 642; goto _test_eof - _test_eof643: cs = 643; goto _test_eof - _test_eof644: cs = 644; goto _test_eof - _test_eof645: cs = 645; goto _test_eof - _test_eof646: cs = 646; goto _test_eof - _test_eof647: cs = 647; goto _test_eof - _test_eof648: cs = 648; goto _test_eof - _test_eof649: cs = 649; goto _test_eof - _test_eof650: cs = 650; goto _test_eof - _test_eof651: cs = 651; goto _test_eof - _test_eof652: cs = 652; goto _test_eof - _test_eof653: cs = 653; goto _test_eof - _test_eof654: cs = 654; goto _test_eof - _test_eof655: cs = 655; goto _test_eof - _test_eof656: cs = 656; goto _test_eof - _test_eof657: cs = 657; goto _test_eof - _test_eof658: cs = 658; goto _test_eof - _test_eof659: cs = 659; goto _test_eof - _test_eof660: cs = 660; goto _test_eof - _test_eof661: cs = 661; goto _test_eof - _test_eof662: cs = 662; goto _test_eof - _test_eof663: cs = 663; goto _test_eof - _test_eof664: cs = 664; goto _test_eof - _test_eof665: cs = 665; goto _test_eof - _test_eof666: cs = 666; goto _test_eof - _test_eof667: cs = 667; goto _test_eof - _test_eof668: cs = 668; goto _test_eof - _test_eof669: cs = 669; goto _test_eof - _test_eof670: cs = 670; goto _test_eof - _test_eof671: cs = 671; goto _test_eof - _test_eof672: cs = 672; goto _test_eof - _test_eof673: cs = 673; goto _test_eof - _test_eof674: cs = 674; goto _test_eof - _test_eof675: cs = 675; goto _test_eof - _test_eof676: cs = 676; goto _test_eof - _test_eof677: cs = 677; goto _test_eof - _test_eof678: cs = 678; goto _test_eof - _test_eof679: cs = 679; goto _test_eof - _test_eof680: cs = 680; goto _test_eof - _test_eof681: cs = 681; goto _test_eof - _test_eof682: cs = 682; goto _test_eof - _test_eof683: cs = 683; goto _test_eof - _test_eof684: cs = 684; goto _test_eof - _test_eof685: cs = 685; goto _test_eof - _test_eof686: cs = 686; goto _test_eof - _test_eof687: cs = 687; goto _test_eof - _test_eof688: cs = 688; goto _test_eof - _test_eof689: cs = 689; goto _test_eof - _test_eof690: cs = 690; goto _test_eof - _test_eof691: cs = 691; goto _test_eof - _test_eof692: cs = 692; goto _test_eof - _test_eof693: cs = 693; goto _test_eof - _test_eof694: cs = 694; goto _test_eof - _test_eof695: cs = 695; goto _test_eof - _test_eof696: cs = 696; goto _test_eof - _test_eof697: cs = 697; goto _test_eof - _test_eof698: cs = 698; goto _test_eof - _test_eof699: cs = 699; goto _test_eof - _test_eof700: cs = 700; goto _test_eof - _test_eof701: cs = 701; goto _test_eof - _test_eof702: cs = 702; goto _test_eof - _test_eof703: cs = 703; goto _test_eof - _test_eof704: cs = 704; goto _test_eof - _test_eof705: cs = 705; goto _test_eof - _test_eof706: cs = 706; goto _test_eof - _test_eof707: cs = 707; goto _test_eof - _test_eof708: cs = 708; goto _test_eof - _test_eof709: cs = 709; goto _test_eof - _test_eof710: cs = 710; goto _test_eof - _test_eof711: cs = 711; goto _test_eof - _test_eof712: cs = 712; goto _test_eof - _test_eof713: cs = 713; goto _test_eof - _test_eof714: cs = 714; goto _test_eof - _test_eof715: cs = 715; goto _test_eof - _test_eof716: cs = 716; goto _test_eof - _test_eof717: cs = 717; goto _test_eof - _test_eof718: cs = 718; goto _test_eof - _test_eof719: cs = 719; goto _test_eof - _test_eof720: cs = 720; goto _test_eof - _test_eof721: cs = 721; goto _test_eof - _test_eof722: cs = 722; goto _test_eof - _test_eof723: cs = 723; goto _test_eof - _test_eof724: cs = 724; goto _test_eof - _test_eof725: cs = 725; goto _test_eof - _test_eof726: cs = 726; goto _test_eof - _test_eof727: cs = 727; goto _test_eof - _test_eof728: cs = 728; goto _test_eof - _test_eof729: cs = 729; goto _test_eof - _test_eof730: cs = 730; goto _test_eof - _test_eof731: cs = 731; goto _test_eof - _test_eof732: cs = 732; goto _test_eof - _test_eof733: cs = 733; goto _test_eof - _test_eof734: cs = 734; goto _test_eof - _test_eof735: cs = 735; goto _test_eof - _test_eof736: cs = 736; goto _test_eof - _test_eof737: cs = 737; goto _test_eof - _test_eof738: cs = 738; goto _test_eof - _test_eof739: cs = 739; goto _test_eof - _test_eof740: cs = 740; goto _test_eof - _test_eof741: cs = 741; goto _test_eof - _test_eof742: cs = 742; goto _test_eof - _test_eof743: cs = 743; goto _test_eof - _test_eof744: cs = 744; goto _test_eof - _test_eof745: cs = 745; goto _test_eof - _test_eof746: cs = 746; goto _test_eof - _test_eof747: cs = 747; goto _test_eof - _test_eof748: cs = 748; goto _test_eof - _test_eof749: cs = 749; goto _test_eof - _test_eof750: cs = 750; goto _test_eof - _test_eof751: cs = 751; goto _test_eof - _test_eof752: cs = 752; goto _test_eof - _test_eof753: cs = 753; goto _test_eof - _test_eof754: cs = 754; goto _test_eof - _test_eof755: cs = 755; goto _test_eof - _test_eof756: cs = 756; goto _test_eof - _test_eof757: cs = 757; goto _test_eof - _test_eof758: cs = 758; goto _test_eof - _test_eof759: cs = 759; goto _test_eof - _test_eof760: cs = 760; goto _test_eof - _test_eof761: cs = 761; goto _test_eof - _test_eof762: cs = 762; goto _test_eof - _test_eof763: cs = 763; goto _test_eof - _test_eof764: cs = 764; goto _test_eof - _test_eof765: cs = 765; goto _test_eof - _test_eof766: cs = 766; goto _test_eof - _test_eof767: cs = 767; goto _test_eof - _test_eof768: cs = 768; goto _test_eof - _test_eof769: cs = 769; goto _test_eof - _test_eof770: cs = 770; goto _test_eof - _test_eof771: cs = 771; goto _test_eof - _test_eof772: cs = 772; goto _test_eof - _test_eof773: cs = 773; goto _test_eof - _test_eof774: cs = 774; goto _test_eof - _test_eof775: cs = 775; goto _test_eof - _test_eof776: cs = 776; goto _test_eof - _test_eof777: cs = 777; goto _test_eof - _test_eof778: cs = 778; goto _test_eof - _test_eof779: cs = 779; goto _test_eof - _test_eof780: cs = 780; goto _test_eof - _test_eof781: cs = 781; goto _test_eof - _test_eof782: cs = 782; goto _test_eof - _test_eof783: cs = 783; goto _test_eof - _test_eof784: cs = 784; goto _test_eof - _test_eof785: cs = 785; goto _test_eof - _test_eof786: cs = 786; goto _test_eof - _test_eof787: cs = 787; goto _test_eof - _test_eof788: cs = 788; goto _test_eof - _test_eof789: cs = 789; goto _test_eof - _test_eof790: cs = 790; goto _test_eof - _test_eof791: cs = 791; goto _test_eof - _test_eof792: cs = 792; goto _test_eof - _test_eof793: cs = 793; goto _test_eof - _test_eof794: cs = 794; goto _test_eof - _test_eof795: cs = 795; goto _test_eof - _test_eof796: cs = 796; goto _test_eof - _test_eof797: cs = 797; goto _test_eof - _test_eof798: cs = 798; goto _test_eof - _test_eof799: cs = 799; goto _test_eof - _test_eof800: cs = 800; goto _test_eof - _test_eof801: cs = 801; goto _test_eof - _test_eof802: cs = 802; goto _test_eof - _test_eof803: cs = 803; goto _test_eof - _test_eof804: cs = 804; goto _test_eof - _test_eof805: cs = 805; goto _test_eof - _test_eof806: cs = 806; goto _test_eof - _test_eof807: cs = 807; goto _test_eof - _test_eof808: cs = 808; goto _test_eof - _test_eof809: cs = 809; goto _test_eof - _test_eof810: cs = 810; goto _test_eof - _test_eof811: cs = 811; goto _test_eof - _test_eof812: cs = 812; goto _test_eof - _test_eof813: cs = 813; goto _test_eof - _test_eof814: cs = 814; goto _test_eof - _test_eof815: cs = 815; goto _test_eof - _test_eof816: cs = 816; goto _test_eof - _test_eof817: cs = 817; goto _test_eof - _test_eof818: cs = 818; goto _test_eof - _test_eof819: cs = 819; goto _test_eof - _test_eof820: cs = 820; goto _test_eof - _test_eof821: cs = 821; goto _test_eof - _test_eof822: cs = 822; goto _test_eof - _test_eof823: cs = 823; goto _test_eof - _test_eof824: cs = 824; goto _test_eof - _test_eof825: cs = 825; goto _test_eof - _test_eof826: cs = 826; goto _test_eof - _test_eof827: cs = 827; goto _test_eof - _test_eof828: cs = 828; goto _test_eof - _test_eof829: cs = 829; goto _test_eof - _test_eof830: cs = 830; goto _test_eof - _test_eof831: cs = 831; goto _test_eof - _test_eof832: cs = 832; goto _test_eof - _test_eof833: cs = 833; goto _test_eof - _test_eof834: cs = 834; goto _test_eof - _test_eof835: cs = 835; goto _test_eof - _test_eof836: cs = 836; goto _test_eof - _test_eof837: cs = 837; goto _test_eof - _test_eof838: cs = 838; goto _test_eof - _test_eof839: cs = 839; goto _test_eof - _test_eof840: cs = 840; goto _test_eof - _test_eof841: cs = 841; goto _test_eof - _test_eof842: cs = 842; goto _test_eof - _test_eof843: cs = 843; goto _test_eof - _test_eof844: cs = 844; goto _test_eof - _test_eof845: cs = 845; goto _test_eof - _test_eof846: cs = 846; goto _test_eof - _test_eof847: cs = 847; goto _test_eof - _test_eof848: cs = 848; goto _test_eof - _test_eof849: cs = 849; goto _test_eof - _test_eof850: cs = 850; goto _test_eof - _test_eof851: cs = 851; goto _test_eof - _test_eof852: cs = 852; goto _test_eof - _test_eof853: cs = 853; goto _test_eof - _test_eof854: cs = 854; goto _test_eof - _test_eof855: cs = 855; goto _test_eof - _test_eof856: cs = 856; goto _test_eof - _test_eof857: cs = 857; goto _test_eof - _test_eof858: cs = 858; goto _test_eof - _test_eof859: cs = 859; goto _test_eof - _test_eof860: cs = 860; goto _test_eof - _test_eof861: cs = 861; goto _test_eof - _test_eof862: cs = 862; goto _test_eof - _test_eof863: cs = 863; goto _test_eof - _test_eof864: cs = 864; goto _test_eof - _test_eof865: cs = 865; goto _test_eof - _test_eof866: cs = 866; goto _test_eof - _test_eof867: cs = 867; goto _test_eof - _test_eof868: cs = 868; goto _test_eof - _test_eof869: cs = 869; goto _test_eof - _test_eof870: cs = 870; goto _test_eof - _test_eof871: cs = 871; goto _test_eof - _test_eof872: cs = 872; goto _test_eof - _test_eof873: cs = 873; goto _test_eof - _test_eof874: cs = 874; goto _test_eof - _test_eof875: cs = 875; goto _test_eof - _test_eof876: cs = 876; goto _test_eof - _test_eof877: cs = 877; goto _test_eof - _test_eof878: cs = 878; goto _test_eof - _test_eof879: cs = 879; goto _test_eof - _test_eof880: cs = 880; goto _test_eof - _test_eof881: cs = 881; goto _test_eof - _test_eof882: cs = 882; goto _test_eof - _test_eof883: cs = 883; goto _test_eof - _test_eof884: cs = 884; goto _test_eof - _test_eof885: cs = 885; goto _test_eof - _test_eof886: cs = 886; goto _test_eof - _test_eof887: cs = 887; goto _test_eof - _test_eof888: cs = 888; goto _test_eof - _test_eof889: cs = 889; goto _test_eof - _test_eof890: cs = 890; goto _test_eof - _test_eof891: cs = 891; goto _test_eof - _test_eof892: cs = 892; goto _test_eof - _test_eof893: cs = 893; goto _test_eof - _test_eof894: cs = 894; goto _test_eof - _test_eof895: cs = 895; goto _test_eof - _test_eof896: cs = 896; goto _test_eof - _test_eof897: cs = 897; goto _test_eof - _test_eof898: cs = 898; goto _test_eof - _test_eof899: cs = 899; goto _test_eof - _test_eof900: cs = 900; goto _test_eof - _test_eof901: cs = 901; goto _test_eof - _test_eof902: cs = 902; goto _test_eof - _test_eof903: cs = 903; goto _test_eof - _test_eof904: cs = 904; goto _test_eof - _test_eof905: cs = 905; goto _test_eof - _test_eof906: cs = 906; goto _test_eof - _test_eof907: cs = 907; goto _test_eof - _test_eof908: cs = 908; goto _test_eof - _test_eof909: cs = 909; goto _test_eof - _test_eof910: cs = 910; goto _test_eof - _test_eof911: cs = 911; goto _test_eof - _test_eof912: cs = 912; goto _test_eof - _test_eof913: cs = 913; goto _test_eof - _test_eof914: cs = 914; goto _test_eof - _test_eof915: cs = 915; goto _test_eof - _test_eof916: cs = 916; goto _test_eof - _test_eof917: cs = 917; goto _test_eof - _test_eof918: cs = 918; goto _test_eof - _test_eof919: cs = 919; goto _test_eof - _test_eof920: cs = 920; goto _test_eof - _test_eof921: cs = 921; goto _test_eof - _test_eof922: cs = 922; goto _test_eof - _test_eof923: cs = 923; goto _test_eof - _test_eof924: cs = 924; goto _test_eof - _test_eof925: cs = 925; goto _test_eof - _test_eof926: cs = 926; goto _test_eof - _test_eof927: cs = 927; goto _test_eof - _test_eof928: cs = 928; goto _test_eof - _test_eof929: cs = 929; goto _test_eof - _test_eof930: cs = 930; goto _test_eof - _test_eof931: cs = 931; goto _test_eof - _test_eof932: cs = 932; goto _test_eof - _test_eof933: cs = 933; goto _test_eof - _test_eof934: cs = 934; goto _test_eof - _test_eof935: cs = 935; goto _test_eof - _test_eof936: cs = 936; goto _test_eof - _test_eof937: cs = 937; goto _test_eof - _test_eof938: cs = 938; goto _test_eof - _test_eof939: cs = 939; goto _test_eof - _test_eof940: cs = 940; goto _test_eof - _test_eof941: cs = 941; goto _test_eof - _test_eof942: cs = 942; goto _test_eof - _test_eof943: cs = 943; goto _test_eof - _test_eof944: cs = 944; goto _test_eof - _test_eof945: cs = 945; goto _test_eof - _test_eof946: cs = 946; goto _test_eof - _test_eof947: cs = 947; goto _test_eof - _test_eof948: cs = 948; goto _test_eof - _test_eof949: cs = 949; goto _test_eof - _test_eof950: cs = 950; goto _test_eof - _test_eof951: cs = 951; goto _test_eof - _test_eof952: cs = 952; goto _test_eof - _test_eof953: cs = 953; goto _test_eof - _test_eof954: cs = 954; goto _test_eof - _test_eof955: cs = 955; goto _test_eof - _test_eof956: cs = 956; goto _test_eof - _test_eof957: cs = 957; goto _test_eof - _test_eof958: cs = 958; goto _test_eof - _test_eof959: cs = 959; goto _test_eof - _test_eof960: cs = 960; goto _test_eof - _test_eof961: cs = 961; goto _test_eof - _test_eof962: cs = 962; goto _test_eof - _test_eof963: cs = 963; goto _test_eof - _test_eof964: cs = 964; goto _test_eof - _test_eof965: cs = 965; goto _test_eof - _test_eof966: cs = 966; goto _test_eof - _test_eof967: cs = 967; goto _test_eof - _test_eof968: cs = 968; goto _test_eof - _test_eof969: cs = 969; goto _test_eof - _test_eof970: cs = 970; goto _test_eof - _test_eof971: cs = 971; goto _test_eof - _test_eof972: cs = 972; goto _test_eof - _test_eof973: cs = 973; goto _test_eof - _test_eof974: cs = 974; goto _test_eof - _test_eof975: cs = 975; goto _test_eof - _test_eof976: cs = 976; goto _test_eof - _test_eof977: cs = 977; goto _test_eof - _test_eof978: cs = 978; goto _test_eof - _test_eof979: cs = 979; goto _test_eof - _test_eof980: cs = 980; goto _test_eof - _test_eof981: cs = 981; goto _test_eof - _test_eof982: cs = 982; goto _test_eof - _test_eof983: cs = 983; goto _test_eof - _test_eof984: cs = 984; goto _test_eof - _test_eof985: cs = 985; goto _test_eof - _test_eof986: cs = 986; goto _test_eof - _test_eof987: cs = 987; goto _test_eof - _test_eof988: cs = 988; goto _test_eof - _test_eof989: cs = 989; goto _test_eof - _test_eof990: cs = 990; goto _test_eof - _test_eof991: cs = 991; goto _test_eof - _test_eof992: cs = 992; goto _test_eof - _test_eof993: cs = 993; goto _test_eof - _test_eof994: cs = 994; goto _test_eof - _test_eof995: cs = 995; goto _test_eof - _test_eof996: cs = 996; goto _test_eof - _test_eof997: cs = 997; goto _test_eof - _test_eof998: cs = 998; goto _test_eof - _test_eof999: cs = 999; goto _test_eof - _test_eof1000: cs = 1000; goto _test_eof - _test_eof1001: cs = 1001; goto _test_eof - _test_eof1002: cs = 1002; goto _test_eof - _test_eof1003: cs = 1003; goto _test_eof - _test_eof1004: cs = 1004; goto _test_eof - _test_eof1005: cs = 1005; goto _test_eof - _test_eof1006: cs = 1006; goto _test_eof - _test_eof1007: cs = 1007; goto _test_eof - _test_eof1008: cs = 1008; goto _test_eof - _test_eof1009: cs = 1009; goto _test_eof - _test_eof1010: cs = 1010; goto _test_eof - _test_eof1011: cs = 1011; goto _test_eof - _test_eof1012: cs = 1012; goto _test_eof - _test_eof1013: cs = 1013; goto _test_eof - _test_eof1014: cs = 1014; goto _test_eof - _test_eof1015: cs = 1015; goto _test_eof - _test_eof1016: cs = 1016; goto _test_eof - _test_eof1017: cs = 1017; goto _test_eof - _test_eof1018: cs = 1018; goto _test_eof - _test_eof1019: cs = 1019; goto _test_eof - _test_eof1020: cs = 1020; goto _test_eof - _test_eof1021: cs = 1021; goto _test_eof - _test_eof1022: cs = 1022; goto _test_eof - _test_eof1023: cs = 1023; goto _test_eof - _test_eof1024: cs = 1024; goto _test_eof - _test_eof1025: cs = 1025; goto _test_eof - _test_eof1026: cs = 1026; goto _test_eof - _test_eof1027: cs = 1027; goto _test_eof - _test_eof1028: cs = 1028; goto _test_eof - _test_eof1029: cs = 1029; goto _test_eof - _test_eof1030: cs = 1030; goto _test_eof - _test_eof1031: cs = 1031; goto _test_eof - _test_eof1032: cs = 1032; goto _test_eof - _test_eof1033: cs = 1033; goto _test_eof - _test_eof1034: cs = 1034; goto _test_eof - _test_eof1035: cs = 1035; goto _test_eof - _test_eof1036: cs = 1036; goto _test_eof - _test_eof1037: cs = 1037; goto _test_eof - _test_eof1038: cs = 1038; goto _test_eof - _test_eof1039: cs = 1039; goto _test_eof - _test_eof1040: cs = 1040; goto _test_eof - _test_eof1041: cs = 1041; goto _test_eof - _test_eof1042: cs = 1042; goto _test_eof - _test_eof1043: cs = 1043; goto _test_eof - _test_eof1044: cs = 1044; goto _test_eof - _test_eof1045: cs = 1045; goto _test_eof - _test_eof1046: cs = 1046; goto _test_eof - _test_eof1047: cs = 1047; goto _test_eof - _test_eof1048: cs = 1048; goto _test_eof - _test_eof1049: cs = 1049; goto _test_eof - _test_eof1050: cs = 1050; goto _test_eof - _test_eof1051: cs = 1051; goto _test_eof - _test_eof1052: cs = 1052; goto _test_eof - _test_eof1053: cs = 1053; goto _test_eof - _test_eof1054: cs = 1054; goto _test_eof - _test_eof1055: cs = 1055; goto _test_eof - _test_eof1056: cs = 1056; goto _test_eof - _test_eof1057: cs = 1057; goto _test_eof - _test_eof1058: cs = 1058; goto _test_eof - _test_eof1059: cs = 1059; goto _test_eof - _test_eof1060: cs = 1060; goto _test_eof - _test_eof1061: cs = 1061; goto _test_eof - _test_eof1062: cs = 1062; goto _test_eof - _test_eof1063: cs = 1063; goto _test_eof - _test_eof1064: cs = 1064; goto _test_eof - _test_eof1065: cs = 1065; goto _test_eof - _test_eof1066: cs = 1066; goto _test_eof - _test_eof1067: cs = 1067; goto _test_eof - _test_eof1068: cs = 1068; goto _test_eof - _test_eof1069: cs = 1069; goto _test_eof - _test_eof1070: cs = 1070; goto _test_eof - _test_eof1071: cs = 1071; goto _test_eof - _test_eof1072: cs = 1072; goto _test_eof - _test_eof1073: cs = 1073; goto _test_eof - _test_eof1074: cs = 1074; goto _test_eof - _test_eof1075: cs = 1075; goto _test_eof - _test_eof1076: cs = 1076; goto _test_eof - _test_eof1077: cs = 1077; goto _test_eof - _test_eof1078: cs = 1078; goto _test_eof - _test_eof1079: cs = 1079; goto _test_eof - _test_eof1080: cs = 1080; goto _test_eof - _test_eof1081: cs = 1081; goto _test_eof - _test_eof1082: cs = 1082; goto _test_eof - _test_eof1083: cs = 1083; goto _test_eof - _test_eof1084: cs = 1084; goto _test_eof - _test_eof1085: cs = 1085; goto _test_eof - _test_eof1086: cs = 1086; goto _test_eof - _test_eof1087: cs = 1087; goto _test_eof - _test_eof1088: cs = 1088; goto _test_eof - _test_eof1089: cs = 1089; goto _test_eof - _test_eof4872: cs = 4872; goto _test_eof - _test_eof1090: cs = 1090; goto _test_eof - _test_eof1091: cs = 1091; goto _test_eof - _test_eof1092: cs = 1092; goto _test_eof - _test_eof1093: cs = 1093; goto _test_eof - _test_eof1094: cs = 1094; goto _test_eof - _test_eof1095: cs = 1095; goto _test_eof - _test_eof1096: cs = 1096; goto _test_eof - _test_eof1097: cs = 1097; goto _test_eof - _test_eof1098: cs = 1098; goto _test_eof - _test_eof1099: cs = 1099; goto _test_eof - _test_eof1100: cs = 1100; goto _test_eof - _test_eof1101: cs = 1101; goto _test_eof - _test_eof1102: cs = 1102; goto _test_eof - _test_eof1103: cs = 1103; goto _test_eof - _test_eof1104: cs = 1104; goto _test_eof - _test_eof1105: cs = 1105; goto _test_eof - _test_eof1106: cs = 1106; goto _test_eof - _test_eof1107: cs = 1107; goto _test_eof - _test_eof1108: cs = 1108; goto _test_eof - _test_eof1109: cs = 1109; goto _test_eof - _test_eof1110: cs = 1110; goto _test_eof - _test_eof1111: cs = 1111; goto _test_eof - _test_eof1112: cs = 1112; goto _test_eof - _test_eof1113: cs = 1113; goto _test_eof - _test_eof1114: cs = 1114; goto _test_eof - _test_eof1115: cs = 1115; goto _test_eof - _test_eof1116: cs = 1116; goto _test_eof - _test_eof1117: cs = 1117; goto _test_eof - _test_eof1118: cs = 1118; goto _test_eof - _test_eof1119: cs = 1119; goto _test_eof - _test_eof1120: cs = 1120; goto _test_eof - _test_eof1121: cs = 1121; goto _test_eof - _test_eof1122: cs = 1122; goto _test_eof - _test_eof1123: cs = 1123; goto _test_eof - _test_eof1124: cs = 1124; goto _test_eof - _test_eof1125: cs = 1125; goto _test_eof - _test_eof1126: cs = 1126; goto _test_eof - _test_eof1127: cs = 1127; goto _test_eof - _test_eof1128: cs = 1128; goto _test_eof - _test_eof1129: cs = 1129; goto _test_eof - _test_eof1130: cs = 1130; goto _test_eof - _test_eof1131: cs = 1131; goto _test_eof - _test_eof1132: cs = 1132; goto _test_eof - _test_eof1133: cs = 1133; goto _test_eof - _test_eof1134: cs = 1134; goto _test_eof - _test_eof1135: cs = 1135; goto _test_eof - _test_eof1136: cs = 1136; goto _test_eof - _test_eof1137: cs = 1137; goto _test_eof - _test_eof1138: cs = 1138; goto _test_eof - _test_eof1139: cs = 1139; goto _test_eof - _test_eof1140: cs = 1140; goto _test_eof - _test_eof1141: cs = 1141; goto _test_eof - _test_eof1142: cs = 1142; goto _test_eof - _test_eof1143: cs = 1143; goto _test_eof - _test_eof1144: cs = 1144; goto _test_eof - _test_eof1145: cs = 1145; goto _test_eof - _test_eof1146: cs = 1146; goto _test_eof - _test_eof1147: cs = 1147; goto _test_eof - _test_eof1148: cs = 1148; goto _test_eof - _test_eof1149: cs = 1149; goto _test_eof - _test_eof1150: cs = 1150; goto _test_eof - _test_eof1151: cs = 1151; goto _test_eof - _test_eof1152: cs = 1152; goto _test_eof - _test_eof1153: cs = 1153; goto _test_eof - _test_eof1154: cs = 1154; goto _test_eof - _test_eof1155: cs = 1155; goto _test_eof - _test_eof1156: cs = 1156; goto _test_eof - _test_eof1157: cs = 1157; goto _test_eof - _test_eof1158: cs = 1158; goto _test_eof - _test_eof1159: cs = 1159; goto _test_eof - _test_eof1160: cs = 1160; goto _test_eof - _test_eof1161: cs = 1161; goto _test_eof - _test_eof1162: cs = 1162; goto _test_eof - _test_eof1163: cs = 1163; goto _test_eof - _test_eof1164: cs = 1164; goto _test_eof - _test_eof1165: cs = 1165; goto _test_eof - _test_eof1166: cs = 1166; goto _test_eof - _test_eof1167: cs = 1167; goto _test_eof - _test_eof1168: cs = 1168; goto _test_eof - _test_eof1169: cs = 1169; goto _test_eof - _test_eof1170: cs = 1170; goto _test_eof - _test_eof1171: cs = 1171; goto _test_eof - _test_eof1172: cs = 1172; goto _test_eof - _test_eof1173: cs = 1173; goto _test_eof - _test_eof1174: cs = 1174; goto _test_eof - _test_eof1175: cs = 1175; goto _test_eof - _test_eof1176: cs = 1176; goto _test_eof - _test_eof1177: cs = 1177; goto _test_eof - _test_eof1178: cs = 1178; goto _test_eof - _test_eof1179: cs = 1179; goto _test_eof - _test_eof1180: cs = 1180; goto _test_eof - _test_eof1181: cs = 1181; goto _test_eof - _test_eof1182: cs = 1182; goto _test_eof - _test_eof1183: cs = 1183; goto _test_eof - _test_eof1184: cs = 1184; goto _test_eof - _test_eof1185: cs = 1185; goto _test_eof - _test_eof1186: cs = 1186; goto _test_eof - _test_eof1187: cs = 1187; goto _test_eof - _test_eof1188: cs = 1188; goto _test_eof - _test_eof1189: cs = 1189; goto _test_eof - _test_eof1190: cs = 1190; goto _test_eof - _test_eof1191: cs = 1191; goto _test_eof - _test_eof1192: cs = 1192; goto _test_eof - _test_eof1193: cs = 1193; goto _test_eof - _test_eof1194: cs = 1194; goto _test_eof - _test_eof1195: cs = 1195; goto _test_eof - _test_eof1196: cs = 1196; goto _test_eof - _test_eof1197: cs = 1197; goto _test_eof - _test_eof1198: cs = 1198; goto _test_eof - _test_eof1199: cs = 1199; goto _test_eof - _test_eof1200: cs = 1200; goto _test_eof - _test_eof1201: cs = 1201; goto _test_eof - _test_eof1202: cs = 1202; goto _test_eof - _test_eof1203: cs = 1203; goto _test_eof - _test_eof1204: cs = 1204; goto _test_eof - _test_eof1205: cs = 1205; goto _test_eof - _test_eof1206: cs = 1206; goto _test_eof - _test_eof1207: cs = 1207; goto _test_eof - _test_eof1208: cs = 1208; goto _test_eof - _test_eof1209: cs = 1209; goto _test_eof - _test_eof1210: cs = 1210; goto _test_eof - _test_eof1211: cs = 1211; goto _test_eof - _test_eof1212: cs = 1212; goto _test_eof - _test_eof1213: cs = 1213; goto _test_eof - _test_eof1214: cs = 1214; goto _test_eof - _test_eof1215: cs = 1215; goto _test_eof - _test_eof1216: cs = 1216; goto _test_eof - _test_eof1217: cs = 1217; goto _test_eof - _test_eof1218: cs = 1218; goto _test_eof - _test_eof1219: cs = 1219; goto _test_eof - _test_eof1220: cs = 1220; goto _test_eof - _test_eof1221: cs = 1221; goto _test_eof - _test_eof1222: cs = 1222; goto _test_eof - _test_eof1223: cs = 1223; goto _test_eof - _test_eof1224: cs = 1224; goto _test_eof - _test_eof1225: cs = 1225; goto _test_eof - _test_eof1226: cs = 1226; goto _test_eof - _test_eof1227: cs = 1227; goto _test_eof - _test_eof1228: cs = 1228; goto _test_eof - _test_eof1229: cs = 1229; goto _test_eof - _test_eof1230: cs = 1230; goto _test_eof - _test_eof1231: cs = 1231; goto _test_eof - _test_eof1232: cs = 1232; goto _test_eof - _test_eof1233: cs = 1233; goto _test_eof - _test_eof1234: cs = 1234; goto _test_eof - _test_eof1235: cs = 1235; goto _test_eof - _test_eof1236: cs = 1236; goto _test_eof - _test_eof1237: cs = 1237; goto _test_eof - _test_eof1238: cs = 1238; goto _test_eof - _test_eof1239: cs = 1239; goto _test_eof - _test_eof1240: cs = 1240; goto _test_eof - _test_eof1241: cs = 1241; goto _test_eof - _test_eof1242: cs = 1242; goto _test_eof - _test_eof1243: cs = 1243; goto _test_eof - _test_eof1244: cs = 1244; goto _test_eof - _test_eof1245: cs = 1245; goto _test_eof - _test_eof1246: cs = 1246; goto _test_eof - _test_eof1247: cs = 1247; goto _test_eof - _test_eof1248: cs = 1248; goto _test_eof - _test_eof1249: cs = 1249; goto _test_eof - _test_eof1250: cs = 1250; goto _test_eof - _test_eof1251: cs = 1251; goto _test_eof - _test_eof1252: cs = 1252; goto _test_eof - _test_eof1253: cs = 1253; goto _test_eof - _test_eof1254: cs = 1254; goto _test_eof - _test_eof1255: cs = 1255; goto _test_eof - _test_eof1256: cs = 1256; goto _test_eof - _test_eof1257: cs = 1257; goto _test_eof - _test_eof1258: cs = 1258; goto _test_eof - _test_eof1259: cs = 1259; goto _test_eof - _test_eof1260: cs = 1260; goto _test_eof - _test_eof1261: cs = 1261; goto _test_eof - _test_eof1262: cs = 1262; goto _test_eof - _test_eof1263: cs = 1263; goto _test_eof - _test_eof1264: cs = 1264; goto _test_eof - _test_eof1265: cs = 1265; goto _test_eof - _test_eof1266: cs = 1266; goto _test_eof - _test_eof1267: cs = 1267; goto _test_eof - _test_eof1268: cs = 1268; goto _test_eof - _test_eof1269: cs = 1269; goto _test_eof - _test_eof1270: cs = 1270; goto _test_eof - _test_eof1271: cs = 1271; goto _test_eof - _test_eof1272: cs = 1272; goto _test_eof - _test_eof1273: cs = 1273; goto _test_eof - _test_eof1274: cs = 1274; goto _test_eof - _test_eof1275: cs = 1275; goto _test_eof - _test_eof1276: cs = 1276; goto _test_eof - _test_eof1277: cs = 1277; goto _test_eof - _test_eof1278: cs = 1278; goto _test_eof - _test_eof1279: cs = 1279; goto _test_eof - _test_eof1280: cs = 1280; goto _test_eof - _test_eof1281: cs = 1281; goto _test_eof - _test_eof1282: cs = 1282; goto _test_eof - _test_eof1283: cs = 1283; goto _test_eof - _test_eof1284: cs = 1284; goto _test_eof - _test_eof1285: cs = 1285; goto _test_eof - _test_eof1286: cs = 1286; goto _test_eof - _test_eof1287: cs = 1287; goto _test_eof - _test_eof1288: cs = 1288; goto _test_eof - _test_eof1289: cs = 1289; goto _test_eof - _test_eof1290: cs = 1290; goto _test_eof - _test_eof1291: cs = 1291; goto _test_eof - _test_eof1292: cs = 1292; goto _test_eof - _test_eof1293: cs = 1293; goto _test_eof - _test_eof1294: cs = 1294; goto _test_eof - _test_eof1295: cs = 1295; goto _test_eof - _test_eof1296: cs = 1296; goto _test_eof - _test_eof1297: cs = 1297; goto _test_eof - _test_eof1298: cs = 1298; goto _test_eof - _test_eof1299: cs = 1299; goto _test_eof - _test_eof1300: cs = 1300; goto _test_eof - _test_eof1301: cs = 1301; goto _test_eof - _test_eof1302: cs = 1302; goto _test_eof - _test_eof1303: cs = 1303; goto _test_eof - _test_eof1304: cs = 1304; goto _test_eof - _test_eof1305: cs = 1305; goto _test_eof - _test_eof1306: cs = 1306; goto _test_eof - _test_eof1307: cs = 1307; goto _test_eof - _test_eof1308: cs = 1308; goto _test_eof - _test_eof1309: cs = 1309; goto _test_eof - _test_eof1310: cs = 1310; goto _test_eof - _test_eof1311: cs = 1311; goto _test_eof - _test_eof1312: cs = 1312; goto _test_eof - _test_eof1313: cs = 1313; goto _test_eof - _test_eof1314: cs = 1314; goto _test_eof - _test_eof1315: cs = 1315; goto _test_eof - _test_eof1316: cs = 1316; goto _test_eof - _test_eof1317: cs = 1317; goto _test_eof - _test_eof1318: cs = 1318; goto _test_eof - _test_eof1319: cs = 1319; goto _test_eof - _test_eof1320: cs = 1320; goto _test_eof - _test_eof1321: cs = 1321; goto _test_eof - _test_eof1322: cs = 1322; goto _test_eof - _test_eof1323: cs = 1323; goto _test_eof - _test_eof1324: cs = 1324; goto _test_eof - _test_eof1325: cs = 1325; goto _test_eof - _test_eof1326: cs = 1326; goto _test_eof - _test_eof1327: cs = 1327; goto _test_eof - _test_eof1328: cs = 1328; goto _test_eof - _test_eof1329: cs = 1329; goto _test_eof - _test_eof1330: cs = 1330; goto _test_eof - _test_eof1331: cs = 1331; goto _test_eof - _test_eof1332: cs = 1332; goto _test_eof - _test_eof1333: cs = 1333; goto _test_eof - _test_eof1334: cs = 1334; goto _test_eof - _test_eof1335: cs = 1335; goto _test_eof - _test_eof1336: cs = 1336; goto _test_eof - _test_eof1337: cs = 1337; goto _test_eof - _test_eof1338: cs = 1338; goto _test_eof - _test_eof1339: cs = 1339; goto _test_eof - _test_eof1340: cs = 1340; goto _test_eof - _test_eof1341: cs = 1341; goto _test_eof - _test_eof1342: cs = 1342; goto _test_eof - _test_eof1343: cs = 1343; goto _test_eof - _test_eof1344: cs = 1344; goto _test_eof - _test_eof1345: cs = 1345; goto _test_eof - _test_eof1346: cs = 1346; goto _test_eof - _test_eof1347: cs = 1347; goto _test_eof - _test_eof1348: cs = 1348; goto _test_eof - _test_eof1349: cs = 1349; goto _test_eof - _test_eof1350: cs = 1350; goto _test_eof - _test_eof1351: cs = 1351; goto _test_eof - _test_eof1352: cs = 1352; goto _test_eof - _test_eof1353: cs = 1353; goto _test_eof - _test_eof1354: cs = 1354; goto _test_eof - _test_eof1355: cs = 1355; goto _test_eof - _test_eof1356: cs = 1356; goto _test_eof - _test_eof1357: cs = 1357; goto _test_eof - _test_eof1358: cs = 1358; goto _test_eof - _test_eof1359: cs = 1359; goto _test_eof - _test_eof1360: cs = 1360; goto _test_eof - _test_eof1361: cs = 1361; goto _test_eof - _test_eof1362: cs = 1362; goto _test_eof - _test_eof1363: cs = 1363; goto _test_eof - _test_eof1364: cs = 1364; goto _test_eof - _test_eof1365: cs = 1365; goto _test_eof - _test_eof1366: cs = 1366; goto _test_eof - _test_eof1367: cs = 1367; goto _test_eof - _test_eof1368: cs = 1368; goto _test_eof - _test_eof1369: cs = 1369; goto _test_eof - _test_eof1370: cs = 1370; goto _test_eof - _test_eof1371: cs = 1371; goto _test_eof - _test_eof1372: cs = 1372; goto _test_eof - _test_eof1373: cs = 1373; goto _test_eof - _test_eof1374: cs = 1374; goto _test_eof - _test_eof1375: cs = 1375; goto _test_eof - _test_eof1376: cs = 1376; goto _test_eof - _test_eof1377: cs = 1377; goto _test_eof - _test_eof1378: cs = 1378; goto _test_eof - _test_eof1379: cs = 1379; goto _test_eof - _test_eof1380: cs = 1380; goto _test_eof - _test_eof1381: cs = 1381; goto _test_eof - _test_eof1382: cs = 1382; goto _test_eof - _test_eof1383: cs = 1383; goto _test_eof - _test_eof1384: cs = 1384; goto _test_eof - _test_eof1385: cs = 1385; goto _test_eof - _test_eof1386: cs = 1386; goto _test_eof - _test_eof1387: cs = 1387; goto _test_eof - _test_eof1388: cs = 1388; goto _test_eof - _test_eof1389: cs = 1389; goto _test_eof - _test_eof1390: cs = 1390; goto _test_eof - _test_eof1391: cs = 1391; goto _test_eof - _test_eof1392: cs = 1392; goto _test_eof - _test_eof1393: cs = 1393; goto _test_eof - _test_eof1394: cs = 1394; goto _test_eof - _test_eof1395: cs = 1395; goto _test_eof - _test_eof1396: cs = 1396; goto _test_eof - _test_eof1397: cs = 1397; goto _test_eof - _test_eof1398: cs = 1398; goto _test_eof - _test_eof1399: cs = 1399; goto _test_eof - _test_eof1400: cs = 1400; goto _test_eof - _test_eof1401: cs = 1401; goto _test_eof - _test_eof1402: cs = 1402; goto _test_eof - _test_eof1403: cs = 1403; goto _test_eof - _test_eof1404: cs = 1404; goto _test_eof - _test_eof1405: cs = 1405; goto _test_eof - _test_eof1406: cs = 1406; goto _test_eof - _test_eof1407: cs = 1407; goto _test_eof - _test_eof1408: cs = 1408; goto _test_eof - _test_eof1409: cs = 1409; goto _test_eof - _test_eof1410: cs = 1410; goto _test_eof - _test_eof1411: cs = 1411; goto _test_eof - _test_eof1412: cs = 1412; goto _test_eof - _test_eof1413: cs = 1413; goto _test_eof - _test_eof1414: cs = 1414; goto _test_eof - _test_eof1415: cs = 1415; goto _test_eof - _test_eof1416: cs = 1416; goto _test_eof - _test_eof1417: cs = 1417; goto _test_eof - _test_eof1418: cs = 1418; goto _test_eof - _test_eof1419: cs = 1419; goto _test_eof - _test_eof1420: cs = 1420; goto _test_eof - _test_eof1421: cs = 1421; goto _test_eof - _test_eof1422: cs = 1422; goto _test_eof - _test_eof1423: cs = 1423; goto _test_eof - _test_eof1424: cs = 1424; goto _test_eof - _test_eof1425: cs = 1425; goto _test_eof - _test_eof1426: cs = 1426; goto _test_eof - _test_eof1427: cs = 1427; goto _test_eof - _test_eof1428: cs = 1428; goto _test_eof - _test_eof1429: cs = 1429; goto _test_eof - _test_eof1430: cs = 1430; goto _test_eof - _test_eof1431: cs = 1431; goto _test_eof - _test_eof1432: cs = 1432; goto _test_eof - _test_eof1433: cs = 1433; goto _test_eof - _test_eof1434: cs = 1434; goto _test_eof - _test_eof1435: cs = 1435; goto _test_eof - _test_eof1436: cs = 1436; goto _test_eof - _test_eof1437: cs = 1437; goto _test_eof - _test_eof1438: cs = 1438; goto _test_eof - _test_eof1439: cs = 1439; goto _test_eof - _test_eof1440: cs = 1440; goto _test_eof - _test_eof1441: cs = 1441; goto _test_eof - _test_eof1442: cs = 1442; goto _test_eof - _test_eof1443: cs = 1443; goto _test_eof - _test_eof1444: cs = 1444; goto _test_eof - _test_eof1445: cs = 1445; goto _test_eof - _test_eof1446: cs = 1446; goto _test_eof - _test_eof1447: cs = 1447; goto _test_eof - _test_eof1448: cs = 1448; goto _test_eof - _test_eof1449: cs = 1449; goto _test_eof - _test_eof1450: cs = 1450; goto _test_eof - _test_eof1451: cs = 1451; goto _test_eof - _test_eof1452: cs = 1452; goto _test_eof - _test_eof1453: cs = 1453; goto _test_eof - _test_eof1454: cs = 1454; goto _test_eof - _test_eof1455: cs = 1455; goto _test_eof - _test_eof1456: cs = 1456; goto _test_eof - _test_eof1457: cs = 1457; goto _test_eof - _test_eof1458: cs = 1458; goto _test_eof - _test_eof1459: cs = 1459; goto _test_eof - _test_eof1460: cs = 1460; goto _test_eof - _test_eof1461: cs = 1461; goto _test_eof - _test_eof1462: cs = 1462; goto _test_eof - _test_eof1463: cs = 1463; goto _test_eof - _test_eof1464: cs = 1464; goto _test_eof - _test_eof1465: cs = 1465; goto _test_eof - _test_eof1466: cs = 1466; goto _test_eof - _test_eof1467: cs = 1467; goto _test_eof - _test_eof1468: cs = 1468; goto _test_eof - _test_eof1469: cs = 1469; goto _test_eof - _test_eof1470: cs = 1470; goto _test_eof - _test_eof1471: cs = 1471; goto _test_eof - _test_eof1472: cs = 1472; goto _test_eof - _test_eof1473: cs = 1473; goto _test_eof - _test_eof1474: cs = 1474; goto _test_eof - _test_eof1475: cs = 1475; goto _test_eof - _test_eof1476: cs = 1476; goto _test_eof - _test_eof1477: cs = 1477; goto _test_eof - _test_eof1478: cs = 1478; goto _test_eof - _test_eof1479: cs = 1479; goto _test_eof - _test_eof1480: cs = 1480; goto _test_eof - _test_eof1481: cs = 1481; goto _test_eof - _test_eof1482: cs = 1482; goto _test_eof - _test_eof1483: cs = 1483; goto _test_eof - _test_eof1484: cs = 1484; goto _test_eof - _test_eof1485: cs = 1485; goto _test_eof - _test_eof1486: cs = 1486; goto _test_eof - _test_eof1487: cs = 1487; goto _test_eof - _test_eof1488: cs = 1488; goto _test_eof - _test_eof1489: cs = 1489; goto _test_eof - _test_eof1490: cs = 1490; goto _test_eof - _test_eof1491: cs = 1491; goto _test_eof - _test_eof1492: cs = 1492; goto _test_eof - _test_eof1493: cs = 1493; goto _test_eof - _test_eof1494: cs = 1494; goto _test_eof - _test_eof1495: cs = 1495; goto _test_eof - _test_eof1496: cs = 1496; goto _test_eof - _test_eof1497: cs = 1497; goto _test_eof - _test_eof1498: cs = 1498; goto _test_eof - _test_eof1499: cs = 1499; goto _test_eof - _test_eof1500: cs = 1500; goto _test_eof - _test_eof1501: cs = 1501; goto _test_eof - _test_eof1502: cs = 1502; goto _test_eof - _test_eof1503: cs = 1503; goto _test_eof - _test_eof1504: cs = 1504; goto _test_eof - _test_eof1505: cs = 1505; goto _test_eof - _test_eof1506: cs = 1506; goto _test_eof - _test_eof1507: cs = 1507; goto _test_eof - _test_eof1508: cs = 1508; goto _test_eof - _test_eof1509: cs = 1509; goto _test_eof - _test_eof1510: cs = 1510; goto _test_eof - _test_eof1511: cs = 1511; goto _test_eof - _test_eof1512: cs = 1512; goto _test_eof - _test_eof1513: cs = 1513; goto _test_eof - _test_eof1514: cs = 1514; goto _test_eof - _test_eof1515: cs = 1515; goto _test_eof - _test_eof1516: cs = 1516; goto _test_eof - _test_eof1517: cs = 1517; goto _test_eof - _test_eof1518: cs = 1518; goto _test_eof - _test_eof1519: cs = 1519; goto _test_eof - _test_eof1520: cs = 1520; goto _test_eof - _test_eof1521: cs = 1521; goto _test_eof - _test_eof1522: cs = 1522; goto _test_eof - _test_eof1523: cs = 1523; goto _test_eof - _test_eof1524: cs = 1524; goto _test_eof - _test_eof1525: cs = 1525; goto _test_eof - _test_eof1526: cs = 1526; goto _test_eof - _test_eof1527: cs = 1527; goto _test_eof - _test_eof1528: cs = 1528; goto _test_eof - _test_eof1529: cs = 1529; goto _test_eof - _test_eof1530: cs = 1530; goto _test_eof - _test_eof1531: cs = 1531; goto _test_eof - _test_eof1532: cs = 1532; goto _test_eof - _test_eof1533: cs = 1533; goto _test_eof - _test_eof1534: cs = 1534; goto _test_eof - _test_eof1535: cs = 1535; goto _test_eof - _test_eof1536: cs = 1536; goto _test_eof - _test_eof1537: cs = 1537; goto _test_eof - _test_eof1538: cs = 1538; goto _test_eof - _test_eof1539: cs = 1539; goto _test_eof - _test_eof1540: cs = 1540; goto _test_eof - _test_eof1541: cs = 1541; goto _test_eof - _test_eof1542: cs = 1542; goto _test_eof - _test_eof1543: cs = 1543; goto _test_eof - _test_eof1544: cs = 1544; goto _test_eof - _test_eof1545: cs = 1545; goto _test_eof - _test_eof1546: cs = 1546; goto _test_eof - _test_eof1547: cs = 1547; goto _test_eof - _test_eof1548: cs = 1548; goto _test_eof - _test_eof1549: cs = 1549; goto _test_eof - _test_eof1550: cs = 1550; goto _test_eof - _test_eof1551: cs = 1551; goto _test_eof - _test_eof1552: cs = 1552; goto _test_eof - _test_eof1553: cs = 1553; goto _test_eof - _test_eof1554: cs = 1554; goto _test_eof - _test_eof1555: cs = 1555; goto _test_eof - _test_eof1556: cs = 1556; goto _test_eof - _test_eof1557: cs = 1557; goto _test_eof - _test_eof1558: cs = 1558; goto _test_eof - _test_eof1559: cs = 1559; goto _test_eof - _test_eof1560: cs = 1560; goto _test_eof - _test_eof1561: cs = 1561; goto _test_eof - _test_eof1562: cs = 1562; goto _test_eof - _test_eof1563: cs = 1563; goto _test_eof - _test_eof1564: cs = 1564; goto _test_eof - _test_eof1565: cs = 1565; goto _test_eof - _test_eof1566: cs = 1566; goto _test_eof - _test_eof1567: cs = 1567; goto _test_eof - _test_eof1568: cs = 1568; goto _test_eof - _test_eof1569: cs = 1569; goto _test_eof - _test_eof1570: cs = 1570; goto _test_eof - _test_eof1571: cs = 1571; goto _test_eof - _test_eof1572: cs = 1572; goto _test_eof - _test_eof1573: cs = 1573; goto _test_eof - _test_eof1574: cs = 1574; goto _test_eof - _test_eof1575: cs = 1575; goto _test_eof - _test_eof1576: cs = 1576; goto _test_eof - _test_eof1577: cs = 1577; goto _test_eof - _test_eof1578: cs = 1578; goto _test_eof - _test_eof1579: cs = 1579; goto _test_eof - _test_eof1580: cs = 1580; goto _test_eof - _test_eof1581: cs = 1581; goto _test_eof - _test_eof1582: cs = 1582; goto _test_eof - _test_eof1583: cs = 1583; goto _test_eof - _test_eof1584: cs = 1584; goto _test_eof - _test_eof1585: cs = 1585; goto _test_eof - _test_eof1586: cs = 1586; goto _test_eof - _test_eof1587: cs = 1587; goto _test_eof - _test_eof1588: cs = 1588; goto _test_eof - _test_eof1589: cs = 1589; goto _test_eof - _test_eof1590: cs = 1590; goto _test_eof - _test_eof1591: cs = 1591; goto _test_eof - _test_eof4873: cs = 4873; goto _test_eof - _test_eof1592: cs = 1592; goto _test_eof - _test_eof1593: cs = 1593; goto _test_eof - _test_eof1594: cs = 1594; goto _test_eof - _test_eof1595: cs = 1595; goto _test_eof - _test_eof1596: cs = 1596; goto _test_eof - _test_eof1597: cs = 1597; goto _test_eof - _test_eof1598: cs = 1598; goto _test_eof - _test_eof1599: cs = 1599; goto _test_eof - _test_eof1600: cs = 1600; goto _test_eof - _test_eof1601: cs = 1601; goto _test_eof - _test_eof1602: cs = 1602; goto _test_eof - _test_eof1603: cs = 1603; goto _test_eof - _test_eof1604: cs = 1604; goto _test_eof - _test_eof1605: cs = 1605; goto _test_eof - _test_eof1606: cs = 1606; goto _test_eof - _test_eof1607: cs = 1607; goto _test_eof - _test_eof1608: cs = 1608; goto _test_eof - _test_eof1609: cs = 1609; goto _test_eof - _test_eof1610: cs = 1610; goto _test_eof - _test_eof1611: cs = 1611; goto _test_eof - _test_eof1612: cs = 1612; goto _test_eof - _test_eof1613: cs = 1613; goto _test_eof - _test_eof1614: cs = 1614; goto _test_eof - _test_eof1615: cs = 1615; goto _test_eof - _test_eof1616: cs = 1616; goto _test_eof - _test_eof1617: cs = 1617; goto _test_eof - _test_eof1618: cs = 1618; goto _test_eof - _test_eof1619: cs = 1619; goto _test_eof - _test_eof1620: cs = 1620; goto _test_eof - _test_eof1621: cs = 1621; goto _test_eof - _test_eof1622: cs = 1622; goto _test_eof - _test_eof1623: cs = 1623; goto _test_eof - _test_eof1624: cs = 1624; goto _test_eof - _test_eof1625: cs = 1625; goto _test_eof - _test_eof1626: cs = 1626; goto _test_eof - _test_eof1627: cs = 1627; goto _test_eof - _test_eof1628: cs = 1628; goto _test_eof - _test_eof1629: cs = 1629; goto _test_eof - _test_eof1630: cs = 1630; goto _test_eof - _test_eof1631: cs = 1631; goto _test_eof - _test_eof1632: cs = 1632; goto _test_eof - _test_eof1633: cs = 1633; goto _test_eof - _test_eof1634: cs = 1634; goto _test_eof - _test_eof1635: cs = 1635; goto _test_eof - _test_eof1636: cs = 1636; goto _test_eof - _test_eof1637: cs = 1637; goto _test_eof - _test_eof1638: cs = 1638; goto _test_eof - _test_eof1639: cs = 1639; goto _test_eof - _test_eof1640: cs = 1640; goto _test_eof - _test_eof1641: cs = 1641; goto _test_eof - _test_eof1642: cs = 1642; goto _test_eof - _test_eof1643: cs = 1643; goto _test_eof - _test_eof1644: cs = 1644; goto _test_eof - _test_eof1645: cs = 1645; goto _test_eof - _test_eof1646: cs = 1646; goto _test_eof - _test_eof1647: cs = 1647; goto _test_eof - _test_eof1648: cs = 1648; goto _test_eof - _test_eof1649: cs = 1649; goto _test_eof - _test_eof1650: cs = 1650; goto _test_eof - _test_eof1651: cs = 1651; goto _test_eof - _test_eof1652: cs = 1652; goto _test_eof - _test_eof1653: cs = 1653; goto _test_eof - _test_eof1654: cs = 1654; goto _test_eof - _test_eof1655: cs = 1655; goto _test_eof - _test_eof1656: cs = 1656; goto _test_eof - _test_eof1657: cs = 1657; goto _test_eof - _test_eof1658: cs = 1658; goto _test_eof - _test_eof1659: cs = 1659; goto _test_eof - _test_eof1660: cs = 1660; goto _test_eof - _test_eof1661: cs = 1661; goto _test_eof - _test_eof1662: cs = 1662; goto _test_eof - _test_eof1663: cs = 1663; goto _test_eof - _test_eof1664: cs = 1664; goto _test_eof - _test_eof1665: cs = 1665; goto _test_eof - _test_eof1666: cs = 1666; goto _test_eof - _test_eof1667: cs = 1667; goto _test_eof - _test_eof1668: cs = 1668; goto _test_eof - _test_eof1669: cs = 1669; goto _test_eof - _test_eof1670: cs = 1670; goto _test_eof - _test_eof1671: cs = 1671; goto _test_eof - _test_eof1672: cs = 1672; goto _test_eof - _test_eof1673: cs = 1673; goto _test_eof - _test_eof1674: cs = 1674; goto _test_eof - _test_eof1675: cs = 1675; goto _test_eof - _test_eof1676: cs = 1676; goto _test_eof - _test_eof1677: cs = 1677; goto _test_eof - _test_eof1678: cs = 1678; goto _test_eof - _test_eof1679: cs = 1679; goto _test_eof - _test_eof1680: cs = 1680; goto _test_eof - _test_eof1681: cs = 1681; goto _test_eof - _test_eof1682: cs = 1682; goto _test_eof - _test_eof1683: cs = 1683; goto _test_eof - _test_eof1684: cs = 1684; goto _test_eof - _test_eof1685: cs = 1685; goto _test_eof - _test_eof1686: cs = 1686; goto _test_eof - _test_eof1687: cs = 1687; goto _test_eof - _test_eof1688: cs = 1688; goto _test_eof - _test_eof1689: cs = 1689; goto _test_eof - _test_eof1690: cs = 1690; goto _test_eof - _test_eof1691: cs = 1691; goto _test_eof - _test_eof1692: cs = 1692; goto _test_eof - _test_eof1693: cs = 1693; goto _test_eof - _test_eof1694: cs = 1694; goto _test_eof - _test_eof1695: cs = 1695; goto _test_eof - _test_eof1696: cs = 1696; goto _test_eof - _test_eof1697: cs = 1697; goto _test_eof - _test_eof1698: cs = 1698; goto _test_eof - _test_eof1699: cs = 1699; goto _test_eof - _test_eof1700: cs = 1700; goto _test_eof - _test_eof1701: cs = 1701; goto _test_eof - _test_eof1702: cs = 1702; goto _test_eof - _test_eof1703: cs = 1703; goto _test_eof - _test_eof1704: cs = 1704; goto _test_eof - _test_eof1705: cs = 1705; goto _test_eof - _test_eof1706: cs = 1706; goto _test_eof - _test_eof1707: cs = 1707; goto _test_eof - _test_eof1708: cs = 1708; goto _test_eof - _test_eof1709: cs = 1709; goto _test_eof - _test_eof1710: cs = 1710; goto _test_eof - _test_eof1711: cs = 1711; goto _test_eof - _test_eof1712: cs = 1712; goto _test_eof - _test_eof1713: cs = 1713; goto _test_eof - _test_eof1714: cs = 1714; goto _test_eof - _test_eof1715: cs = 1715; goto _test_eof - _test_eof1716: cs = 1716; goto _test_eof - _test_eof1717: cs = 1717; goto _test_eof - _test_eof1718: cs = 1718; goto _test_eof - _test_eof1719: cs = 1719; goto _test_eof - _test_eof1720: cs = 1720; goto _test_eof - _test_eof1721: cs = 1721; goto _test_eof - _test_eof1722: cs = 1722; goto _test_eof - _test_eof1723: cs = 1723; goto _test_eof - _test_eof1724: cs = 1724; goto _test_eof - _test_eof1725: cs = 1725; goto _test_eof - _test_eof1726: cs = 1726; goto _test_eof - _test_eof1727: cs = 1727; goto _test_eof - _test_eof1728: cs = 1728; goto _test_eof - _test_eof1729: cs = 1729; goto _test_eof - _test_eof1730: cs = 1730; goto _test_eof - _test_eof1731: cs = 1731; goto _test_eof - _test_eof1732: cs = 1732; goto _test_eof - _test_eof1733: cs = 1733; goto _test_eof - _test_eof1734: cs = 1734; goto _test_eof - _test_eof1735: cs = 1735; goto _test_eof - _test_eof1736: cs = 1736; goto _test_eof - _test_eof1737: cs = 1737; goto _test_eof - _test_eof1738: cs = 1738; goto _test_eof - _test_eof1739: cs = 1739; goto _test_eof - _test_eof1740: cs = 1740; goto _test_eof - _test_eof1741: cs = 1741; goto _test_eof - _test_eof1742: cs = 1742; goto _test_eof - _test_eof1743: cs = 1743; goto _test_eof - _test_eof1744: cs = 1744; goto _test_eof - _test_eof1745: cs = 1745; goto _test_eof - _test_eof1746: cs = 1746; goto _test_eof - _test_eof1747: cs = 1747; goto _test_eof - _test_eof1748: cs = 1748; goto _test_eof - _test_eof1749: cs = 1749; goto _test_eof - _test_eof1750: cs = 1750; goto _test_eof - _test_eof1751: cs = 1751; goto _test_eof - _test_eof1752: cs = 1752; goto _test_eof - _test_eof1753: cs = 1753; goto _test_eof - _test_eof1754: cs = 1754; goto _test_eof - _test_eof1755: cs = 1755; goto _test_eof - _test_eof1756: cs = 1756; goto _test_eof - _test_eof1757: cs = 1757; goto _test_eof - _test_eof1758: cs = 1758; goto _test_eof - _test_eof1759: cs = 1759; goto _test_eof - _test_eof1760: cs = 1760; goto _test_eof - _test_eof1761: cs = 1761; goto _test_eof - _test_eof1762: cs = 1762; goto _test_eof - _test_eof1763: cs = 1763; goto _test_eof - _test_eof1764: cs = 1764; goto _test_eof - _test_eof1765: cs = 1765; goto _test_eof - _test_eof1766: cs = 1766; goto _test_eof - _test_eof1767: cs = 1767; goto _test_eof - _test_eof1768: cs = 1768; goto _test_eof - _test_eof1769: cs = 1769; goto _test_eof - _test_eof1770: cs = 1770; goto _test_eof - _test_eof1771: cs = 1771; goto _test_eof - _test_eof1772: cs = 1772; goto _test_eof - _test_eof1773: cs = 1773; goto _test_eof - _test_eof1774: cs = 1774; goto _test_eof - _test_eof1775: cs = 1775; goto _test_eof - _test_eof1776: cs = 1776; goto _test_eof - _test_eof1777: cs = 1777; goto _test_eof - _test_eof1778: cs = 1778; goto _test_eof - _test_eof1779: cs = 1779; goto _test_eof - _test_eof1780: cs = 1780; goto _test_eof - _test_eof1781: cs = 1781; goto _test_eof - _test_eof1782: cs = 1782; goto _test_eof - _test_eof1783: cs = 1783; goto _test_eof - _test_eof1784: cs = 1784; goto _test_eof - _test_eof1785: cs = 1785; goto _test_eof - _test_eof1786: cs = 1786; goto _test_eof - _test_eof1787: cs = 1787; goto _test_eof - _test_eof1788: cs = 1788; goto _test_eof - _test_eof1789: cs = 1789; goto _test_eof - _test_eof1790: cs = 1790; goto _test_eof - _test_eof1791: cs = 1791; goto _test_eof - _test_eof1792: cs = 1792; goto _test_eof - _test_eof1793: cs = 1793; goto _test_eof - _test_eof1794: cs = 1794; goto _test_eof - _test_eof1795: cs = 1795; goto _test_eof - _test_eof1796: cs = 1796; goto _test_eof - _test_eof1797: cs = 1797; goto _test_eof - _test_eof1798: cs = 1798; goto _test_eof - _test_eof1799: cs = 1799; goto _test_eof - _test_eof1800: cs = 1800; goto _test_eof - _test_eof1801: cs = 1801; goto _test_eof - _test_eof1802: cs = 1802; goto _test_eof - _test_eof1803: cs = 1803; goto _test_eof - _test_eof1804: cs = 1804; goto _test_eof - _test_eof1805: cs = 1805; goto _test_eof - _test_eof1806: cs = 1806; goto _test_eof - _test_eof1807: cs = 1807; goto _test_eof - _test_eof1808: cs = 1808; goto _test_eof - _test_eof1809: cs = 1809; goto _test_eof - _test_eof1810: cs = 1810; goto _test_eof - _test_eof1811: cs = 1811; goto _test_eof - _test_eof1812: cs = 1812; goto _test_eof - _test_eof1813: cs = 1813; goto _test_eof - _test_eof1814: cs = 1814; goto _test_eof - _test_eof1815: cs = 1815; goto _test_eof - _test_eof1816: cs = 1816; goto _test_eof - _test_eof1817: cs = 1817; goto _test_eof - _test_eof1818: cs = 1818; goto _test_eof - _test_eof1819: cs = 1819; goto _test_eof - _test_eof1820: cs = 1820; goto _test_eof - _test_eof1821: cs = 1821; goto _test_eof - _test_eof1822: cs = 1822; goto _test_eof - _test_eof1823: cs = 1823; goto _test_eof - _test_eof1824: cs = 1824; goto _test_eof - _test_eof1825: cs = 1825; goto _test_eof - _test_eof1826: cs = 1826; goto _test_eof - _test_eof1827: cs = 1827; goto _test_eof - _test_eof1828: cs = 1828; goto _test_eof - _test_eof1829: cs = 1829; goto _test_eof - _test_eof1830: cs = 1830; goto _test_eof - _test_eof1831: cs = 1831; goto _test_eof - _test_eof1832: cs = 1832; goto _test_eof - _test_eof1833: cs = 1833; goto _test_eof - _test_eof1834: cs = 1834; goto _test_eof - _test_eof1835: cs = 1835; goto _test_eof - _test_eof1836: cs = 1836; goto _test_eof - _test_eof1837: cs = 1837; goto _test_eof - _test_eof1838: cs = 1838; goto _test_eof - _test_eof1839: cs = 1839; goto _test_eof - _test_eof1840: cs = 1840; goto _test_eof - _test_eof1841: cs = 1841; goto _test_eof - _test_eof1842: cs = 1842; goto _test_eof - _test_eof1843: cs = 1843; goto _test_eof - _test_eof1844: cs = 1844; goto _test_eof - _test_eof1845: cs = 1845; goto _test_eof - _test_eof1846: cs = 1846; goto _test_eof - _test_eof1847: cs = 1847; goto _test_eof - _test_eof1848: cs = 1848; goto _test_eof - _test_eof1849: cs = 1849; goto _test_eof - _test_eof1850: cs = 1850; goto _test_eof - _test_eof1851: cs = 1851; goto _test_eof - _test_eof1852: cs = 1852; goto _test_eof - _test_eof1853: cs = 1853; goto _test_eof - _test_eof1854: cs = 1854; goto _test_eof - _test_eof1855: cs = 1855; goto _test_eof - _test_eof1856: cs = 1856; goto _test_eof - _test_eof1857: cs = 1857; goto _test_eof - _test_eof1858: cs = 1858; goto _test_eof - _test_eof1859: cs = 1859; goto _test_eof - _test_eof1860: cs = 1860; goto _test_eof - _test_eof1861: cs = 1861; goto _test_eof - _test_eof1862: cs = 1862; goto _test_eof - _test_eof1863: cs = 1863; goto _test_eof - _test_eof1864: cs = 1864; goto _test_eof - _test_eof1865: cs = 1865; goto _test_eof - _test_eof1866: cs = 1866; goto _test_eof - _test_eof1867: cs = 1867; goto _test_eof - _test_eof1868: cs = 1868; goto _test_eof - _test_eof1869: cs = 1869; goto _test_eof - _test_eof1870: cs = 1870; goto _test_eof - _test_eof1871: cs = 1871; goto _test_eof - _test_eof1872: cs = 1872; goto _test_eof - _test_eof1873: cs = 1873; goto _test_eof - _test_eof1874: cs = 1874; goto _test_eof - _test_eof1875: cs = 1875; goto _test_eof - _test_eof1876: cs = 1876; goto _test_eof - _test_eof1877: cs = 1877; goto _test_eof - _test_eof1878: cs = 1878; goto _test_eof - _test_eof1879: cs = 1879; goto _test_eof - _test_eof1880: cs = 1880; goto _test_eof - _test_eof1881: cs = 1881; goto _test_eof - _test_eof1882: cs = 1882; goto _test_eof - _test_eof1883: cs = 1883; goto _test_eof - _test_eof1884: cs = 1884; goto _test_eof - _test_eof1885: cs = 1885; goto _test_eof - _test_eof1886: cs = 1886; goto _test_eof - _test_eof1887: cs = 1887; goto _test_eof - _test_eof1888: cs = 1888; goto _test_eof - _test_eof1889: cs = 1889; goto _test_eof - _test_eof1890: cs = 1890; goto _test_eof - _test_eof1891: cs = 1891; goto _test_eof - _test_eof1892: cs = 1892; goto _test_eof - _test_eof1893: cs = 1893; goto _test_eof - _test_eof1894: cs = 1894; goto _test_eof - _test_eof1895: cs = 1895; goto _test_eof - _test_eof1896: cs = 1896; goto _test_eof - _test_eof1897: cs = 1897; goto _test_eof - _test_eof1898: cs = 1898; goto _test_eof - _test_eof1899: cs = 1899; goto _test_eof - _test_eof1900: cs = 1900; goto _test_eof - _test_eof1901: cs = 1901; goto _test_eof - _test_eof1902: cs = 1902; goto _test_eof - _test_eof1903: cs = 1903; goto _test_eof - _test_eof1904: cs = 1904; goto _test_eof - _test_eof1905: cs = 1905; goto _test_eof - _test_eof1906: cs = 1906; goto _test_eof - _test_eof1907: cs = 1907; goto _test_eof - _test_eof1908: cs = 1908; goto _test_eof - _test_eof1909: cs = 1909; goto _test_eof - _test_eof1910: cs = 1910; goto _test_eof - _test_eof1911: cs = 1911; goto _test_eof - _test_eof1912: cs = 1912; goto _test_eof - _test_eof1913: cs = 1913; goto _test_eof - _test_eof1914: cs = 1914; goto _test_eof - _test_eof1915: cs = 1915; goto _test_eof - _test_eof1916: cs = 1916; goto _test_eof - _test_eof1917: cs = 1917; goto _test_eof - _test_eof1918: cs = 1918; goto _test_eof - _test_eof1919: cs = 1919; goto _test_eof - _test_eof1920: cs = 1920; goto _test_eof - _test_eof1921: cs = 1921; goto _test_eof - _test_eof1922: cs = 1922; goto _test_eof - _test_eof1923: cs = 1923; goto _test_eof - _test_eof1924: cs = 1924; goto _test_eof - _test_eof1925: cs = 1925; goto _test_eof - _test_eof1926: cs = 1926; goto _test_eof - _test_eof1927: cs = 1927; goto _test_eof - _test_eof1928: cs = 1928; goto _test_eof - _test_eof1929: cs = 1929; goto _test_eof - _test_eof1930: cs = 1930; goto _test_eof - _test_eof1931: cs = 1931; goto _test_eof - _test_eof1932: cs = 1932; goto _test_eof - _test_eof1933: cs = 1933; goto _test_eof - _test_eof1934: cs = 1934; goto _test_eof - _test_eof1935: cs = 1935; goto _test_eof - _test_eof1936: cs = 1936; goto _test_eof - _test_eof1937: cs = 1937; goto _test_eof - _test_eof1938: cs = 1938; goto _test_eof - _test_eof1939: cs = 1939; goto _test_eof - _test_eof1940: cs = 1940; goto _test_eof - _test_eof1941: cs = 1941; goto _test_eof - _test_eof1942: cs = 1942; goto _test_eof - _test_eof1943: cs = 1943; goto _test_eof - _test_eof1944: cs = 1944; goto _test_eof - _test_eof1945: cs = 1945; goto _test_eof - _test_eof1946: cs = 1946; goto _test_eof - _test_eof1947: cs = 1947; goto _test_eof - _test_eof1948: cs = 1948; goto _test_eof - _test_eof1949: cs = 1949; goto _test_eof - _test_eof1950: cs = 1950; goto _test_eof - _test_eof1951: cs = 1951; goto _test_eof - _test_eof1952: cs = 1952; goto _test_eof - _test_eof1953: cs = 1953; goto _test_eof - _test_eof1954: cs = 1954; goto _test_eof - _test_eof1955: cs = 1955; goto _test_eof - _test_eof1956: cs = 1956; goto _test_eof - _test_eof1957: cs = 1957; goto _test_eof - _test_eof1958: cs = 1958; goto _test_eof - _test_eof1959: cs = 1959; goto _test_eof - _test_eof1960: cs = 1960; goto _test_eof - _test_eof1961: cs = 1961; goto _test_eof - _test_eof1962: cs = 1962; goto _test_eof - _test_eof1963: cs = 1963; goto _test_eof - _test_eof1964: cs = 1964; goto _test_eof - _test_eof1965: cs = 1965; goto _test_eof - _test_eof1966: cs = 1966; goto _test_eof - _test_eof1967: cs = 1967; goto _test_eof - _test_eof1968: cs = 1968; goto _test_eof - _test_eof1969: cs = 1969; goto _test_eof - _test_eof1970: cs = 1970; goto _test_eof - _test_eof1971: cs = 1971; goto _test_eof - _test_eof1972: cs = 1972; goto _test_eof - _test_eof1973: cs = 1973; goto _test_eof - _test_eof1974: cs = 1974; goto _test_eof - _test_eof1975: cs = 1975; goto _test_eof - _test_eof1976: cs = 1976; goto _test_eof - _test_eof1977: cs = 1977; goto _test_eof - _test_eof1978: cs = 1978; goto _test_eof - _test_eof1979: cs = 1979; goto _test_eof - _test_eof1980: cs = 1980; goto _test_eof - _test_eof1981: cs = 1981; goto _test_eof - _test_eof1982: cs = 1982; goto _test_eof - _test_eof1983: cs = 1983; goto _test_eof - _test_eof1984: cs = 1984; goto _test_eof - _test_eof1985: cs = 1985; goto _test_eof - _test_eof1986: cs = 1986; goto _test_eof - _test_eof1987: cs = 1987; goto _test_eof - _test_eof1988: cs = 1988; goto _test_eof - _test_eof1989: cs = 1989; goto _test_eof - _test_eof1990: cs = 1990; goto _test_eof - _test_eof1991: cs = 1991; goto _test_eof - _test_eof1992: cs = 1992; goto _test_eof - _test_eof1993: cs = 1993; goto _test_eof - _test_eof1994: cs = 1994; goto _test_eof - _test_eof1995: cs = 1995; goto _test_eof - _test_eof1996: cs = 1996; goto _test_eof - _test_eof1997: cs = 1997; goto _test_eof - _test_eof1998: cs = 1998; goto _test_eof - _test_eof1999: cs = 1999; goto _test_eof - _test_eof2000: cs = 2000; goto _test_eof - _test_eof2001: cs = 2001; goto _test_eof - _test_eof2002: cs = 2002; goto _test_eof - _test_eof2003: cs = 2003; goto _test_eof - _test_eof2004: cs = 2004; goto _test_eof - _test_eof2005: cs = 2005; goto _test_eof - _test_eof2006: cs = 2006; goto _test_eof - _test_eof2007: cs = 2007; goto _test_eof - _test_eof2008: cs = 2008; goto _test_eof - _test_eof2009: cs = 2009; goto _test_eof - _test_eof2010: cs = 2010; goto _test_eof - _test_eof2011: cs = 2011; goto _test_eof - _test_eof2012: cs = 2012; goto _test_eof - _test_eof2013: cs = 2013; goto _test_eof - _test_eof2014: cs = 2014; goto _test_eof - _test_eof2015: cs = 2015; goto _test_eof - _test_eof2016: cs = 2016; goto _test_eof - _test_eof2017: cs = 2017; goto _test_eof - _test_eof2018: cs = 2018; goto _test_eof - _test_eof2019: cs = 2019; goto _test_eof - _test_eof2020: cs = 2020; goto _test_eof - _test_eof2021: cs = 2021; goto _test_eof - _test_eof2022: cs = 2022; goto _test_eof - _test_eof2023: cs = 2023; goto _test_eof - _test_eof2024: cs = 2024; goto _test_eof - _test_eof2025: cs = 2025; goto _test_eof - _test_eof2026: cs = 2026; goto _test_eof - _test_eof2027: cs = 2027; goto _test_eof - _test_eof2028: cs = 2028; goto _test_eof - _test_eof2029: cs = 2029; goto _test_eof - _test_eof2030: cs = 2030; goto _test_eof - _test_eof2031: cs = 2031; goto _test_eof - _test_eof2032: cs = 2032; goto _test_eof - _test_eof2033: cs = 2033; goto _test_eof - _test_eof2034: cs = 2034; goto _test_eof - _test_eof2035: cs = 2035; goto _test_eof - _test_eof2036: cs = 2036; goto _test_eof - _test_eof2037: cs = 2037; goto _test_eof - _test_eof2038: cs = 2038; goto _test_eof - _test_eof2039: cs = 2039; goto _test_eof - _test_eof2040: cs = 2040; goto _test_eof - _test_eof2041: cs = 2041; goto _test_eof - _test_eof2042: cs = 2042; goto _test_eof - _test_eof2043: cs = 2043; goto _test_eof - _test_eof2044: cs = 2044; goto _test_eof - _test_eof2045: cs = 2045; goto _test_eof - _test_eof2046: cs = 2046; goto _test_eof - _test_eof2047: cs = 2047; goto _test_eof - _test_eof2048: cs = 2048; goto _test_eof - _test_eof2049: cs = 2049; goto _test_eof - _test_eof2050: cs = 2050; goto _test_eof - _test_eof2051: cs = 2051; goto _test_eof - _test_eof2052: cs = 2052; goto _test_eof - _test_eof2053: cs = 2053; goto _test_eof - _test_eof2054: cs = 2054; goto _test_eof - _test_eof2055: cs = 2055; goto _test_eof - _test_eof2056: cs = 2056; goto _test_eof - _test_eof2057: cs = 2057; goto _test_eof - _test_eof2058: cs = 2058; goto _test_eof - _test_eof2059: cs = 2059; goto _test_eof - _test_eof2060: cs = 2060; goto _test_eof - _test_eof2061: cs = 2061; goto _test_eof - _test_eof2062: cs = 2062; goto _test_eof - _test_eof2063: cs = 2063; goto _test_eof - _test_eof2064: cs = 2064; goto _test_eof - _test_eof2065: cs = 2065; goto _test_eof - _test_eof2066: cs = 2066; goto _test_eof - _test_eof2067: cs = 2067; goto _test_eof - _test_eof2068: cs = 2068; goto _test_eof - _test_eof2069: cs = 2069; goto _test_eof - _test_eof2070: cs = 2070; goto _test_eof - _test_eof2071: cs = 2071; goto _test_eof - _test_eof2072: cs = 2072; goto _test_eof - _test_eof2073: cs = 2073; goto _test_eof - _test_eof2074: cs = 2074; goto _test_eof - _test_eof2075: cs = 2075; goto _test_eof - _test_eof2076: cs = 2076; goto _test_eof - _test_eof2077: cs = 2077; goto _test_eof - _test_eof2078: cs = 2078; goto _test_eof - _test_eof2079: cs = 2079; goto _test_eof - _test_eof2080: cs = 2080; goto _test_eof - _test_eof2081: cs = 2081; goto _test_eof - _test_eof2082: cs = 2082; goto _test_eof - _test_eof2083: cs = 2083; goto _test_eof - _test_eof2084: cs = 2084; goto _test_eof - _test_eof2085: cs = 2085; goto _test_eof - _test_eof2086: cs = 2086; goto _test_eof - _test_eof2087: cs = 2087; goto _test_eof - _test_eof2088: cs = 2088; goto _test_eof - _test_eof2089: cs = 2089; goto _test_eof - _test_eof2090: cs = 2090; goto _test_eof - _test_eof2091: cs = 2091; goto _test_eof - _test_eof2092: cs = 2092; goto _test_eof - _test_eof2093: cs = 2093; goto _test_eof - _test_eof2094: cs = 2094; goto _test_eof - _test_eof2095: cs = 2095; goto _test_eof - _test_eof2096: cs = 2096; goto _test_eof - _test_eof2097: cs = 2097; goto _test_eof - _test_eof2098: cs = 2098; goto _test_eof - _test_eof2099: cs = 2099; goto _test_eof - _test_eof2100: cs = 2100; goto _test_eof - _test_eof2101: cs = 2101; goto _test_eof - _test_eof2102: cs = 2102; goto _test_eof - _test_eof2103: cs = 2103; goto _test_eof - _test_eof2104: cs = 2104; goto _test_eof - _test_eof2105: cs = 2105; goto _test_eof - _test_eof2106: cs = 2106; goto _test_eof - _test_eof2107: cs = 2107; goto _test_eof - _test_eof2108: cs = 2108; goto _test_eof - _test_eof2109: cs = 2109; goto _test_eof - _test_eof2110: cs = 2110; goto _test_eof - _test_eof2111: cs = 2111; goto _test_eof - _test_eof2112: cs = 2112; goto _test_eof - _test_eof2113: cs = 2113; goto _test_eof - _test_eof2114: cs = 2114; goto _test_eof - _test_eof2115: cs = 2115; goto _test_eof - _test_eof2116: cs = 2116; goto _test_eof - _test_eof2117: cs = 2117; goto _test_eof - _test_eof2118: cs = 2118; goto _test_eof - _test_eof2119: cs = 2119; goto _test_eof - _test_eof2120: cs = 2120; goto _test_eof - _test_eof2121: cs = 2121; goto _test_eof - _test_eof2122: cs = 2122; goto _test_eof - _test_eof2123: cs = 2123; goto _test_eof - _test_eof2124: cs = 2124; goto _test_eof - _test_eof2125: cs = 2125; goto _test_eof - _test_eof2126: cs = 2126; goto _test_eof - _test_eof2127: cs = 2127; goto _test_eof - _test_eof2128: cs = 2128; goto _test_eof - _test_eof2129: cs = 2129; goto _test_eof - _test_eof2130: cs = 2130; goto _test_eof - _test_eof2131: cs = 2131; goto _test_eof - _test_eof2132: cs = 2132; goto _test_eof - _test_eof2133: cs = 2133; goto _test_eof - _test_eof2134: cs = 2134; goto _test_eof - _test_eof2135: cs = 2135; goto _test_eof - _test_eof2136: cs = 2136; goto _test_eof - _test_eof2137: cs = 2137; goto _test_eof - _test_eof2138: cs = 2138; goto _test_eof - _test_eof2139: cs = 2139; goto _test_eof - _test_eof2140: cs = 2140; goto _test_eof - _test_eof2141: cs = 2141; goto _test_eof - _test_eof2142: cs = 2142; goto _test_eof - _test_eof2143: cs = 2143; goto _test_eof - _test_eof2144: cs = 2144; goto _test_eof - _test_eof2145: cs = 2145; goto _test_eof - _test_eof2146: cs = 2146; goto _test_eof - _test_eof2147: cs = 2147; goto _test_eof - _test_eof2148: cs = 2148; goto _test_eof - _test_eof2149: cs = 2149; goto _test_eof - _test_eof2150: cs = 2150; goto _test_eof - _test_eof2151: cs = 2151; goto _test_eof - _test_eof2152: cs = 2152; goto _test_eof - _test_eof2153: cs = 2153; goto _test_eof - _test_eof2154: cs = 2154; goto _test_eof - _test_eof2155: cs = 2155; goto _test_eof - _test_eof2156: cs = 2156; goto _test_eof - _test_eof2157: cs = 2157; goto _test_eof - _test_eof2158: cs = 2158; goto _test_eof - _test_eof2159: cs = 2159; goto _test_eof - _test_eof2160: cs = 2160; goto _test_eof - _test_eof2161: cs = 2161; goto _test_eof - _test_eof2162: cs = 2162; goto _test_eof - _test_eof2163: cs = 2163; goto _test_eof - _test_eof2164: cs = 2164; goto _test_eof - _test_eof2165: cs = 2165; goto _test_eof - _test_eof2166: cs = 2166; goto _test_eof - _test_eof2167: cs = 2167; goto _test_eof - _test_eof2168: cs = 2168; goto _test_eof - _test_eof2169: cs = 2169; goto _test_eof - _test_eof2170: cs = 2170; goto _test_eof - _test_eof2171: cs = 2171; goto _test_eof - _test_eof2172: cs = 2172; goto _test_eof - _test_eof2173: cs = 2173; goto _test_eof - _test_eof2174: cs = 2174; goto _test_eof - _test_eof2175: cs = 2175; goto _test_eof - _test_eof2176: cs = 2176; goto _test_eof - _test_eof2177: cs = 2177; goto _test_eof - _test_eof2178: cs = 2178; goto _test_eof - _test_eof2179: cs = 2179; goto _test_eof - _test_eof2180: cs = 2180; goto _test_eof - _test_eof2181: cs = 2181; goto _test_eof - _test_eof2182: cs = 2182; goto _test_eof - _test_eof2183: cs = 2183; goto _test_eof - _test_eof2184: cs = 2184; goto _test_eof - _test_eof2185: cs = 2185; goto _test_eof - _test_eof2186: cs = 2186; goto _test_eof - _test_eof2187: cs = 2187; goto _test_eof - _test_eof2188: cs = 2188; goto _test_eof - _test_eof2189: cs = 2189; goto _test_eof - _test_eof2190: cs = 2190; goto _test_eof - _test_eof2191: cs = 2191; goto _test_eof - _test_eof2192: cs = 2192; goto _test_eof - _test_eof4874: cs = 4874; goto _test_eof - _test_eof2193: cs = 2193; goto _test_eof - _test_eof2194: cs = 2194; goto _test_eof - _test_eof2195: cs = 2195; goto _test_eof - _test_eof2196: cs = 2196; goto _test_eof - _test_eof2197: cs = 2197; goto _test_eof - _test_eof2198: cs = 2198; goto _test_eof - _test_eof2199: cs = 2199; goto _test_eof - _test_eof2200: cs = 2200; goto _test_eof - _test_eof2201: cs = 2201; goto _test_eof - _test_eof2202: cs = 2202; goto _test_eof - _test_eof2203: cs = 2203; goto _test_eof - _test_eof2204: cs = 2204; goto _test_eof - _test_eof2205: cs = 2205; goto _test_eof - _test_eof2206: cs = 2206; goto _test_eof - _test_eof2207: cs = 2207; goto _test_eof - _test_eof2208: cs = 2208; goto _test_eof - _test_eof2209: cs = 2209; goto _test_eof - _test_eof2210: cs = 2210; goto _test_eof - _test_eof2211: cs = 2211; goto _test_eof - _test_eof2212: cs = 2212; goto _test_eof - _test_eof2213: cs = 2213; goto _test_eof - _test_eof2214: cs = 2214; goto _test_eof - _test_eof2215: cs = 2215; goto _test_eof - _test_eof2216: cs = 2216; goto _test_eof - _test_eof2217: cs = 2217; goto _test_eof - _test_eof2218: cs = 2218; goto _test_eof - _test_eof2219: cs = 2219; goto _test_eof - _test_eof2220: cs = 2220; goto _test_eof - _test_eof2221: cs = 2221; goto _test_eof - _test_eof2222: cs = 2222; goto _test_eof - _test_eof2223: cs = 2223; goto _test_eof - _test_eof2224: cs = 2224; goto _test_eof - _test_eof2225: cs = 2225; goto _test_eof - _test_eof2226: cs = 2226; goto _test_eof - _test_eof2227: cs = 2227; goto _test_eof - _test_eof2228: cs = 2228; goto _test_eof - _test_eof2229: cs = 2229; goto _test_eof - _test_eof2230: cs = 2230; goto _test_eof - _test_eof2231: cs = 2231; goto _test_eof - _test_eof2232: cs = 2232; goto _test_eof - _test_eof2233: cs = 2233; goto _test_eof - _test_eof2234: cs = 2234; goto _test_eof - _test_eof2235: cs = 2235; goto _test_eof - _test_eof2236: cs = 2236; goto _test_eof - _test_eof2237: cs = 2237; goto _test_eof - _test_eof2238: cs = 2238; goto _test_eof - _test_eof2239: cs = 2239; goto _test_eof - _test_eof2240: cs = 2240; goto _test_eof - _test_eof2241: cs = 2241; goto _test_eof - _test_eof2242: cs = 2242; goto _test_eof - _test_eof2243: cs = 2243; goto _test_eof - _test_eof2244: cs = 2244; goto _test_eof - _test_eof2245: cs = 2245; goto _test_eof - _test_eof2246: cs = 2246; goto _test_eof - _test_eof2247: cs = 2247; goto _test_eof - _test_eof2248: cs = 2248; goto _test_eof - _test_eof2249: cs = 2249; goto _test_eof - _test_eof2250: cs = 2250; goto _test_eof - _test_eof2251: cs = 2251; goto _test_eof - _test_eof2252: cs = 2252; goto _test_eof - _test_eof2253: cs = 2253; goto _test_eof - _test_eof2254: cs = 2254; goto _test_eof - _test_eof2255: cs = 2255; goto _test_eof - _test_eof2256: cs = 2256; goto _test_eof - _test_eof2257: cs = 2257; goto _test_eof - _test_eof2258: cs = 2258; goto _test_eof - _test_eof2259: cs = 2259; goto _test_eof - _test_eof2260: cs = 2260; goto _test_eof - _test_eof2261: cs = 2261; goto _test_eof - _test_eof2262: cs = 2262; goto _test_eof - _test_eof2263: cs = 2263; goto _test_eof - _test_eof2264: cs = 2264; goto _test_eof - _test_eof2265: cs = 2265; goto _test_eof - _test_eof2266: cs = 2266; goto _test_eof - _test_eof2267: cs = 2267; goto _test_eof - _test_eof2268: cs = 2268; goto _test_eof - _test_eof2269: cs = 2269; goto _test_eof - _test_eof2270: cs = 2270; goto _test_eof - _test_eof2271: cs = 2271; goto _test_eof - _test_eof2272: cs = 2272; goto _test_eof - _test_eof2273: cs = 2273; goto _test_eof - _test_eof2274: cs = 2274; goto _test_eof - _test_eof2275: cs = 2275; goto _test_eof - _test_eof2276: cs = 2276; goto _test_eof - _test_eof2277: cs = 2277; goto _test_eof - _test_eof2278: cs = 2278; goto _test_eof - _test_eof2279: cs = 2279; goto _test_eof - _test_eof2280: cs = 2280; goto _test_eof - _test_eof2281: cs = 2281; goto _test_eof - _test_eof2282: cs = 2282; goto _test_eof - _test_eof2283: cs = 2283; goto _test_eof - _test_eof2284: cs = 2284; goto _test_eof - _test_eof2285: cs = 2285; goto _test_eof - _test_eof2286: cs = 2286; goto _test_eof - _test_eof2287: cs = 2287; goto _test_eof - _test_eof2288: cs = 2288; goto _test_eof - _test_eof2289: cs = 2289; goto _test_eof - _test_eof2290: cs = 2290; goto _test_eof - _test_eof2291: cs = 2291; goto _test_eof - _test_eof2292: cs = 2292; goto _test_eof - _test_eof2293: cs = 2293; goto _test_eof - _test_eof2294: cs = 2294; goto _test_eof - _test_eof2295: cs = 2295; goto _test_eof - _test_eof2296: cs = 2296; goto _test_eof - _test_eof2297: cs = 2297; goto _test_eof - _test_eof2298: cs = 2298; goto _test_eof - _test_eof2299: cs = 2299; goto _test_eof - _test_eof2300: cs = 2300; goto _test_eof - _test_eof2301: cs = 2301; goto _test_eof - _test_eof2302: cs = 2302; goto _test_eof - _test_eof2303: cs = 2303; goto _test_eof - _test_eof2304: cs = 2304; goto _test_eof - _test_eof2305: cs = 2305; goto _test_eof - _test_eof2306: cs = 2306; goto _test_eof - _test_eof2307: cs = 2307; goto _test_eof - _test_eof2308: cs = 2308; goto _test_eof - _test_eof2309: cs = 2309; goto _test_eof - _test_eof2310: cs = 2310; goto _test_eof - _test_eof2311: cs = 2311; goto _test_eof - _test_eof2312: cs = 2312; goto _test_eof - _test_eof2313: cs = 2313; goto _test_eof - _test_eof2314: cs = 2314; goto _test_eof - _test_eof2315: cs = 2315; goto _test_eof - _test_eof2316: cs = 2316; goto _test_eof - _test_eof2317: cs = 2317; goto _test_eof - _test_eof2318: cs = 2318; goto _test_eof - _test_eof2319: cs = 2319; goto _test_eof - _test_eof2320: cs = 2320; goto _test_eof - _test_eof2321: cs = 2321; goto _test_eof - _test_eof2322: cs = 2322; goto _test_eof - _test_eof2323: cs = 2323; goto _test_eof - _test_eof2324: cs = 2324; goto _test_eof - _test_eof2325: cs = 2325; goto _test_eof - _test_eof2326: cs = 2326; goto _test_eof - _test_eof2327: cs = 2327; goto _test_eof - _test_eof2328: cs = 2328; goto _test_eof - _test_eof2329: cs = 2329; goto _test_eof - _test_eof2330: cs = 2330; goto _test_eof - _test_eof2331: cs = 2331; goto _test_eof - _test_eof2332: cs = 2332; goto _test_eof - _test_eof2333: cs = 2333; goto _test_eof - _test_eof2334: cs = 2334; goto _test_eof - _test_eof2335: cs = 2335; goto _test_eof - _test_eof2336: cs = 2336; goto _test_eof - _test_eof2337: cs = 2337; goto _test_eof - _test_eof2338: cs = 2338; goto _test_eof - _test_eof2339: cs = 2339; goto _test_eof - _test_eof4875: cs = 4875; goto _test_eof - _test_eof4876: cs = 4876; goto _test_eof - _test_eof2340: cs = 2340; goto _test_eof - _test_eof2341: cs = 2341; goto _test_eof - _test_eof2342: cs = 2342; goto _test_eof - _test_eof2343: cs = 2343; goto _test_eof - _test_eof2344: cs = 2344; goto _test_eof - _test_eof2345: cs = 2345; goto _test_eof - _test_eof2346: cs = 2346; goto _test_eof - _test_eof2347: cs = 2347; goto _test_eof - _test_eof2348: cs = 2348; goto _test_eof - _test_eof2349: cs = 2349; goto _test_eof - _test_eof2350: cs = 2350; goto _test_eof - _test_eof2351: cs = 2351; goto _test_eof - _test_eof2352: cs = 2352; goto _test_eof - _test_eof2353: cs = 2353; goto _test_eof - _test_eof2354: cs = 2354; goto _test_eof - _test_eof2355: cs = 2355; goto _test_eof - _test_eof2356: cs = 2356; goto _test_eof - _test_eof2357: cs = 2357; goto _test_eof - _test_eof2358: cs = 2358; goto _test_eof - _test_eof2359: cs = 2359; goto _test_eof - _test_eof2360: cs = 2360; goto _test_eof - _test_eof2361: cs = 2361; goto _test_eof - _test_eof2362: cs = 2362; goto _test_eof - _test_eof2363: cs = 2363; goto _test_eof - _test_eof2364: cs = 2364; goto _test_eof - _test_eof2365: cs = 2365; goto _test_eof - _test_eof2366: cs = 2366; goto _test_eof - _test_eof2367: cs = 2367; goto _test_eof - _test_eof2368: cs = 2368; goto _test_eof - _test_eof2369: cs = 2369; goto _test_eof - _test_eof2370: cs = 2370; goto _test_eof - _test_eof2371: cs = 2371; goto _test_eof - _test_eof2372: cs = 2372; goto _test_eof - _test_eof2373: cs = 2373; goto _test_eof - _test_eof2374: cs = 2374; goto _test_eof - _test_eof2375: cs = 2375; goto _test_eof - _test_eof2376: cs = 2376; goto _test_eof - _test_eof2377: cs = 2377; goto _test_eof - _test_eof2378: cs = 2378; goto _test_eof - _test_eof2379: cs = 2379; goto _test_eof - _test_eof2380: cs = 2380; goto _test_eof - _test_eof2381: cs = 2381; goto _test_eof - _test_eof2382: cs = 2382; goto _test_eof - _test_eof2383: cs = 2383; goto _test_eof - _test_eof2384: cs = 2384; goto _test_eof - _test_eof2385: cs = 2385; goto _test_eof - _test_eof2386: cs = 2386; goto _test_eof - _test_eof2387: cs = 2387; goto _test_eof - _test_eof2388: cs = 2388; goto _test_eof - _test_eof2389: cs = 2389; goto _test_eof - _test_eof2390: cs = 2390; goto _test_eof - _test_eof2391: cs = 2391; goto _test_eof - _test_eof2392: cs = 2392; goto _test_eof - _test_eof2393: cs = 2393; goto _test_eof - _test_eof2394: cs = 2394; goto _test_eof - _test_eof2395: cs = 2395; goto _test_eof - _test_eof2396: cs = 2396; goto _test_eof - _test_eof2397: cs = 2397; goto _test_eof - _test_eof2398: cs = 2398; goto _test_eof - _test_eof2399: cs = 2399; goto _test_eof - _test_eof2400: cs = 2400; goto _test_eof - _test_eof2401: cs = 2401; goto _test_eof - _test_eof2402: cs = 2402; goto _test_eof - _test_eof2403: cs = 2403; goto _test_eof - _test_eof2404: cs = 2404; goto _test_eof - _test_eof2405: cs = 2405; goto _test_eof - _test_eof2406: cs = 2406; goto _test_eof - _test_eof2407: cs = 2407; goto _test_eof - _test_eof2408: cs = 2408; goto _test_eof - _test_eof2409: cs = 2409; goto _test_eof - _test_eof2410: cs = 2410; goto _test_eof - _test_eof2411: cs = 2411; goto _test_eof - _test_eof2412: cs = 2412; goto _test_eof - _test_eof2413: cs = 2413; goto _test_eof - _test_eof2414: cs = 2414; goto _test_eof - _test_eof2415: cs = 2415; goto _test_eof - _test_eof2416: cs = 2416; goto _test_eof - _test_eof2417: cs = 2417; goto _test_eof - _test_eof2418: cs = 2418; goto _test_eof - _test_eof2419: cs = 2419; goto _test_eof - _test_eof2420: cs = 2420; goto _test_eof - _test_eof2421: cs = 2421; goto _test_eof - _test_eof2422: cs = 2422; goto _test_eof - _test_eof2423: cs = 2423; goto _test_eof - _test_eof2424: cs = 2424; goto _test_eof - _test_eof2425: cs = 2425; goto _test_eof - _test_eof2426: cs = 2426; goto _test_eof - _test_eof2427: cs = 2427; goto _test_eof - _test_eof2428: cs = 2428; goto _test_eof - _test_eof2429: cs = 2429; goto _test_eof - _test_eof2430: cs = 2430; goto _test_eof - _test_eof2431: cs = 2431; goto _test_eof - _test_eof2432: cs = 2432; goto _test_eof - _test_eof2433: cs = 2433; goto _test_eof - _test_eof2434: cs = 2434; goto _test_eof - _test_eof2435: cs = 2435; goto _test_eof - _test_eof2436: cs = 2436; goto _test_eof - _test_eof2437: cs = 2437; goto _test_eof - _test_eof2438: cs = 2438; goto _test_eof - _test_eof2439: cs = 2439; goto _test_eof - _test_eof2440: cs = 2440; goto _test_eof - _test_eof2441: cs = 2441; goto _test_eof - _test_eof2442: cs = 2442; goto _test_eof - _test_eof2443: cs = 2443; goto _test_eof - _test_eof2444: cs = 2444; goto _test_eof - _test_eof2445: cs = 2445; goto _test_eof - _test_eof2446: cs = 2446; goto _test_eof - _test_eof2447: cs = 2447; goto _test_eof - _test_eof2448: cs = 2448; goto _test_eof - _test_eof2449: cs = 2449; goto _test_eof - _test_eof2450: cs = 2450; goto _test_eof - _test_eof2451: cs = 2451; goto _test_eof - _test_eof2452: cs = 2452; goto _test_eof - _test_eof2453: cs = 2453; goto _test_eof - _test_eof2454: cs = 2454; goto _test_eof - _test_eof2455: cs = 2455; goto _test_eof - _test_eof2456: cs = 2456; goto _test_eof - _test_eof2457: cs = 2457; goto _test_eof - _test_eof2458: cs = 2458; goto _test_eof - _test_eof2459: cs = 2459; goto _test_eof - _test_eof2460: cs = 2460; goto _test_eof - _test_eof2461: cs = 2461; goto _test_eof - _test_eof2462: cs = 2462; goto _test_eof - _test_eof2463: cs = 2463; goto _test_eof - _test_eof2464: cs = 2464; goto _test_eof - _test_eof2465: cs = 2465; goto _test_eof - _test_eof2466: cs = 2466; goto _test_eof - _test_eof2467: cs = 2467; goto _test_eof - _test_eof2468: cs = 2468; goto _test_eof - _test_eof2469: cs = 2469; goto _test_eof - _test_eof2470: cs = 2470; goto _test_eof - _test_eof2471: cs = 2471; goto _test_eof - _test_eof2472: cs = 2472; goto _test_eof - _test_eof2473: cs = 2473; goto _test_eof - _test_eof2474: cs = 2474; goto _test_eof - _test_eof2475: cs = 2475; goto _test_eof - _test_eof2476: cs = 2476; goto _test_eof - _test_eof2477: cs = 2477; goto _test_eof - _test_eof2478: cs = 2478; goto _test_eof - _test_eof2479: cs = 2479; goto _test_eof - _test_eof2480: cs = 2480; goto _test_eof - _test_eof2481: cs = 2481; goto _test_eof - _test_eof2482: cs = 2482; goto _test_eof - _test_eof2483: cs = 2483; goto _test_eof - _test_eof2484: cs = 2484; goto _test_eof - _test_eof2485: cs = 2485; goto _test_eof - _test_eof2486: cs = 2486; goto _test_eof - _test_eof2487: cs = 2487; goto _test_eof - _test_eof2488: cs = 2488; goto _test_eof - _test_eof2489: cs = 2489; goto _test_eof - _test_eof2490: cs = 2490; goto _test_eof - _test_eof2491: cs = 2491; goto _test_eof - _test_eof2492: cs = 2492; goto _test_eof - _test_eof2493: cs = 2493; goto _test_eof - _test_eof2494: cs = 2494; goto _test_eof - _test_eof2495: cs = 2495; goto _test_eof - _test_eof2496: cs = 2496; goto _test_eof - _test_eof2497: cs = 2497; goto _test_eof - _test_eof2498: cs = 2498; goto _test_eof - _test_eof2499: cs = 2499; goto _test_eof - _test_eof2500: cs = 2500; goto _test_eof - _test_eof2501: cs = 2501; goto _test_eof - _test_eof2502: cs = 2502; goto _test_eof - _test_eof2503: cs = 2503; goto _test_eof - _test_eof2504: cs = 2504; goto _test_eof - _test_eof2505: cs = 2505; goto _test_eof - _test_eof2506: cs = 2506; goto _test_eof - _test_eof2507: cs = 2507; goto _test_eof - _test_eof2508: cs = 2508; goto _test_eof - _test_eof2509: cs = 2509; goto _test_eof - _test_eof2510: cs = 2510; goto _test_eof - _test_eof2511: cs = 2511; goto _test_eof - _test_eof2512: cs = 2512; goto _test_eof - _test_eof2513: cs = 2513; goto _test_eof - _test_eof2514: cs = 2514; goto _test_eof - _test_eof2515: cs = 2515; goto _test_eof - _test_eof2516: cs = 2516; goto _test_eof - _test_eof2517: cs = 2517; goto _test_eof - _test_eof2518: cs = 2518; goto _test_eof - _test_eof2519: cs = 2519; goto _test_eof - _test_eof2520: cs = 2520; goto _test_eof - _test_eof2521: cs = 2521; goto _test_eof - _test_eof2522: cs = 2522; goto _test_eof - _test_eof2523: cs = 2523; goto _test_eof - _test_eof2524: cs = 2524; goto _test_eof - _test_eof2525: cs = 2525; goto _test_eof - _test_eof2526: cs = 2526; goto _test_eof - _test_eof2527: cs = 2527; goto _test_eof - _test_eof2528: cs = 2528; goto _test_eof - _test_eof2529: cs = 2529; goto _test_eof - _test_eof2530: cs = 2530; goto _test_eof - _test_eof2531: cs = 2531; goto _test_eof - _test_eof2532: cs = 2532; goto _test_eof - _test_eof2533: cs = 2533; goto _test_eof - _test_eof2534: cs = 2534; goto _test_eof - _test_eof2535: cs = 2535; goto _test_eof - _test_eof2536: cs = 2536; goto _test_eof - _test_eof2537: cs = 2537; goto _test_eof - _test_eof2538: cs = 2538; goto _test_eof - _test_eof2539: cs = 2539; goto _test_eof - _test_eof2540: cs = 2540; goto _test_eof - _test_eof2541: cs = 2541; goto _test_eof - _test_eof2542: cs = 2542; goto _test_eof - _test_eof2543: cs = 2543; goto _test_eof - _test_eof2544: cs = 2544; goto _test_eof - _test_eof2545: cs = 2545; goto _test_eof - _test_eof2546: cs = 2546; goto _test_eof - _test_eof2547: cs = 2547; goto _test_eof - _test_eof2548: cs = 2548; goto _test_eof - _test_eof2549: cs = 2549; goto _test_eof - _test_eof2550: cs = 2550; goto _test_eof - _test_eof2551: cs = 2551; goto _test_eof - _test_eof2552: cs = 2552; goto _test_eof - _test_eof2553: cs = 2553; goto _test_eof - _test_eof2554: cs = 2554; goto _test_eof - _test_eof2555: cs = 2555; goto _test_eof - _test_eof2556: cs = 2556; goto _test_eof - _test_eof2557: cs = 2557; goto _test_eof - _test_eof2558: cs = 2558; goto _test_eof - _test_eof2559: cs = 2559; goto _test_eof - _test_eof2560: cs = 2560; goto _test_eof - _test_eof2561: cs = 2561; goto _test_eof - _test_eof2562: cs = 2562; goto _test_eof - _test_eof2563: cs = 2563; goto _test_eof - _test_eof2564: cs = 2564; goto _test_eof - _test_eof2565: cs = 2565; goto _test_eof - _test_eof2566: cs = 2566; goto _test_eof - _test_eof2567: cs = 2567; goto _test_eof - _test_eof2568: cs = 2568; goto _test_eof - _test_eof2569: cs = 2569; goto _test_eof - _test_eof2570: cs = 2570; goto _test_eof - _test_eof2571: cs = 2571; goto _test_eof - _test_eof2572: cs = 2572; goto _test_eof - _test_eof2573: cs = 2573; goto _test_eof - _test_eof2574: cs = 2574; goto _test_eof - _test_eof2575: cs = 2575; goto _test_eof - _test_eof2576: cs = 2576; goto _test_eof - _test_eof2577: cs = 2577; goto _test_eof - _test_eof2578: cs = 2578; goto _test_eof - _test_eof2579: cs = 2579; goto _test_eof - _test_eof2580: cs = 2580; goto _test_eof - _test_eof2581: cs = 2581; goto _test_eof - _test_eof2582: cs = 2582; goto _test_eof - _test_eof2583: cs = 2583; goto _test_eof - _test_eof2584: cs = 2584; goto _test_eof - _test_eof2585: cs = 2585; goto _test_eof - _test_eof2586: cs = 2586; goto _test_eof - _test_eof2587: cs = 2587; goto _test_eof - _test_eof2588: cs = 2588; goto _test_eof - _test_eof2589: cs = 2589; goto _test_eof - _test_eof2590: cs = 2590; goto _test_eof - _test_eof2591: cs = 2591; goto _test_eof - _test_eof2592: cs = 2592; goto _test_eof - _test_eof2593: cs = 2593; goto _test_eof - _test_eof2594: cs = 2594; goto _test_eof - _test_eof2595: cs = 2595; goto _test_eof - _test_eof2596: cs = 2596; goto _test_eof - _test_eof2597: cs = 2597; goto _test_eof - _test_eof2598: cs = 2598; goto _test_eof - _test_eof2599: cs = 2599; goto _test_eof - _test_eof2600: cs = 2600; goto _test_eof - _test_eof2601: cs = 2601; goto _test_eof - _test_eof2602: cs = 2602; goto _test_eof - _test_eof2603: cs = 2603; goto _test_eof - _test_eof2604: cs = 2604; goto _test_eof - _test_eof2605: cs = 2605; goto _test_eof - _test_eof2606: cs = 2606; goto _test_eof - _test_eof2607: cs = 2607; goto _test_eof - _test_eof2608: cs = 2608; goto _test_eof - _test_eof2609: cs = 2609; goto _test_eof - _test_eof2610: cs = 2610; goto _test_eof - _test_eof2611: cs = 2611; goto _test_eof - _test_eof2612: cs = 2612; goto _test_eof - _test_eof2613: cs = 2613; goto _test_eof - _test_eof2614: cs = 2614; goto _test_eof - _test_eof2615: cs = 2615; goto _test_eof - _test_eof2616: cs = 2616; goto _test_eof - _test_eof2617: cs = 2617; goto _test_eof - _test_eof2618: cs = 2618; goto _test_eof - _test_eof2619: cs = 2619; goto _test_eof - _test_eof2620: cs = 2620; goto _test_eof - _test_eof2621: cs = 2621; goto _test_eof - _test_eof2622: cs = 2622; goto _test_eof - _test_eof2623: cs = 2623; goto _test_eof - _test_eof2624: cs = 2624; goto _test_eof - _test_eof2625: cs = 2625; goto _test_eof - _test_eof2626: cs = 2626; goto _test_eof - _test_eof2627: cs = 2627; goto _test_eof - _test_eof2628: cs = 2628; goto _test_eof - _test_eof2629: cs = 2629; goto _test_eof - _test_eof2630: cs = 2630; goto _test_eof - _test_eof2631: cs = 2631; goto _test_eof - _test_eof2632: cs = 2632; goto _test_eof - _test_eof2633: cs = 2633; goto _test_eof - _test_eof2634: cs = 2634; goto _test_eof - _test_eof2635: cs = 2635; goto _test_eof - _test_eof4877: cs = 4877; goto _test_eof - _test_eof4878: cs = 4878; goto _test_eof - _test_eof2636: cs = 2636; goto _test_eof - _test_eof2637: cs = 2637; goto _test_eof - _test_eof2638: cs = 2638; goto _test_eof - _test_eof2639: cs = 2639; goto _test_eof - _test_eof2640: cs = 2640; goto _test_eof - _test_eof2641: cs = 2641; goto _test_eof - _test_eof2642: cs = 2642; goto _test_eof - _test_eof2643: cs = 2643; goto _test_eof - _test_eof2644: cs = 2644; goto _test_eof - _test_eof2645: cs = 2645; goto _test_eof - _test_eof2646: cs = 2646; goto _test_eof - _test_eof2647: cs = 2647; goto _test_eof - _test_eof2648: cs = 2648; goto _test_eof - _test_eof2649: cs = 2649; goto _test_eof - _test_eof2650: cs = 2650; goto _test_eof - _test_eof2651: cs = 2651; goto _test_eof - _test_eof2652: cs = 2652; goto _test_eof - _test_eof2653: cs = 2653; goto _test_eof - _test_eof2654: cs = 2654; goto _test_eof - _test_eof2655: cs = 2655; goto _test_eof - _test_eof2656: cs = 2656; goto _test_eof - _test_eof2657: cs = 2657; goto _test_eof - _test_eof2658: cs = 2658; goto _test_eof - _test_eof2659: cs = 2659; goto _test_eof - _test_eof2660: cs = 2660; goto _test_eof - _test_eof2661: cs = 2661; goto _test_eof - _test_eof2662: cs = 2662; goto _test_eof - _test_eof2663: cs = 2663; goto _test_eof - _test_eof2664: cs = 2664; goto _test_eof - _test_eof2665: cs = 2665; goto _test_eof - _test_eof2666: cs = 2666; goto _test_eof - _test_eof2667: cs = 2667; goto _test_eof - _test_eof2668: cs = 2668; goto _test_eof - _test_eof2669: cs = 2669; goto _test_eof - _test_eof2670: cs = 2670; goto _test_eof - _test_eof2671: cs = 2671; goto _test_eof - _test_eof2672: cs = 2672; goto _test_eof - _test_eof2673: cs = 2673; goto _test_eof - _test_eof2674: cs = 2674; goto _test_eof - _test_eof2675: cs = 2675; goto _test_eof - _test_eof2676: cs = 2676; goto _test_eof - _test_eof2677: cs = 2677; goto _test_eof - _test_eof2678: cs = 2678; goto _test_eof - _test_eof2679: cs = 2679; goto _test_eof - _test_eof2680: cs = 2680; goto _test_eof - _test_eof2681: cs = 2681; goto _test_eof - _test_eof2682: cs = 2682; goto _test_eof - _test_eof2683: cs = 2683; goto _test_eof - _test_eof2684: cs = 2684; goto _test_eof - _test_eof2685: cs = 2685; goto _test_eof - _test_eof2686: cs = 2686; goto _test_eof - _test_eof2687: cs = 2687; goto _test_eof - _test_eof2688: cs = 2688; goto _test_eof - _test_eof2689: cs = 2689; goto _test_eof - _test_eof2690: cs = 2690; goto _test_eof - _test_eof2691: cs = 2691; goto _test_eof - _test_eof2692: cs = 2692; goto _test_eof - _test_eof2693: cs = 2693; goto _test_eof - _test_eof2694: cs = 2694; goto _test_eof - _test_eof2695: cs = 2695; goto _test_eof - _test_eof2696: cs = 2696; goto _test_eof - _test_eof2697: cs = 2697; goto _test_eof - _test_eof2698: cs = 2698; goto _test_eof - _test_eof2699: cs = 2699; goto _test_eof - _test_eof2700: cs = 2700; goto _test_eof - _test_eof2701: cs = 2701; goto _test_eof - _test_eof2702: cs = 2702; goto _test_eof - _test_eof2703: cs = 2703; goto _test_eof - _test_eof2704: cs = 2704; goto _test_eof - _test_eof2705: cs = 2705; goto _test_eof - _test_eof2706: cs = 2706; goto _test_eof - _test_eof2707: cs = 2707; goto _test_eof - _test_eof2708: cs = 2708; goto _test_eof - _test_eof2709: cs = 2709; goto _test_eof - _test_eof2710: cs = 2710; goto _test_eof - _test_eof2711: cs = 2711; goto _test_eof - _test_eof2712: cs = 2712; goto _test_eof - _test_eof2713: cs = 2713; goto _test_eof - _test_eof2714: cs = 2714; goto _test_eof - _test_eof2715: cs = 2715; goto _test_eof - _test_eof2716: cs = 2716; goto _test_eof - _test_eof2717: cs = 2717; goto _test_eof - _test_eof2718: cs = 2718; goto _test_eof - _test_eof2719: cs = 2719; goto _test_eof - _test_eof2720: cs = 2720; goto _test_eof - _test_eof2721: cs = 2721; goto _test_eof - _test_eof2722: cs = 2722; goto _test_eof - _test_eof2723: cs = 2723; goto _test_eof - _test_eof2724: cs = 2724; goto _test_eof - _test_eof2725: cs = 2725; goto _test_eof - _test_eof2726: cs = 2726; goto _test_eof - _test_eof2727: cs = 2727; goto _test_eof - _test_eof2728: cs = 2728; goto _test_eof - _test_eof2729: cs = 2729; goto _test_eof - _test_eof2730: cs = 2730; goto _test_eof - _test_eof2731: cs = 2731; goto _test_eof - _test_eof2732: cs = 2732; goto _test_eof - _test_eof2733: cs = 2733; goto _test_eof - _test_eof2734: cs = 2734; goto _test_eof - _test_eof2735: cs = 2735; goto _test_eof - _test_eof2736: cs = 2736; goto _test_eof - _test_eof2737: cs = 2737; goto _test_eof - _test_eof2738: cs = 2738; goto _test_eof - _test_eof2739: cs = 2739; goto _test_eof - _test_eof2740: cs = 2740; goto _test_eof - _test_eof2741: cs = 2741; goto _test_eof - _test_eof2742: cs = 2742; goto _test_eof - _test_eof2743: cs = 2743; goto _test_eof - _test_eof2744: cs = 2744; goto _test_eof - _test_eof2745: cs = 2745; goto _test_eof - _test_eof2746: cs = 2746; goto _test_eof - _test_eof2747: cs = 2747; goto _test_eof - _test_eof2748: cs = 2748; goto _test_eof - _test_eof2749: cs = 2749; goto _test_eof - _test_eof2750: cs = 2750; goto _test_eof - _test_eof2751: cs = 2751; goto _test_eof - _test_eof2752: cs = 2752; goto _test_eof - _test_eof2753: cs = 2753; goto _test_eof - _test_eof2754: cs = 2754; goto _test_eof - _test_eof2755: cs = 2755; goto _test_eof - _test_eof2756: cs = 2756; goto _test_eof - _test_eof2757: cs = 2757; goto _test_eof - _test_eof2758: cs = 2758; goto _test_eof - _test_eof2759: cs = 2759; goto _test_eof - _test_eof2760: cs = 2760; goto _test_eof - _test_eof2761: cs = 2761; goto _test_eof - _test_eof2762: cs = 2762; goto _test_eof - _test_eof2763: cs = 2763; goto _test_eof - _test_eof2764: cs = 2764; goto _test_eof - _test_eof2765: cs = 2765; goto _test_eof - _test_eof2766: cs = 2766; goto _test_eof - _test_eof2767: cs = 2767; goto _test_eof - _test_eof2768: cs = 2768; goto _test_eof - _test_eof2769: cs = 2769; goto _test_eof - _test_eof2770: cs = 2770; goto _test_eof - _test_eof2771: cs = 2771; goto _test_eof - _test_eof2772: cs = 2772; goto _test_eof - _test_eof2773: cs = 2773; goto _test_eof - _test_eof2774: cs = 2774; goto _test_eof - _test_eof2775: cs = 2775; goto _test_eof - _test_eof2776: cs = 2776; goto _test_eof - _test_eof4879: cs = 4879; goto _test_eof - _test_eof4880: cs = 4880; goto _test_eof - _test_eof4881: cs = 4881; goto _test_eof - _test_eof4882: cs = 4882; goto _test_eof - _test_eof4883: cs = 4883; goto _test_eof - _test_eof4884: cs = 4884; goto _test_eof - _test_eof4885: cs = 4885; goto _test_eof - _test_eof2777: cs = 2777; goto _test_eof - _test_eof2778: cs = 2778; goto _test_eof - _test_eof2779: cs = 2779; goto _test_eof - _test_eof2780: cs = 2780; goto _test_eof - _test_eof2781: cs = 2781; goto _test_eof - _test_eof2782: cs = 2782; goto _test_eof - _test_eof2783: cs = 2783; goto _test_eof - _test_eof2784: cs = 2784; goto _test_eof - _test_eof2785: cs = 2785; goto _test_eof - _test_eof2786: cs = 2786; goto _test_eof - _test_eof2787: cs = 2787; goto _test_eof - _test_eof2788: cs = 2788; goto _test_eof - _test_eof2789: cs = 2789; goto _test_eof - _test_eof2790: cs = 2790; goto _test_eof - _test_eof2791: cs = 2791; goto _test_eof - _test_eof2792: cs = 2792; goto _test_eof - _test_eof2793: cs = 2793; goto _test_eof - _test_eof2794: cs = 2794; goto _test_eof - _test_eof2795: cs = 2795; goto _test_eof - _test_eof2796: cs = 2796; goto _test_eof - _test_eof2797: cs = 2797; goto _test_eof - _test_eof2798: cs = 2798; goto _test_eof - _test_eof2799: cs = 2799; goto _test_eof - _test_eof2800: cs = 2800; goto _test_eof - _test_eof2801: cs = 2801; goto _test_eof - _test_eof2802: cs = 2802; goto _test_eof - _test_eof2803: cs = 2803; goto _test_eof - _test_eof2804: cs = 2804; goto _test_eof - _test_eof2805: cs = 2805; goto _test_eof - _test_eof2806: cs = 2806; goto _test_eof - _test_eof2807: cs = 2807; goto _test_eof - _test_eof2808: cs = 2808; goto _test_eof - _test_eof2809: cs = 2809; goto _test_eof - _test_eof2810: cs = 2810; goto _test_eof - _test_eof2811: cs = 2811; goto _test_eof - _test_eof2812: cs = 2812; goto _test_eof - _test_eof2813: cs = 2813; goto _test_eof - _test_eof2814: cs = 2814; goto _test_eof - _test_eof2815: cs = 2815; goto _test_eof - _test_eof2816: cs = 2816; goto _test_eof - _test_eof2817: cs = 2817; goto _test_eof - _test_eof2818: cs = 2818; goto _test_eof - _test_eof2819: cs = 2819; goto _test_eof - _test_eof2820: cs = 2820; goto _test_eof - _test_eof2821: cs = 2821; goto _test_eof - _test_eof2822: cs = 2822; goto _test_eof - _test_eof2823: cs = 2823; goto _test_eof - _test_eof2824: cs = 2824; goto _test_eof - _test_eof2825: cs = 2825; goto _test_eof - _test_eof2826: cs = 2826; goto _test_eof - _test_eof2827: cs = 2827; goto _test_eof - _test_eof2828: cs = 2828; goto _test_eof - _test_eof2829: cs = 2829; goto _test_eof - _test_eof2830: cs = 2830; goto _test_eof - _test_eof2831: cs = 2831; goto _test_eof - _test_eof2832: cs = 2832; goto _test_eof - _test_eof2833: cs = 2833; goto _test_eof - _test_eof2834: cs = 2834; goto _test_eof - _test_eof2835: cs = 2835; goto _test_eof - _test_eof2836: cs = 2836; goto _test_eof - _test_eof2837: cs = 2837; goto _test_eof - _test_eof2838: cs = 2838; goto _test_eof - _test_eof2839: cs = 2839; goto _test_eof - _test_eof2840: cs = 2840; goto _test_eof - _test_eof2841: cs = 2841; goto _test_eof - _test_eof2842: cs = 2842; goto _test_eof - _test_eof2843: cs = 2843; goto _test_eof - _test_eof2844: cs = 2844; goto _test_eof - _test_eof2845: cs = 2845; goto _test_eof - _test_eof2846: cs = 2846; goto _test_eof - _test_eof2847: cs = 2847; goto _test_eof - _test_eof2848: cs = 2848; goto _test_eof - _test_eof2849: cs = 2849; goto _test_eof - _test_eof2850: cs = 2850; goto _test_eof - _test_eof2851: cs = 2851; goto _test_eof - _test_eof2852: cs = 2852; goto _test_eof - _test_eof2853: cs = 2853; goto _test_eof - _test_eof2854: cs = 2854; goto _test_eof - _test_eof2855: cs = 2855; goto _test_eof - _test_eof2856: cs = 2856; goto _test_eof - _test_eof2857: cs = 2857; goto _test_eof - _test_eof2858: cs = 2858; goto _test_eof - _test_eof2859: cs = 2859; goto _test_eof - _test_eof2860: cs = 2860; goto _test_eof - _test_eof2861: cs = 2861; goto _test_eof - _test_eof2862: cs = 2862; goto _test_eof - _test_eof2863: cs = 2863; goto _test_eof - _test_eof2864: cs = 2864; goto _test_eof - _test_eof2865: cs = 2865; goto _test_eof - _test_eof2866: cs = 2866; goto _test_eof - _test_eof2867: cs = 2867; goto _test_eof - _test_eof2868: cs = 2868; goto _test_eof - _test_eof2869: cs = 2869; goto _test_eof - _test_eof2870: cs = 2870; goto _test_eof - _test_eof2871: cs = 2871; goto _test_eof - _test_eof2872: cs = 2872; goto _test_eof - _test_eof2873: cs = 2873; goto _test_eof - _test_eof2874: cs = 2874; goto _test_eof - _test_eof2875: cs = 2875; goto _test_eof - _test_eof2876: cs = 2876; goto _test_eof - _test_eof2877: cs = 2877; goto _test_eof - _test_eof2878: cs = 2878; goto _test_eof - _test_eof2879: cs = 2879; goto _test_eof - _test_eof2880: cs = 2880; goto _test_eof - _test_eof2881: cs = 2881; goto _test_eof - _test_eof2882: cs = 2882; goto _test_eof - _test_eof2883: cs = 2883; goto _test_eof - _test_eof2884: cs = 2884; goto _test_eof - _test_eof2885: cs = 2885; goto _test_eof - _test_eof2886: cs = 2886; goto _test_eof - _test_eof2887: cs = 2887; goto _test_eof - _test_eof2888: cs = 2888; goto _test_eof - _test_eof2889: cs = 2889; goto _test_eof - _test_eof2890: cs = 2890; goto _test_eof - _test_eof2891: cs = 2891; goto _test_eof - _test_eof2892: cs = 2892; goto _test_eof - _test_eof2893: cs = 2893; goto _test_eof - _test_eof2894: cs = 2894; goto _test_eof - _test_eof2895: cs = 2895; goto _test_eof - _test_eof2896: cs = 2896; goto _test_eof - _test_eof2897: cs = 2897; goto _test_eof - _test_eof2898: cs = 2898; goto _test_eof - _test_eof2899: cs = 2899; goto _test_eof - _test_eof2900: cs = 2900; goto _test_eof - _test_eof2901: cs = 2901; goto _test_eof - _test_eof2902: cs = 2902; goto _test_eof - _test_eof2903: cs = 2903; goto _test_eof - _test_eof2904: cs = 2904; goto _test_eof - _test_eof2905: cs = 2905; goto _test_eof - _test_eof2906: cs = 2906; goto _test_eof - _test_eof2907: cs = 2907; goto _test_eof - _test_eof2908: cs = 2908; goto _test_eof - _test_eof2909: cs = 2909; goto _test_eof - _test_eof2910: cs = 2910; goto _test_eof - _test_eof2911: cs = 2911; goto _test_eof - _test_eof2912: cs = 2912; goto _test_eof - _test_eof2913: cs = 2913; goto _test_eof - _test_eof2914: cs = 2914; goto _test_eof - _test_eof2915: cs = 2915; goto _test_eof - _test_eof2916: cs = 2916; goto _test_eof - _test_eof2917: cs = 2917; goto _test_eof - _test_eof2918: cs = 2918; goto _test_eof - _test_eof2919: cs = 2919; goto _test_eof - _test_eof2920: cs = 2920; goto _test_eof - _test_eof2921: cs = 2921; goto _test_eof - _test_eof2922: cs = 2922; goto _test_eof - _test_eof2923: cs = 2923; goto _test_eof - _test_eof4886: cs = 4886; goto _test_eof - _test_eof2924: cs = 2924; goto _test_eof - _test_eof2925: cs = 2925; goto _test_eof - _test_eof2926: cs = 2926; goto _test_eof - _test_eof2927: cs = 2927; goto _test_eof - _test_eof2928: cs = 2928; goto _test_eof - _test_eof2929: cs = 2929; goto _test_eof - _test_eof2930: cs = 2930; goto _test_eof - _test_eof2931: cs = 2931; goto _test_eof - _test_eof2932: cs = 2932; goto _test_eof - _test_eof2933: cs = 2933; goto _test_eof - _test_eof2934: cs = 2934; goto _test_eof - _test_eof2935: cs = 2935; goto _test_eof - _test_eof2936: cs = 2936; goto _test_eof - _test_eof2937: cs = 2937; goto _test_eof - _test_eof2938: cs = 2938; goto _test_eof - _test_eof2939: cs = 2939; goto _test_eof - _test_eof2940: cs = 2940; goto _test_eof - _test_eof2941: cs = 2941; goto _test_eof - _test_eof2942: cs = 2942; goto _test_eof - _test_eof2943: cs = 2943; goto _test_eof - _test_eof2944: cs = 2944; goto _test_eof - _test_eof2945: cs = 2945; goto _test_eof - _test_eof2946: cs = 2946; goto _test_eof - _test_eof2947: cs = 2947; goto _test_eof - _test_eof2948: cs = 2948; goto _test_eof - _test_eof2949: cs = 2949; goto _test_eof - _test_eof2950: cs = 2950; goto _test_eof - _test_eof2951: cs = 2951; goto _test_eof - _test_eof2952: cs = 2952; goto _test_eof - _test_eof2953: cs = 2953; goto _test_eof - _test_eof2954: cs = 2954; goto _test_eof - _test_eof2955: cs = 2955; goto _test_eof - _test_eof2956: cs = 2956; goto _test_eof - _test_eof2957: cs = 2957; goto _test_eof - _test_eof2958: cs = 2958; goto _test_eof - _test_eof2959: cs = 2959; goto _test_eof - _test_eof2960: cs = 2960; goto _test_eof - _test_eof2961: cs = 2961; goto _test_eof - _test_eof2962: cs = 2962; goto _test_eof - _test_eof2963: cs = 2963; goto _test_eof - _test_eof2964: cs = 2964; goto _test_eof - _test_eof2965: cs = 2965; goto _test_eof - _test_eof2966: cs = 2966; goto _test_eof - _test_eof2967: cs = 2967; goto _test_eof - _test_eof2968: cs = 2968; goto _test_eof - _test_eof2969: cs = 2969; goto _test_eof - _test_eof2970: cs = 2970; goto _test_eof - _test_eof2971: cs = 2971; goto _test_eof - _test_eof2972: cs = 2972; goto _test_eof - _test_eof2973: cs = 2973; goto _test_eof - _test_eof2974: cs = 2974; goto _test_eof - _test_eof2975: cs = 2975; goto _test_eof - _test_eof2976: cs = 2976; goto _test_eof - _test_eof2977: cs = 2977; goto _test_eof - _test_eof2978: cs = 2978; goto _test_eof - _test_eof2979: cs = 2979; goto _test_eof - _test_eof2980: cs = 2980; goto _test_eof - _test_eof2981: cs = 2981; goto _test_eof - _test_eof2982: cs = 2982; goto _test_eof - _test_eof2983: cs = 2983; goto _test_eof - _test_eof2984: cs = 2984; goto _test_eof - _test_eof2985: cs = 2985; goto _test_eof - _test_eof2986: cs = 2986; goto _test_eof - _test_eof2987: cs = 2987; goto _test_eof - _test_eof2988: cs = 2988; goto _test_eof - _test_eof2989: cs = 2989; goto _test_eof - _test_eof2990: cs = 2990; goto _test_eof - _test_eof2991: cs = 2991; goto _test_eof - _test_eof2992: cs = 2992; goto _test_eof - _test_eof2993: cs = 2993; goto _test_eof - _test_eof2994: cs = 2994; goto _test_eof - _test_eof2995: cs = 2995; goto _test_eof - _test_eof2996: cs = 2996; goto _test_eof - _test_eof2997: cs = 2997; goto _test_eof - _test_eof2998: cs = 2998; goto _test_eof - _test_eof2999: cs = 2999; goto _test_eof - _test_eof3000: cs = 3000; goto _test_eof - _test_eof3001: cs = 3001; goto _test_eof - _test_eof3002: cs = 3002; goto _test_eof - _test_eof3003: cs = 3003; goto _test_eof - _test_eof3004: cs = 3004; goto _test_eof - _test_eof3005: cs = 3005; goto _test_eof - _test_eof3006: cs = 3006; goto _test_eof - _test_eof3007: cs = 3007; goto _test_eof - _test_eof3008: cs = 3008; goto _test_eof - _test_eof3009: cs = 3009; goto _test_eof - _test_eof3010: cs = 3010; goto _test_eof - _test_eof3011: cs = 3011; goto _test_eof - _test_eof3012: cs = 3012; goto _test_eof - _test_eof3013: cs = 3013; goto _test_eof - _test_eof3014: cs = 3014; goto _test_eof - _test_eof3015: cs = 3015; goto _test_eof - _test_eof3016: cs = 3016; goto _test_eof - _test_eof3017: cs = 3017; goto _test_eof - _test_eof3018: cs = 3018; goto _test_eof - _test_eof3019: cs = 3019; goto _test_eof - _test_eof3020: cs = 3020; goto _test_eof - _test_eof3021: cs = 3021; goto _test_eof - _test_eof3022: cs = 3022; goto _test_eof - _test_eof3023: cs = 3023; goto _test_eof - _test_eof3024: cs = 3024; goto _test_eof - _test_eof3025: cs = 3025; goto _test_eof - _test_eof3026: cs = 3026; goto _test_eof - _test_eof3027: cs = 3027; goto _test_eof - _test_eof3028: cs = 3028; goto _test_eof - _test_eof3029: cs = 3029; goto _test_eof - _test_eof3030: cs = 3030; goto _test_eof - _test_eof3031: cs = 3031; goto _test_eof - _test_eof3032: cs = 3032; goto _test_eof - _test_eof3033: cs = 3033; goto _test_eof - _test_eof3034: cs = 3034; goto _test_eof - _test_eof3035: cs = 3035; goto _test_eof - _test_eof3036: cs = 3036; goto _test_eof - _test_eof3037: cs = 3037; goto _test_eof - _test_eof3038: cs = 3038; goto _test_eof - _test_eof3039: cs = 3039; goto _test_eof - _test_eof3040: cs = 3040; goto _test_eof - _test_eof3041: cs = 3041; goto _test_eof - _test_eof3042: cs = 3042; goto _test_eof - _test_eof3043: cs = 3043; goto _test_eof - _test_eof3044: cs = 3044; goto _test_eof - _test_eof3045: cs = 3045; goto _test_eof - _test_eof3046: cs = 3046; goto _test_eof - _test_eof3047: cs = 3047; goto _test_eof - _test_eof3048: cs = 3048; goto _test_eof - _test_eof3049: cs = 3049; goto _test_eof - _test_eof3050: cs = 3050; goto _test_eof - _test_eof3051: cs = 3051; goto _test_eof - _test_eof3052: cs = 3052; goto _test_eof - _test_eof3053: cs = 3053; goto _test_eof - _test_eof3054: cs = 3054; goto _test_eof - _test_eof3055: cs = 3055; goto _test_eof - _test_eof3056: cs = 3056; goto _test_eof - _test_eof3057: cs = 3057; goto _test_eof - _test_eof3058: cs = 3058; goto _test_eof - _test_eof3059: cs = 3059; goto _test_eof - _test_eof3060: cs = 3060; goto _test_eof - _test_eof3061: cs = 3061; goto _test_eof - _test_eof3062: cs = 3062; goto _test_eof - _test_eof3063: cs = 3063; goto _test_eof - _test_eof3064: cs = 3064; goto _test_eof - _test_eof3065: cs = 3065; goto _test_eof - _test_eof3066: cs = 3066; goto _test_eof - _test_eof3067: cs = 3067; goto _test_eof - _test_eof3068: cs = 3068; goto _test_eof - _test_eof3069: cs = 3069; goto _test_eof - _test_eof3070: cs = 3070; goto _test_eof - _test_eof4887: cs = 4887; goto _test_eof - _test_eof3071: cs = 3071; goto _test_eof - _test_eof3072: cs = 3072; goto _test_eof - _test_eof3073: cs = 3073; goto _test_eof - _test_eof3074: cs = 3074; goto _test_eof - _test_eof3075: cs = 3075; goto _test_eof - _test_eof3076: cs = 3076; goto _test_eof - _test_eof3077: cs = 3077; goto _test_eof - _test_eof3078: cs = 3078; goto _test_eof - _test_eof3079: cs = 3079; goto _test_eof - _test_eof3080: cs = 3080; goto _test_eof - _test_eof3081: cs = 3081; goto _test_eof - _test_eof3082: cs = 3082; goto _test_eof - _test_eof3083: cs = 3083; goto _test_eof - _test_eof3084: cs = 3084; goto _test_eof - _test_eof3085: cs = 3085; goto _test_eof - _test_eof3086: cs = 3086; goto _test_eof - _test_eof3087: cs = 3087; goto _test_eof - _test_eof3088: cs = 3088; goto _test_eof - _test_eof3089: cs = 3089; goto _test_eof - _test_eof3090: cs = 3090; goto _test_eof - _test_eof3091: cs = 3091; goto _test_eof - _test_eof3092: cs = 3092; goto _test_eof - _test_eof3093: cs = 3093; goto _test_eof - _test_eof3094: cs = 3094; goto _test_eof - _test_eof3095: cs = 3095; goto _test_eof - _test_eof3096: cs = 3096; goto _test_eof - _test_eof3097: cs = 3097; goto _test_eof - _test_eof3098: cs = 3098; goto _test_eof - _test_eof3099: cs = 3099; goto _test_eof - _test_eof3100: cs = 3100; goto _test_eof - _test_eof3101: cs = 3101; goto _test_eof - _test_eof3102: cs = 3102; goto _test_eof - _test_eof3103: cs = 3103; goto _test_eof - _test_eof3104: cs = 3104; goto _test_eof - _test_eof3105: cs = 3105; goto _test_eof - _test_eof3106: cs = 3106; goto _test_eof - _test_eof3107: cs = 3107; goto _test_eof - _test_eof3108: cs = 3108; goto _test_eof - _test_eof3109: cs = 3109; goto _test_eof - _test_eof3110: cs = 3110; goto _test_eof - _test_eof3111: cs = 3111; goto _test_eof - _test_eof3112: cs = 3112; goto _test_eof - _test_eof3113: cs = 3113; goto _test_eof - _test_eof3114: cs = 3114; goto _test_eof - _test_eof3115: cs = 3115; goto _test_eof - _test_eof3116: cs = 3116; goto _test_eof - _test_eof3117: cs = 3117; goto _test_eof - _test_eof3118: cs = 3118; goto _test_eof - _test_eof3119: cs = 3119; goto _test_eof - _test_eof3120: cs = 3120; goto _test_eof - _test_eof3121: cs = 3121; goto _test_eof - _test_eof3122: cs = 3122; goto _test_eof - _test_eof3123: cs = 3123; goto _test_eof - _test_eof3124: cs = 3124; goto _test_eof - _test_eof3125: cs = 3125; goto _test_eof - _test_eof3126: cs = 3126; goto _test_eof - _test_eof3127: cs = 3127; goto _test_eof - _test_eof3128: cs = 3128; goto _test_eof - _test_eof3129: cs = 3129; goto _test_eof - _test_eof3130: cs = 3130; goto _test_eof - _test_eof3131: cs = 3131; goto _test_eof - _test_eof3132: cs = 3132; goto _test_eof - _test_eof3133: cs = 3133; goto _test_eof - _test_eof3134: cs = 3134; goto _test_eof - _test_eof3135: cs = 3135; goto _test_eof - _test_eof3136: cs = 3136; goto _test_eof - _test_eof3137: cs = 3137; goto _test_eof - _test_eof3138: cs = 3138; goto _test_eof - _test_eof3139: cs = 3139; goto _test_eof - _test_eof3140: cs = 3140; goto _test_eof - _test_eof3141: cs = 3141; goto _test_eof - _test_eof3142: cs = 3142; goto _test_eof - _test_eof3143: cs = 3143; goto _test_eof - _test_eof3144: cs = 3144; goto _test_eof - _test_eof3145: cs = 3145; goto _test_eof - _test_eof3146: cs = 3146; goto _test_eof - _test_eof3147: cs = 3147; goto _test_eof - _test_eof3148: cs = 3148; goto _test_eof - _test_eof3149: cs = 3149; goto _test_eof - _test_eof3150: cs = 3150; goto _test_eof - _test_eof3151: cs = 3151; goto _test_eof - _test_eof3152: cs = 3152; goto _test_eof - _test_eof3153: cs = 3153; goto _test_eof - _test_eof3154: cs = 3154; goto _test_eof - _test_eof3155: cs = 3155; goto _test_eof - _test_eof3156: cs = 3156; goto _test_eof - _test_eof3157: cs = 3157; goto _test_eof - _test_eof3158: cs = 3158; goto _test_eof - _test_eof3159: cs = 3159; goto _test_eof - _test_eof3160: cs = 3160; goto _test_eof - _test_eof3161: cs = 3161; goto _test_eof - _test_eof3162: cs = 3162; goto _test_eof - _test_eof3163: cs = 3163; goto _test_eof - _test_eof3164: cs = 3164; goto _test_eof - _test_eof3165: cs = 3165; goto _test_eof - _test_eof3166: cs = 3166; goto _test_eof - _test_eof3167: cs = 3167; goto _test_eof - _test_eof3168: cs = 3168; goto _test_eof - _test_eof3169: cs = 3169; goto _test_eof - _test_eof3170: cs = 3170; goto _test_eof - _test_eof3171: cs = 3171; goto _test_eof - _test_eof3172: cs = 3172; goto _test_eof - _test_eof3173: cs = 3173; goto _test_eof - _test_eof3174: cs = 3174; goto _test_eof - _test_eof3175: cs = 3175; goto _test_eof - _test_eof3176: cs = 3176; goto _test_eof - _test_eof3177: cs = 3177; goto _test_eof - _test_eof3178: cs = 3178; goto _test_eof - _test_eof3179: cs = 3179; goto _test_eof - _test_eof3180: cs = 3180; goto _test_eof - _test_eof3181: cs = 3181; goto _test_eof - _test_eof3182: cs = 3182; goto _test_eof - _test_eof3183: cs = 3183; goto _test_eof - _test_eof3184: cs = 3184; goto _test_eof - _test_eof3185: cs = 3185; goto _test_eof - _test_eof3186: cs = 3186; goto _test_eof - _test_eof3187: cs = 3187; goto _test_eof - _test_eof3188: cs = 3188; goto _test_eof - _test_eof3189: cs = 3189; goto _test_eof - _test_eof3190: cs = 3190; goto _test_eof - _test_eof3191: cs = 3191; goto _test_eof - _test_eof3192: cs = 3192; goto _test_eof - _test_eof3193: cs = 3193; goto _test_eof - _test_eof3194: cs = 3194; goto _test_eof - _test_eof3195: cs = 3195; goto _test_eof - _test_eof3196: cs = 3196; goto _test_eof - _test_eof3197: cs = 3197; goto _test_eof - _test_eof3198: cs = 3198; goto _test_eof - _test_eof3199: cs = 3199; goto _test_eof - _test_eof3200: cs = 3200; goto _test_eof - _test_eof3201: cs = 3201; goto _test_eof - _test_eof3202: cs = 3202; goto _test_eof - _test_eof3203: cs = 3203; goto _test_eof - _test_eof3204: cs = 3204; goto _test_eof - _test_eof3205: cs = 3205; goto _test_eof - _test_eof3206: cs = 3206; goto _test_eof - _test_eof3207: cs = 3207; goto _test_eof - _test_eof3208: cs = 3208; goto _test_eof - _test_eof3209: cs = 3209; goto _test_eof - _test_eof3210: cs = 3210; goto _test_eof - _test_eof3211: cs = 3211; goto _test_eof - _test_eof3212: cs = 3212; goto _test_eof - _test_eof3213: cs = 3213; goto _test_eof - _test_eof3214: cs = 3214; goto _test_eof - _test_eof3215: cs = 3215; goto _test_eof - _test_eof3216: cs = 3216; goto _test_eof - _test_eof3217: cs = 3217; goto _test_eof - _test_eof4888: cs = 4888; goto _test_eof - _test_eof4889: cs = 4889; goto _test_eof - _test_eof4890: cs = 4890; goto _test_eof - _test_eof4891: cs = 4891; goto _test_eof - _test_eof4892: cs = 4892; goto _test_eof - _test_eof4893: cs = 4893; goto _test_eof - _test_eof4894: cs = 4894; goto _test_eof - _test_eof4895: cs = 4895; goto _test_eof - _test_eof4896: cs = 4896; goto _test_eof - _test_eof4897: cs = 4897; goto _test_eof - _test_eof4898: cs = 4898; goto _test_eof - _test_eof4899: cs = 4899; goto _test_eof - _test_eof4900: cs = 4900; goto _test_eof - _test_eof4901: cs = 4901; goto _test_eof - _test_eof4902: cs = 4902; goto _test_eof - _test_eof4903: cs = 4903; goto _test_eof - _test_eof4904: cs = 4904; goto _test_eof - _test_eof4905: cs = 4905; goto _test_eof - _test_eof4906: cs = 4906; goto _test_eof - _test_eof4907: cs = 4907; goto _test_eof - _test_eof4908: cs = 4908; goto _test_eof - _test_eof4909: cs = 4909; goto _test_eof - _test_eof4910: cs = 4910; goto _test_eof - _test_eof4911: cs = 4911; goto _test_eof - _test_eof4912: cs = 4912; goto _test_eof - _test_eof4913: cs = 4913; goto _test_eof - _test_eof4914: cs = 4914; goto _test_eof - _test_eof4915: cs = 4915; goto _test_eof - _test_eof4916: cs = 4916; goto _test_eof - _test_eof4917: cs = 4917; goto _test_eof - _test_eof4918: cs = 4918; goto _test_eof - _test_eof4919: cs = 4919; goto _test_eof - _test_eof4920: cs = 4920; goto _test_eof - _test_eof4921: cs = 4921; goto _test_eof - _test_eof4922: cs = 4922; goto _test_eof - _test_eof4923: cs = 4923; goto _test_eof - _test_eof4924: cs = 4924; goto _test_eof - _test_eof4925: cs = 4925; goto _test_eof - _test_eof4926: cs = 4926; goto _test_eof - _test_eof4927: cs = 4927; goto _test_eof - _test_eof4928: cs = 4928; goto _test_eof - _test_eof3218: cs = 3218; goto _test_eof - _test_eof3219: cs = 3219; goto _test_eof - _test_eof3220: cs = 3220; goto _test_eof - _test_eof3221: cs = 3221; goto _test_eof - _test_eof3222: cs = 3222; goto _test_eof - _test_eof3223: cs = 3223; goto _test_eof - _test_eof3224: cs = 3224; goto _test_eof - _test_eof3225: cs = 3225; goto _test_eof - _test_eof3226: cs = 3226; goto _test_eof - _test_eof3227: cs = 3227; goto _test_eof - _test_eof3228: cs = 3228; goto _test_eof - _test_eof3229: cs = 3229; goto _test_eof - _test_eof3230: cs = 3230; goto _test_eof - _test_eof3231: cs = 3231; goto _test_eof - _test_eof4929: cs = 4929; goto _test_eof - _test_eof4930: cs = 4930; goto _test_eof - _test_eof4931: cs = 4931; goto _test_eof - _test_eof4932: cs = 4932; goto _test_eof - _test_eof3232: cs = 3232; goto _test_eof - _test_eof4933: cs = 4933; goto _test_eof - _test_eof4934: cs = 4934; goto _test_eof - _test_eof4935: cs = 4935; goto _test_eof - _test_eof4936: cs = 4936; goto _test_eof - _test_eof4937: cs = 4937; goto _test_eof - _test_eof4938: cs = 4938; goto _test_eof - _test_eof4939: cs = 4939; goto _test_eof - _test_eof4940: cs = 4940; goto _test_eof - _test_eof4941: cs = 4941; goto _test_eof - _test_eof4942: cs = 4942; goto _test_eof - _test_eof4943: cs = 4943; goto _test_eof - _test_eof4944: cs = 4944; goto _test_eof - _test_eof4945: cs = 4945; goto _test_eof - _test_eof4946: cs = 4946; goto _test_eof - _test_eof4947: cs = 4947; goto _test_eof - _test_eof4948: cs = 4948; goto _test_eof - _test_eof4949: cs = 4949; goto _test_eof - _test_eof4950: cs = 4950; goto _test_eof - _test_eof4951: cs = 4951; goto _test_eof - _test_eof4952: cs = 4952; goto _test_eof - _test_eof4953: cs = 4953; goto _test_eof - _test_eof4954: cs = 4954; goto _test_eof - _test_eof4955: cs = 4955; goto _test_eof - _test_eof4956: cs = 4956; goto _test_eof - _test_eof4957: cs = 4957; goto _test_eof - _test_eof3233: cs = 3233; goto _test_eof - _test_eof4958: cs = 4958; goto _test_eof - _test_eof4959: cs = 4959; goto _test_eof - _test_eof4960: cs = 4960; goto _test_eof - _test_eof4961: cs = 4961; goto _test_eof - _test_eof4962: cs = 4962; goto _test_eof - _test_eof4963: cs = 4963; goto _test_eof - _test_eof3234: cs = 3234; goto _test_eof - _test_eof4964: cs = 4964; goto _test_eof - _test_eof4965: cs = 4965; goto _test_eof - _test_eof3235: cs = 3235; goto _test_eof - _test_eof4966: cs = 4966; goto _test_eof - _test_eof4967: cs = 4967; goto _test_eof - _test_eof4968: cs = 4968; goto _test_eof - _test_eof4969: cs = 4969; goto _test_eof - _test_eof4970: cs = 4970; goto _test_eof - _test_eof4971: cs = 4971; goto _test_eof - _test_eof4972: cs = 4972; goto _test_eof - _test_eof4973: cs = 4973; goto _test_eof - _test_eof4974: cs = 4974; goto _test_eof - _test_eof4975: cs = 4975; goto _test_eof - _test_eof4976: cs = 4976; goto _test_eof - _test_eof4977: cs = 4977; goto _test_eof - _test_eof4978: cs = 4978; goto _test_eof - _test_eof4979: cs = 4979; goto _test_eof - _test_eof4980: cs = 4980; goto _test_eof - _test_eof3236: cs = 3236; goto _test_eof - _test_eof4981: cs = 4981; goto _test_eof - _test_eof4982: cs = 4982; goto _test_eof - _test_eof4983: cs = 4983; goto _test_eof - _test_eof3237: cs = 3237; goto _test_eof - _test_eof4984: cs = 4984; goto _test_eof - _test_eof4985: cs = 4985; goto _test_eof - _test_eof4986: cs = 4986; goto _test_eof - _test_eof4987: cs = 4987; goto _test_eof - _test_eof4988: cs = 4988; goto _test_eof - _test_eof4989: cs = 4989; goto _test_eof - _test_eof3238: cs = 3238; goto _test_eof - _test_eof4990: cs = 4990; goto _test_eof - _test_eof4991: cs = 4991; goto _test_eof - _test_eof4992: cs = 4992; goto _test_eof - _test_eof4993: cs = 4993; goto _test_eof - _test_eof4994: cs = 4994; goto _test_eof - _test_eof4995: cs = 4995; goto _test_eof - _test_eof4996: cs = 4996; goto _test_eof - _test_eof4997: cs = 4997; goto _test_eof - _test_eof4998: cs = 4998; goto _test_eof - _test_eof4999: cs = 4999; goto _test_eof - _test_eof5000: cs = 5000; goto _test_eof - _test_eof5001: cs = 5001; goto _test_eof - _test_eof5002: cs = 5002; goto _test_eof - _test_eof5003: cs = 5003; goto _test_eof - _test_eof5004: cs = 5004; goto _test_eof - _test_eof5005: cs = 5005; goto _test_eof - _test_eof5006: cs = 5006; goto _test_eof - _test_eof5007: cs = 5007; goto _test_eof - _test_eof5008: cs = 5008; goto _test_eof - _test_eof5009: cs = 5009; goto _test_eof - _test_eof5010: cs = 5010; goto _test_eof - _test_eof5011: cs = 5011; goto _test_eof - _test_eof5012: cs = 5012; goto _test_eof - _test_eof5013: cs = 5013; goto _test_eof - _test_eof5014: cs = 5014; goto _test_eof - _test_eof5015: cs = 5015; goto _test_eof - _test_eof5016: cs = 5016; goto _test_eof - _test_eof5017: cs = 5017; goto _test_eof - _test_eof5018: cs = 5018; goto _test_eof - _test_eof5019: cs = 5019; goto _test_eof - _test_eof5020: cs = 5020; goto _test_eof - _test_eof5021: cs = 5021; goto _test_eof - _test_eof5022: cs = 5022; goto _test_eof - _test_eof5023: cs = 5023; goto _test_eof - _test_eof5024: cs = 5024; goto _test_eof - _test_eof5025: cs = 5025; goto _test_eof - _test_eof5026: cs = 5026; goto _test_eof - _test_eof5027: cs = 5027; goto _test_eof - _test_eof5028: cs = 5028; goto _test_eof - _test_eof5029: cs = 5029; goto _test_eof - _test_eof5030: cs = 5030; goto _test_eof - _test_eof5031: cs = 5031; goto _test_eof - _test_eof5032: cs = 5032; goto _test_eof - _test_eof5033: cs = 5033; goto _test_eof - _test_eof5034: cs = 5034; goto _test_eof - _test_eof5035: cs = 5035; goto _test_eof - _test_eof5036: cs = 5036; goto _test_eof - _test_eof5037: cs = 5037; goto _test_eof - _test_eof5038: cs = 5038; goto _test_eof - _test_eof5039: cs = 5039; goto _test_eof - _test_eof5040: cs = 5040; goto _test_eof - _test_eof5041: cs = 5041; goto _test_eof - _test_eof5042: cs = 5042; goto _test_eof - _test_eof5043: cs = 5043; goto _test_eof - _test_eof5044: cs = 5044; goto _test_eof - _test_eof5045: cs = 5045; goto _test_eof - _test_eof5046: cs = 5046; goto _test_eof - _test_eof5047: cs = 5047; goto _test_eof - _test_eof5048: cs = 5048; goto _test_eof - _test_eof5049: cs = 5049; goto _test_eof - _test_eof5050: cs = 5050; goto _test_eof - _test_eof5051: cs = 5051; goto _test_eof - _test_eof5052: cs = 5052; goto _test_eof - _test_eof5053: cs = 5053; goto _test_eof - _test_eof5054: cs = 5054; goto _test_eof - _test_eof5055: cs = 5055; goto _test_eof - _test_eof5056: cs = 5056; goto _test_eof - _test_eof5057: cs = 5057; goto _test_eof - _test_eof5058: cs = 5058; goto _test_eof - _test_eof5059: cs = 5059; goto _test_eof - _test_eof5060: cs = 5060; goto _test_eof - _test_eof5061: cs = 5061; goto _test_eof - _test_eof5062: cs = 5062; goto _test_eof - _test_eof5063: cs = 5063; goto _test_eof - _test_eof5064: cs = 5064; goto _test_eof - _test_eof5065: cs = 5065; goto _test_eof - _test_eof5066: cs = 5066; goto _test_eof - _test_eof5067: cs = 5067; goto _test_eof - _test_eof5068: cs = 5068; goto _test_eof - _test_eof5069: cs = 5069; goto _test_eof - _test_eof5070: cs = 5070; goto _test_eof - _test_eof5071: cs = 5071; goto _test_eof - _test_eof3239: cs = 3239; goto _test_eof - _test_eof3240: cs = 3240; goto _test_eof - _test_eof3241: cs = 3241; goto _test_eof - _test_eof3242: cs = 3242; goto _test_eof - _test_eof3243: cs = 3243; goto _test_eof - _test_eof3244: cs = 3244; goto _test_eof - _test_eof3245: cs = 3245; goto _test_eof - _test_eof3246: cs = 3246; goto _test_eof - _test_eof3247: cs = 3247; goto _test_eof - _test_eof3248: cs = 3248; goto _test_eof - _test_eof3249: cs = 3249; goto _test_eof - _test_eof3250: cs = 3250; goto _test_eof - _test_eof3251: cs = 3251; goto _test_eof - _test_eof3252: cs = 3252; goto _test_eof - _test_eof3253: cs = 3253; goto _test_eof - _test_eof3254: cs = 3254; goto _test_eof - _test_eof3255: cs = 3255; goto _test_eof - _test_eof3256: cs = 3256; goto _test_eof - _test_eof3257: cs = 3257; goto _test_eof - _test_eof3258: cs = 3258; goto _test_eof - _test_eof3259: cs = 3259; goto _test_eof - _test_eof3260: cs = 3260; goto _test_eof - _test_eof3261: cs = 3261; goto _test_eof - _test_eof3262: cs = 3262; goto _test_eof - _test_eof3263: cs = 3263; goto _test_eof - _test_eof3264: cs = 3264; goto _test_eof - _test_eof3265: cs = 3265; goto _test_eof - _test_eof5072: cs = 5072; goto _test_eof - _test_eof3266: cs = 3266; goto _test_eof - _test_eof3267: cs = 3267; goto _test_eof - _test_eof3268: cs = 3268; goto _test_eof - _test_eof5073: cs = 5073; goto _test_eof - _test_eof3269: cs = 3269; goto _test_eof - _test_eof3270: cs = 3270; goto _test_eof - _test_eof3271: cs = 3271; goto _test_eof - _test_eof3272: cs = 3272; goto _test_eof - _test_eof3273: cs = 3273; goto _test_eof - _test_eof3274: cs = 3274; goto _test_eof - _test_eof3275: cs = 3275; goto _test_eof - _test_eof3276: cs = 3276; goto _test_eof - _test_eof3277: cs = 3277; goto _test_eof - _test_eof3278: cs = 3278; goto _test_eof - _test_eof3279: cs = 3279; goto _test_eof - _test_eof3280: cs = 3280; goto _test_eof - _test_eof3281: cs = 3281; goto _test_eof - _test_eof3282: cs = 3282; goto _test_eof - _test_eof3283: cs = 3283; goto _test_eof - _test_eof3284: cs = 3284; goto _test_eof - _test_eof3285: cs = 3285; goto _test_eof - _test_eof3286: cs = 3286; goto _test_eof - _test_eof3287: cs = 3287; goto _test_eof - _test_eof3288: cs = 3288; goto _test_eof - _test_eof3289: cs = 3289; goto _test_eof - _test_eof3290: cs = 3290; goto _test_eof - _test_eof3291: cs = 3291; goto _test_eof - _test_eof3292: cs = 3292; goto _test_eof - _test_eof3293: cs = 3293; goto _test_eof - _test_eof3294: cs = 3294; goto _test_eof - _test_eof3295: cs = 3295; goto _test_eof - _test_eof3296: cs = 3296; goto _test_eof - _test_eof3297: cs = 3297; goto _test_eof - _test_eof3298: cs = 3298; goto _test_eof - _test_eof3299: cs = 3299; goto _test_eof - _test_eof3300: cs = 3300; goto _test_eof - _test_eof3301: cs = 3301; goto _test_eof - _test_eof3302: cs = 3302; goto _test_eof - _test_eof3303: cs = 3303; goto _test_eof - _test_eof3304: cs = 3304; goto _test_eof - _test_eof3305: cs = 3305; goto _test_eof - _test_eof3306: cs = 3306; goto _test_eof - _test_eof3307: cs = 3307; goto _test_eof - _test_eof3308: cs = 3308; goto _test_eof - _test_eof3309: cs = 3309; goto _test_eof - _test_eof3310: cs = 3310; goto _test_eof - _test_eof3311: cs = 3311; goto _test_eof - _test_eof3312: cs = 3312; goto _test_eof - _test_eof3313: cs = 3313; goto _test_eof - _test_eof3314: cs = 3314; goto _test_eof - _test_eof3315: cs = 3315; goto _test_eof - _test_eof3316: cs = 3316; goto _test_eof - _test_eof3317: cs = 3317; goto _test_eof - _test_eof3318: cs = 3318; goto _test_eof - _test_eof3319: cs = 3319; goto _test_eof - _test_eof3320: cs = 3320; goto _test_eof - _test_eof3321: cs = 3321; goto _test_eof - _test_eof3322: cs = 3322; goto _test_eof - _test_eof3323: cs = 3323; goto _test_eof - _test_eof3324: cs = 3324; goto _test_eof - _test_eof3325: cs = 3325; goto _test_eof - _test_eof3326: cs = 3326; goto _test_eof - _test_eof3327: cs = 3327; goto _test_eof - _test_eof3328: cs = 3328; goto _test_eof - _test_eof3329: cs = 3329; goto _test_eof - _test_eof3330: cs = 3330; goto _test_eof - _test_eof3331: cs = 3331; goto _test_eof - _test_eof3332: cs = 3332; goto _test_eof - _test_eof3333: cs = 3333; goto _test_eof - _test_eof3334: cs = 3334; goto _test_eof - _test_eof3335: cs = 3335; goto _test_eof - _test_eof3336: cs = 3336; goto _test_eof - _test_eof3337: cs = 3337; goto _test_eof - _test_eof3338: cs = 3338; goto _test_eof - _test_eof3339: cs = 3339; goto _test_eof - _test_eof3340: cs = 3340; goto _test_eof - _test_eof3341: cs = 3341; goto _test_eof - _test_eof3342: cs = 3342; goto _test_eof - _test_eof3343: cs = 3343; goto _test_eof - _test_eof3344: cs = 3344; goto _test_eof - _test_eof3345: cs = 3345; goto _test_eof - _test_eof3346: cs = 3346; goto _test_eof - _test_eof3347: cs = 3347; goto _test_eof - _test_eof3348: cs = 3348; goto _test_eof - _test_eof3349: cs = 3349; goto _test_eof - _test_eof3350: cs = 3350; goto _test_eof - _test_eof5074: cs = 5074; goto _test_eof - _test_eof3351: cs = 3351; goto _test_eof - _test_eof3352: cs = 3352; goto _test_eof - _test_eof3353: cs = 3353; goto _test_eof - _test_eof3354: cs = 3354; goto _test_eof - _test_eof3355: cs = 3355; goto _test_eof - _test_eof3356: cs = 3356; goto _test_eof - _test_eof3357: cs = 3357; goto _test_eof - _test_eof3358: cs = 3358; goto _test_eof - _test_eof3359: cs = 3359; goto _test_eof - _test_eof3360: cs = 3360; goto _test_eof - _test_eof3361: cs = 3361; goto _test_eof - _test_eof3362: cs = 3362; goto _test_eof - _test_eof3363: cs = 3363; goto _test_eof - _test_eof3364: cs = 3364; goto _test_eof - _test_eof3365: cs = 3365; goto _test_eof - _test_eof3366: cs = 3366; goto _test_eof - _test_eof3367: cs = 3367; goto _test_eof - _test_eof3368: cs = 3368; goto _test_eof - _test_eof3369: cs = 3369; goto _test_eof - _test_eof3370: cs = 3370; goto _test_eof - _test_eof3371: cs = 3371; goto _test_eof - _test_eof3372: cs = 3372; goto _test_eof - _test_eof3373: cs = 3373; goto _test_eof - _test_eof3374: cs = 3374; goto _test_eof - _test_eof3375: cs = 3375; goto _test_eof - _test_eof3376: cs = 3376; goto _test_eof - _test_eof3377: cs = 3377; goto _test_eof - _test_eof3378: cs = 3378; goto _test_eof - _test_eof3379: cs = 3379; goto _test_eof - _test_eof3380: cs = 3380; goto _test_eof - _test_eof3381: cs = 3381; goto _test_eof - _test_eof3382: cs = 3382; goto _test_eof - _test_eof3383: cs = 3383; goto _test_eof - _test_eof3384: cs = 3384; goto _test_eof - _test_eof3385: cs = 3385; goto _test_eof - _test_eof3386: cs = 3386; goto _test_eof - _test_eof3387: cs = 3387; goto _test_eof - _test_eof3388: cs = 3388; goto _test_eof - _test_eof3389: cs = 3389; goto _test_eof - _test_eof3390: cs = 3390; goto _test_eof - _test_eof3391: cs = 3391; goto _test_eof - _test_eof3392: cs = 3392; goto _test_eof - _test_eof3393: cs = 3393; goto _test_eof - _test_eof3394: cs = 3394; goto _test_eof - _test_eof3395: cs = 3395; goto _test_eof - _test_eof3396: cs = 3396; goto _test_eof - _test_eof3397: cs = 3397; goto _test_eof - _test_eof3398: cs = 3398; goto _test_eof - _test_eof3399: cs = 3399; goto _test_eof - _test_eof3400: cs = 3400; goto _test_eof - _test_eof3401: cs = 3401; goto _test_eof - _test_eof3402: cs = 3402; goto _test_eof - _test_eof3403: cs = 3403; goto _test_eof - _test_eof3404: cs = 3404; goto _test_eof - _test_eof3405: cs = 3405; goto _test_eof - _test_eof3406: cs = 3406; goto _test_eof - _test_eof3407: cs = 3407; goto _test_eof - _test_eof3408: cs = 3408; goto _test_eof - _test_eof3409: cs = 3409; goto _test_eof - _test_eof3410: cs = 3410; goto _test_eof - _test_eof3411: cs = 3411; goto _test_eof - _test_eof3412: cs = 3412; goto _test_eof - _test_eof3413: cs = 3413; goto _test_eof - _test_eof3414: cs = 3414; goto _test_eof - _test_eof3415: cs = 3415; goto _test_eof - _test_eof3416: cs = 3416; goto _test_eof - _test_eof3417: cs = 3417; goto _test_eof - _test_eof3418: cs = 3418; goto _test_eof - _test_eof3419: cs = 3419; goto _test_eof - _test_eof3420: cs = 3420; goto _test_eof - _test_eof3421: cs = 3421; goto _test_eof - _test_eof3422: cs = 3422; goto _test_eof - _test_eof3423: cs = 3423; goto _test_eof - _test_eof3424: cs = 3424; goto _test_eof - _test_eof3425: cs = 3425; goto _test_eof - _test_eof3426: cs = 3426; goto _test_eof - _test_eof3427: cs = 3427; goto _test_eof - _test_eof3428: cs = 3428; goto _test_eof - _test_eof3429: cs = 3429; goto _test_eof - _test_eof3430: cs = 3430; goto _test_eof - _test_eof3431: cs = 3431; goto _test_eof - _test_eof3432: cs = 3432; goto _test_eof - _test_eof3433: cs = 3433; goto _test_eof - _test_eof3434: cs = 3434; goto _test_eof - _test_eof3435: cs = 3435; goto _test_eof - _test_eof3436: cs = 3436; goto _test_eof - _test_eof3437: cs = 3437; goto _test_eof - _test_eof3438: cs = 3438; goto _test_eof - _test_eof3439: cs = 3439; goto _test_eof - _test_eof3440: cs = 3440; goto _test_eof - _test_eof3441: cs = 3441; goto _test_eof - _test_eof3442: cs = 3442; goto _test_eof - _test_eof3443: cs = 3443; goto _test_eof - _test_eof3444: cs = 3444; goto _test_eof - _test_eof3445: cs = 3445; goto _test_eof - _test_eof3446: cs = 3446; goto _test_eof - _test_eof3447: cs = 3447; goto _test_eof - _test_eof3448: cs = 3448; goto _test_eof - _test_eof3449: cs = 3449; goto _test_eof - _test_eof3450: cs = 3450; goto _test_eof - _test_eof3451: cs = 3451; goto _test_eof - _test_eof3452: cs = 3452; goto _test_eof - _test_eof3453: cs = 3453; goto _test_eof - _test_eof3454: cs = 3454; goto _test_eof - _test_eof3455: cs = 3455; goto _test_eof - _test_eof3456: cs = 3456; goto _test_eof - _test_eof3457: cs = 3457; goto _test_eof - _test_eof3458: cs = 3458; goto _test_eof - _test_eof3459: cs = 3459; goto _test_eof - _test_eof3460: cs = 3460; goto _test_eof - _test_eof3461: cs = 3461; goto _test_eof - _test_eof3462: cs = 3462; goto _test_eof - _test_eof3463: cs = 3463; goto _test_eof - _test_eof3464: cs = 3464; goto _test_eof - _test_eof3465: cs = 3465; goto _test_eof - _test_eof3466: cs = 3466; goto _test_eof - _test_eof3467: cs = 3467; goto _test_eof - _test_eof3468: cs = 3468; goto _test_eof - _test_eof3469: cs = 3469; goto _test_eof - _test_eof3470: cs = 3470; goto _test_eof - _test_eof3471: cs = 3471; goto _test_eof - _test_eof3472: cs = 3472; goto _test_eof - _test_eof3473: cs = 3473; goto _test_eof - _test_eof3474: cs = 3474; goto _test_eof - _test_eof3475: cs = 3475; goto _test_eof - _test_eof3476: cs = 3476; goto _test_eof - _test_eof3477: cs = 3477; goto _test_eof - _test_eof3478: cs = 3478; goto _test_eof - _test_eof3479: cs = 3479; goto _test_eof - _test_eof3480: cs = 3480; goto _test_eof - _test_eof3481: cs = 3481; goto _test_eof - _test_eof3482: cs = 3482; goto _test_eof - _test_eof3483: cs = 3483; goto _test_eof - _test_eof3484: cs = 3484; goto _test_eof - _test_eof3485: cs = 3485; goto _test_eof - _test_eof3486: cs = 3486; goto _test_eof - _test_eof3487: cs = 3487; goto _test_eof - _test_eof3488: cs = 3488; goto _test_eof - _test_eof3489: cs = 3489; goto _test_eof - _test_eof3490: cs = 3490; goto _test_eof - _test_eof3491: cs = 3491; goto _test_eof - _test_eof3492: cs = 3492; goto _test_eof - _test_eof3493: cs = 3493; goto _test_eof - _test_eof3494: cs = 3494; goto _test_eof - _test_eof3495: cs = 3495; goto _test_eof - _test_eof3496: cs = 3496; goto _test_eof - _test_eof3497: cs = 3497; goto _test_eof - _test_eof3498: cs = 3498; goto _test_eof - _test_eof3499: cs = 3499; goto _test_eof - _test_eof3500: cs = 3500; goto _test_eof - _test_eof3501: cs = 3501; goto _test_eof - _test_eof3502: cs = 3502; goto _test_eof - _test_eof3503: cs = 3503; goto _test_eof - _test_eof3504: cs = 3504; goto _test_eof - _test_eof3505: cs = 3505; goto _test_eof - _test_eof3506: cs = 3506; goto _test_eof - _test_eof3507: cs = 3507; goto _test_eof - _test_eof3508: cs = 3508; goto _test_eof - _test_eof3509: cs = 3509; goto _test_eof - _test_eof3510: cs = 3510; goto _test_eof - _test_eof3511: cs = 3511; goto _test_eof - _test_eof3512: cs = 3512; goto _test_eof - _test_eof3513: cs = 3513; goto _test_eof - _test_eof3514: cs = 3514; goto _test_eof - _test_eof3515: cs = 3515; goto _test_eof - _test_eof3516: cs = 3516; goto _test_eof - _test_eof3517: cs = 3517; goto _test_eof - _test_eof3518: cs = 3518; goto _test_eof - _test_eof3519: cs = 3519; goto _test_eof - _test_eof3520: cs = 3520; goto _test_eof - _test_eof3521: cs = 3521; goto _test_eof - _test_eof3522: cs = 3522; goto _test_eof - _test_eof3523: cs = 3523; goto _test_eof - _test_eof3524: cs = 3524; goto _test_eof - _test_eof3525: cs = 3525; goto _test_eof - _test_eof3526: cs = 3526; goto _test_eof - _test_eof3527: cs = 3527; goto _test_eof - _test_eof3528: cs = 3528; goto _test_eof - _test_eof3529: cs = 3529; goto _test_eof - _test_eof3530: cs = 3530; goto _test_eof - _test_eof3531: cs = 3531; goto _test_eof - _test_eof3532: cs = 3532; goto _test_eof - _test_eof3533: cs = 3533; goto _test_eof - _test_eof3534: cs = 3534; goto _test_eof - _test_eof3535: cs = 3535; goto _test_eof - _test_eof3536: cs = 3536; goto _test_eof - _test_eof3537: cs = 3537; goto _test_eof - _test_eof3538: cs = 3538; goto _test_eof - _test_eof3539: cs = 3539; goto _test_eof - _test_eof3540: cs = 3540; goto _test_eof - _test_eof3541: cs = 3541; goto _test_eof - _test_eof3542: cs = 3542; goto _test_eof - _test_eof3543: cs = 3543; goto _test_eof - _test_eof3544: cs = 3544; goto _test_eof - _test_eof3545: cs = 3545; goto _test_eof - _test_eof3546: cs = 3546; goto _test_eof - _test_eof3547: cs = 3547; goto _test_eof - _test_eof3548: cs = 3548; goto _test_eof - _test_eof3549: cs = 3549; goto _test_eof - _test_eof3550: cs = 3550; goto _test_eof - _test_eof3551: cs = 3551; goto _test_eof - _test_eof3552: cs = 3552; goto _test_eof - _test_eof3553: cs = 3553; goto _test_eof - _test_eof3554: cs = 3554; goto _test_eof - _test_eof3555: cs = 3555; goto _test_eof - _test_eof3556: cs = 3556; goto _test_eof - _test_eof3557: cs = 3557; goto _test_eof - _test_eof3558: cs = 3558; goto _test_eof - _test_eof3559: cs = 3559; goto _test_eof - _test_eof3560: cs = 3560; goto _test_eof - _test_eof3561: cs = 3561; goto _test_eof - _test_eof3562: cs = 3562; goto _test_eof - _test_eof3563: cs = 3563; goto _test_eof - _test_eof3564: cs = 3564; goto _test_eof - _test_eof3565: cs = 3565; goto _test_eof - _test_eof3566: cs = 3566; goto _test_eof - _test_eof3567: cs = 3567; goto _test_eof - _test_eof3568: cs = 3568; goto _test_eof - _test_eof3569: cs = 3569; goto _test_eof - _test_eof3570: cs = 3570; goto _test_eof - _test_eof3571: cs = 3571; goto _test_eof - _test_eof3572: cs = 3572; goto _test_eof - _test_eof3573: cs = 3573; goto _test_eof - _test_eof3574: cs = 3574; goto _test_eof - _test_eof3575: cs = 3575; goto _test_eof - _test_eof3576: cs = 3576; goto _test_eof - _test_eof3577: cs = 3577; goto _test_eof - _test_eof3578: cs = 3578; goto _test_eof - _test_eof3579: cs = 3579; goto _test_eof - _test_eof3580: cs = 3580; goto _test_eof - _test_eof3581: cs = 3581; goto _test_eof - _test_eof3582: cs = 3582; goto _test_eof - _test_eof3583: cs = 3583; goto _test_eof - _test_eof3584: cs = 3584; goto _test_eof - _test_eof3585: cs = 3585; goto _test_eof - _test_eof3586: cs = 3586; goto _test_eof - _test_eof3587: cs = 3587; goto _test_eof - _test_eof5075: cs = 5075; goto _test_eof - _test_eof3588: cs = 3588; goto _test_eof - _test_eof3589: cs = 3589; goto _test_eof - _test_eof3590: cs = 3590; goto _test_eof - _test_eof3591: cs = 3591; goto _test_eof - _test_eof3592: cs = 3592; goto _test_eof - _test_eof3593: cs = 3593; goto _test_eof - _test_eof5076: cs = 5076; goto _test_eof - _test_eof3594: cs = 3594; goto _test_eof - _test_eof3595: cs = 3595; goto _test_eof - _test_eof3596: cs = 3596; goto _test_eof - _test_eof3597: cs = 3597; goto _test_eof - _test_eof3598: cs = 3598; goto _test_eof - _test_eof3599: cs = 3599; goto _test_eof - _test_eof3600: cs = 3600; goto _test_eof - _test_eof3601: cs = 3601; goto _test_eof - _test_eof3602: cs = 3602; goto _test_eof - _test_eof3603: cs = 3603; goto _test_eof - _test_eof3604: cs = 3604; goto _test_eof - _test_eof3605: cs = 3605; goto _test_eof - _test_eof3606: cs = 3606; goto _test_eof - _test_eof3607: cs = 3607; goto _test_eof - _test_eof3608: cs = 3608; goto _test_eof - _test_eof3609: cs = 3609; goto _test_eof - _test_eof3610: cs = 3610; goto _test_eof - _test_eof3611: cs = 3611; goto _test_eof - _test_eof3612: cs = 3612; goto _test_eof - _test_eof3613: cs = 3613; goto _test_eof - _test_eof3614: cs = 3614; goto _test_eof - _test_eof3615: cs = 3615; goto _test_eof - _test_eof3616: cs = 3616; goto _test_eof - _test_eof3617: cs = 3617; goto _test_eof - _test_eof3618: cs = 3618; goto _test_eof - _test_eof3619: cs = 3619; goto _test_eof - _test_eof3620: cs = 3620; goto _test_eof - _test_eof3621: cs = 3621; goto _test_eof - _test_eof3622: cs = 3622; goto _test_eof - _test_eof3623: cs = 3623; goto _test_eof - _test_eof3624: cs = 3624; goto _test_eof - _test_eof3625: cs = 3625; goto _test_eof - _test_eof3626: cs = 3626; goto _test_eof - _test_eof3627: cs = 3627; goto _test_eof - _test_eof3628: cs = 3628; goto _test_eof - _test_eof3629: cs = 3629; goto _test_eof - _test_eof3630: cs = 3630; goto _test_eof - _test_eof3631: cs = 3631; goto _test_eof - _test_eof3632: cs = 3632; goto _test_eof - _test_eof3633: cs = 3633; goto _test_eof - _test_eof3634: cs = 3634; goto _test_eof - _test_eof3635: cs = 3635; goto _test_eof - _test_eof3636: cs = 3636; goto _test_eof - _test_eof3637: cs = 3637; goto _test_eof - _test_eof3638: cs = 3638; goto _test_eof - _test_eof3639: cs = 3639; goto _test_eof - _test_eof3640: cs = 3640; goto _test_eof - _test_eof3641: cs = 3641; goto _test_eof - _test_eof3642: cs = 3642; goto _test_eof - _test_eof3643: cs = 3643; goto _test_eof - _test_eof3644: cs = 3644; goto _test_eof - _test_eof3645: cs = 3645; goto _test_eof - _test_eof3646: cs = 3646; goto _test_eof - _test_eof3647: cs = 3647; goto _test_eof - _test_eof3648: cs = 3648; goto _test_eof - _test_eof3649: cs = 3649; goto _test_eof - _test_eof3650: cs = 3650; goto _test_eof - _test_eof3651: cs = 3651; goto _test_eof - _test_eof3652: cs = 3652; goto _test_eof - _test_eof3653: cs = 3653; goto _test_eof - _test_eof3654: cs = 3654; goto _test_eof - _test_eof3655: cs = 3655; goto _test_eof - _test_eof3656: cs = 3656; goto _test_eof - _test_eof3657: cs = 3657; goto _test_eof - _test_eof3658: cs = 3658; goto _test_eof - _test_eof3659: cs = 3659; goto _test_eof - _test_eof3660: cs = 3660; goto _test_eof - _test_eof3661: cs = 3661; goto _test_eof - _test_eof3662: cs = 3662; goto _test_eof - _test_eof3663: cs = 3663; goto _test_eof - _test_eof3664: cs = 3664; goto _test_eof - _test_eof3665: cs = 3665; goto _test_eof - _test_eof3666: cs = 3666; goto _test_eof - _test_eof3667: cs = 3667; goto _test_eof - _test_eof3668: cs = 3668; goto _test_eof - _test_eof3669: cs = 3669; goto _test_eof - _test_eof3670: cs = 3670; goto _test_eof - _test_eof3671: cs = 3671; goto _test_eof - _test_eof3672: cs = 3672; goto _test_eof - _test_eof3673: cs = 3673; goto _test_eof - _test_eof3674: cs = 3674; goto _test_eof - _test_eof3675: cs = 3675; goto _test_eof - _test_eof3676: cs = 3676; goto _test_eof - _test_eof3677: cs = 3677; goto _test_eof - _test_eof3678: cs = 3678; goto _test_eof - _test_eof3679: cs = 3679; goto _test_eof - _test_eof3680: cs = 3680; goto _test_eof - _test_eof3681: cs = 3681; goto _test_eof - _test_eof3682: cs = 3682; goto _test_eof - _test_eof3683: cs = 3683; goto _test_eof - _test_eof3684: cs = 3684; goto _test_eof - _test_eof3685: cs = 3685; goto _test_eof - _test_eof3686: cs = 3686; goto _test_eof - _test_eof3687: cs = 3687; goto _test_eof - _test_eof3688: cs = 3688; goto _test_eof - _test_eof3689: cs = 3689; goto _test_eof - _test_eof3690: cs = 3690; goto _test_eof - _test_eof3691: cs = 3691; goto _test_eof - _test_eof3692: cs = 3692; goto _test_eof - _test_eof3693: cs = 3693; goto _test_eof - _test_eof3694: cs = 3694; goto _test_eof - _test_eof3695: cs = 3695; goto _test_eof - _test_eof3696: cs = 3696; goto _test_eof - _test_eof3697: cs = 3697; goto _test_eof - _test_eof3698: cs = 3698; goto _test_eof - _test_eof3699: cs = 3699; goto _test_eof - _test_eof3700: cs = 3700; goto _test_eof - _test_eof3701: cs = 3701; goto _test_eof - _test_eof3702: cs = 3702; goto _test_eof - _test_eof3703: cs = 3703; goto _test_eof - _test_eof3704: cs = 3704; goto _test_eof - _test_eof3705: cs = 3705; goto _test_eof - _test_eof3706: cs = 3706; goto _test_eof - _test_eof3707: cs = 3707; goto _test_eof - _test_eof3708: cs = 3708; goto _test_eof - _test_eof3709: cs = 3709; goto _test_eof - _test_eof3710: cs = 3710; goto _test_eof - _test_eof3711: cs = 3711; goto _test_eof - _test_eof3712: cs = 3712; goto _test_eof - _test_eof3713: cs = 3713; goto _test_eof - _test_eof3714: cs = 3714; goto _test_eof - _test_eof3715: cs = 3715; goto _test_eof - _test_eof3716: cs = 3716; goto _test_eof - _test_eof3717: cs = 3717; goto _test_eof - _test_eof3718: cs = 3718; goto _test_eof - _test_eof3719: cs = 3719; goto _test_eof - _test_eof3720: cs = 3720; goto _test_eof - _test_eof3721: cs = 3721; goto _test_eof - _test_eof3722: cs = 3722; goto _test_eof - _test_eof3723: cs = 3723; goto _test_eof - _test_eof3724: cs = 3724; goto _test_eof - _test_eof3725: cs = 3725; goto _test_eof - _test_eof3726: cs = 3726; goto _test_eof - _test_eof3727: cs = 3727; goto _test_eof - _test_eof3728: cs = 3728; goto _test_eof - _test_eof3729: cs = 3729; goto _test_eof - _test_eof3730: cs = 3730; goto _test_eof - _test_eof3731: cs = 3731; goto _test_eof - _test_eof3732: cs = 3732; goto _test_eof - _test_eof3733: cs = 3733; goto _test_eof - _test_eof3734: cs = 3734; goto _test_eof - _test_eof3735: cs = 3735; goto _test_eof - _test_eof3736: cs = 3736; goto _test_eof - _test_eof5077: cs = 5077; goto _test_eof - _test_eof3737: cs = 3737; goto _test_eof - _test_eof5078: cs = 5078; goto _test_eof - _test_eof3738: cs = 3738; goto _test_eof - _test_eof3739: cs = 3739; goto _test_eof - _test_eof3740: cs = 3740; goto _test_eof - _test_eof3741: cs = 3741; goto _test_eof - _test_eof3742: cs = 3742; goto _test_eof - _test_eof3743: cs = 3743; goto _test_eof - _test_eof3744: cs = 3744; goto _test_eof - _test_eof3745: cs = 3745; goto _test_eof - _test_eof3746: cs = 3746; goto _test_eof - _test_eof3747: cs = 3747; goto _test_eof - _test_eof3748: cs = 3748; goto _test_eof - _test_eof3749: cs = 3749; goto _test_eof - _test_eof3750: cs = 3750; goto _test_eof - _test_eof3751: cs = 3751; goto _test_eof - _test_eof3752: cs = 3752; goto _test_eof - _test_eof3753: cs = 3753; goto _test_eof - _test_eof3754: cs = 3754; goto _test_eof - _test_eof3755: cs = 3755; goto _test_eof - _test_eof3756: cs = 3756; goto _test_eof - _test_eof3757: cs = 3757; goto _test_eof - _test_eof3758: cs = 3758; goto _test_eof - _test_eof3759: cs = 3759; goto _test_eof - _test_eof3760: cs = 3760; goto _test_eof - _test_eof3761: cs = 3761; goto _test_eof - _test_eof3762: cs = 3762; goto _test_eof - _test_eof3763: cs = 3763; goto _test_eof - _test_eof3764: cs = 3764; goto _test_eof - _test_eof3765: cs = 3765; goto _test_eof - _test_eof3766: cs = 3766; goto _test_eof - _test_eof3767: cs = 3767; goto _test_eof - _test_eof3768: cs = 3768; goto _test_eof - _test_eof3769: cs = 3769; goto _test_eof - _test_eof3770: cs = 3770; goto _test_eof - _test_eof3771: cs = 3771; goto _test_eof - _test_eof3772: cs = 3772; goto _test_eof - _test_eof3773: cs = 3773; goto _test_eof - _test_eof3774: cs = 3774; goto _test_eof - _test_eof3775: cs = 3775; goto _test_eof - _test_eof3776: cs = 3776; goto _test_eof - _test_eof3777: cs = 3777; goto _test_eof - _test_eof3778: cs = 3778; goto _test_eof - _test_eof3779: cs = 3779; goto _test_eof - _test_eof3780: cs = 3780; goto _test_eof - _test_eof3781: cs = 3781; goto _test_eof - _test_eof3782: cs = 3782; goto _test_eof - _test_eof3783: cs = 3783; goto _test_eof - _test_eof3784: cs = 3784; goto _test_eof - _test_eof3785: cs = 3785; goto _test_eof - _test_eof3786: cs = 3786; goto _test_eof - _test_eof3787: cs = 3787; goto _test_eof - _test_eof3788: cs = 3788; goto _test_eof - _test_eof3789: cs = 3789; goto _test_eof - _test_eof3790: cs = 3790; goto _test_eof - _test_eof3791: cs = 3791; goto _test_eof - _test_eof3792: cs = 3792; goto _test_eof - _test_eof3793: cs = 3793; goto _test_eof - _test_eof3794: cs = 3794; goto _test_eof - _test_eof3795: cs = 3795; goto _test_eof - _test_eof3796: cs = 3796; goto _test_eof - _test_eof3797: cs = 3797; goto _test_eof - _test_eof3798: cs = 3798; goto _test_eof - _test_eof3799: cs = 3799; goto _test_eof - _test_eof3800: cs = 3800; goto _test_eof - _test_eof3801: cs = 3801; goto _test_eof - _test_eof3802: cs = 3802; goto _test_eof - _test_eof3803: cs = 3803; goto _test_eof - _test_eof3804: cs = 3804; goto _test_eof - _test_eof3805: cs = 3805; goto _test_eof - _test_eof3806: cs = 3806; goto _test_eof - _test_eof3807: cs = 3807; goto _test_eof - _test_eof3808: cs = 3808; goto _test_eof - _test_eof3809: cs = 3809; goto _test_eof - _test_eof3810: cs = 3810; goto _test_eof - _test_eof3811: cs = 3811; goto _test_eof - _test_eof3812: cs = 3812; goto _test_eof - _test_eof3813: cs = 3813; goto _test_eof - _test_eof3814: cs = 3814; goto _test_eof - _test_eof3815: cs = 3815; goto _test_eof - _test_eof3816: cs = 3816; goto _test_eof - _test_eof3817: cs = 3817; goto _test_eof - _test_eof3818: cs = 3818; goto _test_eof - _test_eof3819: cs = 3819; goto _test_eof - _test_eof3820: cs = 3820; goto _test_eof - _test_eof3821: cs = 3821; goto _test_eof - _test_eof3822: cs = 3822; goto _test_eof - _test_eof3823: cs = 3823; goto _test_eof - _test_eof3824: cs = 3824; goto _test_eof - _test_eof3825: cs = 3825; goto _test_eof - _test_eof3826: cs = 3826; goto _test_eof - _test_eof3827: cs = 3827; goto _test_eof - _test_eof3828: cs = 3828; goto _test_eof - _test_eof3829: cs = 3829; goto _test_eof - _test_eof3830: cs = 3830; goto _test_eof - _test_eof3831: cs = 3831; goto _test_eof - _test_eof3832: cs = 3832; goto _test_eof - _test_eof3833: cs = 3833; goto _test_eof - _test_eof3834: cs = 3834; goto _test_eof - _test_eof3835: cs = 3835; goto _test_eof - _test_eof3836: cs = 3836; goto _test_eof - _test_eof3837: cs = 3837; goto _test_eof - _test_eof3838: cs = 3838; goto _test_eof - _test_eof3839: cs = 3839; goto _test_eof - _test_eof3840: cs = 3840; goto _test_eof - _test_eof3841: cs = 3841; goto _test_eof - _test_eof3842: cs = 3842; goto _test_eof - _test_eof3843: cs = 3843; goto _test_eof - _test_eof3844: cs = 3844; goto _test_eof - _test_eof3845: cs = 3845; goto _test_eof - _test_eof3846: cs = 3846; goto _test_eof - _test_eof3847: cs = 3847; goto _test_eof - _test_eof3848: cs = 3848; goto _test_eof - _test_eof3849: cs = 3849; goto _test_eof - _test_eof3850: cs = 3850; goto _test_eof - _test_eof3851: cs = 3851; goto _test_eof - _test_eof3852: cs = 3852; goto _test_eof - _test_eof3853: cs = 3853; goto _test_eof - _test_eof3854: cs = 3854; goto _test_eof - _test_eof3855: cs = 3855; goto _test_eof - _test_eof3856: cs = 3856; goto _test_eof - _test_eof3857: cs = 3857; goto _test_eof - _test_eof3858: cs = 3858; goto _test_eof - _test_eof3859: cs = 3859; goto _test_eof - _test_eof3860: cs = 3860; goto _test_eof - _test_eof3861: cs = 3861; goto _test_eof - _test_eof3862: cs = 3862; goto _test_eof - _test_eof3863: cs = 3863; goto _test_eof - _test_eof3864: cs = 3864; goto _test_eof - _test_eof3865: cs = 3865; goto _test_eof - _test_eof3866: cs = 3866; goto _test_eof - _test_eof3867: cs = 3867; goto _test_eof - _test_eof3868: cs = 3868; goto _test_eof - _test_eof3869: cs = 3869; goto _test_eof - _test_eof3870: cs = 3870; goto _test_eof - _test_eof3871: cs = 3871; goto _test_eof - _test_eof3872: cs = 3872; goto _test_eof - _test_eof3873: cs = 3873; goto _test_eof - _test_eof3874: cs = 3874; goto _test_eof - _test_eof3875: cs = 3875; goto _test_eof - _test_eof3876: cs = 3876; goto _test_eof - _test_eof3877: cs = 3877; goto _test_eof - _test_eof3878: cs = 3878; goto _test_eof - _test_eof3879: cs = 3879; goto _test_eof - _test_eof3880: cs = 3880; goto _test_eof - _test_eof3881: cs = 3881; goto _test_eof - _test_eof3882: cs = 3882; goto _test_eof - _test_eof3883: cs = 3883; goto _test_eof - _test_eof3884: cs = 3884; goto _test_eof - _test_eof5079: cs = 5079; goto _test_eof - _test_eof3885: cs = 3885; goto _test_eof - _test_eof3886: cs = 3886; goto _test_eof - _test_eof3887: cs = 3887; goto _test_eof - _test_eof3888: cs = 3888; goto _test_eof - _test_eof3889: cs = 3889; goto _test_eof - _test_eof3890: cs = 3890; goto _test_eof - _test_eof3891: cs = 3891; goto _test_eof - _test_eof3892: cs = 3892; goto _test_eof - _test_eof3893: cs = 3893; goto _test_eof - _test_eof3894: cs = 3894; goto _test_eof - _test_eof3895: cs = 3895; goto _test_eof - _test_eof3896: cs = 3896; goto _test_eof - _test_eof3897: cs = 3897; goto _test_eof - _test_eof3898: cs = 3898; goto _test_eof - _test_eof3899: cs = 3899; goto _test_eof - _test_eof3900: cs = 3900; goto _test_eof - _test_eof3901: cs = 3901; goto _test_eof - _test_eof3902: cs = 3902; goto _test_eof - _test_eof3903: cs = 3903; goto _test_eof - _test_eof3904: cs = 3904; goto _test_eof - _test_eof3905: cs = 3905; goto _test_eof - _test_eof3906: cs = 3906; goto _test_eof - _test_eof3907: cs = 3907; goto _test_eof - _test_eof3908: cs = 3908; goto _test_eof - _test_eof3909: cs = 3909; goto _test_eof - _test_eof3910: cs = 3910; goto _test_eof - _test_eof3911: cs = 3911; goto _test_eof - _test_eof3912: cs = 3912; goto _test_eof - _test_eof3913: cs = 3913; goto _test_eof - _test_eof3914: cs = 3914; goto _test_eof - _test_eof3915: cs = 3915; goto _test_eof - _test_eof3916: cs = 3916; goto _test_eof - _test_eof3917: cs = 3917; goto _test_eof - _test_eof3918: cs = 3918; goto _test_eof - _test_eof3919: cs = 3919; goto _test_eof - _test_eof3920: cs = 3920; goto _test_eof - _test_eof3921: cs = 3921; goto _test_eof - _test_eof3922: cs = 3922; goto _test_eof - _test_eof3923: cs = 3923; goto _test_eof - _test_eof3924: cs = 3924; goto _test_eof - _test_eof3925: cs = 3925; goto _test_eof - _test_eof3926: cs = 3926; goto _test_eof - _test_eof3927: cs = 3927; goto _test_eof - _test_eof3928: cs = 3928; goto _test_eof - _test_eof3929: cs = 3929; goto _test_eof - _test_eof3930: cs = 3930; goto _test_eof - _test_eof3931: cs = 3931; goto _test_eof - _test_eof3932: cs = 3932; goto _test_eof - _test_eof3933: cs = 3933; goto _test_eof - _test_eof3934: cs = 3934; goto _test_eof - _test_eof3935: cs = 3935; goto _test_eof - _test_eof3936: cs = 3936; goto _test_eof - _test_eof3937: cs = 3937; goto _test_eof - _test_eof3938: cs = 3938; goto _test_eof - _test_eof3939: cs = 3939; goto _test_eof - _test_eof3940: cs = 3940; goto _test_eof - _test_eof3941: cs = 3941; goto _test_eof - _test_eof3942: cs = 3942; goto _test_eof - _test_eof3943: cs = 3943; goto _test_eof - _test_eof3944: cs = 3944; goto _test_eof - _test_eof3945: cs = 3945; goto _test_eof - _test_eof3946: cs = 3946; goto _test_eof - _test_eof3947: cs = 3947; goto _test_eof - _test_eof3948: cs = 3948; goto _test_eof - _test_eof3949: cs = 3949; goto _test_eof - _test_eof3950: cs = 3950; goto _test_eof - _test_eof3951: cs = 3951; goto _test_eof - _test_eof3952: cs = 3952; goto _test_eof - _test_eof3953: cs = 3953; goto _test_eof - _test_eof3954: cs = 3954; goto _test_eof - _test_eof3955: cs = 3955; goto _test_eof - _test_eof3956: cs = 3956; goto _test_eof - _test_eof3957: cs = 3957; goto _test_eof - _test_eof3958: cs = 3958; goto _test_eof - _test_eof3959: cs = 3959; goto _test_eof - _test_eof3960: cs = 3960; goto _test_eof - _test_eof3961: cs = 3961; goto _test_eof - _test_eof3962: cs = 3962; goto _test_eof - _test_eof3963: cs = 3963; goto _test_eof - _test_eof3964: cs = 3964; goto _test_eof - _test_eof3965: cs = 3965; goto _test_eof - _test_eof3966: cs = 3966; goto _test_eof - _test_eof3967: cs = 3967; goto _test_eof - _test_eof3968: cs = 3968; goto _test_eof - _test_eof3969: cs = 3969; goto _test_eof - _test_eof3970: cs = 3970; goto _test_eof - _test_eof3971: cs = 3971; goto _test_eof - _test_eof3972: cs = 3972; goto _test_eof - _test_eof3973: cs = 3973; goto _test_eof - _test_eof3974: cs = 3974; goto _test_eof - _test_eof3975: cs = 3975; goto _test_eof - _test_eof3976: cs = 3976; goto _test_eof - _test_eof3977: cs = 3977; goto _test_eof - _test_eof3978: cs = 3978; goto _test_eof - _test_eof3979: cs = 3979; goto _test_eof - _test_eof3980: cs = 3980; goto _test_eof - _test_eof3981: cs = 3981; goto _test_eof - _test_eof3982: cs = 3982; goto _test_eof - _test_eof3983: cs = 3983; goto _test_eof - _test_eof3984: cs = 3984; goto _test_eof - _test_eof3985: cs = 3985; goto _test_eof - _test_eof3986: cs = 3986; goto _test_eof - _test_eof3987: cs = 3987; goto _test_eof - _test_eof3988: cs = 3988; goto _test_eof - _test_eof3989: cs = 3989; goto _test_eof - _test_eof3990: cs = 3990; goto _test_eof - _test_eof3991: cs = 3991; goto _test_eof - _test_eof3992: cs = 3992; goto _test_eof - _test_eof3993: cs = 3993; goto _test_eof - _test_eof3994: cs = 3994; goto _test_eof - _test_eof3995: cs = 3995; goto _test_eof - _test_eof3996: cs = 3996; goto _test_eof - _test_eof3997: cs = 3997; goto _test_eof - _test_eof3998: cs = 3998; goto _test_eof - _test_eof3999: cs = 3999; goto _test_eof - _test_eof4000: cs = 4000; goto _test_eof - _test_eof4001: cs = 4001; goto _test_eof - _test_eof4002: cs = 4002; goto _test_eof - _test_eof4003: cs = 4003; goto _test_eof - _test_eof4004: cs = 4004; goto _test_eof - _test_eof4005: cs = 4005; goto _test_eof - _test_eof4006: cs = 4006; goto _test_eof - _test_eof4007: cs = 4007; goto _test_eof - _test_eof4008: cs = 4008; goto _test_eof - _test_eof4009: cs = 4009; goto _test_eof - _test_eof4010: cs = 4010; goto _test_eof - _test_eof4011: cs = 4011; goto _test_eof - _test_eof4012: cs = 4012; goto _test_eof - _test_eof4013: cs = 4013; goto _test_eof - _test_eof4014: cs = 4014; goto _test_eof - _test_eof4015: cs = 4015; goto _test_eof - _test_eof4016: cs = 4016; goto _test_eof - _test_eof4017: cs = 4017; goto _test_eof - _test_eof4018: cs = 4018; goto _test_eof - _test_eof4019: cs = 4019; goto _test_eof - _test_eof4020: cs = 4020; goto _test_eof - _test_eof4021: cs = 4021; goto _test_eof - _test_eof4022: cs = 4022; goto _test_eof - _test_eof4023: cs = 4023; goto _test_eof - _test_eof4024: cs = 4024; goto _test_eof - _test_eof4025: cs = 4025; goto _test_eof - _test_eof4026: cs = 4026; goto _test_eof - _test_eof5080: cs = 5080; goto _test_eof - _test_eof4027: cs = 4027; goto _test_eof - _test_eof4028: cs = 4028; goto _test_eof - _test_eof4029: cs = 4029; goto _test_eof - _test_eof4030: cs = 4030; goto _test_eof - _test_eof4031: cs = 4031; goto _test_eof - _test_eof4032: cs = 4032; goto _test_eof - _test_eof4033: cs = 4033; goto _test_eof - _test_eof4034: cs = 4034; goto _test_eof - _test_eof4035: cs = 4035; goto _test_eof - _test_eof4036: cs = 4036; goto _test_eof - _test_eof4037: cs = 4037; goto _test_eof - _test_eof4038: cs = 4038; goto _test_eof - _test_eof4039: cs = 4039; goto _test_eof - _test_eof4040: cs = 4040; goto _test_eof - _test_eof4041: cs = 4041; goto _test_eof - _test_eof4042: cs = 4042; goto _test_eof - _test_eof4043: cs = 4043; goto _test_eof - _test_eof4044: cs = 4044; goto _test_eof - _test_eof4045: cs = 4045; goto _test_eof - _test_eof4046: cs = 4046; goto _test_eof - _test_eof4047: cs = 4047; goto _test_eof - _test_eof4048: cs = 4048; goto _test_eof - _test_eof4049: cs = 4049; goto _test_eof - _test_eof4050: cs = 4050; goto _test_eof - _test_eof4051: cs = 4051; goto _test_eof - _test_eof4052: cs = 4052; goto _test_eof - _test_eof4053: cs = 4053; goto _test_eof - _test_eof4054: cs = 4054; goto _test_eof - _test_eof4055: cs = 4055; goto _test_eof - _test_eof4056: cs = 4056; goto _test_eof - _test_eof4057: cs = 4057; goto _test_eof - _test_eof4058: cs = 4058; goto _test_eof - _test_eof4059: cs = 4059; goto _test_eof - _test_eof4060: cs = 4060; goto _test_eof - _test_eof4061: cs = 4061; goto _test_eof - _test_eof4062: cs = 4062; goto _test_eof - _test_eof4063: cs = 4063; goto _test_eof - _test_eof4064: cs = 4064; goto _test_eof - _test_eof4065: cs = 4065; goto _test_eof - _test_eof4066: cs = 4066; goto _test_eof - _test_eof4067: cs = 4067; goto _test_eof - _test_eof4068: cs = 4068; goto _test_eof - _test_eof4069: cs = 4069; goto _test_eof - _test_eof4070: cs = 4070; goto _test_eof - _test_eof4071: cs = 4071; goto _test_eof - _test_eof4072: cs = 4072; goto _test_eof - _test_eof4073: cs = 4073; goto _test_eof - _test_eof4074: cs = 4074; goto _test_eof - _test_eof4075: cs = 4075; goto _test_eof - _test_eof4076: cs = 4076; goto _test_eof - _test_eof4077: cs = 4077; goto _test_eof - _test_eof4078: cs = 4078; goto _test_eof - _test_eof4079: cs = 4079; goto _test_eof - _test_eof4080: cs = 4080; goto _test_eof - _test_eof4081: cs = 4081; goto _test_eof - _test_eof4082: cs = 4082; goto _test_eof - _test_eof4083: cs = 4083; goto _test_eof - _test_eof4084: cs = 4084; goto _test_eof - _test_eof4085: cs = 4085; goto _test_eof - _test_eof4086: cs = 4086; goto _test_eof - _test_eof4087: cs = 4087; goto _test_eof - _test_eof4088: cs = 4088; goto _test_eof - _test_eof4089: cs = 4089; goto _test_eof - _test_eof4090: cs = 4090; goto _test_eof - _test_eof4091: cs = 4091; goto _test_eof - _test_eof4092: cs = 4092; goto _test_eof - _test_eof4093: cs = 4093; goto _test_eof - _test_eof4094: cs = 4094; goto _test_eof - _test_eof4095: cs = 4095; goto _test_eof - _test_eof4096: cs = 4096; goto _test_eof - _test_eof4097: cs = 4097; goto _test_eof - _test_eof4098: cs = 4098; goto _test_eof - _test_eof4099: cs = 4099; goto _test_eof - _test_eof4100: cs = 4100; goto _test_eof - _test_eof4101: cs = 4101; goto _test_eof - _test_eof4102: cs = 4102; goto _test_eof - _test_eof4103: cs = 4103; goto _test_eof - _test_eof4104: cs = 4104; goto _test_eof - _test_eof4105: cs = 4105; goto _test_eof - _test_eof4106: cs = 4106; goto _test_eof - _test_eof4107: cs = 4107; goto _test_eof - _test_eof4108: cs = 4108; goto _test_eof - _test_eof4109: cs = 4109; goto _test_eof - _test_eof4110: cs = 4110; goto _test_eof - _test_eof4111: cs = 4111; goto _test_eof - _test_eof4112: cs = 4112; goto _test_eof - _test_eof4113: cs = 4113; goto _test_eof - _test_eof4114: cs = 4114; goto _test_eof - _test_eof4115: cs = 4115; goto _test_eof - _test_eof4116: cs = 4116; goto _test_eof - _test_eof4117: cs = 4117; goto _test_eof - _test_eof4118: cs = 4118; goto _test_eof - _test_eof4119: cs = 4119; goto _test_eof - _test_eof4120: cs = 4120; goto _test_eof - _test_eof4121: cs = 4121; goto _test_eof - _test_eof4122: cs = 4122; goto _test_eof - _test_eof4123: cs = 4123; goto _test_eof - _test_eof4124: cs = 4124; goto _test_eof - _test_eof4125: cs = 4125; goto _test_eof - _test_eof4126: cs = 4126; goto _test_eof - _test_eof4127: cs = 4127; goto _test_eof - _test_eof4128: cs = 4128; goto _test_eof - _test_eof4129: cs = 4129; goto _test_eof - _test_eof4130: cs = 4130; goto _test_eof - _test_eof4131: cs = 4131; goto _test_eof - _test_eof4132: cs = 4132; goto _test_eof - _test_eof4133: cs = 4133; goto _test_eof - _test_eof4134: cs = 4134; goto _test_eof - _test_eof4135: cs = 4135; goto _test_eof - _test_eof4136: cs = 4136; goto _test_eof - _test_eof4137: cs = 4137; goto _test_eof - _test_eof4138: cs = 4138; goto _test_eof - _test_eof4139: cs = 4139; goto _test_eof - _test_eof4140: cs = 4140; goto _test_eof - _test_eof4141: cs = 4141; goto _test_eof - _test_eof4142: cs = 4142; goto _test_eof - _test_eof4143: cs = 4143; goto _test_eof - _test_eof4144: cs = 4144; goto _test_eof - _test_eof4145: cs = 4145; goto _test_eof - _test_eof4146: cs = 4146; goto _test_eof - _test_eof4147: cs = 4147; goto _test_eof - _test_eof4148: cs = 4148; goto _test_eof - _test_eof4149: cs = 4149; goto _test_eof - _test_eof4150: cs = 4150; goto _test_eof - _test_eof4151: cs = 4151; goto _test_eof - _test_eof4152: cs = 4152; goto _test_eof - _test_eof4153: cs = 4153; goto _test_eof - _test_eof4154: cs = 4154; goto _test_eof - _test_eof4155: cs = 4155; goto _test_eof - _test_eof4156: cs = 4156; goto _test_eof - _test_eof4157: cs = 4157; goto _test_eof - _test_eof4158: cs = 4158; goto _test_eof - _test_eof4159: cs = 4159; goto _test_eof - _test_eof4160: cs = 4160; goto _test_eof - _test_eof4161: cs = 4161; goto _test_eof - _test_eof4162: cs = 4162; goto _test_eof - _test_eof4163: cs = 4163; goto _test_eof - _test_eof4164: cs = 4164; goto _test_eof - _test_eof4165: cs = 4165; goto _test_eof - _test_eof4166: cs = 4166; goto _test_eof - _test_eof4167: cs = 4167; goto _test_eof - _test_eof4168: cs = 4168; goto _test_eof - _test_eof4169: cs = 4169; goto _test_eof - _test_eof4170: cs = 4170; goto _test_eof - _test_eof4171: cs = 4171; goto _test_eof - _test_eof4172: cs = 4172; goto _test_eof - _test_eof4173: cs = 4173; goto _test_eof - _test_eof4174: cs = 4174; goto _test_eof - _test_eof4175: cs = 4175; goto _test_eof - _test_eof5081: cs = 5081; goto _test_eof - _test_eof4176: cs = 4176; goto _test_eof - _test_eof4177: cs = 4177; goto _test_eof - _test_eof4178: cs = 4178; goto _test_eof - _test_eof4179: cs = 4179; goto _test_eof - _test_eof4180: cs = 4180; goto _test_eof - _test_eof4181: cs = 4181; goto _test_eof - _test_eof4182: cs = 4182; goto _test_eof - _test_eof4183: cs = 4183; goto _test_eof - _test_eof4184: cs = 4184; goto _test_eof - _test_eof4185: cs = 4185; goto _test_eof - _test_eof4186: cs = 4186; goto _test_eof - _test_eof4187: cs = 4187; goto _test_eof - _test_eof4188: cs = 4188; goto _test_eof - _test_eof4189: cs = 4189; goto _test_eof - _test_eof4190: cs = 4190; goto _test_eof - _test_eof4191: cs = 4191; goto _test_eof - _test_eof4192: cs = 4192; goto _test_eof - _test_eof4193: cs = 4193; goto _test_eof - _test_eof4194: cs = 4194; goto _test_eof - _test_eof4195: cs = 4195; goto _test_eof - _test_eof4196: cs = 4196; goto _test_eof - _test_eof4197: cs = 4197; goto _test_eof - _test_eof4198: cs = 4198; goto _test_eof - _test_eof4199: cs = 4199; goto _test_eof - _test_eof4200: cs = 4200; goto _test_eof - _test_eof4201: cs = 4201; goto _test_eof - _test_eof4202: cs = 4202; goto _test_eof - _test_eof4203: cs = 4203; goto _test_eof - _test_eof4204: cs = 4204; goto _test_eof - _test_eof4205: cs = 4205; goto _test_eof - _test_eof4206: cs = 4206; goto _test_eof - _test_eof4207: cs = 4207; goto _test_eof - _test_eof4208: cs = 4208; goto _test_eof - _test_eof4209: cs = 4209; goto _test_eof - _test_eof4210: cs = 4210; goto _test_eof - _test_eof4211: cs = 4211; goto _test_eof - _test_eof4212: cs = 4212; goto _test_eof - _test_eof4213: cs = 4213; goto _test_eof - _test_eof4214: cs = 4214; goto _test_eof - _test_eof4215: cs = 4215; goto _test_eof - _test_eof4216: cs = 4216; goto _test_eof - _test_eof4217: cs = 4217; goto _test_eof - _test_eof4218: cs = 4218; goto _test_eof - _test_eof4219: cs = 4219; goto _test_eof - _test_eof4220: cs = 4220; goto _test_eof - _test_eof4221: cs = 4221; goto _test_eof - _test_eof4222: cs = 4222; goto _test_eof - _test_eof4223: cs = 4223; goto _test_eof - _test_eof4224: cs = 4224; goto _test_eof - _test_eof4225: cs = 4225; goto _test_eof - _test_eof4226: cs = 4226; goto _test_eof - _test_eof4227: cs = 4227; goto _test_eof - _test_eof4228: cs = 4228; goto _test_eof - _test_eof4229: cs = 4229; goto _test_eof - _test_eof4230: cs = 4230; goto _test_eof - _test_eof4231: cs = 4231; goto _test_eof - _test_eof4232: cs = 4232; goto _test_eof - _test_eof4233: cs = 4233; goto _test_eof - _test_eof4234: cs = 4234; goto _test_eof - _test_eof4235: cs = 4235; goto _test_eof - _test_eof4236: cs = 4236; goto _test_eof - _test_eof4237: cs = 4237; goto _test_eof - _test_eof4238: cs = 4238; goto _test_eof - _test_eof4239: cs = 4239; goto _test_eof - _test_eof4240: cs = 4240; goto _test_eof - _test_eof4241: cs = 4241; goto _test_eof - _test_eof4242: cs = 4242; goto _test_eof - _test_eof4243: cs = 4243; goto _test_eof - _test_eof4244: cs = 4244; goto _test_eof - _test_eof4245: cs = 4245; goto _test_eof - _test_eof4246: cs = 4246; goto _test_eof - _test_eof4247: cs = 4247; goto _test_eof - _test_eof4248: cs = 4248; goto _test_eof - _test_eof4249: cs = 4249; goto _test_eof - _test_eof4250: cs = 4250; goto _test_eof - _test_eof4251: cs = 4251; goto _test_eof - _test_eof4252: cs = 4252; goto _test_eof - _test_eof4253: cs = 4253; goto _test_eof - _test_eof4254: cs = 4254; goto _test_eof - _test_eof4255: cs = 4255; goto _test_eof - _test_eof4256: cs = 4256; goto _test_eof - _test_eof4257: cs = 4257; goto _test_eof - _test_eof4258: cs = 4258; goto _test_eof - _test_eof4259: cs = 4259; goto _test_eof - _test_eof4260: cs = 4260; goto _test_eof - _test_eof4261: cs = 4261; goto _test_eof - _test_eof4262: cs = 4262; goto _test_eof - _test_eof4263: cs = 4263; goto _test_eof - _test_eof4264: cs = 4264; goto _test_eof - _test_eof4265: cs = 4265; goto _test_eof - _test_eof4266: cs = 4266; goto _test_eof - _test_eof4267: cs = 4267; goto _test_eof - _test_eof4268: cs = 4268; goto _test_eof - _test_eof4269: cs = 4269; goto _test_eof - _test_eof4270: cs = 4270; goto _test_eof - _test_eof4271: cs = 4271; goto _test_eof - _test_eof4272: cs = 4272; goto _test_eof - _test_eof4273: cs = 4273; goto _test_eof - _test_eof4274: cs = 4274; goto _test_eof - _test_eof4275: cs = 4275; goto _test_eof - _test_eof4276: cs = 4276; goto _test_eof - _test_eof4277: cs = 4277; goto _test_eof - _test_eof4278: cs = 4278; goto _test_eof - _test_eof4279: cs = 4279; goto _test_eof - _test_eof4280: cs = 4280; goto _test_eof - _test_eof4281: cs = 4281; goto _test_eof - _test_eof4282: cs = 4282; goto _test_eof - _test_eof4283: cs = 4283; goto _test_eof - _test_eof4284: cs = 4284; goto _test_eof - _test_eof4285: cs = 4285; goto _test_eof - _test_eof4286: cs = 4286; goto _test_eof - _test_eof4287: cs = 4287; goto _test_eof - _test_eof4288: cs = 4288; goto _test_eof - _test_eof4289: cs = 4289; goto _test_eof - _test_eof4290: cs = 4290; goto _test_eof - _test_eof4291: cs = 4291; goto _test_eof - _test_eof4292: cs = 4292; goto _test_eof - _test_eof4293: cs = 4293; goto _test_eof - _test_eof4294: cs = 4294; goto _test_eof - _test_eof4295: cs = 4295; goto _test_eof - _test_eof4296: cs = 4296; goto _test_eof - _test_eof4297: cs = 4297; goto _test_eof - _test_eof4298: cs = 4298; goto _test_eof - _test_eof4299: cs = 4299; goto _test_eof - _test_eof4300: cs = 4300; goto _test_eof - _test_eof4301: cs = 4301; goto _test_eof - _test_eof4302: cs = 4302; goto _test_eof - _test_eof4303: cs = 4303; goto _test_eof - _test_eof4304: cs = 4304; goto _test_eof - _test_eof4305: cs = 4305; goto _test_eof - _test_eof4306: cs = 4306; goto _test_eof - _test_eof4307: cs = 4307; goto _test_eof - _test_eof4308: cs = 4308; goto _test_eof - _test_eof4309: cs = 4309; goto _test_eof - _test_eof4310: cs = 4310; goto _test_eof - _test_eof4311: cs = 4311; goto _test_eof - _test_eof4312: cs = 4312; goto _test_eof - _test_eof4313: cs = 4313; goto _test_eof - _test_eof4314: cs = 4314; goto _test_eof - _test_eof4315: cs = 4315; goto _test_eof - _test_eof4316: cs = 4316; goto _test_eof - _test_eof4317: cs = 4317; goto _test_eof - _test_eof4318: cs = 4318; goto _test_eof - _test_eof5082: cs = 5082; goto _test_eof - _test_eof4319: cs = 4319; goto _test_eof - _test_eof4320: cs = 4320; goto _test_eof - _test_eof4321: cs = 4321; goto _test_eof - _test_eof4322: cs = 4322; goto _test_eof - _test_eof4323: cs = 4323; goto _test_eof - _test_eof4324: cs = 4324; goto _test_eof - _test_eof4325: cs = 4325; goto _test_eof - _test_eof4326: cs = 4326; goto _test_eof - _test_eof4327: cs = 4327; goto _test_eof - _test_eof4328: cs = 4328; goto _test_eof - _test_eof4329: cs = 4329; goto _test_eof - _test_eof4330: cs = 4330; goto _test_eof - _test_eof4331: cs = 4331; goto _test_eof - _test_eof4332: cs = 4332; goto _test_eof - _test_eof4333: cs = 4333; goto _test_eof - _test_eof4334: cs = 4334; goto _test_eof - _test_eof4335: cs = 4335; goto _test_eof - _test_eof4336: cs = 4336; goto _test_eof - _test_eof4337: cs = 4337; goto _test_eof - _test_eof4338: cs = 4338; goto _test_eof - _test_eof4339: cs = 4339; goto _test_eof - _test_eof4340: cs = 4340; goto _test_eof - _test_eof4341: cs = 4341; goto _test_eof - _test_eof4342: cs = 4342; goto _test_eof - _test_eof4343: cs = 4343; goto _test_eof - _test_eof4344: cs = 4344; goto _test_eof - _test_eof4345: cs = 4345; goto _test_eof - _test_eof4346: cs = 4346; goto _test_eof - _test_eof4347: cs = 4347; goto _test_eof - _test_eof4348: cs = 4348; goto _test_eof - _test_eof4349: cs = 4349; goto _test_eof - _test_eof4350: cs = 4350; goto _test_eof - _test_eof4351: cs = 4351; goto _test_eof - _test_eof4352: cs = 4352; goto _test_eof - _test_eof4353: cs = 4353; goto _test_eof - _test_eof4354: cs = 4354; goto _test_eof - _test_eof4355: cs = 4355; goto _test_eof - _test_eof4356: cs = 4356; goto _test_eof - _test_eof4357: cs = 4357; goto _test_eof - _test_eof4358: cs = 4358; goto _test_eof - _test_eof4359: cs = 4359; goto _test_eof - _test_eof4360: cs = 4360; goto _test_eof - _test_eof4361: cs = 4361; goto _test_eof - _test_eof4362: cs = 4362; goto _test_eof - _test_eof4363: cs = 4363; goto _test_eof - _test_eof4364: cs = 4364; goto _test_eof - _test_eof4365: cs = 4365; goto _test_eof - _test_eof4366: cs = 4366; goto _test_eof - _test_eof4367: cs = 4367; goto _test_eof - _test_eof4368: cs = 4368; goto _test_eof - _test_eof4369: cs = 4369; goto _test_eof - _test_eof4370: cs = 4370; goto _test_eof - _test_eof4371: cs = 4371; goto _test_eof - _test_eof4372: cs = 4372; goto _test_eof - _test_eof4373: cs = 4373; goto _test_eof - _test_eof4374: cs = 4374; goto _test_eof - _test_eof4375: cs = 4375; goto _test_eof - _test_eof4376: cs = 4376; goto _test_eof - _test_eof4377: cs = 4377; goto _test_eof - _test_eof4378: cs = 4378; goto _test_eof - _test_eof4379: cs = 4379; goto _test_eof - _test_eof4380: cs = 4380; goto _test_eof - _test_eof4381: cs = 4381; goto _test_eof - _test_eof4382: cs = 4382; goto _test_eof - _test_eof4383: cs = 4383; goto _test_eof - _test_eof4384: cs = 4384; goto _test_eof - _test_eof4385: cs = 4385; goto _test_eof - _test_eof4386: cs = 4386; goto _test_eof - _test_eof4387: cs = 4387; goto _test_eof - _test_eof4388: cs = 4388; goto _test_eof - _test_eof4389: cs = 4389; goto _test_eof - _test_eof4390: cs = 4390; goto _test_eof - _test_eof4391: cs = 4391; goto _test_eof - _test_eof4392: cs = 4392; goto _test_eof - _test_eof4393: cs = 4393; goto _test_eof - _test_eof4394: cs = 4394; goto _test_eof - _test_eof4395: cs = 4395; goto _test_eof - _test_eof4396: cs = 4396; goto _test_eof - _test_eof4397: cs = 4397; goto _test_eof - _test_eof4398: cs = 4398; goto _test_eof - _test_eof4399: cs = 4399; goto _test_eof - _test_eof4400: cs = 4400; goto _test_eof - _test_eof4401: cs = 4401; goto _test_eof - _test_eof4402: cs = 4402; goto _test_eof - _test_eof4403: cs = 4403; goto _test_eof - _test_eof4404: cs = 4404; goto _test_eof - _test_eof4405: cs = 4405; goto _test_eof - _test_eof4406: cs = 4406; goto _test_eof - _test_eof4407: cs = 4407; goto _test_eof - _test_eof4408: cs = 4408; goto _test_eof - _test_eof4409: cs = 4409; goto _test_eof - _test_eof4410: cs = 4410; goto _test_eof - _test_eof4411: cs = 4411; goto _test_eof - _test_eof4412: cs = 4412; goto _test_eof - _test_eof4413: cs = 4413; goto _test_eof - _test_eof4414: cs = 4414; goto _test_eof - _test_eof4415: cs = 4415; goto _test_eof - _test_eof4416: cs = 4416; goto _test_eof - _test_eof4417: cs = 4417; goto _test_eof - _test_eof4418: cs = 4418; goto _test_eof - _test_eof4419: cs = 4419; goto _test_eof - _test_eof4420: cs = 4420; goto _test_eof - _test_eof4421: cs = 4421; goto _test_eof - _test_eof4422: cs = 4422; goto _test_eof - _test_eof4423: cs = 4423; goto _test_eof - _test_eof4424: cs = 4424; goto _test_eof - _test_eof4425: cs = 4425; goto _test_eof - _test_eof4426: cs = 4426; goto _test_eof - _test_eof4427: cs = 4427; goto _test_eof - _test_eof4428: cs = 4428; goto _test_eof - _test_eof4429: cs = 4429; goto _test_eof - _test_eof4430: cs = 4430; goto _test_eof - _test_eof4431: cs = 4431; goto _test_eof - _test_eof4432: cs = 4432; goto _test_eof - _test_eof4433: cs = 4433; goto _test_eof - _test_eof4434: cs = 4434; goto _test_eof - _test_eof4435: cs = 4435; goto _test_eof - _test_eof4436: cs = 4436; goto _test_eof - _test_eof4437: cs = 4437; goto _test_eof - _test_eof4438: cs = 4438; goto _test_eof - _test_eof4439: cs = 4439; goto _test_eof - _test_eof4440: cs = 4440; goto _test_eof - _test_eof4441: cs = 4441; goto _test_eof - _test_eof4442: cs = 4442; goto _test_eof - _test_eof4443: cs = 4443; goto _test_eof - _test_eof4444: cs = 4444; goto _test_eof - _test_eof4445: cs = 4445; goto _test_eof - _test_eof4446: cs = 4446; goto _test_eof - _test_eof4447: cs = 4447; goto _test_eof - _test_eof4448: cs = 4448; goto _test_eof - _test_eof4449: cs = 4449; goto _test_eof - _test_eof4450: cs = 4450; goto _test_eof - _test_eof4451: cs = 4451; goto _test_eof - _test_eof4452: cs = 4452; goto _test_eof - _test_eof4453: cs = 4453; goto _test_eof - _test_eof4454: cs = 4454; goto _test_eof - _test_eof4455: cs = 4455; goto _test_eof - _test_eof4456: cs = 4456; goto _test_eof - _test_eof4457: cs = 4457; goto _test_eof - _test_eof4458: cs = 4458; goto _test_eof - _test_eof4459: cs = 4459; goto _test_eof - _test_eof4460: cs = 4460; goto _test_eof - _test_eof4461: cs = 4461; goto _test_eof - _test_eof4462: cs = 4462; goto _test_eof - _test_eof4463: cs = 4463; goto _test_eof - _test_eof4464: cs = 4464; goto _test_eof - _test_eof4465: cs = 4465; goto _test_eof - _test_eof4466: cs = 4466; goto _test_eof - _test_eof4467: cs = 4467; goto _test_eof - _test_eof4468: cs = 4468; goto _test_eof - _test_eof4469: cs = 4469; goto _test_eof - _test_eof4470: cs = 4470; goto _test_eof - _test_eof4471: cs = 4471; goto _test_eof - _test_eof4472: cs = 4472; goto _test_eof - _test_eof5083: cs = 5083; goto _test_eof - _test_eof5084: cs = 5084; goto _test_eof - _test_eof5085: cs = 5085; goto _test_eof - _test_eof5086: cs = 5086; goto _test_eof - _test_eof5087: cs = 5087; goto _test_eof - _test_eof5088: cs = 5088; goto _test_eof - _test_eof5089: cs = 5089; goto _test_eof - _test_eof5090: cs = 5090; goto _test_eof - _test_eof5091: cs = 5091; goto _test_eof - _test_eof5092: cs = 5092; goto _test_eof - _test_eof5093: cs = 5093; goto _test_eof - _test_eof5094: cs = 5094; goto _test_eof - _test_eof5095: cs = 5095; goto _test_eof - _test_eof5096: cs = 5096; goto _test_eof - _test_eof5097: cs = 5097; goto _test_eof - _test_eof5098: cs = 5098; goto _test_eof - _test_eof5099: cs = 5099; goto _test_eof - _test_eof5100: cs = 5100; goto _test_eof - _test_eof5101: cs = 5101; goto _test_eof - _test_eof5102: cs = 5102; goto _test_eof - _test_eof5103: cs = 5103; goto _test_eof - _test_eof5104: cs = 5104; goto _test_eof - _test_eof5105: cs = 5105; goto _test_eof - _test_eof5106: cs = 5106; goto _test_eof - _test_eof5107: cs = 5107; goto _test_eof - _test_eof5108: cs = 5108; goto _test_eof - _test_eof5109: cs = 5109; goto _test_eof - _test_eof5110: cs = 5110; goto _test_eof - _test_eof5111: cs = 5111; goto _test_eof - _test_eof5112: cs = 5112; goto _test_eof - _test_eof5113: cs = 5113; goto _test_eof - _test_eof5114: cs = 5114; goto _test_eof - _test_eof5115: cs = 5115; goto _test_eof - _test_eof5116: cs = 5116; goto _test_eof - _test_eof5117: cs = 5117; goto _test_eof - _test_eof5118: cs = 5118; goto _test_eof - _test_eof5119: cs = 5119; goto _test_eof - _test_eof5120: cs = 5120; goto _test_eof - _test_eof5121: cs = 5121; goto _test_eof - _test_eof5122: cs = 5122; goto _test_eof - _test_eof5123: cs = 5123; goto _test_eof - _test_eof5124: cs = 5124; goto _test_eof - _test_eof5125: cs = 5125; goto _test_eof - _test_eof5126: cs = 5126; goto _test_eof - _test_eof5127: cs = 5127; goto _test_eof - _test_eof5128: cs = 5128; goto _test_eof - _test_eof5129: cs = 5129; goto _test_eof - _test_eof5130: cs = 5130; goto _test_eof - _test_eof5131: cs = 5131; goto _test_eof - _test_eof5132: cs = 5132; goto _test_eof - _test_eof5133: cs = 5133; goto _test_eof - _test_eof5134: cs = 5134; goto _test_eof - _test_eof5135: cs = 5135; goto _test_eof - _test_eof5136: cs = 5136; goto _test_eof - _test_eof5137: cs = 5137; goto _test_eof - _test_eof5138: cs = 5138; goto _test_eof - _test_eof5139: cs = 5139; goto _test_eof - _test_eof5140: cs = 5140; goto _test_eof - _test_eof5141: cs = 5141; goto _test_eof - _test_eof5142: cs = 5142; goto _test_eof - _test_eof5143: cs = 5143; goto _test_eof - _test_eof5144: cs = 5144; goto _test_eof - _test_eof5145: cs = 5145; goto _test_eof - _test_eof5146: cs = 5146; goto _test_eof - _test_eof5147: cs = 5147; goto _test_eof - _test_eof5148: cs = 5148; goto _test_eof - _test_eof5149: cs = 5149; goto _test_eof - _test_eof5150: cs = 5150; goto _test_eof - _test_eof5151: cs = 5151; goto _test_eof - _test_eof5152: cs = 5152; goto _test_eof - _test_eof4473: cs = 4473; goto _test_eof - _test_eof5153: cs = 5153; goto _test_eof - _test_eof5154: cs = 5154; goto _test_eof - _test_eof5155: cs = 5155; goto _test_eof - _test_eof5156: cs = 5156; goto _test_eof - _test_eof5157: cs = 5157; goto _test_eof - _test_eof5158: cs = 5158; goto _test_eof - _test_eof5159: cs = 5159; goto _test_eof - _test_eof5160: cs = 5160; goto _test_eof - _test_eof5161: cs = 5161; goto _test_eof - _test_eof5162: cs = 5162; goto _test_eof - _test_eof5163: cs = 5163; goto _test_eof - _test_eof5164: cs = 5164; goto _test_eof - _test_eof5165: cs = 5165; goto _test_eof - _test_eof5166: cs = 5166; goto _test_eof - _test_eof5167: cs = 5167; goto _test_eof - _test_eof5168: cs = 5168; goto _test_eof - _test_eof5169: cs = 5169; goto _test_eof - _test_eof5170: cs = 5170; goto _test_eof - _test_eof5171: cs = 5171; goto _test_eof - _test_eof5172: cs = 5172; goto _test_eof - _test_eof5173: cs = 5173; goto _test_eof - _test_eof4474: cs = 4474; goto _test_eof - _test_eof5174: cs = 5174; goto _test_eof - _test_eof5175: cs = 5175; goto _test_eof - _test_eof5176: cs = 5176; goto _test_eof - _test_eof5177: cs = 5177; goto _test_eof - _test_eof5178: cs = 5178; goto _test_eof - _test_eof5179: cs = 5179; goto _test_eof - _test_eof4475: cs = 4475; goto _test_eof - _test_eof5180: cs = 5180; goto _test_eof - _test_eof5181: cs = 5181; goto _test_eof - _test_eof4476: cs = 4476; goto _test_eof - _test_eof5182: cs = 5182; goto _test_eof - _test_eof5183: cs = 5183; goto _test_eof - _test_eof5184: cs = 5184; goto _test_eof - _test_eof5185: cs = 5185; goto _test_eof - _test_eof5186: cs = 5186; goto _test_eof - _test_eof5187: cs = 5187; goto _test_eof - _test_eof5188: cs = 5188; goto _test_eof - _test_eof5189: cs = 5189; goto _test_eof - _test_eof5190: cs = 5190; goto _test_eof - _test_eof5191: cs = 5191; goto _test_eof - _test_eof5192: cs = 5192; goto _test_eof - _test_eof5193: cs = 5193; goto _test_eof - _test_eof5194: cs = 5194; goto _test_eof - _test_eof5195: cs = 5195; goto _test_eof - _test_eof5196: cs = 5196; goto _test_eof - _test_eof4477: cs = 4477; goto _test_eof - _test_eof5197: cs = 5197; goto _test_eof - _test_eof5198: cs = 5198; goto _test_eof - _test_eof5199: cs = 5199; goto _test_eof - _test_eof4478: cs = 4478; goto _test_eof - _test_eof5200: cs = 5200; goto _test_eof - _test_eof5201: cs = 5201; goto _test_eof - _test_eof5202: cs = 5202; goto _test_eof - _test_eof5203: cs = 5203; goto _test_eof - _test_eof5204: cs = 5204; goto _test_eof - _test_eof5205: cs = 5205; goto _test_eof - _test_eof4479: cs = 4479; goto _test_eof - _test_eof5206: cs = 5206; goto _test_eof - _test_eof5207: cs = 5207; goto _test_eof - _test_eof4480: cs = 4480; goto _test_eof - _test_eof5208: cs = 5208; goto _test_eof - _test_eof5209: cs = 5209; goto _test_eof - _test_eof5210: cs = 5210; goto _test_eof - _test_eof4481: cs = 4481; goto _test_eof - _test_eof4482: cs = 4482; goto _test_eof - _test_eof4483: cs = 4483; goto _test_eof - _test_eof4484: cs = 4484; goto _test_eof - _test_eof4485: cs = 4485; goto _test_eof - _test_eof4486: cs = 4486; goto _test_eof - _test_eof4487: cs = 4487; goto _test_eof - _test_eof4488: cs = 4488; goto _test_eof - _test_eof4489: cs = 4489; goto _test_eof - _test_eof4490: cs = 4490; goto _test_eof - _test_eof4491: cs = 4491; goto _test_eof - _test_eof4492: cs = 4492; goto _test_eof - _test_eof4493: cs = 4493; goto _test_eof - _test_eof4494: cs = 4494; goto _test_eof - _test_eof4495: cs = 4495; goto _test_eof - _test_eof5211: cs = 5211; goto _test_eof - _test_eof4496: cs = 4496; goto _test_eof - _test_eof4497: cs = 4497; goto _test_eof - _test_eof4498: cs = 4498; goto _test_eof - _test_eof4499: cs = 4499; goto _test_eof - _test_eof4500: cs = 4500; goto _test_eof - _test_eof4501: cs = 4501; goto _test_eof - _test_eof4502: cs = 4502; goto _test_eof - _test_eof4503: cs = 4503; goto _test_eof - _test_eof4504: cs = 4504; goto _test_eof - _test_eof4505: cs = 4505; goto _test_eof - _test_eof4506: cs = 4506; goto _test_eof - _test_eof4507: cs = 4507; goto _test_eof - _test_eof4508: cs = 4508; goto _test_eof - _test_eof4509: cs = 4509; goto _test_eof - _test_eof4510: cs = 4510; goto _test_eof - _test_eof4511: cs = 4511; goto _test_eof - _test_eof4512: cs = 4512; goto _test_eof - _test_eof4513: cs = 4513; goto _test_eof - _test_eof4514: cs = 4514; goto _test_eof - _test_eof4515: cs = 4515; goto _test_eof - _test_eof4516: cs = 4516; goto _test_eof - _test_eof4517: cs = 4517; goto _test_eof - _test_eof4518: cs = 4518; goto _test_eof - _test_eof4519: cs = 4519; goto _test_eof - _test_eof4520: cs = 4520; goto _test_eof - _test_eof4521: cs = 4521; goto _test_eof - _test_eof4522: cs = 4522; goto _test_eof - _test_eof4523: cs = 4523; goto _test_eof - _test_eof4524: cs = 4524; goto _test_eof - _test_eof4525: cs = 4525; goto _test_eof - _test_eof4526: cs = 4526; goto _test_eof - _test_eof4527: cs = 4527; goto _test_eof - _test_eof4528: cs = 4528; goto _test_eof - _test_eof4529: cs = 4529; goto _test_eof - _test_eof4530: cs = 4530; goto _test_eof - _test_eof4531: cs = 4531; goto _test_eof - _test_eof4532: cs = 4532; goto _test_eof - _test_eof4533: cs = 4533; goto _test_eof - _test_eof4534: cs = 4534; goto _test_eof - _test_eof4535: cs = 4535; goto _test_eof - _test_eof4536: cs = 4536; goto _test_eof - _test_eof4537: cs = 4537; goto _test_eof - _test_eof4538: cs = 4538; goto _test_eof - _test_eof4539: cs = 4539; goto _test_eof - _test_eof4540: cs = 4540; goto _test_eof - _test_eof4541: cs = 4541; goto _test_eof - _test_eof4542: cs = 4542; goto _test_eof - _test_eof4543: cs = 4543; goto _test_eof - _test_eof4544: cs = 4544; goto _test_eof - _test_eof4545: cs = 4545; goto _test_eof - _test_eof4546: cs = 4546; goto _test_eof - _test_eof4547: cs = 4547; goto _test_eof - _test_eof4548: cs = 4548; goto _test_eof - _test_eof4549: cs = 4549; goto _test_eof - _test_eof4550: cs = 4550; goto _test_eof - _test_eof4551: cs = 4551; goto _test_eof - _test_eof4552: cs = 4552; goto _test_eof - _test_eof4553: cs = 4553; goto _test_eof - _test_eof4554: cs = 4554; goto _test_eof - _test_eof4555: cs = 4555; goto _test_eof - _test_eof4556: cs = 4556; goto _test_eof - _test_eof4557: cs = 4557; goto _test_eof - _test_eof4558: cs = 4558; goto _test_eof - _test_eof4559: cs = 4559; goto _test_eof - _test_eof4560: cs = 4560; goto _test_eof - _test_eof4561: cs = 4561; goto _test_eof - _test_eof4562: cs = 4562; goto _test_eof - _test_eof4563: cs = 4563; goto _test_eof - _test_eof4564: cs = 4564; goto _test_eof - _test_eof4565: cs = 4565; goto _test_eof - _test_eof4566: cs = 4566; goto _test_eof - _test_eof4567: cs = 4567; goto _test_eof - _test_eof4568: cs = 4568; goto _test_eof - _test_eof4569: cs = 4569; goto _test_eof - _test_eof4570: cs = 4570; goto _test_eof - _test_eof4571: cs = 4571; goto _test_eof - _test_eof4572: cs = 4572; goto _test_eof - _test_eof4573: cs = 4573; goto _test_eof - _test_eof4574: cs = 4574; goto _test_eof - _test_eof4575: cs = 4575; goto _test_eof - _test_eof4576: cs = 4576; goto _test_eof - _test_eof4577: cs = 4577; goto _test_eof - _test_eof4578: cs = 4578; goto _test_eof - _test_eof4579: cs = 4579; goto _test_eof - _test_eof4580: cs = 4580; goto _test_eof - _test_eof4581: cs = 4581; goto _test_eof - _test_eof4582: cs = 4582; goto _test_eof - _test_eof4583: cs = 4583; goto _test_eof - _test_eof4584: cs = 4584; goto _test_eof - _test_eof4585: cs = 4585; goto _test_eof - _test_eof4586: cs = 4586; goto _test_eof - _test_eof4587: cs = 4587; goto _test_eof - _test_eof4588: cs = 4588; goto _test_eof - _test_eof4589: cs = 4589; goto _test_eof - _test_eof4590: cs = 4590; goto _test_eof - _test_eof4591: cs = 4591; goto _test_eof - _test_eof4592: cs = 4592; goto _test_eof - _test_eof4593: cs = 4593; goto _test_eof - _test_eof4594: cs = 4594; goto _test_eof - _test_eof4595: cs = 4595; goto _test_eof - _test_eof4596: cs = 4596; goto _test_eof - _test_eof4597: cs = 4597; goto _test_eof - _test_eof4598: cs = 4598; goto _test_eof - _test_eof4599: cs = 4599; goto _test_eof - _test_eof4600: cs = 4600; goto _test_eof - _test_eof4601: cs = 4601; goto _test_eof - _test_eof4602: cs = 4602; goto _test_eof - _test_eof4603: cs = 4603; goto _test_eof - _test_eof4604: cs = 4604; goto _test_eof - _test_eof4605: cs = 4605; goto _test_eof - _test_eof4606: cs = 4606; goto _test_eof - _test_eof4607: cs = 4607; goto _test_eof - _test_eof4608: cs = 4608; goto _test_eof - _test_eof4609: cs = 4609; goto _test_eof - _test_eof4610: cs = 4610; goto _test_eof - _test_eof4611: cs = 4611; goto _test_eof - _test_eof4612: cs = 4612; goto _test_eof - _test_eof4613: cs = 4613; goto _test_eof - _test_eof4614: cs = 4614; goto _test_eof - _test_eof4615: cs = 4615; goto _test_eof - _test_eof4616: cs = 4616; goto _test_eof - _test_eof4617: cs = 4617; goto _test_eof - _test_eof4618: cs = 4618; goto _test_eof - _test_eof4619: cs = 4619; goto _test_eof - _test_eof4620: cs = 4620; goto _test_eof - _test_eof4621: cs = 4621; goto _test_eof - _test_eof4622: cs = 4622; goto _test_eof - _test_eof4623: cs = 4623; goto _test_eof - _test_eof4624: cs = 4624; goto _test_eof - _test_eof4625: cs = 4625; goto _test_eof - _test_eof4626: cs = 4626; goto _test_eof - _test_eof4627: cs = 4627; goto _test_eof - _test_eof4628: cs = 4628; goto _test_eof - _test_eof4629: cs = 4629; goto _test_eof - _test_eof4630: cs = 4630; goto _test_eof - _test_eof4631: cs = 4631; goto _test_eof - _test_eof4632: cs = 4632; goto _test_eof - _test_eof4633: cs = 4633; goto _test_eof - _test_eof4634: cs = 4634; goto _test_eof - _test_eof4635: cs = 4635; goto _test_eof - _test_eof4636: cs = 4636; goto _test_eof - _test_eof4637: cs = 4637; goto _test_eof - _test_eof4638: cs = 4638; goto _test_eof - _test_eof4639: cs = 4639; goto _test_eof - _test_eof4640: cs = 4640; goto _test_eof - _test_eof4641: cs = 4641; goto _test_eof - _test_eof4642: cs = 4642; goto _test_eof - _test_eof4643: cs = 4643; goto _test_eof - _test_eof4644: cs = 4644; goto _test_eof - _test_eof4645: cs = 4645; goto _test_eof - _test_eof4646: cs = 4646; goto _test_eof - _test_eof4647: cs = 4647; goto _test_eof - _test_eof4648: cs = 4648; goto _test_eof - _test_eof4649: cs = 4649; goto _test_eof - _test_eof4650: cs = 4650; goto _test_eof - _test_eof4651: cs = 4651; goto _test_eof - _test_eof4652: cs = 4652; goto _test_eof - _test_eof4653: cs = 4653; goto _test_eof - _test_eof4654: cs = 4654; goto _test_eof - _test_eof4655: cs = 4655; goto _test_eof - _test_eof5212: cs = 5212; goto _test_eof - _test_eof5213: cs = 5213; goto _test_eof - _test_eof5214: cs = 5214; goto _test_eof - _test_eof5215: cs = 5215; goto _test_eof - _test_eof5216: cs = 5216; goto _test_eof - _test_eof5217: cs = 5217; goto _test_eof - _test_eof5218: cs = 5218; goto _test_eof - _test_eof5219: cs = 5219; goto _test_eof - _test_eof5220: cs = 5220; goto _test_eof - _test_eof5221: cs = 5221; goto _test_eof - _test_eof5222: cs = 5222; goto _test_eof - _test_eof5223: cs = 5223; goto _test_eof - _test_eof5224: cs = 5224; goto _test_eof - _test_eof5225: cs = 5225; goto _test_eof - _test_eof5226: cs = 5226; goto _test_eof - _test_eof5227: cs = 5227; goto _test_eof - _test_eof5228: cs = 5228; goto _test_eof - _test_eof5229: cs = 5229; goto _test_eof - _test_eof5230: cs = 5230; goto _test_eof - _test_eof5231: cs = 5231; goto _test_eof - _test_eof5232: cs = 5232; goto _test_eof - _test_eof5233: cs = 5233; goto _test_eof - _test_eof5234: cs = 5234; goto _test_eof - _test_eof5235: cs = 5235; goto _test_eof - _test_eof5236: cs = 5236; goto _test_eof - _test_eof5237: cs = 5237; goto _test_eof - _test_eof5238: cs = 5238; goto _test_eof - _test_eof5239: cs = 5239; goto _test_eof - _test_eof5240: cs = 5240; goto _test_eof - _test_eof5241: cs = 5241; goto _test_eof - _test_eof5242: cs = 5242; goto _test_eof - _test_eof4656: cs = 4656; goto _test_eof - _test_eof5243: cs = 5243; goto _test_eof - _test_eof5244: cs = 5244; goto _test_eof - _test_eof5245: cs = 5245; goto _test_eof - _test_eof5246: cs = 5246; goto _test_eof - _test_eof5247: cs = 5247; goto _test_eof - _test_eof5248: cs = 5248; goto _test_eof - _test_eof5249: cs = 5249; goto _test_eof - _test_eof5250: cs = 5250; goto _test_eof - _test_eof4657: cs = 4657; goto _test_eof - _test_eof5251: cs = 5251; goto _test_eof - _test_eof5252: cs = 5252; goto _test_eof - _test_eof5253: cs = 5253; goto _test_eof - _test_eof5254: cs = 5254; goto _test_eof - _test_eof5255: cs = 5255; goto _test_eof - _test_eof5256: cs = 5256; goto _test_eof - _test_eof4658: cs = 4658; goto _test_eof - _test_eof5257: cs = 5257; goto _test_eof - _test_eof5258: cs = 5258; goto _test_eof - _test_eof4659: cs = 4659; goto _test_eof - _test_eof5259: cs = 5259; goto _test_eof - _test_eof5260: cs = 5260; goto _test_eof - _test_eof5261: cs = 5261; goto _test_eof - _test_eof5262: cs = 5262; goto _test_eof - _test_eof5263: cs = 5263; goto _test_eof - _test_eof5264: cs = 5264; goto _test_eof - _test_eof5265: cs = 5265; goto _test_eof - _test_eof5266: cs = 5266; goto _test_eof - _test_eof5267: cs = 5267; goto _test_eof - _test_eof5268: cs = 5268; goto _test_eof - _test_eof5269: cs = 5269; goto _test_eof - _test_eof5270: cs = 5270; goto _test_eof - _test_eof5271: cs = 5271; goto _test_eof - _test_eof5272: cs = 5272; goto _test_eof - _test_eof5273: cs = 5273; goto _test_eof - _test_eof5274: cs = 5274; goto _test_eof - _test_eof5275: cs = 5275; goto _test_eof - _test_eof5276: cs = 5276; goto _test_eof - _test_eof5277: cs = 5277; goto _test_eof - _test_eof4660: cs = 4660; goto _test_eof - _test_eof5278: cs = 5278; goto _test_eof - _test_eof5279: cs = 5279; goto _test_eof - _test_eof5280: cs = 5280; goto _test_eof - _test_eof4661: cs = 4661; goto _test_eof - _test_eof5281: cs = 5281; goto _test_eof - _test_eof5282: cs = 5282; goto _test_eof - _test_eof5283: cs = 5283; goto _test_eof - _test_eof5284: cs = 5284; goto _test_eof - _test_eof5285: cs = 5285; goto _test_eof - _test_eof5286: cs = 5286; goto _test_eof - _test_eof4662: cs = 4662; goto _test_eof - _test_eof5287: cs = 5287; goto _test_eof - _test_eof5288: cs = 5288; goto _test_eof - _test_eof5289: cs = 5289; goto _test_eof - _test_eof5290: cs = 5290; goto _test_eof - _test_eof5291: cs = 5291; goto _test_eof - _test_eof5292: cs = 5292; goto _test_eof - _test_eof5293: cs = 5293; goto _test_eof - _test_eof5294: cs = 5294; goto _test_eof - _test_eof5295: cs = 5295; goto _test_eof - _test_eof5296: cs = 5296; goto _test_eof - _test_eof5297: cs = 5297; goto _test_eof - _test_eof5298: cs = 5298; goto _test_eof - _test_eof5299: cs = 5299; goto _test_eof - _test_eof5300: cs = 5300; goto _test_eof - _test_eof5301: cs = 5301; goto _test_eof - _test_eof5302: cs = 5302; goto _test_eof - _test_eof5303: cs = 5303; goto _test_eof - _test_eof5304: cs = 5304; goto _test_eof - _test_eof5305: cs = 5305; goto _test_eof - _test_eof5306: cs = 5306; goto _test_eof - _test_eof5307: cs = 5307; goto _test_eof - _test_eof5308: cs = 5308; goto _test_eof - _test_eof5309: cs = 5309; goto _test_eof - _test_eof5310: cs = 5310; goto _test_eof - _test_eof5311: cs = 5311; goto _test_eof - _test_eof5312: cs = 5312; goto _test_eof - _test_eof5313: cs = 5313; goto _test_eof - _test_eof5314: cs = 5314; goto _test_eof - _test_eof5315: cs = 5315; goto _test_eof - _test_eof5316: cs = 5316; goto _test_eof - _test_eof5317: cs = 5317; goto _test_eof - _test_eof5318: cs = 5318; goto _test_eof - _test_eof5319: cs = 5319; goto _test_eof - _test_eof5320: cs = 5320; goto _test_eof - _test_eof5321: cs = 5321; goto _test_eof - _test_eof5322: cs = 5322; goto _test_eof - _test_eof5323: cs = 5323; goto _test_eof - _test_eof5324: cs = 5324; goto _test_eof - _test_eof5325: cs = 5325; goto _test_eof - _test_eof5326: cs = 5326; goto _test_eof - _test_eof5327: cs = 5327; goto _test_eof - _test_eof5328: cs = 5328; goto _test_eof - _test_eof5329: cs = 5329; goto _test_eof - _test_eof5330: cs = 5330; goto _test_eof - _test_eof5331: cs = 5331; goto _test_eof - _test_eof5332: cs = 5332; goto _test_eof - _test_eof5333: cs = 5333; goto _test_eof - _test_eof5334: cs = 5334; goto _test_eof - _test_eof5335: cs = 5335; goto _test_eof - _test_eof5336: cs = 5336; goto _test_eof - _test_eof5337: cs = 5337; goto _test_eof - _test_eof5338: cs = 5338; goto _test_eof - _test_eof4663: cs = 4663; goto _test_eof - _test_eof4664: cs = 4664; goto _test_eof - _test_eof4665: cs = 4665; goto _test_eof - _test_eof4666: cs = 4666; goto _test_eof - _test_eof4667: cs = 4667; goto _test_eof - _test_eof4668: cs = 4668; goto _test_eof - _test_eof4669: cs = 4669; goto _test_eof - _test_eof4670: cs = 4670; goto _test_eof - _test_eof5339: cs = 5339; goto _test_eof - _test_eof4671: cs = 4671; goto _test_eof - _test_eof4672: cs = 4672; goto _test_eof - _test_eof4673: cs = 4673; goto _test_eof - _test_eof4674: cs = 4674; goto _test_eof - _test_eof4675: cs = 4675; goto _test_eof - _test_eof4676: cs = 4676; goto _test_eof - _test_eof4677: cs = 4677; goto _test_eof - _test_eof4678: cs = 4678; goto _test_eof - _test_eof4679: cs = 4679; goto _test_eof - _test_eof4680: cs = 4680; goto _test_eof - _test_eof4681: cs = 4681; goto _test_eof - _test_eof4682: cs = 4682; goto _test_eof - _test_eof4683: cs = 4683; goto _test_eof - _test_eof4684: cs = 4684; goto _test_eof - _test_eof4685: cs = 4685; goto _test_eof - _test_eof4686: cs = 4686; goto _test_eof - _test_eof4687: cs = 4687; goto _test_eof - _test_eof4688: cs = 4688; goto _test_eof - _test_eof4689: cs = 4689; goto _test_eof - _test_eof4690: cs = 4690; goto _test_eof - _test_eof4691: cs = 4691; goto _test_eof - _test_eof4692: cs = 4692; goto _test_eof - _test_eof4693: cs = 4693; goto _test_eof - _test_eof4694: cs = 4694; goto _test_eof - _test_eof4695: cs = 4695; goto _test_eof - _test_eof4696: cs = 4696; goto _test_eof - _test_eof4697: cs = 4697; goto _test_eof - _test_eof4698: cs = 4698; goto _test_eof - _test_eof4699: cs = 4699; goto _test_eof - _test_eof4700: cs = 4700; goto _test_eof - _test_eof4701: cs = 4701; goto _test_eof - _test_eof4702: cs = 4702; goto _test_eof - _test_eof4703: cs = 4703; goto _test_eof - _test_eof4704: cs = 4704; goto _test_eof - _test_eof4705: cs = 4705; goto _test_eof - _test_eof4706: cs = 4706; goto _test_eof - _test_eof4707: cs = 4707; goto _test_eof - _test_eof5340: cs = 5340; goto _test_eof - _test_eof4708: cs = 4708; goto _test_eof - _test_eof4709: cs = 4709; goto _test_eof - _test_eof4710: cs = 4710; goto _test_eof - _test_eof4711: cs = 4711; goto _test_eof - _test_eof4712: cs = 4712; goto _test_eof - _test_eof4713: cs = 4713; goto _test_eof - _test_eof4714: cs = 4714; goto _test_eof - _test_eof4715: cs = 4715; goto _test_eof - _test_eof4716: cs = 4716; goto _test_eof - _test_eof4717: cs = 4717; goto _test_eof - _test_eof4718: cs = 4718; goto _test_eof - _test_eof4719: cs = 4719; goto _test_eof - _test_eof4720: cs = 4720; goto _test_eof - _test_eof4721: cs = 4721; goto _test_eof - _test_eof4722: cs = 4722; goto _test_eof - _test_eof4723: cs = 4723; goto _test_eof - _test_eof4724: cs = 4724; goto _test_eof - _test_eof4725: cs = 4725; goto _test_eof - _test_eof4726: cs = 4726; goto _test_eof - _test_eof4727: cs = 4727; goto _test_eof - _test_eof4728: cs = 4728; goto _test_eof - _test_eof4729: cs = 4729; goto _test_eof - _test_eof4730: cs = 4730; goto _test_eof - _test_eof4731: cs = 4731; goto _test_eof - _test_eof4732: cs = 4732; goto _test_eof - _test_eof4733: cs = 4733; goto _test_eof - _test_eof4734: cs = 4734; goto _test_eof - _test_eof4735: cs = 4735; goto _test_eof - _test_eof4736: cs = 4736; goto _test_eof - _test_eof4737: cs = 4737; goto _test_eof - _test_eof4738: cs = 4738; goto _test_eof - _test_eof4739: cs = 4739; goto _test_eof - _test_eof4740: cs = 4740; goto _test_eof - _test_eof4741: cs = 4741; goto _test_eof - _test_eof4742: cs = 4742; goto _test_eof - _test_eof4743: cs = 4743; goto _test_eof - _test_eof4744: cs = 4744; goto _test_eof - _test_eof4745: cs = 4745; goto _test_eof - _test_eof4746: cs = 4746; goto _test_eof - _test_eof4747: cs = 4747; goto _test_eof - _test_eof4748: cs = 4748; goto _test_eof - _test_eof4749: cs = 4749; goto _test_eof - _test_eof4750: cs = 4750; goto _test_eof - _test_eof4751: cs = 4751; goto _test_eof - _test_eof4752: cs = 4752; goto _test_eof - _test_eof4753: cs = 4753; goto _test_eof - _test_eof4754: cs = 4754; goto _test_eof - _test_eof4755: cs = 4755; goto _test_eof - _test_eof4756: cs = 4756; goto _test_eof - _test_eof4757: cs = 4757; goto _test_eof - _test_eof4758: cs = 4758; goto _test_eof - _test_eof4759: cs = 4759; goto _test_eof - _test_eof4760: cs = 4760; goto _test_eof - _test_eof4761: cs = 4761; goto _test_eof - _test_eof4762: cs = 4762; goto _test_eof - _test_eof4763: cs = 4763; goto _test_eof - _test_eof4764: cs = 4764; goto _test_eof - _test_eof4765: cs = 4765; goto _test_eof - _test_eof4766: cs = 4766; goto _test_eof - _test_eof4767: cs = 4767; goto _test_eof - _test_eof4768: cs = 4768; goto _test_eof - _test_eof4769: cs = 4769; goto _test_eof - _test_eof4770: cs = 4770; goto _test_eof - _test_eof4771: cs = 4771; goto _test_eof - _test_eof4772: cs = 4772; goto _test_eof - _test_eof4773: cs = 4773; goto _test_eof - _test_eof4774: cs = 4774; goto _test_eof - _test_eof4775: cs = 4775; goto _test_eof - _test_eof4776: cs = 4776; goto _test_eof - _test_eof4777: cs = 4777; goto _test_eof - _test_eof4778: cs = 4778; goto _test_eof - _test_eof4779: cs = 4779; goto _test_eof - _test_eof4780: cs = 4780; goto _test_eof - _test_eof4781: cs = 4781; goto _test_eof - _test_eof4782: cs = 4782; goto _test_eof - _test_eof4783: cs = 4783; goto _test_eof - _test_eof4784: cs = 4784; goto _test_eof - _test_eof4785: cs = 4785; goto _test_eof - _test_eof4786: cs = 4786; goto _test_eof - _test_eof4787: cs = 4787; goto _test_eof - _test_eof4788: cs = 4788; goto _test_eof - _test_eof4789: cs = 4789; goto _test_eof - _test_eof4790: cs = 4790; goto _test_eof - _test_eof4791: cs = 4791; goto _test_eof - _test_eof4792: cs = 4792; goto _test_eof - _test_eof4793: cs = 4793; goto _test_eof - _test_eof4794: cs = 4794; goto _test_eof - _test_eof4795: cs = 4795; goto _test_eof - _test_eof4796: cs = 4796; goto _test_eof - _test_eof4797: cs = 4797; goto _test_eof - _test_eof4798: cs = 4798; goto _test_eof - _test_eof4799: cs = 4799; goto _test_eof - _test_eof4800: cs = 4800; goto _test_eof - _test_eof4801: cs = 4801; goto _test_eof - _test_eof4802: cs = 4802; goto _test_eof - _test_eof4803: cs = 4803; goto _test_eof - _test_eof4804: cs = 4804; goto _test_eof - _test_eof4805: cs = 4805; goto _test_eof - _test_eof4806: cs = 4806; goto _test_eof - _test_eof4807: cs = 4807; goto _test_eof - _test_eof4808: cs = 4808; goto _test_eof - _test_eof4809: cs = 4809; goto _test_eof - _test_eof4810: cs = 4810; goto _test_eof - _test_eof4811: cs = 4811; goto _test_eof - _test_eof4812: cs = 4812; goto _test_eof - _test_eof4813: cs = 4813; goto _test_eof - _test_eof4814: cs = 4814; goto _test_eof - _test_eof4815: cs = 4815; goto _test_eof - _test_eof4816: cs = 4816; goto _test_eof - _test_eof4817: cs = 4817; goto _test_eof - _test_eof4818: cs = 4818; goto _test_eof - _test_eof4819: cs = 4819; goto _test_eof - _test_eof4820: cs = 4820; goto _test_eof - _test_eof4821: cs = 4821; goto _test_eof - _test_eof4822: cs = 4822; goto _test_eof - _test_eof4823: cs = 4823; goto _test_eof - _test_eof4824: cs = 4824; goto _test_eof - _test_eof4825: cs = 4825; goto _test_eof - _test_eof4826: cs = 4826; goto _test_eof - _test_eof4827: cs = 4827; goto _test_eof - _test_eof4828: cs = 4828; goto _test_eof - _test_eof4829: cs = 4829; goto _test_eof - _test_eof4830: cs = 4830; goto _test_eof - _test_eof4831: cs = 4831; goto _test_eof - _test_eof4832: cs = 4832; goto _test_eof - _test_eof4833: cs = 4833; goto _test_eof - _test_eof4834: cs = 4834; goto _test_eof - _test_eof4835: cs = 4835; goto _test_eof - _test_eof4836: cs = 4836; goto _test_eof - _test_eof4837: cs = 4837; goto _test_eof - _test_eof4838: cs = 4838; goto _test_eof - _test_eof4839: cs = 4839; goto _test_eof - _test_eof4840: cs = 4840; goto _test_eof - _test_eof4841: cs = 4841; goto _test_eof - _test_eof4842: cs = 4842; goto _test_eof - _test_eof4843: cs = 4843; goto _test_eof - _test_eof4844: cs = 4844; goto _test_eof - _test_eof4845: cs = 4845; goto _test_eof - _test_eof4846: cs = 4846; goto _test_eof - _test_eof4847: cs = 4847; goto _test_eof - _test_eof4848: cs = 4848; goto _test_eof - _test_eof4849: cs = 4849; goto _test_eof - _test_eof4850: cs = 4850; goto _test_eof - _test_eof4851: cs = 4851; goto _test_eof - _test_eof4852: cs = 4852; goto _test_eof - _test_eof4853: cs = 4853; goto _test_eof - _test_eof4854: cs = 4854; goto _test_eof - _test_eof4855: cs = 4855; goto _test_eof - _test_eof4856: cs = 4856; goto _test_eof - _test_eof4857: cs = 4857; goto _test_eof - _test_eof4858: cs = 4858; goto _test_eof - _test_eof4859: cs = 4859; goto _test_eof - _test_eof4860: cs = 4860; goto _test_eof - _test_eof4861: cs = 4861; goto _test_eof + _test_eof4862: + cs = 4862 + goto _test_eof + _test_eof4863: + cs = 4863 + goto _test_eof + _test_eof0: + cs = 0 + goto _test_eof + _test_eof1: + cs = 1 + goto _test_eof + _test_eof2: + cs = 2 + goto _test_eof + _test_eof3: + cs = 3 + goto _test_eof + _test_eof4: + cs = 4 + goto _test_eof + _test_eof5: + cs = 5 + goto _test_eof + _test_eof6: + cs = 6 + goto _test_eof + _test_eof7: + cs = 7 + goto _test_eof + _test_eof8: + cs = 8 + goto _test_eof + _test_eof9: + cs = 9 + goto _test_eof + _test_eof10: + cs = 10 + goto _test_eof + _test_eof11: + cs = 11 + goto _test_eof + _test_eof12: + cs = 12 + goto _test_eof + _test_eof13: + cs = 13 + goto _test_eof + _test_eof14: + cs = 14 + goto _test_eof + _test_eof15: + cs = 15 + goto _test_eof + _test_eof16: + cs = 16 + goto _test_eof + _test_eof17: + cs = 17 + goto _test_eof + _test_eof18: + cs = 18 + goto _test_eof + _test_eof19: + cs = 19 + goto _test_eof + _test_eof20: + cs = 20 + goto _test_eof + _test_eof21: + cs = 21 + goto _test_eof + _test_eof22: + cs = 22 + goto _test_eof + _test_eof23: + cs = 23 + goto _test_eof + _test_eof24: + cs = 24 + goto _test_eof + _test_eof25: + cs = 25 + goto _test_eof + _test_eof26: + cs = 26 + goto _test_eof + _test_eof27: + cs = 27 + goto _test_eof + _test_eof28: + cs = 28 + goto _test_eof + _test_eof29: + cs = 29 + goto _test_eof + _test_eof30: + cs = 30 + goto _test_eof + _test_eof31: + cs = 31 + goto _test_eof + _test_eof32: + cs = 32 + goto _test_eof + _test_eof33: + cs = 33 + goto _test_eof + _test_eof34: + cs = 34 + goto _test_eof + _test_eof35: + cs = 35 + goto _test_eof + _test_eof36: + cs = 36 + goto _test_eof + _test_eof37: + cs = 37 + goto _test_eof + _test_eof38: + cs = 38 + goto _test_eof + _test_eof39: + cs = 39 + goto _test_eof + _test_eof40: + cs = 40 + goto _test_eof + _test_eof41: + cs = 41 + goto _test_eof + _test_eof42: + cs = 42 + goto _test_eof + _test_eof43: + cs = 43 + goto _test_eof + _test_eof44: + cs = 44 + goto _test_eof + _test_eof45: + cs = 45 + goto _test_eof + _test_eof46: + cs = 46 + goto _test_eof + _test_eof47: + cs = 47 + goto _test_eof + _test_eof48: + cs = 48 + goto _test_eof + _test_eof49: + cs = 49 + goto _test_eof + _test_eof50: + cs = 50 + goto _test_eof + _test_eof51: + cs = 51 + goto _test_eof + _test_eof52: + cs = 52 + goto _test_eof + _test_eof53: + cs = 53 + goto _test_eof + _test_eof54: + cs = 54 + goto _test_eof + _test_eof55: + cs = 55 + goto _test_eof + _test_eof56: + cs = 56 + goto _test_eof + _test_eof57: + cs = 57 + goto _test_eof + _test_eof58: + cs = 58 + goto _test_eof + _test_eof59: + cs = 59 + goto _test_eof + _test_eof60: + cs = 60 + goto _test_eof + _test_eof61: + cs = 61 + goto _test_eof + _test_eof62: + cs = 62 + goto _test_eof + _test_eof63: + cs = 63 + goto _test_eof + _test_eof64: + cs = 64 + goto _test_eof + _test_eof65: + cs = 65 + goto _test_eof + _test_eof66: + cs = 66 + goto _test_eof + _test_eof67: + cs = 67 + goto _test_eof + _test_eof68: + cs = 68 + goto _test_eof + _test_eof69: + cs = 69 + goto _test_eof + _test_eof70: + cs = 70 + goto _test_eof + _test_eof71: + cs = 71 + goto _test_eof + _test_eof72: + cs = 72 + goto _test_eof + _test_eof73: + cs = 73 + goto _test_eof + _test_eof74: + cs = 74 + goto _test_eof + _test_eof75: + cs = 75 + goto _test_eof + _test_eof76: + cs = 76 + goto _test_eof + _test_eof77: + cs = 77 + goto _test_eof + _test_eof78: + cs = 78 + goto _test_eof + _test_eof79: + cs = 79 + goto _test_eof + _test_eof80: + cs = 80 + goto _test_eof + _test_eof81: + cs = 81 + goto _test_eof + _test_eof82: + cs = 82 + goto _test_eof + _test_eof83: + cs = 83 + goto _test_eof + _test_eof84: + cs = 84 + goto _test_eof + _test_eof85: + cs = 85 + goto _test_eof + _test_eof86: + cs = 86 + goto _test_eof + _test_eof87: + cs = 87 + goto _test_eof + _test_eof88: + cs = 88 + goto _test_eof + _test_eof89: + cs = 89 + goto _test_eof + _test_eof90: + cs = 90 + goto _test_eof + _test_eof91: + cs = 91 + goto _test_eof + _test_eof92: + cs = 92 + goto _test_eof + _test_eof93: + cs = 93 + goto _test_eof + _test_eof94: + cs = 94 + goto _test_eof + _test_eof95: + cs = 95 + goto _test_eof + _test_eof96: + cs = 96 + goto _test_eof + _test_eof97: + cs = 97 + goto _test_eof + _test_eof98: + cs = 98 + goto _test_eof + _test_eof99: + cs = 99 + goto _test_eof + _test_eof100: + cs = 100 + goto _test_eof + _test_eof101: + cs = 101 + goto _test_eof + _test_eof102: + cs = 102 + goto _test_eof + _test_eof103: + cs = 103 + goto _test_eof + _test_eof104: + cs = 104 + goto _test_eof + _test_eof105: + cs = 105 + goto _test_eof + _test_eof106: + cs = 106 + goto _test_eof + _test_eof107: + cs = 107 + goto _test_eof + _test_eof108: + cs = 108 + goto _test_eof + _test_eof109: + cs = 109 + goto _test_eof + _test_eof110: + cs = 110 + goto _test_eof + _test_eof111: + cs = 111 + goto _test_eof + _test_eof112: + cs = 112 + goto _test_eof + _test_eof113: + cs = 113 + goto _test_eof + _test_eof114: + cs = 114 + goto _test_eof + _test_eof115: + cs = 115 + goto _test_eof + _test_eof116: + cs = 116 + goto _test_eof + _test_eof117: + cs = 117 + goto _test_eof + _test_eof118: + cs = 118 + goto _test_eof + _test_eof119: + cs = 119 + goto _test_eof + _test_eof120: + cs = 120 + goto _test_eof + _test_eof121: + cs = 121 + goto _test_eof + _test_eof122: + cs = 122 + goto _test_eof + _test_eof123: + cs = 123 + goto _test_eof + _test_eof124: + cs = 124 + goto _test_eof + _test_eof125: + cs = 125 + goto _test_eof + _test_eof126: + cs = 126 + goto _test_eof + _test_eof127: + cs = 127 + goto _test_eof + _test_eof128: + cs = 128 + goto _test_eof + _test_eof129: + cs = 129 + goto _test_eof + _test_eof130: + cs = 130 + goto _test_eof + _test_eof131: + cs = 131 + goto _test_eof + _test_eof132: + cs = 132 + goto _test_eof + _test_eof133: + cs = 133 + goto _test_eof + _test_eof134: + cs = 134 + goto _test_eof + _test_eof135: + cs = 135 + goto _test_eof + _test_eof136: + cs = 136 + goto _test_eof + _test_eof137: + cs = 137 + goto _test_eof + _test_eof138: + cs = 138 + goto _test_eof + _test_eof139: + cs = 139 + goto _test_eof + _test_eof140: + cs = 140 + goto _test_eof + _test_eof4864: + cs = 4864 + goto _test_eof + _test_eof4865: + cs = 4865 + goto _test_eof + _test_eof141: + cs = 141 + goto _test_eof + _test_eof4866: + cs = 4866 + goto _test_eof + _test_eof4867: + cs = 4867 + goto _test_eof + _test_eof142: + cs = 142 + goto _test_eof + _test_eof143: + cs = 143 + goto _test_eof + _test_eof144: + cs = 144 + goto _test_eof + _test_eof145: + cs = 145 + goto _test_eof + _test_eof146: + cs = 146 + goto _test_eof + _test_eof147: + cs = 147 + goto _test_eof + _test_eof148: + cs = 148 + goto _test_eof + _test_eof149: + cs = 149 + goto _test_eof + _test_eof150: + cs = 150 + goto _test_eof + _test_eof151: + cs = 151 + goto _test_eof + _test_eof152: + cs = 152 + goto _test_eof + _test_eof153: + cs = 153 + goto _test_eof + _test_eof154: + cs = 154 + goto _test_eof + _test_eof155: + cs = 155 + goto _test_eof + _test_eof156: + cs = 156 + goto _test_eof + _test_eof157: + cs = 157 + goto _test_eof + _test_eof158: + cs = 158 + goto _test_eof + _test_eof159: + cs = 159 + goto _test_eof + _test_eof160: + cs = 160 + goto _test_eof + _test_eof161: + cs = 161 + goto _test_eof + _test_eof162: + cs = 162 + goto _test_eof + _test_eof163: + cs = 163 + goto _test_eof + _test_eof164: + cs = 164 + goto _test_eof + _test_eof165: + cs = 165 + goto _test_eof + _test_eof166: + cs = 166 + goto _test_eof + _test_eof167: + cs = 167 + goto _test_eof + _test_eof168: + cs = 168 + goto _test_eof + _test_eof169: + cs = 169 + goto _test_eof + _test_eof170: + cs = 170 + goto _test_eof + _test_eof171: + cs = 171 + goto _test_eof + _test_eof172: + cs = 172 + goto _test_eof + _test_eof173: + cs = 173 + goto _test_eof + _test_eof174: + cs = 174 + goto _test_eof + _test_eof175: + cs = 175 + goto _test_eof + _test_eof176: + cs = 176 + goto _test_eof + _test_eof177: + cs = 177 + goto _test_eof + _test_eof178: + cs = 178 + goto _test_eof + _test_eof179: + cs = 179 + goto _test_eof + _test_eof180: + cs = 180 + goto _test_eof + _test_eof181: + cs = 181 + goto _test_eof + _test_eof182: + cs = 182 + goto _test_eof + _test_eof183: + cs = 183 + goto _test_eof + _test_eof184: + cs = 184 + goto _test_eof + _test_eof185: + cs = 185 + goto _test_eof + _test_eof186: + cs = 186 + goto _test_eof + _test_eof187: + cs = 187 + goto _test_eof + _test_eof188: + cs = 188 + goto _test_eof + _test_eof189: + cs = 189 + goto _test_eof + _test_eof190: + cs = 190 + goto _test_eof + _test_eof191: + cs = 191 + goto _test_eof + _test_eof192: + cs = 192 + goto _test_eof + _test_eof193: + cs = 193 + goto _test_eof + _test_eof194: + cs = 194 + goto _test_eof + _test_eof195: + cs = 195 + goto _test_eof + _test_eof196: + cs = 196 + goto _test_eof + _test_eof197: + cs = 197 + goto _test_eof + _test_eof198: + cs = 198 + goto _test_eof + _test_eof199: + cs = 199 + goto _test_eof + _test_eof200: + cs = 200 + goto _test_eof + _test_eof201: + cs = 201 + goto _test_eof + _test_eof202: + cs = 202 + goto _test_eof + _test_eof203: + cs = 203 + goto _test_eof + _test_eof204: + cs = 204 + goto _test_eof + _test_eof205: + cs = 205 + goto _test_eof + _test_eof206: + cs = 206 + goto _test_eof + _test_eof207: + cs = 207 + goto _test_eof + _test_eof208: + cs = 208 + goto _test_eof + _test_eof209: + cs = 209 + goto _test_eof + _test_eof210: + cs = 210 + goto _test_eof + _test_eof211: + cs = 211 + goto _test_eof + _test_eof212: + cs = 212 + goto _test_eof + _test_eof213: + cs = 213 + goto _test_eof + _test_eof214: + cs = 214 + goto _test_eof + _test_eof215: + cs = 215 + goto _test_eof + _test_eof216: + cs = 216 + goto _test_eof + _test_eof217: + cs = 217 + goto _test_eof + _test_eof218: + cs = 218 + goto _test_eof + _test_eof219: + cs = 219 + goto _test_eof + _test_eof220: + cs = 220 + goto _test_eof + _test_eof221: + cs = 221 + goto _test_eof + _test_eof222: + cs = 222 + goto _test_eof + _test_eof223: + cs = 223 + goto _test_eof + _test_eof224: + cs = 224 + goto _test_eof + _test_eof225: + cs = 225 + goto _test_eof + _test_eof226: + cs = 226 + goto _test_eof + _test_eof227: + cs = 227 + goto _test_eof + _test_eof228: + cs = 228 + goto _test_eof + _test_eof229: + cs = 229 + goto _test_eof + _test_eof230: + cs = 230 + goto _test_eof + _test_eof231: + cs = 231 + goto _test_eof + _test_eof232: + cs = 232 + goto _test_eof + _test_eof233: + cs = 233 + goto _test_eof + _test_eof234: + cs = 234 + goto _test_eof + _test_eof235: + cs = 235 + goto _test_eof + _test_eof236: + cs = 236 + goto _test_eof + _test_eof237: + cs = 237 + goto _test_eof + _test_eof238: + cs = 238 + goto _test_eof + _test_eof239: + cs = 239 + goto _test_eof + _test_eof240: + cs = 240 + goto _test_eof + _test_eof241: + cs = 241 + goto _test_eof + _test_eof242: + cs = 242 + goto _test_eof + _test_eof243: + cs = 243 + goto _test_eof + _test_eof244: + cs = 244 + goto _test_eof + _test_eof245: + cs = 245 + goto _test_eof + _test_eof246: + cs = 246 + goto _test_eof + _test_eof247: + cs = 247 + goto _test_eof + _test_eof248: + cs = 248 + goto _test_eof + _test_eof249: + cs = 249 + goto _test_eof + _test_eof250: + cs = 250 + goto _test_eof + _test_eof251: + cs = 251 + goto _test_eof + _test_eof252: + cs = 252 + goto _test_eof + _test_eof253: + cs = 253 + goto _test_eof + _test_eof254: + cs = 254 + goto _test_eof + _test_eof255: + cs = 255 + goto _test_eof + _test_eof256: + cs = 256 + goto _test_eof + _test_eof257: + cs = 257 + goto _test_eof + _test_eof258: + cs = 258 + goto _test_eof + _test_eof259: + cs = 259 + goto _test_eof + _test_eof260: + cs = 260 + goto _test_eof + _test_eof261: + cs = 261 + goto _test_eof + _test_eof262: + cs = 262 + goto _test_eof + _test_eof263: + cs = 263 + goto _test_eof + _test_eof264: + cs = 264 + goto _test_eof + _test_eof265: + cs = 265 + goto _test_eof + _test_eof266: + cs = 266 + goto _test_eof + _test_eof267: + cs = 267 + goto _test_eof + _test_eof268: + cs = 268 + goto _test_eof + _test_eof269: + cs = 269 + goto _test_eof + _test_eof270: + cs = 270 + goto _test_eof + _test_eof271: + cs = 271 + goto _test_eof + _test_eof272: + cs = 272 + goto _test_eof + _test_eof273: + cs = 273 + goto _test_eof + _test_eof274: + cs = 274 + goto _test_eof + _test_eof275: + cs = 275 + goto _test_eof + _test_eof276: + cs = 276 + goto _test_eof + _test_eof277: + cs = 277 + goto _test_eof + _test_eof278: + cs = 278 + goto _test_eof + _test_eof279: + cs = 279 + goto _test_eof + _test_eof280: + cs = 280 + goto _test_eof + _test_eof281: + cs = 281 + goto _test_eof + _test_eof282: + cs = 282 + goto _test_eof + _test_eof283: + cs = 283 + goto _test_eof + _test_eof284: + cs = 284 + goto _test_eof + _test_eof285: + cs = 285 + goto _test_eof + _test_eof286: + cs = 286 + goto _test_eof + _test_eof287: + cs = 287 + goto _test_eof + _test_eof288: + cs = 288 + goto _test_eof + _test_eof289: + cs = 289 + goto _test_eof + _test_eof290: + cs = 290 + goto _test_eof + _test_eof291: + cs = 291 + goto _test_eof + _test_eof292: + cs = 292 + goto _test_eof + _test_eof293: + cs = 293 + goto _test_eof + _test_eof294: + cs = 294 + goto _test_eof + _test_eof295: + cs = 295 + goto _test_eof + _test_eof296: + cs = 296 + goto _test_eof + _test_eof297: + cs = 297 + goto _test_eof + _test_eof298: + cs = 298 + goto _test_eof + _test_eof299: + cs = 299 + goto _test_eof + _test_eof300: + cs = 300 + goto _test_eof + _test_eof301: + cs = 301 + goto _test_eof + _test_eof302: + cs = 302 + goto _test_eof + _test_eof303: + cs = 303 + goto _test_eof + _test_eof304: + cs = 304 + goto _test_eof + _test_eof305: + cs = 305 + goto _test_eof + _test_eof306: + cs = 306 + goto _test_eof + _test_eof307: + cs = 307 + goto _test_eof + _test_eof308: + cs = 308 + goto _test_eof + _test_eof309: + cs = 309 + goto _test_eof + _test_eof310: + cs = 310 + goto _test_eof + _test_eof311: + cs = 311 + goto _test_eof + _test_eof312: + cs = 312 + goto _test_eof + _test_eof313: + cs = 313 + goto _test_eof + _test_eof314: + cs = 314 + goto _test_eof + _test_eof315: + cs = 315 + goto _test_eof + _test_eof316: + cs = 316 + goto _test_eof + _test_eof317: + cs = 317 + goto _test_eof + _test_eof318: + cs = 318 + goto _test_eof + _test_eof319: + cs = 319 + goto _test_eof + _test_eof320: + cs = 320 + goto _test_eof + _test_eof321: + cs = 321 + goto _test_eof + _test_eof322: + cs = 322 + goto _test_eof + _test_eof323: + cs = 323 + goto _test_eof + _test_eof324: + cs = 324 + goto _test_eof + _test_eof325: + cs = 325 + goto _test_eof + _test_eof326: + cs = 326 + goto _test_eof + _test_eof327: + cs = 327 + goto _test_eof + _test_eof328: + cs = 328 + goto _test_eof + _test_eof329: + cs = 329 + goto _test_eof + _test_eof330: + cs = 330 + goto _test_eof + _test_eof331: + cs = 331 + goto _test_eof + _test_eof332: + cs = 332 + goto _test_eof + _test_eof333: + cs = 333 + goto _test_eof + _test_eof334: + cs = 334 + goto _test_eof + _test_eof335: + cs = 335 + goto _test_eof + _test_eof336: + cs = 336 + goto _test_eof + _test_eof337: + cs = 337 + goto _test_eof + _test_eof338: + cs = 338 + goto _test_eof + _test_eof339: + cs = 339 + goto _test_eof + _test_eof340: + cs = 340 + goto _test_eof + _test_eof341: + cs = 341 + goto _test_eof + _test_eof342: + cs = 342 + goto _test_eof + _test_eof343: + cs = 343 + goto _test_eof + _test_eof344: + cs = 344 + goto _test_eof + _test_eof345: + cs = 345 + goto _test_eof + _test_eof346: + cs = 346 + goto _test_eof + _test_eof347: + cs = 347 + goto _test_eof + _test_eof348: + cs = 348 + goto _test_eof + _test_eof349: + cs = 349 + goto _test_eof + _test_eof350: + cs = 350 + goto _test_eof + _test_eof351: + cs = 351 + goto _test_eof + _test_eof352: + cs = 352 + goto _test_eof + _test_eof353: + cs = 353 + goto _test_eof + _test_eof354: + cs = 354 + goto _test_eof + _test_eof355: + cs = 355 + goto _test_eof + _test_eof356: + cs = 356 + goto _test_eof + _test_eof357: + cs = 357 + goto _test_eof + _test_eof358: + cs = 358 + goto _test_eof + _test_eof359: + cs = 359 + goto _test_eof + _test_eof360: + cs = 360 + goto _test_eof + _test_eof361: + cs = 361 + goto _test_eof + _test_eof362: + cs = 362 + goto _test_eof + _test_eof363: + cs = 363 + goto _test_eof + _test_eof364: + cs = 364 + goto _test_eof + _test_eof365: + cs = 365 + goto _test_eof + _test_eof366: + cs = 366 + goto _test_eof + _test_eof367: + cs = 367 + goto _test_eof + _test_eof368: + cs = 368 + goto _test_eof + _test_eof369: + cs = 369 + goto _test_eof + _test_eof370: + cs = 370 + goto _test_eof + _test_eof371: + cs = 371 + goto _test_eof + _test_eof372: + cs = 372 + goto _test_eof + _test_eof373: + cs = 373 + goto _test_eof + _test_eof374: + cs = 374 + goto _test_eof + _test_eof375: + cs = 375 + goto _test_eof + _test_eof376: + cs = 376 + goto _test_eof + _test_eof377: + cs = 377 + goto _test_eof + _test_eof378: + cs = 378 + goto _test_eof + _test_eof379: + cs = 379 + goto _test_eof + _test_eof380: + cs = 380 + goto _test_eof + _test_eof381: + cs = 381 + goto _test_eof + _test_eof382: + cs = 382 + goto _test_eof + _test_eof383: + cs = 383 + goto _test_eof + _test_eof384: + cs = 384 + goto _test_eof + _test_eof385: + cs = 385 + goto _test_eof + _test_eof386: + cs = 386 + goto _test_eof + _test_eof387: + cs = 387 + goto _test_eof + _test_eof388: + cs = 388 + goto _test_eof + _test_eof389: + cs = 389 + goto _test_eof + _test_eof390: + cs = 390 + goto _test_eof + _test_eof391: + cs = 391 + goto _test_eof + _test_eof392: + cs = 392 + goto _test_eof + _test_eof393: + cs = 393 + goto _test_eof + _test_eof394: + cs = 394 + goto _test_eof + _test_eof395: + cs = 395 + goto _test_eof + _test_eof396: + cs = 396 + goto _test_eof + _test_eof397: + cs = 397 + goto _test_eof + _test_eof398: + cs = 398 + goto _test_eof + _test_eof399: + cs = 399 + goto _test_eof + _test_eof400: + cs = 400 + goto _test_eof + _test_eof401: + cs = 401 + goto _test_eof + _test_eof402: + cs = 402 + goto _test_eof + _test_eof403: + cs = 403 + goto _test_eof + _test_eof404: + cs = 404 + goto _test_eof + _test_eof405: + cs = 405 + goto _test_eof + _test_eof406: + cs = 406 + goto _test_eof + _test_eof407: + cs = 407 + goto _test_eof + _test_eof408: + cs = 408 + goto _test_eof + _test_eof409: + cs = 409 + goto _test_eof + _test_eof410: + cs = 410 + goto _test_eof + _test_eof411: + cs = 411 + goto _test_eof + _test_eof412: + cs = 412 + goto _test_eof + _test_eof4868: + cs = 4868 + goto _test_eof + _test_eof413: + cs = 413 + goto _test_eof + _test_eof414: + cs = 414 + goto _test_eof + _test_eof415: + cs = 415 + goto _test_eof + _test_eof416: + cs = 416 + goto _test_eof + _test_eof417: + cs = 417 + goto _test_eof + _test_eof418: + cs = 418 + goto _test_eof + _test_eof419: + cs = 419 + goto _test_eof + _test_eof420: + cs = 420 + goto _test_eof + _test_eof421: + cs = 421 + goto _test_eof + _test_eof422: + cs = 422 + goto _test_eof + _test_eof423: + cs = 423 + goto _test_eof + _test_eof424: + cs = 424 + goto _test_eof + _test_eof425: + cs = 425 + goto _test_eof + _test_eof426: + cs = 426 + goto _test_eof + _test_eof427: + cs = 427 + goto _test_eof + _test_eof428: + cs = 428 + goto _test_eof + _test_eof429: + cs = 429 + goto _test_eof + _test_eof430: + cs = 430 + goto _test_eof + _test_eof431: + cs = 431 + goto _test_eof + _test_eof432: + cs = 432 + goto _test_eof + _test_eof433: + cs = 433 + goto _test_eof + _test_eof434: + cs = 434 + goto _test_eof + _test_eof435: + cs = 435 + goto _test_eof + _test_eof436: + cs = 436 + goto _test_eof + _test_eof437: + cs = 437 + goto _test_eof + _test_eof438: + cs = 438 + goto _test_eof + _test_eof439: + cs = 439 + goto _test_eof + _test_eof440: + cs = 440 + goto _test_eof + _test_eof441: + cs = 441 + goto _test_eof + _test_eof442: + cs = 442 + goto _test_eof + _test_eof443: + cs = 443 + goto _test_eof + _test_eof444: + cs = 444 + goto _test_eof + _test_eof445: + cs = 445 + goto _test_eof + _test_eof446: + cs = 446 + goto _test_eof + _test_eof447: + cs = 447 + goto _test_eof + _test_eof448: + cs = 448 + goto _test_eof + _test_eof449: + cs = 449 + goto _test_eof + _test_eof450: + cs = 450 + goto _test_eof + _test_eof451: + cs = 451 + goto _test_eof + _test_eof452: + cs = 452 + goto _test_eof + _test_eof453: + cs = 453 + goto _test_eof + _test_eof454: + cs = 454 + goto _test_eof + _test_eof455: + cs = 455 + goto _test_eof + _test_eof456: + cs = 456 + goto _test_eof + _test_eof457: + cs = 457 + goto _test_eof + _test_eof458: + cs = 458 + goto _test_eof + _test_eof459: + cs = 459 + goto _test_eof + _test_eof460: + cs = 460 + goto _test_eof + _test_eof461: + cs = 461 + goto _test_eof + _test_eof462: + cs = 462 + goto _test_eof + _test_eof463: + cs = 463 + goto _test_eof + _test_eof464: + cs = 464 + goto _test_eof + _test_eof465: + cs = 465 + goto _test_eof + _test_eof466: + cs = 466 + goto _test_eof + _test_eof467: + cs = 467 + goto _test_eof + _test_eof468: + cs = 468 + goto _test_eof + _test_eof469: + cs = 469 + goto _test_eof + _test_eof470: + cs = 470 + goto _test_eof + _test_eof471: + cs = 471 + goto _test_eof + _test_eof472: + cs = 472 + goto _test_eof + _test_eof473: + cs = 473 + goto _test_eof + _test_eof474: + cs = 474 + goto _test_eof + _test_eof475: + cs = 475 + goto _test_eof + _test_eof476: + cs = 476 + goto _test_eof + _test_eof477: + cs = 477 + goto _test_eof + _test_eof478: + cs = 478 + goto _test_eof + _test_eof479: + cs = 479 + goto _test_eof + _test_eof480: + cs = 480 + goto _test_eof + _test_eof481: + cs = 481 + goto _test_eof + _test_eof482: + cs = 482 + goto _test_eof + _test_eof483: + cs = 483 + goto _test_eof + _test_eof484: + cs = 484 + goto _test_eof + _test_eof485: + cs = 485 + goto _test_eof + _test_eof486: + cs = 486 + goto _test_eof + _test_eof487: + cs = 487 + goto _test_eof + _test_eof488: + cs = 488 + goto _test_eof + _test_eof489: + cs = 489 + goto _test_eof + _test_eof490: + cs = 490 + goto _test_eof + _test_eof491: + cs = 491 + goto _test_eof + _test_eof492: + cs = 492 + goto _test_eof + _test_eof493: + cs = 493 + goto _test_eof + _test_eof494: + cs = 494 + goto _test_eof + _test_eof495: + cs = 495 + goto _test_eof + _test_eof496: + cs = 496 + goto _test_eof + _test_eof497: + cs = 497 + goto _test_eof + _test_eof498: + cs = 498 + goto _test_eof + _test_eof499: + cs = 499 + goto _test_eof + _test_eof500: + cs = 500 + goto _test_eof + _test_eof501: + cs = 501 + goto _test_eof + _test_eof502: + cs = 502 + goto _test_eof + _test_eof503: + cs = 503 + goto _test_eof + _test_eof504: + cs = 504 + goto _test_eof + _test_eof505: + cs = 505 + goto _test_eof + _test_eof506: + cs = 506 + goto _test_eof + _test_eof507: + cs = 507 + goto _test_eof + _test_eof508: + cs = 508 + goto _test_eof + _test_eof509: + cs = 509 + goto _test_eof + _test_eof510: + cs = 510 + goto _test_eof + _test_eof511: + cs = 511 + goto _test_eof + _test_eof512: + cs = 512 + goto _test_eof + _test_eof513: + cs = 513 + goto _test_eof + _test_eof514: + cs = 514 + goto _test_eof + _test_eof515: + cs = 515 + goto _test_eof + _test_eof516: + cs = 516 + goto _test_eof + _test_eof517: + cs = 517 + goto _test_eof + _test_eof518: + cs = 518 + goto _test_eof + _test_eof519: + cs = 519 + goto _test_eof + _test_eof520: + cs = 520 + goto _test_eof + _test_eof521: + cs = 521 + goto _test_eof + _test_eof522: + cs = 522 + goto _test_eof + _test_eof523: + cs = 523 + goto _test_eof + _test_eof524: + cs = 524 + goto _test_eof + _test_eof525: + cs = 525 + goto _test_eof + _test_eof526: + cs = 526 + goto _test_eof + _test_eof527: + cs = 527 + goto _test_eof + _test_eof528: + cs = 528 + goto _test_eof + _test_eof529: + cs = 529 + goto _test_eof + _test_eof530: + cs = 530 + goto _test_eof + _test_eof531: + cs = 531 + goto _test_eof + _test_eof532: + cs = 532 + goto _test_eof + _test_eof533: + cs = 533 + goto _test_eof + _test_eof534: + cs = 534 + goto _test_eof + _test_eof535: + cs = 535 + goto _test_eof + _test_eof536: + cs = 536 + goto _test_eof + _test_eof537: + cs = 537 + goto _test_eof + _test_eof538: + cs = 538 + goto _test_eof + _test_eof539: + cs = 539 + goto _test_eof + _test_eof540: + cs = 540 + goto _test_eof + _test_eof541: + cs = 541 + goto _test_eof + _test_eof542: + cs = 542 + goto _test_eof + _test_eof543: + cs = 543 + goto _test_eof + _test_eof544: + cs = 544 + goto _test_eof + _test_eof545: + cs = 545 + goto _test_eof + _test_eof546: + cs = 546 + goto _test_eof + _test_eof547: + cs = 547 + goto _test_eof + _test_eof548: + cs = 548 + goto _test_eof + _test_eof549: + cs = 549 + goto _test_eof + _test_eof550: + cs = 550 + goto _test_eof + _test_eof551: + cs = 551 + goto _test_eof + _test_eof552: + cs = 552 + goto _test_eof + _test_eof553: + cs = 553 + goto _test_eof + _test_eof554: + cs = 554 + goto _test_eof + _test_eof555: + cs = 555 + goto _test_eof + _test_eof556: + cs = 556 + goto _test_eof + _test_eof557: + cs = 557 + goto _test_eof + _test_eof558: + cs = 558 + goto _test_eof + _test_eof559: + cs = 559 + goto _test_eof + _test_eof560: + cs = 560 + goto _test_eof + _test_eof561: + cs = 561 + goto _test_eof + _test_eof4869: + cs = 4869 + goto _test_eof + _test_eof562: + cs = 562 + goto _test_eof + _test_eof563: + cs = 563 + goto _test_eof + _test_eof564: + cs = 564 + goto _test_eof + _test_eof565: + cs = 565 + goto _test_eof + _test_eof566: + cs = 566 + goto _test_eof + _test_eof567: + cs = 567 + goto _test_eof + _test_eof4870: + cs = 4870 + goto _test_eof + _test_eof568: + cs = 568 + goto _test_eof + _test_eof569: + cs = 569 + goto _test_eof + _test_eof570: + cs = 570 + goto _test_eof + _test_eof571: + cs = 571 + goto _test_eof + _test_eof572: + cs = 572 + goto _test_eof + _test_eof573: + cs = 573 + goto _test_eof + _test_eof574: + cs = 574 + goto _test_eof + _test_eof4871: + cs = 4871 + goto _test_eof + _test_eof575: + cs = 575 + goto _test_eof + _test_eof576: + cs = 576 + goto _test_eof + _test_eof577: + cs = 577 + goto _test_eof + _test_eof578: + cs = 578 + goto _test_eof + _test_eof579: + cs = 579 + goto _test_eof + _test_eof580: + cs = 580 + goto _test_eof + _test_eof581: + cs = 581 + goto _test_eof + _test_eof582: + cs = 582 + goto _test_eof + _test_eof583: + cs = 583 + goto _test_eof + _test_eof584: + cs = 584 + goto _test_eof + _test_eof585: + cs = 585 + goto _test_eof + _test_eof586: + cs = 586 + goto _test_eof + _test_eof587: + cs = 587 + goto _test_eof + _test_eof588: + cs = 588 + goto _test_eof + _test_eof589: + cs = 589 + goto _test_eof + _test_eof590: + cs = 590 + goto _test_eof + _test_eof591: + cs = 591 + goto _test_eof + _test_eof592: + cs = 592 + goto _test_eof + _test_eof593: + cs = 593 + goto _test_eof + _test_eof594: + cs = 594 + goto _test_eof + _test_eof595: + cs = 595 + goto _test_eof + _test_eof596: + cs = 596 + goto _test_eof + _test_eof597: + cs = 597 + goto _test_eof + _test_eof598: + cs = 598 + goto _test_eof + _test_eof599: + cs = 599 + goto _test_eof + _test_eof600: + cs = 600 + goto _test_eof + _test_eof601: + cs = 601 + goto _test_eof + _test_eof602: + cs = 602 + goto _test_eof + _test_eof603: + cs = 603 + goto _test_eof + _test_eof604: + cs = 604 + goto _test_eof + _test_eof605: + cs = 605 + goto _test_eof + _test_eof606: + cs = 606 + goto _test_eof + _test_eof607: + cs = 607 + goto _test_eof + _test_eof608: + cs = 608 + goto _test_eof + _test_eof609: + cs = 609 + goto _test_eof + _test_eof610: + cs = 610 + goto _test_eof + _test_eof611: + cs = 611 + goto _test_eof + _test_eof612: + cs = 612 + goto _test_eof + _test_eof613: + cs = 613 + goto _test_eof + _test_eof614: + cs = 614 + goto _test_eof + _test_eof615: + cs = 615 + goto _test_eof + _test_eof616: + cs = 616 + goto _test_eof + _test_eof617: + cs = 617 + goto _test_eof + _test_eof618: + cs = 618 + goto _test_eof + _test_eof619: + cs = 619 + goto _test_eof + _test_eof620: + cs = 620 + goto _test_eof + _test_eof621: + cs = 621 + goto _test_eof + _test_eof622: + cs = 622 + goto _test_eof + _test_eof623: + cs = 623 + goto _test_eof + _test_eof624: + cs = 624 + goto _test_eof + _test_eof625: + cs = 625 + goto _test_eof + _test_eof626: + cs = 626 + goto _test_eof + _test_eof627: + cs = 627 + goto _test_eof + _test_eof628: + cs = 628 + goto _test_eof + _test_eof629: + cs = 629 + goto _test_eof + _test_eof630: + cs = 630 + goto _test_eof + _test_eof631: + cs = 631 + goto _test_eof + _test_eof632: + cs = 632 + goto _test_eof + _test_eof633: + cs = 633 + goto _test_eof + _test_eof634: + cs = 634 + goto _test_eof + _test_eof635: + cs = 635 + goto _test_eof + _test_eof636: + cs = 636 + goto _test_eof + _test_eof637: + cs = 637 + goto _test_eof + _test_eof638: + cs = 638 + goto _test_eof + _test_eof639: + cs = 639 + goto _test_eof + _test_eof640: + cs = 640 + goto _test_eof + _test_eof641: + cs = 641 + goto _test_eof + _test_eof642: + cs = 642 + goto _test_eof + _test_eof643: + cs = 643 + goto _test_eof + _test_eof644: + cs = 644 + goto _test_eof + _test_eof645: + cs = 645 + goto _test_eof + _test_eof646: + cs = 646 + goto _test_eof + _test_eof647: + cs = 647 + goto _test_eof + _test_eof648: + cs = 648 + goto _test_eof + _test_eof649: + cs = 649 + goto _test_eof + _test_eof650: + cs = 650 + goto _test_eof + _test_eof651: + cs = 651 + goto _test_eof + _test_eof652: + cs = 652 + goto _test_eof + _test_eof653: + cs = 653 + goto _test_eof + _test_eof654: + cs = 654 + goto _test_eof + _test_eof655: + cs = 655 + goto _test_eof + _test_eof656: + cs = 656 + goto _test_eof + _test_eof657: + cs = 657 + goto _test_eof + _test_eof658: + cs = 658 + goto _test_eof + _test_eof659: + cs = 659 + goto _test_eof + _test_eof660: + cs = 660 + goto _test_eof + _test_eof661: + cs = 661 + goto _test_eof + _test_eof662: + cs = 662 + goto _test_eof + _test_eof663: + cs = 663 + goto _test_eof + _test_eof664: + cs = 664 + goto _test_eof + _test_eof665: + cs = 665 + goto _test_eof + _test_eof666: + cs = 666 + goto _test_eof + _test_eof667: + cs = 667 + goto _test_eof + _test_eof668: + cs = 668 + goto _test_eof + _test_eof669: + cs = 669 + goto _test_eof + _test_eof670: + cs = 670 + goto _test_eof + _test_eof671: + cs = 671 + goto _test_eof + _test_eof672: + cs = 672 + goto _test_eof + _test_eof673: + cs = 673 + goto _test_eof + _test_eof674: + cs = 674 + goto _test_eof + _test_eof675: + cs = 675 + goto _test_eof + _test_eof676: + cs = 676 + goto _test_eof + _test_eof677: + cs = 677 + goto _test_eof + _test_eof678: + cs = 678 + goto _test_eof + _test_eof679: + cs = 679 + goto _test_eof + _test_eof680: + cs = 680 + goto _test_eof + _test_eof681: + cs = 681 + goto _test_eof + _test_eof682: + cs = 682 + goto _test_eof + _test_eof683: + cs = 683 + goto _test_eof + _test_eof684: + cs = 684 + goto _test_eof + _test_eof685: + cs = 685 + goto _test_eof + _test_eof686: + cs = 686 + goto _test_eof + _test_eof687: + cs = 687 + goto _test_eof + _test_eof688: + cs = 688 + goto _test_eof + _test_eof689: + cs = 689 + goto _test_eof + _test_eof690: + cs = 690 + goto _test_eof + _test_eof691: + cs = 691 + goto _test_eof + _test_eof692: + cs = 692 + goto _test_eof + _test_eof693: + cs = 693 + goto _test_eof + _test_eof694: + cs = 694 + goto _test_eof + _test_eof695: + cs = 695 + goto _test_eof + _test_eof696: + cs = 696 + goto _test_eof + _test_eof697: + cs = 697 + goto _test_eof + _test_eof698: + cs = 698 + goto _test_eof + _test_eof699: + cs = 699 + goto _test_eof + _test_eof700: + cs = 700 + goto _test_eof + _test_eof701: + cs = 701 + goto _test_eof + _test_eof702: + cs = 702 + goto _test_eof + _test_eof703: + cs = 703 + goto _test_eof + _test_eof704: + cs = 704 + goto _test_eof + _test_eof705: + cs = 705 + goto _test_eof + _test_eof706: + cs = 706 + goto _test_eof + _test_eof707: + cs = 707 + goto _test_eof + _test_eof708: + cs = 708 + goto _test_eof + _test_eof709: + cs = 709 + goto _test_eof + _test_eof710: + cs = 710 + goto _test_eof + _test_eof711: + cs = 711 + goto _test_eof + _test_eof712: + cs = 712 + goto _test_eof + _test_eof713: + cs = 713 + goto _test_eof + _test_eof714: + cs = 714 + goto _test_eof + _test_eof715: + cs = 715 + goto _test_eof + _test_eof716: + cs = 716 + goto _test_eof + _test_eof717: + cs = 717 + goto _test_eof + _test_eof718: + cs = 718 + goto _test_eof + _test_eof719: + cs = 719 + goto _test_eof + _test_eof720: + cs = 720 + goto _test_eof + _test_eof721: + cs = 721 + goto _test_eof + _test_eof722: + cs = 722 + goto _test_eof + _test_eof723: + cs = 723 + goto _test_eof + _test_eof724: + cs = 724 + goto _test_eof + _test_eof725: + cs = 725 + goto _test_eof + _test_eof726: + cs = 726 + goto _test_eof + _test_eof727: + cs = 727 + goto _test_eof + _test_eof728: + cs = 728 + goto _test_eof + _test_eof729: + cs = 729 + goto _test_eof + _test_eof730: + cs = 730 + goto _test_eof + _test_eof731: + cs = 731 + goto _test_eof + _test_eof732: + cs = 732 + goto _test_eof + _test_eof733: + cs = 733 + goto _test_eof + _test_eof734: + cs = 734 + goto _test_eof + _test_eof735: + cs = 735 + goto _test_eof + _test_eof736: + cs = 736 + goto _test_eof + _test_eof737: + cs = 737 + goto _test_eof + _test_eof738: + cs = 738 + goto _test_eof + _test_eof739: + cs = 739 + goto _test_eof + _test_eof740: + cs = 740 + goto _test_eof + _test_eof741: + cs = 741 + goto _test_eof + _test_eof742: + cs = 742 + goto _test_eof + _test_eof743: + cs = 743 + goto _test_eof + _test_eof744: + cs = 744 + goto _test_eof + _test_eof745: + cs = 745 + goto _test_eof + _test_eof746: + cs = 746 + goto _test_eof + _test_eof747: + cs = 747 + goto _test_eof + _test_eof748: + cs = 748 + goto _test_eof + _test_eof749: + cs = 749 + goto _test_eof + _test_eof750: + cs = 750 + goto _test_eof + _test_eof751: + cs = 751 + goto _test_eof + _test_eof752: + cs = 752 + goto _test_eof + _test_eof753: + cs = 753 + goto _test_eof + _test_eof754: + cs = 754 + goto _test_eof + _test_eof755: + cs = 755 + goto _test_eof + _test_eof756: + cs = 756 + goto _test_eof + _test_eof757: + cs = 757 + goto _test_eof + _test_eof758: + cs = 758 + goto _test_eof + _test_eof759: + cs = 759 + goto _test_eof + _test_eof760: + cs = 760 + goto _test_eof + _test_eof761: + cs = 761 + goto _test_eof + _test_eof762: + cs = 762 + goto _test_eof + _test_eof763: + cs = 763 + goto _test_eof + _test_eof764: + cs = 764 + goto _test_eof + _test_eof765: + cs = 765 + goto _test_eof + _test_eof766: + cs = 766 + goto _test_eof + _test_eof767: + cs = 767 + goto _test_eof + _test_eof768: + cs = 768 + goto _test_eof + _test_eof769: + cs = 769 + goto _test_eof + _test_eof770: + cs = 770 + goto _test_eof + _test_eof771: + cs = 771 + goto _test_eof + _test_eof772: + cs = 772 + goto _test_eof + _test_eof773: + cs = 773 + goto _test_eof + _test_eof774: + cs = 774 + goto _test_eof + _test_eof775: + cs = 775 + goto _test_eof + _test_eof776: + cs = 776 + goto _test_eof + _test_eof777: + cs = 777 + goto _test_eof + _test_eof778: + cs = 778 + goto _test_eof + _test_eof779: + cs = 779 + goto _test_eof + _test_eof780: + cs = 780 + goto _test_eof + _test_eof781: + cs = 781 + goto _test_eof + _test_eof782: + cs = 782 + goto _test_eof + _test_eof783: + cs = 783 + goto _test_eof + _test_eof784: + cs = 784 + goto _test_eof + _test_eof785: + cs = 785 + goto _test_eof + _test_eof786: + cs = 786 + goto _test_eof + _test_eof787: + cs = 787 + goto _test_eof + _test_eof788: + cs = 788 + goto _test_eof + _test_eof789: + cs = 789 + goto _test_eof + _test_eof790: + cs = 790 + goto _test_eof + _test_eof791: + cs = 791 + goto _test_eof + _test_eof792: + cs = 792 + goto _test_eof + _test_eof793: + cs = 793 + goto _test_eof + _test_eof794: + cs = 794 + goto _test_eof + _test_eof795: + cs = 795 + goto _test_eof + _test_eof796: + cs = 796 + goto _test_eof + _test_eof797: + cs = 797 + goto _test_eof + _test_eof798: + cs = 798 + goto _test_eof + _test_eof799: + cs = 799 + goto _test_eof + _test_eof800: + cs = 800 + goto _test_eof + _test_eof801: + cs = 801 + goto _test_eof + _test_eof802: + cs = 802 + goto _test_eof + _test_eof803: + cs = 803 + goto _test_eof + _test_eof804: + cs = 804 + goto _test_eof + _test_eof805: + cs = 805 + goto _test_eof + _test_eof806: + cs = 806 + goto _test_eof + _test_eof807: + cs = 807 + goto _test_eof + _test_eof808: + cs = 808 + goto _test_eof + _test_eof809: + cs = 809 + goto _test_eof + _test_eof810: + cs = 810 + goto _test_eof + _test_eof811: + cs = 811 + goto _test_eof + _test_eof812: + cs = 812 + goto _test_eof + _test_eof813: + cs = 813 + goto _test_eof + _test_eof814: + cs = 814 + goto _test_eof + _test_eof815: + cs = 815 + goto _test_eof + _test_eof816: + cs = 816 + goto _test_eof + _test_eof817: + cs = 817 + goto _test_eof + _test_eof818: + cs = 818 + goto _test_eof + _test_eof819: + cs = 819 + goto _test_eof + _test_eof820: + cs = 820 + goto _test_eof + _test_eof821: + cs = 821 + goto _test_eof + _test_eof822: + cs = 822 + goto _test_eof + _test_eof823: + cs = 823 + goto _test_eof + _test_eof824: + cs = 824 + goto _test_eof + _test_eof825: + cs = 825 + goto _test_eof + _test_eof826: + cs = 826 + goto _test_eof + _test_eof827: + cs = 827 + goto _test_eof + _test_eof828: + cs = 828 + goto _test_eof + _test_eof829: + cs = 829 + goto _test_eof + _test_eof830: + cs = 830 + goto _test_eof + _test_eof831: + cs = 831 + goto _test_eof + _test_eof832: + cs = 832 + goto _test_eof + _test_eof833: + cs = 833 + goto _test_eof + _test_eof834: + cs = 834 + goto _test_eof + _test_eof835: + cs = 835 + goto _test_eof + _test_eof836: + cs = 836 + goto _test_eof + _test_eof837: + cs = 837 + goto _test_eof + _test_eof838: + cs = 838 + goto _test_eof + _test_eof839: + cs = 839 + goto _test_eof + _test_eof840: + cs = 840 + goto _test_eof + _test_eof841: + cs = 841 + goto _test_eof + _test_eof842: + cs = 842 + goto _test_eof + _test_eof843: + cs = 843 + goto _test_eof + _test_eof844: + cs = 844 + goto _test_eof + _test_eof845: + cs = 845 + goto _test_eof + _test_eof846: + cs = 846 + goto _test_eof + _test_eof847: + cs = 847 + goto _test_eof + _test_eof848: + cs = 848 + goto _test_eof + _test_eof849: + cs = 849 + goto _test_eof + _test_eof850: + cs = 850 + goto _test_eof + _test_eof851: + cs = 851 + goto _test_eof + _test_eof852: + cs = 852 + goto _test_eof + _test_eof853: + cs = 853 + goto _test_eof + _test_eof854: + cs = 854 + goto _test_eof + _test_eof855: + cs = 855 + goto _test_eof + _test_eof856: + cs = 856 + goto _test_eof + _test_eof857: + cs = 857 + goto _test_eof + _test_eof858: + cs = 858 + goto _test_eof + _test_eof859: + cs = 859 + goto _test_eof + _test_eof860: + cs = 860 + goto _test_eof + _test_eof861: + cs = 861 + goto _test_eof + _test_eof862: + cs = 862 + goto _test_eof + _test_eof863: + cs = 863 + goto _test_eof + _test_eof864: + cs = 864 + goto _test_eof + _test_eof865: + cs = 865 + goto _test_eof + _test_eof866: + cs = 866 + goto _test_eof + _test_eof867: + cs = 867 + goto _test_eof + _test_eof868: + cs = 868 + goto _test_eof + _test_eof869: + cs = 869 + goto _test_eof + _test_eof870: + cs = 870 + goto _test_eof + _test_eof871: + cs = 871 + goto _test_eof + _test_eof872: + cs = 872 + goto _test_eof + _test_eof873: + cs = 873 + goto _test_eof + _test_eof874: + cs = 874 + goto _test_eof + _test_eof875: + cs = 875 + goto _test_eof + _test_eof876: + cs = 876 + goto _test_eof + _test_eof877: + cs = 877 + goto _test_eof + _test_eof878: + cs = 878 + goto _test_eof + _test_eof879: + cs = 879 + goto _test_eof + _test_eof880: + cs = 880 + goto _test_eof + _test_eof881: + cs = 881 + goto _test_eof + _test_eof882: + cs = 882 + goto _test_eof + _test_eof883: + cs = 883 + goto _test_eof + _test_eof884: + cs = 884 + goto _test_eof + _test_eof885: + cs = 885 + goto _test_eof + _test_eof886: + cs = 886 + goto _test_eof + _test_eof887: + cs = 887 + goto _test_eof + _test_eof888: + cs = 888 + goto _test_eof + _test_eof889: + cs = 889 + goto _test_eof + _test_eof890: + cs = 890 + goto _test_eof + _test_eof891: + cs = 891 + goto _test_eof + _test_eof892: + cs = 892 + goto _test_eof + _test_eof893: + cs = 893 + goto _test_eof + _test_eof894: + cs = 894 + goto _test_eof + _test_eof895: + cs = 895 + goto _test_eof + _test_eof896: + cs = 896 + goto _test_eof + _test_eof897: + cs = 897 + goto _test_eof + _test_eof898: + cs = 898 + goto _test_eof + _test_eof899: + cs = 899 + goto _test_eof + _test_eof900: + cs = 900 + goto _test_eof + _test_eof901: + cs = 901 + goto _test_eof + _test_eof902: + cs = 902 + goto _test_eof + _test_eof903: + cs = 903 + goto _test_eof + _test_eof904: + cs = 904 + goto _test_eof + _test_eof905: + cs = 905 + goto _test_eof + _test_eof906: + cs = 906 + goto _test_eof + _test_eof907: + cs = 907 + goto _test_eof + _test_eof908: + cs = 908 + goto _test_eof + _test_eof909: + cs = 909 + goto _test_eof + _test_eof910: + cs = 910 + goto _test_eof + _test_eof911: + cs = 911 + goto _test_eof + _test_eof912: + cs = 912 + goto _test_eof + _test_eof913: + cs = 913 + goto _test_eof + _test_eof914: + cs = 914 + goto _test_eof + _test_eof915: + cs = 915 + goto _test_eof + _test_eof916: + cs = 916 + goto _test_eof + _test_eof917: + cs = 917 + goto _test_eof + _test_eof918: + cs = 918 + goto _test_eof + _test_eof919: + cs = 919 + goto _test_eof + _test_eof920: + cs = 920 + goto _test_eof + _test_eof921: + cs = 921 + goto _test_eof + _test_eof922: + cs = 922 + goto _test_eof + _test_eof923: + cs = 923 + goto _test_eof + _test_eof924: + cs = 924 + goto _test_eof + _test_eof925: + cs = 925 + goto _test_eof + _test_eof926: + cs = 926 + goto _test_eof + _test_eof927: + cs = 927 + goto _test_eof + _test_eof928: + cs = 928 + goto _test_eof + _test_eof929: + cs = 929 + goto _test_eof + _test_eof930: + cs = 930 + goto _test_eof + _test_eof931: + cs = 931 + goto _test_eof + _test_eof932: + cs = 932 + goto _test_eof + _test_eof933: + cs = 933 + goto _test_eof + _test_eof934: + cs = 934 + goto _test_eof + _test_eof935: + cs = 935 + goto _test_eof + _test_eof936: + cs = 936 + goto _test_eof + _test_eof937: + cs = 937 + goto _test_eof + _test_eof938: + cs = 938 + goto _test_eof + _test_eof939: + cs = 939 + goto _test_eof + _test_eof940: + cs = 940 + goto _test_eof + _test_eof941: + cs = 941 + goto _test_eof + _test_eof942: + cs = 942 + goto _test_eof + _test_eof943: + cs = 943 + goto _test_eof + _test_eof944: + cs = 944 + goto _test_eof + _test_eof945: + cs = 945 + goto _test_eof + _test_eof946: + cs = 946 + goto _test_eof + _test_eof947: + cs = 947 + goto _test_eof + _test_eof948: + cs = 948 + goto _test_eof + _test_eof949: + cs = 949 + goto _test_eof + _test_eof950: + cs = 950 + goto _test_eof + _test_eof951: + cs = 951 + goto _test_eof + _test_eof952: + cs = 952 + goto _test_eof + _test_eof953: + cs = 953 + goto _test_eof + _test_eof954: + cs = 954 + goto _test_eof + _test_eof955: + cs = 955 + goto _test_eof + _test_eof956: + cs = 956 + goto _test_eof + _test_eof957: + cs = 957 + goto _test_eof + _test_eof958: + cs = 958 + goto _test_eof + _test_eof959: + cs = 959 + goto _test_eof + _test_eof960: + cs = 960 + goto _test_eof + _test_eof961: + cs = 961 + goto _test_eof + _test_eof962: + cs = 962 + goto _test_eof + _test_eof963: + cs = 963 + goto _test_eof + _test_eof964: + cs = 964 + goto _test_eof + _test_eof965: + cs = 965 + goto _test_eof + _test_eof966: + cs = 966 + goto _test_eof + _test_eof967: + cs = 967 + goto _test_eof + _test_eof968: + cs = 968 + goto _test_eof + _test_eof969: + cs = 969 + goto _test_eof + _test_eof970: + cs = 970 + goto _test_eof + _test_eof971: + cs = 971 + goto _test_eof + _test_eof972: + cs = 972 + goto _test_eof + _test_eof973: + cs = 973 + goto _test_eof + _test_eof974: + cs = 974 + goto _test_eof + _test_eof975: + cs = 975 + goto _test_eof + _test_eof976: + cs = 976 + goto _test_eof + _test_eof977: + cs = 977 + goto _test_eof + _test_eof978: + cs = 978 + goto _test_eof + _test_eof979: + cs = 979 + goto _test_eof + _test_eof980: + cs = 980 + goto _test_eof + _test_eof981: + cs = 981 + goto _test_eof + _test_eof982: + cs = 982 + goto _test_eof + _test_eof983: + cs = 983 + goto _test_eof + _test_eof984: + cs = 984 + goto _test_eof + _test_eof985: + cs = 985 + goto _test_eof + _test_eof986: + cs = 986 + goto _test_eof + _test_eof987: + cs = 987 + goto _test_eof + _test_eof988: + cs = 988 + goto _test_eof + _test_eof989: + cs = 989 + goto _test_eof + _test_eof990: + cs = 990 + goto _test_eof + _test_eof991: + cs = 991 + goto _test_eof + _test_eof992: + cs = 992 + goto _test_eof + _test_eof993: + cs = 993 + goto _test_eof + _test_eof994: + cs = 994 + goto _test_eof + _test_eof995: + cs = 995 + goto _test_eof + _test_eof996: + cs = 996 + goto _test_eof + _test_eof997: + cs = 997 + goto _test_eof + _test_eof998: + cs = 998 + goto _test_eof + _test_eof999: + cs = 999 + goto _test_eof + _test_eof1000: + cs = 1000 + goto _test_eof + _test_eof1001: + cs = 1001 + goto _test_eof + _test_eof1002: + cs = 1002 + goto _test_eof + _test_eof1003: + cs = 1003 + goto _test_eof + _test_eof1004: + cs = 1004 + goto _test_eof + _test_eof1005: + cs = 1005 + goto _test_eof + _test_eof1006: + cs = 1006 + goto _test_eof + _test_eof1007: + cs = 1007 + goto _test_eof + _test_eof1008: + cs = 1008 + goto _test_eof + _test_eof1009: + cs = 1009 + goto _test_eof + _test_eof1010: + cs = 1010 + goto _test_eof + _test_eof1011: + cs = 1011 + goto _test_eof + _test_eof1012: + cs = 1012 + goto _test_eof + _test_eof1013: + cs = 1013 + goto _test_eof + _test_eof1014: + cs = 1014 + goto _test_eof + _test_eof1015: + cs = 1015 + goto _test_eof + _test_eof1016: + cs = 1016 + goto _test_eof + _test_eof1017: + cs = 1017 + goto _test_eof + _test_eof1018: + cs = 1018 + goto _test_eof + _test_eof1019: + cs = 1019 + goto _test_eof + _test_eof1020: + cs = 1020 + goto _test_eof + _test_eof1021: + cs = 1021 + goto _test_eof + _test_eof1022: + cs = 1022 + goto _test_eof + _test_eof1023: + cs = 1023 + goto _test_eof + _test_eof1024: + cs = 1024 + goto _test_eof + _test_eof1025: + cs = 1025 + goto _test_eof + _test_eof1026: + cs = 1026 + goto _test_eof + _test_eof1027: + cs = 1027 + goto _test_eof + _test_eof1028: + cs = 1028 + goto _test_eof + _test_eof1029: + cs = 1029 + goto _test_eof + _test_eof1030: + cs = 1030 + goto _test_eof + _test_eof1031: + cs = 1031 + goto _test_eof + _test_eof1032: + cs = 1032 + goto _test_eof + _test_eof1033: + cs = 1033 + goto _test_eof + _test_eof1034: + cs = 1034 + goto _test_eof + _test_eof1035: + cs = 1035 + goto _test_eof + _test_eof1036: + cs = 1036 + goto _test_eof + _test_eof1037: + cs = 1037 + goto _test_eof + _test_eof1038: + cs = 1038 + goto _test_eof + _test_eof1039: + cs = 1039 + goto _test_eof + _test_eof1040: + cs = 1040 + goto _test_eof + _test_eof1041: + cs = 1041 + goto _test_eof + _test_eof1042: + cs = 1042 + goto _test_eof + _test_eof1043: + cs = 1043 + goto _test_eof + _test_eof1044: + cs = 1044 + goto _test_eof + _test_eof1045: + cs = 1045 + goto _test_eof + _test_eof1046: + cs = 1046 + goto _test_eof + _test_eof1047: + cs = 1047 + goto _test_eof + _test_eof1048: + cs = 1048 + goto _test_eof + _test_eof1049: + cs = 1049 + goto _test_eof + _test_eof1050: + cs = 1050 + goto _test_eof + _test_eof1051: + cs = 1051 + goto _test_eof + _test_eof1052: + cs = 1052 + goto _test_eof + _test_eof1053: + cs = 1053 + goto _test_eof + _test_eof1054: + cs = 1054 + goto _test_eof + _test_eof1055: + cs = 1055 + goto _test_eof + _test_eof1056: + cs = 1056 + goto _test_eof + _test_eof1057: + cs = 1057 + goto _test_eof + _test_eof1058: + cs = 1058 + goto _test_eof + _test_eof1059: + cs = 1059 + goto _test_eof + _test_eof1060: + cs = 1060 + goto _test_eof + _test_eof1061: + cs = 1061 + goto _test_eof + _test_eof1062: + cs = 1062 + goto _test_eof + _test_eof1063: + cs = 1063 + goto _test_eof + _test_eof1064: + cs = 1064 + goto _test_eof + _test_eof1065: + cs = 1065 + goto _test_eof + _test_eof1066: + cs = 1066 + goto _test_eof + _test_eof1067: + cs = 1067 + goto _test_eof + _test_eof1068: + cs = 1068 + goto _test_eof + _test_eof1069: + cs = 1069 + goto _test_eof + _test_eof1070: + cs = 1070 + goto _test_eof + _test_eof1071: + cs = 1071 + goto _test_eof + _test_eof1072: + cs = 1072 + goto _test_eof + _test_eof1073: + cs = 1073 + goto _test_eof + _test_eof1074: + cs = 1074 + goto _test_eof + _test_eof1075: + cs = 1075 + goto _test_eof + _test_eof1076: + cs = 1076 + goto _test_eof + _test_eof1077: + cs = 1077 + goto _test_eof + _test_eof1078: + cs = 1078 + goto _test_eof + _test_eof1079: + cs = 1079 + goto _test_eof + _test_eof1080: + cs = 1080 + goto _test_eof + _test_eof1081: + cs = 1081 + goto _test_eof + _test_eof1082: + cs = 1082 + goto _test_eof + _test_eof1083: + cs = 1083 + goto _test_eof + _test_eof1084: + cs = 1084 + goto _test_eof + _test_eof1085: + cs = 1085 + goto _test_eof + _test_eof1086: + cs = 1086 + goto _test_eof + _test_eof1087: + cs = 1087 + goto _test_eof + _test_eof1088: + cs = 1088 + goto _test_eof + _test_eof1089: + cs = 1089 + goto _test_eof + _test_eof4872: + cs = 4872 + goto _test_eof + _test_eof1090: + cs = 1090 + goto _test_eof + _test_eof1091: + cs = 1091 + goto _test_eof + _test_eof1092: + cs = 1092 + goto _test_eof + _test_eof1093: + cs = 1093 + goto _test_eof + _test_eof1094: + cs = 1094 + goto _test_eof + _test_eof1095: + cs = 1095 + goto _test_eof + _test_eof1096: + cs = 1096 + goto _test_eof + _test_eof1097: + cs = 1097 + goto _test_eof + _test_eof1098: + cs = 1098 + goto _test_eof + _test_eof1099: + cs = 1099 + goto _test_eof + _test_eof1100: + cs = 1100 + goto _test_eof + _test_eof1101: + cs = 1101 + goto _test_eof + _test_eof1102: + cs = 1102 + goto _test_eof + _test_eof1103: + cs = 1103 + goto _test_eof + _test_eof1104: + cs = 1104 + goto _test_eof + _test_eof1105: + cs = 1105 + goto _test_eof + _test_eof1106: + cs = 1106 + goto _test_eof + _test_eof1107: + cs = 1107 + goto _test_eof + _test_eof1108: + cs = 1108 + goto _test_eof + _test_eof1109: + cs = 1109 + goto _test_eof + _test_eof1110: + cs = 1110 + goto _test_eof + _test_eof1111: + cs = 1111 + goto _test_eof + _test_eof1112: + cs = 1112 + goto _test_eof + _test_eof1113: + cs = 1113 + goto _test_eof + _test_eof1114: + cs = 1114 + goto _test_eof + _test_eof1115: + cs = 1115 + goto _test_eof + _test_eof1116: + cs = 1116 + goto _test_eof + _test_eof1117: + cs = 1117 + goto _test_eof + _test_eof1118: + cs = 1118 + goto _test_eof + _test_eof1119: + cs = 1119 + goto _test_eof + _test_eof1120: + cs = 1120 + goto _test_eof + _test_eof1121: + cs = 1121 + goto _test_eof + _test_eof1122: + cs = 1122 + goto _test_eof + _test_eof1123: + cs = 1123 + goto _test_eof + _test_eof1124: + cs = 1124 + goto _test_eof + _test_eof1125: + cs = 1125 + goto _test_eof + _test_eof1126: + cs = 1126 + goto _test_eof + _test_eof1127: + cs = 1127 + goto _test_eof + _test_eof1128: + cs = 1128 + goto _test_eof + _test_eof1129: + cs = 1129 + goto _test_eof + _test_eof1130: + cs = 1130 + goto _test_eof + _test_eof1131: + cs = 1131 + goto _test_eof + _test_eof1132: + cs = 1132 + goto _test_eof + _test_eof1133: + cs = 1133 + goto _test_eof + _test_eof1134: + cs = 1134 + goto _test_eof + _test_eof1135: + cs = 1135 + goto _test_eof + _test_eof1136: + cs = 1136 + goto _test_eof + _test_eof1137: + cs = 1137 + goto _test_eof + _test_eof1138: + cs = 1138 + goto _test_eof + _test_eof1139: + cs = 1139 + goto _test_eof + _test_eof1140: + cs = 1140 + goto _test_eof + _test_eof1141: + cs = 1141 + goto _test_eof + _test_eof1142: + cs = 1142 + goto _test_eof + _test_eof1143: + cs = 1143 + goto _test_eof + _test_eof1144: + cs = 1144 + goto _test_eof + _test_eof1145: + cs = 1145 + goto _test_eof + _test_eof1146: + cs = 1146 + goto _test_eof + _test_eof1147: + cs = 1147 + goto _test_eof + _test_eof1148: + cs = 1148 + goto _test_eof + _test_eof1149: + cs = 1149 + goto _test_eof + _test_eof1150: + cs = 1150 + goto _test_eof + _test_eof1151: + cs = 1151 + goto _test_eof + _test_eof1152: + cs = 1152 + goto _test_eof + _test_eof1153: + cs = 1153 + goto _test_eof + _test_eof1154: + cs = 1154 + goto _test_eof + _test_eof1155: + cs = 1155 + goto _test_eof + _test_eof1156: + cs = 1156 + goto _test_eof + _test_eof1157: + cs = 1157 + goto _test_eof + _test_eof1158: + cs = 1158 + goto _test_eof + _test_eof1159: + cs = 1159 + goto _test_eof + _test_eof1160: + cs = 1160 + goto _test_eof + _test_eof1161: + cs = 1161 + goto _test_eof + _test_eof1162: + cs = 1162 + goto _test_eof + _test_eof1163: + cs = 1163 + goto _test_eof + _test_eof1164: + cs = 1164 + goto _test_eof + _test_eof1165: + cs = 1165 + goto _test_eof + _test_eof1166: + cs = 1166 + goto _test_eof + _test_eof1167: + cs = 1167 + goto _test_eof + _test_eof1168: + cs = 1168 + goto _test_eof + _test_eof1169: + cs = 1169 + goto _test_eof + _test_eof1170: + cs = 1170 + goto _test_eof + _test_eof1171: + cs = 1171 + goto _test_eof + _test_eof1172: + cs = 1172 + goto _test_eof + _test_eof1173: + cs = 1173 + goto _test_eof + _test_eof1174: + cs = 1174 + goto _test_eof + _test_eof1175: + cs = 1175 + goto _test_eof + _test_eof1176: + cs = 1176 + goto _test_eof + _test_eof1177: + cs = 1177 + goto _test_eof + _test_eof1178: + cs = 1178 + goto _test_eof + _test_eof1179: + cs = 1179 + goto _test_eof + _test_eof1180: + cs = 1180 + goto _test_eof + _test_eof1181: + cs = 1181 + goto _test_eof + _test_eof1182: + cs = 1182 + goto _test_eof + _test_eof1183: + cs = 1183 + goto _test_eof + _test_eof1184: + cs = 1184 + goto _test_eof + _test_eof1185: + cs = 1185 + goto _test_eof + _test_eof1186: + cs = 1186 + goto _test_eof + _test_eof1187: + cs = 1187 + goto _test_eof + _test_eof1188: + cs = 1188 + goto _test_eof + _test_eof1189: + cs = 1189 + goto _test_eof + _test_eof1190: + cs = 1190 + goto _test_eof + _test_eof1191: + cs = 1191 + goto _test_eof + _test_eof1192: + cs = 1192 + goto _test_eof + _test_eof1193: + cs = 1193 + goto _test_eof + _test_eof1194: + cs = 1194 + goto _test_eof + _test_eof1195: + cs = 1195 + goto _test_eof + _test_eof1196: + cs = 1196 + goto _test_eof + _test_eof1197: + cs = 1197 + goto _test_eof + _test_eof1198: + cs = 1198 + goto _test_eof + _test_eof1199: + cs = 1199 + goto _test_eof + _test_eof1200: + cs = 1200 + goto _test_eof + _test_eof1201: + cs = 1201 + goto _test_eof + _test_eof1202: + cs = 1202 + goto _test_eof + _test_eof1203: + cs = 1203 + goto _test_eof + _test_eof1204: + cs = 1204 + goto _test_eof + _test_eof1205: + cs = 1205 + goto _test_eof + _test_eof1206: + cs = 1206 + goto _test_eof + _test_eof1207: + cs = 1207 + goto _test_eof + _test_eof1208: + cs = 1208 + goto _test_eof + _test_eof1209: + cs = 1209 + goto _test_eof + _test_eof1210: + cs = 1210 + goto _test_eof + _test_eof1211: + cs = 1211 + goto _test_eof + _test_eof1212: + cs = 1212 + goto _test_eof + _test_eof1213: + cs = 1213 + goto _test_eof + _test_eof1214: + cs = 1214 + goto _test_eof + _test_eof1215: + cs = 1215 + goto _test_eof + _test_eof1216: + cs = 1216 + goto _test_eof + _test_eof1217: + cs = 1217 + goto _test_eof + _test_eof1218: + cs = 1218 + goto _test_eof + _test_eof1219: + cs = 1219 + goto _test_eof + _test_eof1220: + cs = 1220 + goto _test_eof + _test_eof1221: + cs = 1221 + goto _test_eof + _test_eof1222: + cs = 1222 + goto _test_eof + _test_eof1223: + cs = 1223 + goto _test_eof + _test_eof1224: + cs = 1224 + goto _test_eof + _test_eof1225: + cs = 1225 + goto _test_eof + _test_eof1226: + cs = 1226 + goto _test_eof + _test_eof1227: + cs = 1227 + goto _test_eof + _test_eof1228: + cs = 1228 + goto _test_eof + _test_eof1229: + cs = 1229 + goto _test_eof + _test_eof1230: + cs = 1230 + goto _test_eof + _test_eof1231: + cs = 1231 + goto _test_eof + _test_eof1232: + cs = 1232 + goto _test_eof + _test_eof1233: + cs = 1233 + goto _test_eof + _test_eof1234: + cs = 1234 + goto _test_eof + _test_eof1235: + cs = 1235 + goto _test_eof + _test_eof1236: + cs = 1236 + goto _test_eof + _test_eof1237: + cs = 1237 + goto _test_eof + _test_eof1238: + cs = 1238 + goto _test_eof + _test_eof1239: + cs = 1239 + goto _test_eof + _test_eof1240: + cs = 1240 + goto _test_eof + _test_eof1241: + cs = 1241 + goto _test_eof + _test_eof1242: + cs = 1242 + goto _test_eof + _test_eof1243: + cs = 1243 + goto _test_eof + _test_eof1244: + cs = 1244 + goto _test_eof + _test_eof1245: + cs = 1245 + goto _test_eof + _test_eof1246: + cs = 1246 + goto _test_eof + _test_eof1247: + cs = 1247 + goto _test_eof + _test_eof1248: + cs = 1248 + goto _test_eof + _test_eof1249: + cs = 1249 + goto _test_eof + _test_eof1250: + cs = 1250 + goto _test_eof + _test_eof1251: + cs = 1251 + goto _test_eof + _test_eof1252: + cs = 1252 + goto _test_eof + _test_eof1253: + cs = 1253 + goto _test_eof + _test_eof1254: + cs = 1254 + goto _test_eof + _test_eof1255: + cs = 1255 + goto _test_eof + _test_eof1256: + cs = 1256 + goto _test_eof + _test_eof1257: + cs = 1257 + goto _test_eof + _test_eof1258: + cs = 1258 + goto _test_eof + _test_eof1259: + cs = 1259 + goto _test_eof + _test_eof1260: + cs = 1260 + goto _test_eof + _test_eof1261: + cs = 1261 + goto _test_eof + _test_eof1262: + cs = 1262 + goto _test_eof + _test_eof1263: + cs = 1263 + goto _test_eof + _test_eof1264: + cs = 1264 + goto _test_eof + _test_eof1265: + cs = 1265 + goto _test_eof + _test_eof1266: + cs = 1266 + goto _test_eof + _test_eof1267: + cs = 1267 + goto _test_eof + _test_eof1268: + cs = 1268 + goto _test_eof + _test_eof1269: + cs = 1269 + goto _test_eof + _test_eof1270: + cs = 1270 + goto _test_eof + _test_eof1271: + cs = 1271 + goto _test_eof + _test_eof1272: + cs = 1272 + goto _test_eof + _test_eof1273: + cs = 1273 + goto _test_eof + _test_eof1274: + cs = 1274 + goto _test_eof + _test_eof1275: + cs = 1275 + goto _test_eof + _test_eof1276: + cs = 1276 + goto _test_eof + _test_eof1277: + cs = 1277 + goto _test_eof + _test_eof1278: + cs = 1278 + goto _test_eof + _test_eof1279: + cs = 1279 + goto _test_eof + _test_eof1280: + cs = 1280 + goto _test_eof + _test_eof1281: + cs = 1281 + goto _test_eof + _test_eof1282: + cs = 1282 + goto _test_eof + _test_eof1283: + cs = 1283 + goto _test_eof + _test_eof1284: + cs = 1284 + goto _test_eof + _test_eof1285: + cs = 1285 + goto _test_eof + _test_eof1286: + cs = 1286 + goto _test_eof + _test_eof1287: + cs = 1287 + goto _test_eof + _test_eof1288: + cs = 1288 + goto _test_eof + _test_eof1289: + cs = 1289 + goto _test_eof + _test_eof1290: + cs = 1290 + goto _test_eof + _test_eof1291: + cs = 1291 + goto _test_eof + _test_eof1292: + cs = 1292 + goto _test_eof + _test_eof1293: + cs = 1293 + goto _test_eof + _test_eof1294: + cs = 1294 + goto _test_eof + _test_eof1295: + cs = 1295 + goto _test_eof + _test_eof1296: + cs = 1296 + goto _test_eof + _test_eof1297: + cs = 1297 + goto _test_eof + _test_eof1298: + cs = 1298 + goto _test_eof + _test_eof1299: + cs = 1299 + goto _test_eof + _test_eof1300: + cs = 1300 + goto _test_eof + _test_eof1301: + cs = 1301 + goto _test_eof + _test_eof1302: + cs = 1302 + goto _test_eof + _test_eof1303: + cs = 1303 + goto _test_eof + _test_eof1304: + cs = 1304 + goto _test_eof + _test_eof1305: + cs = 1305 + goto _test_eof + _test_eof1306: + cs = 1306 + goto _test_eof + _test_eof1307: + cs = 1307 + goto _test_eof + _test_eof1308: + cs = 1308 + goto _test_eof + _test_eof1309: + cs = 1309 + goto _test_eof + _test_eof1310: + cs = 1310 + goto _test_eof + _test_eof1311: + cs = 1311 + goto _test_eof + _test_eof1312: + cs = 1312 + goto _test_eof + _test_eof1313: + cs = 1313 + goto _test_eof + _test_eof1314: + cs = 1314 + goto _test_eof + _test_eof1315: + cs = 1315 + goto _test_eof + _test_eof1316: + cs = 1316 + goto _test_eof + _test_eof1317: + cs = 1317 + goto _test_eof + _test_eof1318: + cs = 1318 + goto _test_eof + _test_eof1319: + cs = 1319 + goto _test_eof + _test_eof1320: + cs = 1320 + goto _test_eof + _test_eof1321: + cs = 1321 + goto _test_eof + _test_eof1322: + cs = 1322 + goto _test_eof + _test_eof1323: + cs = 1323 + goto _test_eof + _test_eof1324: + cs = 1324 + goto _test_eof + _test_eof1325: + cs = 1325 + goto _test_eof + _test_eof1326: + cs = 1326 + goto _test_eof + _test_eof1327: + cs = 1327 + goto _test_eof + _test_eof1328: + cs = 1328 + goto _test_eof + _test_eof1329: + cs = 1329 + goto _test_eof + _test_eof1330: + cs = 1330 + goto _test_eof + _test_eof1331: + cs = 1331 + goto _test_eof + _test_eof1332: + cs = 1332 + goto _test_eof + _test_eof1333: + cs = 1333 + goto _test_eof + _test_eof1334: + cs = 1334 + goto _test_eof + _test_eof1335: + cs = 1335 + goto _test_eof + _test_eof1336: + cs = 1336 + goto _test_eof + _test_eof1337: + cs = 1337 + goto _test_eof + _test_eof1338: + cs = 1338 + goto _test_eof + _test_eof1339: + cs = 1339 + goto _test_eof + _test_eof1340: + cs = 1340 + goto _test_eof + _test_eof1341: + cs = 1341 + goto _test_eof + _test_eof1342: + cs = 1342 + goto _test_eof + _test_eof1343: + cs = 1343 + goto _test_eof + _test_eof1344: + cs = 1344 + goto _test_eof + _test_eof1345: + cs = 1345 + goto _test_eof + _test_eof1346: + cs = 1346 + goto _test_eof + _test_eof1347: + cs = 1347 + goto _test_eof + _test_eof1348: + cs = 1348 + goto _test_eof + _test_eof1349: + cs = 1349 + goto _test_eof + _test_eof1350: + cs = 1350 + goto _test_eof + _test_eof1351: + cs = 1351 + goto _test_eof + _test_eof1352: + cs = 1352 + goto _test_eof + _test_eof1353: + cs = 1353 + goto _test_eof + _test_eof1354: + cs = 1354 + goto _test_eof + _test_eof1355: + cs = 1355 + goto _test_eof + _test_eof1356: + cs = 1356 + goto _test_eof + _test_eof1357: + cs = 1357 + goto _test_eof + _test_eof1358: + cs = 1358 + goto _test_eof + _test_eof1359: + cs = 1359 + goto _test_eof + _test_eof1360: + cs = 1360 + goto _test_eof + _test_eof1361: + cs = 1361 + goto _test_eof + _test_eof1362: + cs = 1362 + goto _test_eof + _test_eof1363: + cs = 1363 + goto _test_eof + _test_eof1364: + cs = 1364 + goto _test_eof + _test_eof1365: + cs = 1365 + goto _test_eof + _test_eof1366: + cs = 1366 + goto _test_eof + _test_eof1367: + cs = 1367 + goto _test_eof + _test_eof1368: + cs = 1368 + goto _test_eof + _test_eof1369: + cs = 1369 + goto _test_eof + _test_eof1370: + cs = 1370 + goto _test_eof + _test_eof1371: + cs = 1371 + goto _test_eof + _test_eof1372: + cs = 1372 + goto _test_eof + _test_eof1373: + cs = 1373 + goto _test_eof + _test_eof1374: + cs = 1374 + goto _test_eof + _test_eof1375: + cs = 1375 + goto _test_eof + _test_eof1376: + cs = 1376 + goto _test_eof + _test_eof1377: + cs = 1377 + goto _test_eof + _test_eof1378: + cs = 1378 + goto _test_eof + _test_eof1379: + cs = 1379 + goto _test_eof + _test_eof1380: + cs = 1380 + goto _test_eof + _test_eof1381: + cs = 1381 + goto _test_eof + _test_eof1382: + cs = 1382 + goto _test_eof + _test_eof1383: + cs = 1383 + goto _test_eof + _test_eof1384: + cs = 1384 + goto _test_eof + _test_eof1385: + cs = 1385 + goto _test_eof + _test_eof1386: + cs = 1386 + goto _test_eof + _test_eof1387: + cs = 1387 + goto _test_eof + _test_eof1388: + cs = 1388 + goto _test_eof + _test_eof1389: + cs = 1389 + goto _test_eof + _test_eof1390: + cs = 1390 + goto _test_eof + _test_eof1391: + cs = 1391 + goto _test_eof + _test_eof1392: + cs = 1392 + goto _test_eof + _test_eof1393: + cs = 1393 + goto _test_eof + _test_eof1394: + cs = 1394 + goto _test_eof + _test_eof1395: + cs = 1395 + goto _test_eof + _test_eof1396: + cs = 1396 + goto _test_eof + _test_eof1397: + cs = 1397 + goto _test_eof + _test_eof1398: + cs = 1398 + goto _test_eof + _test_eof1399: + cs = 1399 + goto _test_eof + _test_eof1400: + cs = 1400 + goto _test_eof + _test_eof1401: + cs = 1401 + goto _test_eof + _test_eof1402: + cs = 1402 + goto _test_eof + _test_eof1403: + cs = 1403 + goto _test_eof + _test_eof1404: + cs = 1404 + goto _test_eof + _test_eof1405: + cs = 1405 + goto _test_eof + _test_eof1406: + cs = 1406 + goto _test_eof + _test_eof1407: + cs = 1407 + goto _test_eof + _test_eof1408: + cs = 1408 + goto _test_eof + _test_eof1409: + cs = 1409 + goto _test_eof + _test_eof1410: + cs = 1410 + goto _test_eof + _test_eof1411: + cs = 1411 + goto _test_eof + _test_eof1412: + cs = 1412 + goto _test_eof + _test_eof1413: + cs = 1413 + goto _test_eof + _test_eof1414: + cs = 1414 + goto _test_eof + _test_eof1415: + cs = 1415 + goto _test_eof + _test_eof1416: + cs = 1416 + goto _test_eof + _test_eof1417: + cs = 1417 + goto _test_eof + _test_eof1418: + cs = 1418 + goto _test_eof + _test_eof1419: + cs = 1419 + goto _test_eof + _test_eof1420: + cs = 1420 + goto _test_eof + _test_eof1421: + cs = 1421 + goto _test_eof + _test_eof1422: + cs = 1422 + goto _test_eof + _test_eof1423: + cs = 1423 + goto _test_eof + _test_eof1424: + cs = 1424 + goto _test_eof + _test_eof1425: + cs = 1425 + goto _test_eof + _test_eof1426: + cs = 1426 + goto _test_eof + _test_eof1427: + cs = 1427 + goto _test_eof + _test_eof1428: + cs = 1428 + goto _test_eof + _test_eof1429: + cs = 1429 + goto _test_eof + _test_eof1430: + cs = 1430 + goto _test_eof + _test_eof1431: + cs = 1431 + goto _test_eof + _test_eof1432: + cs = 1432 + goto _test_eof + _test_eof1433: + cs = 1433 + goto _test_eof + _test_eof1434: + cs = 1434 + goto _test_eof + _test_eof1435: + cs = 1435 + goto _test_eof + _test_eof1436: + cs = 1436 + goto _test_eof + _test_eof1437: + cs = 1437 + goto _test_eof + _test_eof1438: + cs = 1438 + goto _test_eof + _test_eof1439: + cs = 1439 + goto _test_eof + _test_eof1440: + cs = 1440 + goto _test_eof + _test_eof1441: + cs = 1441 + goto _test_eof + _test_eof1442: + cs = 1442 + goto _test_eof + _test_eof1443: + cs = 1443 + goto _test_eof + _test_eof1444: + cs = 1444 + goto _test_eof + _test_eof1445: + cs = 1445 + goto _test_eof + _test_eof1446: + cs = 1446 + goto _test_eof + _test_eof1447: + cs = 1447 + goto _test_eof + _test_eof1448: + cs = 1448 + goto _test_eof + _test_eof1449: + cs = 1449 + goto _test_eof + _test_eof1450: + cs = 1450 + goto _test_eof + _test_eof1451: + cs = 1451 + goto _test_eof + _test_eof1452: + cs = 1452 + goto _test_eof + _test_eof1453: + cs = 1453 + goto _test_eof + _test_eof1454: + cs = 1454 + goto _test_eof + _test_eof1455: + cs = 1455 + goto _test_eof + _test_eof1456: + cs = 1456 + goto _test_eof + _test_eof1457: + cs = 1457 + goto _test_eof + _test_eof1458: + cs = 1458 + goto _test_eof + _test_eof1459: + cs = 1459 + goto _test_eof + _test_eof1460: + cs = 1460 + goto _test_eof + _test_eof1461: + cs = 1461 + goto _test_eof + _test_eof1462: + cs = 1462 + goto _test_eof + _test_eof1463: + cs = 1463 + goto _test_eof + _test_eof1464: + cs = 1464 + goto _test_eof + _test_eof1465: + cs = 1465 + goto _test_eof + _test_eof1466: + cs = 1466 + goto _test_eof + _test_eof1467: + cs = 1467 + goto _test_eof + _test_eof1468: + cs = 1468 + goto _test_eof + _test_eof1469: + cs = 1469 + goto _test_eof + _test_eof1470: + cs = 1470 + goto _test_eof + _test_eof1471: + cs = 1471 + goto _test_eof + _test_eof1472: + cs = 1472 + goto _test_eof + _test_eof1473: + cs = 1473 + goto _test_eof + _test_eof1474: + cs = 1474 + goto _test_eof + _test_eof1475: + cs = 1475 + goto _test_eof + _test_eof1476: + cs = 1476 + goto _test_eof + _test_eof1477: + cs = 1477 + goto _test_eof + _test_eof1478: + cs = 1478 + goto _test_eof + _test_eof1479: + cs = 1479 + goto _test_eof + _test_eof1480: + cs = 1480 + goto _test_eof + _test_eof1481: + cs = 1481 + goto _test_eof + _test_eof1482: + cs = 1482 + goto _test_eof + _test_eof1483: + cs = 1483 + goto _test_eof + _test_eof1484: + cs = 1484 + goto _test_eof + _test_eof1485: + cs = 1485 + goto _test_eof + _test_eof1486: + cs = 1486 + goto _test_eof + _test_eof1487: + cs = 1487 + goto _test_eof + _test_eof1488: + cs = 1488 + goto _test_eof + _test_eof1489: + cs = 1489 + goto _test_eof + _test_eof1490: + cs = 1490 + goto _test_eof + _test_eof1491: + cs = 1491 + goto _test_eof + _test_eof1492: + cs = 1492 + goto _test_eof + _test_eof1493: + cs = 1493 + goto _test_eof + _test_eof1494: + cs = 1494 + goto _test_eof + _test_eof1495: + cs = 1495 + goto _test_eof + _test_eof1496: + cs = 1496 + goto _test_eof + _test_eof1497: + cs = 1497 + goto _test_eof + _test_eof1498: + cs = 1498 + goto _test_eof + _test_eof1499: + cs = 1499 + goto _test_eof + _test_eof1500: + cs = 1500 + goto _test_eof + _test_eof1501: + cs = 1501 + goto _test_eof + _test_eof1502: + cs = 1502 + goto _test_eof + _test_eof1503: + cs = 1503 + goto _test_eof + _test_eof1504: + cs = 1504 + goto _test_eof + _test_eof1505: + cs = 1505 + goto _test_eof + _test_eof1506: + cs = 1506 + goto _test_eof + _test_eof1507: + cs = 1507 + goto _test_eof + _test_eof1508: + cs = 1508 + goto _test_eof + _test_eof1509: + cs = 1509 + goto _test_eof + _test_eof1510: + cs = 1510 + goto _test_eof + _test_eof1511: + cs = 1511 + goto _test_eof + _test_eof1512: + cs = 1512 + goto _test_eof + _test_eof1513: + cs = 1513 + goto _test_eof + _test_eof1514: + cs = 1514 + goto _test_eof + _test_eof1515: + cs = 1515 + goto _test_eof + _test_eof1516: + cs = 1516 + goto _test_eof + _test_eof1517: + cs = 1517 + goto _test_eof + _test_eof1518: + cs = 1518 + goto _test_eof + _test_eof1519: + cs = 1519 + goto _test_eof + _test_eof1520: + cs = 1520 + goto _test_eof + _test_eof1521: + cs = 1521 + goto _test_eof + _test_eof1522: + cs = 1522 + goto _test_eof + _test_eof1523: + cs = 1523 + goto _test_eof + _test_eof1524: + cs = 1524 + goto _test_eof + _test_eof1525: + cs = 1525 + goto _test_eof + _test_eof1526: + cs = 1526 + goto _test_eof + _test_eof1527: + cs = 1527 + goto _test_eof + _test_eof1528: + cs = 1528 + goto _test_eof + _test_eof1529: + cs = 1529 + goto _test_eof + _test_eof1530: + cs = 1530 + goto _test_eof + _test_eof1531: + cs = 1531 + goto _test_eof + _test_eof1532: + cs = 1532 + goto _test_eof + _test_eof1533: + cs = 1533 + goto _test_eof + _test_eof1534: + cs = 1534 + goto _test_eof + _test_eof1535: + cs = 1535 + goto _test_eof + _test_eof1536: + cs = 1536 + goto _test_eof + _test_eof1537: + cs = 1537 + goto _test_eof + _test_eof1538: + cs = 1538 + goto _test_eof + _test_eof1539: + cs = 1539 + goto _test_eof + _test_eof1540: + cs = 1540 + goto _test_eof + _test_eof1541: + cs = 1541 + goto _test_eof + _test_eof1542: + cs = 1542 + goto _test_eof + _test_eof1543: + cs = 1543 + goto _test_eof + _test_eof1544: + cs = 1544 + goto _test_eof + _test_eof1545: + cs = 1545 + goto _test_eof + _test_eof1546: + cs = 1546 + goto _test_eof + _test_eof1547: + cs = 1547 + goto _test_eof + _test_eof1548: + cs = 1548 + goto _test_eof + _test_eof1549: + cs = 1549 + goto _test_eof + _test_eof1550: + cs = 1550 + goto _test_eof + _test_eof1551: + cs = 1551 + goto _test_eof + _test_eof1552: + cs = 1552 + goto _test_eof + _test_eof1553: + cs = 1553 + goto _test_eof + _test_eof1554: + cs = 1554 + goto _test_eof + _test_eof1555: + cs = 1555 + goto _test_eof + _test_eof1556: + cs = 1556 + goto _test_eof + _test_eof1557: + cs = 1557 + goto _test_eof + _test_eof1558: + cs = 1558 + goto _test_eof + _test_eof1559: + cs = 1559 + goto _test_eof + _test_eof1560: + cs = 1560 + goto _test_eof + _test_eof1561: + cs = 1561 + goto _test_eof + _test_eof1562: + cs = 1562 + goto _test_eof + _test_eof1563: + cs = 1563 + goto _test_eof + _test_eof1564: + cs = 1564 + goto _test_eof + _test_eof1565: + cs = 1565 + goto _test_eof + _test_eof1566: + cs = 1566 + goto _test_eof + _test_eof1567: + cs = 1567 + goto _test_eof + _test_eof1568: + cs = 1568 + goto _test_eof + _test_eof1569: + cs = 1569 + goto _test_eof + _test_eof1570: + cs = 1570 + goto _test_eof + _test_eof1571: + cs = 1571 + goto _test_eof + _test_eof1572: + cs = 1572 + goto _test_eof + _test_eof1573: + cs = 1573 + goto _test_eof + _test_eof1574: + cs = 1574 + goto _test_eof + _test_eof1575: + cs = 1575 + goto _test_eof + _test_eof1576: + cs = 1576 + goto _test_eof + _test_eof1577: + cs = 1577 + goto _test_eof + _test_eof1578: + cs = 1578 + goto _test_eof + _test_eof1579: + cs = 1579 + goto _test_eof + _test_eof1580: + cs = 1580 + goto _test_eof + _test_eof1581: + cs = 1581 + goto _test_eof + _test_eof1582: + cs = 1582 + goto _test_eof + _test_eof1583: + cs = 1583 + goto _test_eof + _test_eof1584: + cs = 1584 + goto _test_eof + _test_eof1585: + cs = 1585 + goto _test_eof + _test_eof1586: + cs = 1586 + goto _test_eof + _test_eof1587: + cs = 1587 + goto _test_eof + _test_eof1588: + cs = 1588 + goto _test_eof + _test_eof1589: + cs = 1589 + goto _test_eof + _test_eof1590: + cs = 1590 + goto _test_eof + _test_eof1591: + cs = 1591 + goto _test_eof + _test_eof4873: + cs = 4873 + goto _test_eof + _test_eof1592: + cs = 1592 + goto _test_eof + _test_eof1593: + cs = 1593 + goto _test_eof + _test_eof1594: + cs = 1594 + goto _test_eof + _test_eof1595: + cs = 1595 + goto _test_eof + _test_eof1596: + cs = 1596 + goto _test_eof + _test_eof1597: + cs = 1597 + goto _test_eof + _test_eof1598: + cs = 1598 + goto _test_eof + _test_eof1599: + cs = 1599 + goto _test_eof + _test_eof1600: + cs = 1600 + goto _test_eof + _test_eof1601: + cs = 1601 + goto _test_eof + _test_eof1602: + cs = 1602 + goto _test_eof + _test_eof1603: + cs = 1603 + goto _test_eof + _test_eof1604: + cs = 1604 + goto _test_eof + _test_eof1605: + cs = 1605 + goto _test_eof + _test_eof1606: + cs = 1606 + goto _test_eof + _test_eof1607: + cs = 1607 + goto _test_eof + _test_eof1608: + cs = 1608 + goto _test_eof + _test_eof1609: + cs = 1609 + goto _test_eof + _test_eof1610: + cs = 1610 + goto _test_eof + _test_eof1611: + cs = 1611 + goto _test_eof + _test_eof1612: + cs = 1612 + goto _test_eof + _test_eof1613: + cs = 1613 + goto _test_eof + _test_eof1614: + cs = 1614 + goto _test_eof + _test_eof1615: + cs = 1615 + goto _test_eof + _test_eof1616: + cs = 1616 + goto _test_eof + _test_eof1617: + cs = 1617 + goto _test_eof + _test_eof1618: + cs = 1618 + goto _test_eof + _test_eof1619: + cs = 1619 + goto _test_eof + _test_eof1620: + cs = 1620 + goto _test_eof + _test_eof1621: + cs = 1621 + goto _test_eof + _test_eof1622: + cs = 1622 + goto _test_eof + _test_eof1623: + cs = 1623 + goto _test_eof + _test_eof1624: + cs = 1624 + goto _test_eof + _test_eof1625: + cs = 1625 + goto _test_eof + _test_eof1626: + cs = 1626 + goto _test_eof + _test_eof1627: + cs = 1627 + goto _test_eof + _test_eof1628: + cs = 1628 + goto _test_eof + _test_eof1629: + cs = 1629 + goto _test_eof + _test_eof1630: + cs = 1630 + goto _test_eof + _test_eof1631: + cs = 1631 + goto _test_eof + _test_eof1632: + cs = 1632 + goto _test_eof + _test_eof1633: + cs = 1633 + goto _test_eof + _test_eof1634: + cs = 1634 + goto _test_eof + _test_eof1635: + cs = 1635 + goto _test_eof + _test_eof1636: + cs = 1636 + goto _test_eof + _test_eof1637: + cs = 1637 + goto _test_eof + _test_eof1638: + cs = 1638 + goto _test_eof + _test_eof1639: + cs = 1639 + goto _test_eof + _test_eof1640: + cs = 1640 + goto _test_eof + _test_eof1641: + cs = 1641 + goto _test_eof + _test_eof1642: + cs = 1642 + goto _test_eof + _test_eof1643: + cs = 1643 + goto _test_eof + _test_eof1644: + cs = 1644 + goto _test_eof + _test_eof1645: + cs = 1645 + goto _test_eof + _test_eof1646: + cs = 1646 + goto _test_eof + _test_eof1647: + cs = 1647 + goto _test_eof + _test_eof1648: + cs = 1648 + goto _test_eof + _test_eof1649: + cs = 1649 + goto _test_eof + _test_eof1650: + cs = 1650 + goto _test_eof + _test_eof1651: + cs = 1651 + goto _test_eof + _test_eof1652: + cs = 1652 + goto _test_eof + _test_eof1653: + cs = 1653 + goto _test_eof + _test_eof1654: + cs = 1654 + goto _test_eof + _test_eof1655: + cs = 1655 + goto _test_eof + _test_eof1656: + cs = 1656 + goto _test_eof + _test_eof1657: + cs = 1657 + goto _test_eof + _test_eof1658: + cs = 1658 + goto _test_eof + _test_eof1659: + cs = 1659 + goto _test_eof + _test_eof1660: + cs = 1660 + goto _test_eof + _test_eof1661: + cs = 1661 + goto _test_eof + _test_eof1662: + cs = 1662 + goto _test_eof + _test_eof1663: + cs = 1663 + goto _test_eof + _test_eof1664: + cs = 1664 + goto _test_eof + _test_eof1665: + cs = 1665 + goto _test_eof + _test_eof1666: + cs = 1666 + goto _test_eof + _test_eof1667: + cs = 1667 + goto _test_eof + _test_eof1668: + cs = 1668 + goto _test_eof + _test_eof1669: + cs = 1669 + goto _test_eof + _test_eof1670: + cs = 1670 + goto _test_eof + _test_eof1671: + cs = 1671 + goto _test_eof + _test_eof1672: + cs = 1672 + goto _test_eof + _test_eof1673: + cs = 1673 + goto _test_eof + _test_eof1674: + cs = 1674 + goto _test_eof + _test_eof1675: + cs = 1675 + goto _test_eof + _test_eof1676: + cs = 1676 + goto _test_eof + _test_eof1677: + cs = 1677 + goto _test_eof + _test_eof1678: + cs = 1678 + goto _test_eof + _test_eof1679: + cs = 1679 + goto _test_eof + _test_eof1680: + cs = 1680 + goto _test_eof + _test_eof1681: + cs = 1681 + goto _test_eof + _test_eof1682: + cs = 1682 + goto _test_eof + _test_eof1683: + cs = 1683 + goto _test_eof + _test_eof1684: + cs = 1684 + goto _test_eof + _test_eof1685: + cs = 1685 + goto _test_eof + _test_eof1686: + cs = 1686 + goto _test_eof + _test_eof1687: + cs = 1687 + goto _test_eof + _test_eof1688: + cs = 1688 + goto _test_eof + _test_eof1689: + cs = 1689 + goto _test_eof + _test_eof1690: + cs = 1690 + goto _test_eof + _test_eof1691: + cs = 1691 + goto _test_eof + _test_eof1692: + cs = 1692 + goto _test_eof + _test_eof1693: + cs = 1693 + goto _test_eof + _test_eof1694: + cs = 1694 + goto _test_eof + _test_eof1695: + cs = 1695 + goto _test_eof + _test_eof1696: + cs = 1696 + goto _test_eof + _test_eof1697: + cs = 1697 + goto _test_eof + _test_eof1698: + cs = 1698 + goto _test_eof + _test_eof1699: + cs = 1699 + goto _test_eof + _test_eof1700: + cs = 1700 + goto _test_eof + _test_eof1701: + cs = 1701 + goto _test_eof + _test_eof1702: + cs = 1702 + goto _test_eof + _test_eof1703: + cs = 1703 + goto _test_eof + _test_eof1704: + cs = 1704 + goto _test_eof + _test_eof1705: + cs = 1705 + goto _test_eof + _test_eof1706: + cs = 1706 + goto _test_eof + _test_eof1707: + cs = 1707 + goto _test_eof + _test_eof1708: + cs = 1708 + goto _test_eof + _test_eof1709: + cs = 1709 + goto _test_eof + _test_eof1710: + cs = 1710 + goto _test_eof + _test_eof1711: + cs = 1711 + goto _test_eof + _test_eof1712: + cs = 1712 + goto _test_eof + _test_eof1713: + cs = 1713 + goto _test_eof + _test_eof1714: + cs = 1714 + goto _test_eof + _test_eof1715: + cs = 1715 + goto _test_eof + _test_eof1716: + cs = 1716 + goto _test_eof + _test_eof1717: + cs = 1717 + goto _test_eof + _test_eof1718: + cs = 1718 + goto _test_eof + _test_eof1719: + cs = 1719 + goto _test_eof + _test_eof1720: + cs = 1720 + goto _test_eof + _test_eof1721: + cs = 1721 + goto _test_eof + _test_eof1722: + cs = 1722 + goto _test_eof + _test_eof1723: + cs = 1723 + goto _test_eof + _test_eof1724: + cs = 1724 + goto _test_eof + _test_eof1725: + cs = 1725 + goto _test_eof + _test_eof1726: + cs = 1726 + goto _test_eof + _test_eof1727: + cs = 1727 + goto _test_eof + _test_eof1728: + cs = 1728 + goto _test_eof + _test_eof1729: + cs = 1729 + goto _test_eof + _test_eof1730: + cs = 1730 + goto _test_eof + _test_eof1731: + cs = 1731 + goto _test_eof + _test_eof1732: + cs = 1732 + goto _test_eof + _test_eof1733: + cs = 1733 + goto _test_eof + _test_eof1734: + cs = 1734 + goto _test_eof + _test_eof1735: + cs = 1735 + goto _test_eof + _test_eof1736: + cs = 1736 + goto _test_eof + _test_eof1737: + cs = 1737 + goto _test_eof + _test_eof1738: + cs = 1738 + goto _test_eof + _test_eof1739: + cs = 1739 + goto _test_eof + _test_eof1740: + cs = 1740 + goto _test_eof + _test_eof1741: + cs = 1741 + goto _test_eof + _test_eof1742: + cs = 1742 + goto _test_eof + _test_eof1743: + cs = 1743 + goto _test_eof + _test_eof1744: + cs = 1744 + goto _test_eof + _test_eof1745: + cs = 1745 + goto _test_eof + _test_eof1746: + cs = 1746 + goto _test_eof + _test_eof1747: + cs = 1747 + goto _test_eof + _test_eof1748: + cs = 1748 + goto _test_eof + _test_eof1749: + cs = 1749 + goto _test_eof + _test_eof1750: + cs = 1750 + goto _test_eof + _test_eof1751: + cs = 1751 + goto _test_eof + _test_eof1752: + cs = 1752 + goto _test_eof + _test_eof1753: + cs = 1753 + goto _test_eof + _test_eof1754: + cs = 1754 + goto _test_eof + _test_eof1755: + cs = 1755 + goto _test_eof + _test_eof1756: + cs = 1756 + goto _test_eof + _test_eof1757: + cs = 1757 + goto _test_eof + _test_eof1758: + cs = 1758 + goto _test_eof + _test_eof1759: + cs = 1759 + goto _test_eof + _test_eof1760: + cs = 1760 + goto _test_eof + _test_eof1761: + cs = 1761 + goto _test_eof + _test_eof1762: + cs = 1762 + goto _test_eof + _test_eof1763: + cs = 1763 + goto _test_eof + _test_eof1764: + cs = 1764 + goto _test_eof + _test_eof1765: + cs = 1765 + goto _test_eof + _test_eof1766: + cs = 1766 + goto _test_eof + _test_eof1767: + cs = 1767 + goto _test_eof + _test_eof1768: + cs = 1768 + goto _test_eof + _test_eof1769: + cs = 1769 + goto _test_eof + _test_eof1770: + cs = 1770 + goto _test_eof + _test_eof1771: + cs = 1771 + goto _test_eof + _test_eof1772: + cs = 1772 + goto _test_eof + _test_eof1773: + cs = 1773 + goto _test_eof + _test_eof1774: + cs = 1774 + goto _test_eof + _test_eof1775: + cs = 1775 + goto _test_eof + _test_eof1776: + cs = 1776 + goto _test_eof + _test_eof1777: + cs = 1777 + goto _test_eof + _test_eof1778: + cs = 1778 + goto _test_eof + _test_eof1779: + cs = 1779 + goto _test_eof + _test_eof1780: + cs = 1780 + goto _test_eof + _test_eof1781: + cs = 1781 + goto _test_eof + _test_eof1782: + cs = 1782 + goto _test_eof + _test_eof1783: + cs = 1783 + goto _test_eof + _test_eof1784: + cs = 1784 + goto _test_eof + _test_eof1785: + cs = 1785 + goto _test_eof + _test_eof1786: + cs = 1786 + goto _test_eof + _test_eof1787: + cs = 1787 + goto _test_eof + _test_eof1788: + cs = 1788 + goto _test_eof + _test_eof1789: + cs = 1789 + goto _test_eof + _test_eof1790: + cs = 1790 + goto _test_eof + _test_eof1791: + cs = 1791 + goto _test_eof + _test_eof1792: + cs = 1792 + goto _test_eof + _test_eof1793: + cs = 1793 + goto _test_eof + _test_eof1794: + cs = 1794 + goto _test_eof + _test_eof1795: + cs = 1795 + goto _test_eof + _test_eof1796: + cs = 1796 + goto _test_eof + _test_eof1797: + cs = 1797 + goto _test_eof + _test_eof1798: + cs = 1798 + goto _test_eof + _test_eof1799: + cs = 1799 + goto _test_eof + _test_eof1800: + cs = 1800 + goto _test_eof + _test_eof1801: + cs = 1801 + goto _test_eof + _test_eof1802: + cs = 1802 + goto _test_eof + _test_eof1803: + cs = 1803 + goto _test_eof + _test_eof1804: + cs = 1804 + goto _test_eof + _test_eof1805: + cs = 1805 + goto _test_eof + _test_eof1806: + cs = 1806 + goto _test_eof + _test_eof1807: + cs = 1807 + goto _test_eof + _test_eof1808: + cs = 1808 + goto _test_eof + _test_eof1809: + cs = 1809 + goto _test_eof + _test_eof1810: + cs = 1810 + goto _test_eof + _test_eof1811: + cs = 1811 + goto _test_eof + _test_eof1812: + cs = 1812 + goto _test_eof + _test_eof1813: + cs = 1813 + goto _test_eof + _test_eof1814: + cs = 1814 + goto _test_eof + _test_eof1815: + cs = 1815 + goto _test_eof + _test_eof1816: + cs = 1816 + goto _test_eof + _test_eof1817: + cs = 1817 + goto _test_eof + _test_eof1818: + cs = 1818 + goto _test_eof + _test_eof1819: + cs = 1819 + goto _test_eof + _test_eof1820: + cs = 1820 + goto _test_eof + _test_eof1821: + cs = 1821 + goto _test_eof + _test_eof1822: + cs = 1822 + goto _test_eof + _test_eof1823: + cs = 1823 + goto _test_eof + _test_eof1824: + cs = 1824 + goto _test_eof + _test_eof1825: + cs = 1825 + goto _test_eof + _test_eof1826: + cs = 1826 + goto _test_eof + _test_eof1827: + cs = 1827 + goto _test_eof + _test_eof1828: + cs = 1828 + goto _test_eof + _test_eof1829: + cs = 1829 + goto _test_eof + _test_eof1830: + cs = 1830 + goto _test_eof + _test_eof1831: + cs = 1831 + goto _test_eof + _test_eof1832: + cs = 1832 + goto _test_eof + _test_eof1833: + cs = 1833 + goto _test_eof + _test_eof1834: + cs = 1834 + goto _test_eof + _test_eof1835: + cs = 1835 + goto _test_eof + _test_eof1836: + cs = 1836 + goto _test_eof + _test_eof1837: + cs = 1837 + goto _test_eof + _test_eof1838: + cs = 1838 + goto _test_eof + _test_eof1839: + cs = 1839 + goto _test_eof + _test_eof1840: + cs = 1840 + goto _test_eof + _test_eof1841: + cs = 1841 + goto _test_eof + _test_eof1842: + cs = 1842 + goto _test_eof + _test_eof1843: + cs = 1843 + goto _test_eof + _test_eof1844: + cs = 1844 + goto _test_eof + _test_eof1845: + cs = 1845 + goto _test_eof + _test_eof1846: + cs = 1846 + goto _test_eof + _test_eof1847: + cs = 1847 + goto _test_eof + _test_eof1848: + cs = 1848 + goto _test_eof + _test_eof1849: + cs = 1849 + goto _test_eof + _test_eof1850: + cs = 1850 + goto _test_eof + _test_eof1851: + cs = 1851 + goto _test_eof + _test_eof1852: + cs = 1852 + goto _test_eof + _test_eof1853: + cs = 1853 + goto _test_eof + _test_eof1854: + cs = 1854 + goto _test_eof + _test_eof1855: + cs = 1855 + goto _test_eof + _test_eof1856: + cs = 1856 + goto _test_eof + _test_eof1857: + cs = 1857 + goto _test_eof + _test_eof1858: + cs = 1858 + goto _test_eof + _test_eof1859: + cs = 1859 + goto _test_eof + _test_eof1860: + cs = 1860 + goto _test_eof + _test_eof1861: + cs = 1861 + goto _test_eof + _test_eof1862: + cs = 1862 + goto _test_eof + _test_eof1863: + cs = 1863 + goto _test_eof + _test_eof1864: + cs = 1864 + goto _test_eof + _test_eof1865: + cs = 1865 + goto _test_eof + _test_eof1866: + cs = 1866 + goto _test_eof + _test_eof1867: + cs = 1867 + goto _test_eof + _test_eof1868: + cs = 1868 + goto _test_eof + _test_eof1869: + cs = 1869 + goto _test_eof + _test_eof1870: + cs = 1870 + goto _test_eof + _test_eof1871: + cs = 1871 + goto _test_eof + _test_eof1872: + cs = 1872 + goto _test_eof + _test_eof1873: + cs = 1873 + goto _test_eof + _test_eof1874: + cs = 1874 + goto _test_eof + _test_eof1875: + cs = 1875 + goto _test_eof + _test_eof1876: + cs = 1876 + goto _test_eof + _test_eof1877: + cs = 1877 + goto _test_eof + _test_eof1878: + cs = 1878 + goto _test_eof + _test_eof1879: + cs = 1879 + goto _test_eof + _test_eof1880: + cs = 1880 + goto _test_eof + _test_eof1881: + cs = 1881 + goto _test_eof + _test_eof1882: + cs = 1882 + goto _test_eof + _test_eof1883: + cs = 1883 + goto _test_eof + _test_eof1884: + cs = 1884 + goto _test_eof + _test_eof1885: + cs = 1885 + goto _test_eof + _test_eof1886: + cs = 1886 + goto _test_eof + _test_eof1887: + cs = 1887 + goto _test_eof + _test_eof1888: + cs = 1888 + goto _test_eof + _test_eof1889: + cs = 1889 + goto _test_eof + _test_eof1890: + cs = 1890 + goto _test_eof + _test_eof1891: + cs = 1891 + goto _test_eof + _test_eof1892: + cs = 1892 + goto _test_eof + _test_eof1893: + cs = 1893 + goto _test_eof + _test_eof1894: + cs = 1894 + goto _test_eof + _test_eof1895: + cs = 1895 + goto _test_eof + _test_eof1896: + cs = 1896 + goto _test_eof + _test_eof1897: + cs = 1897 + goto _test_eof + _test_eof1898: + cs = 1898 + goto _test_eof + _test_eof1899: + cs = 1899 + goto _test_eof + _test_eof1900: + cs = 1900 + goto _test_eof + _test_eof1901: + cs = 1901 + goto _test_eof + _test_eof1902: + cs = 1902 + goto _test_eof + _test_eof1903: + cs = 1903 + goto _test_eof + _test_eof1904: + cs = 1904 + goto _test_eof + _test_eof1905: + cs = 1905 + goto _test_eof + _test_eof1906: + cs = 1906 + goto _test_eof + _test_eof1907: + cs = 1907 + goto _test_eof + _test_eof1908: + cs = 1908 + goto _test_eof + _test_eof1909: + cs = 1909 + goto _test_eof + _test_eof1910: + cs = 1910 + goto _test_eof + _test_eof1911: + cs = 1911 + goto _test_eof + _test_eof1912: + cs = 1912 + goto _test_eof + _test_eof1913: + cs = 1913 + goto _test_eof + _test_eof1914: + cs = 1914 + goto _test_eof + _test_eof1915: + cs = 1915 + goto _test_eof + _test_eof1916: + cs = 1916 + goto _test_eof + _test_eof1917: + cs = 1917 + goto _test_eof + _test_eof1918: + cs = 1918 + goto _test_eof + _test_eof1919: + cs = 1919 + goto _test_eof + _test_eof1920: + cs = 1920 + goto _test_eof + _test_eof1921: + cs = 1921 + goto _test_eof + _test_eof1922: + cs = 1922 + goto _test_eof + _test_eof1923: + cs = 1923 + goto _test_eof + _test_eof1924: + cs = 1924 + goto _test_eof + _test_eof1925: + cs = 1925 + goto _test_eof + _test_eof1926: + cs = 1926 + goto _test_eof + _test_eof1927: + cs = 1927 + goto _test_eof + _test_eof1928: + cs = 1928 + goto _test_eof + _test_eof1929: + cs = 1929 + goto _test_eof + _test_eof1930: + cs = 1930 + goto _test_eof + _test_eof1931: + cs = 1931 + goto _test_eof + _test_eof1932: + cs = 1932 + goto _test_eof + _test_eof1933: + cs = 1933 + goto _test_eof + _test_eof1934: + cs = 1934 + goto _test_eof + _test_eof1935: + cs = 1935 + goto _test_eof + _test_eof1936: + cs = 1936 + goto _test_eof + _test_eof1937: + cs = 1937 + goto _test_eof + _test_eof1938: + cs = 1938 + goto _test_eof + _test_eof1939: + cs = 1939 + goto _test_eof + _test_eof1940: + cs = 1940 + goto _test_eof + _test_eof1941: + cs = 1941 + goto _test_eof + _test_eof1942: + cs = 1942 + goto _test_eof + _test_eof1943: + cs = 1943 + goto _test_eof + _test_eof1944: + cs = 1944 + goto _test_eof + _test_eof1945: + cs = 1945 + goto _test_eof + _test_eof1946: + cs = 1946 + goto _test_eof + _test_eof1947: + cs = 1947 + goto _test_eof + _test_eof1948: + cs = 1948 + goto _test_eof + _test_eof1949: + cs = 1949 + goto _test_eof + _test_eof1950: + cs = 1950 + goto _test_eof + _test_eof1951: + cs = 1951 + goto _test_eof + _test_eof1952: + cs = 1952 + goto _test_eof + _test_eof1953: + cs = 1953 + goto _test_eof + _test_eof1954: + cs = 1954 + goto _test_eof + _test_eof1955: + cs = 1955 + goto _test_eof + _test_eof1956: + cs = 1956 + goto _test_eof + _test_eof1957: + cs = 1957 + goto _test_eof + _test_eof1958: + cs = 1958 + goto _test_eof + _test_eof1959: + cs = 1959 + goto _test_eof + _test_eof1960: + cs = 1960 + goto _test_eof + _test_eof1961: + cs = 1961 + goto _test_eof + _test_eof1962: + cs = 1962 + goto _test_eof + _test_eof1963: + cs = 1963 + goto _test_eof + _test_eof1964: + cs = 1964 + goto _test_eof + _test_eof1965: + cs = 1965 + goto _test_eof + _test_eof1966: + cs = 1966 + goto _test_eof + _test_eof1967: + cs = 1967 + goto _test_eof + _test_eof1968: + cs = 1968 + goto _test_eof + _test_eof1969: + cs = 1969 + goto _test_eof + _test_eof1970: + cs = 1970 + goto _test_eof + _test_eof1971: + cs = 1971 + goto _test_eof + _test_eof1972: + cs = 1972 + goto _test_eof + _test_eof1973: + cs = 1973 + goto _test_eof + _test_eof1974: + cs = 1974 + goto _test_eof + _test_eof1975: + cs = 1975 + goto _test_eof + _test_eof1976: + cs = 1976 + goto _test_eof + _test_eof1977: + cs = 1977 + goto _test_eof + _test_eof1978: + cs = 1978 + goto _test_eof + _test_eof1979: + cs = 1979 + goto _test_eof + _test_eof1980: + cs = 1980 + goto _test_eof + _test_eof1981: + cs = 1981 + goto _test_eof + _test_eof1982: + cs = 1982 + goto _test_eof + _test_eof1983: + cs = 1983 + goto _test_eof + _test_eof1984: + cs = 1984 + goto _test_eof + _test_eof1985: + cs = 1985 + goto _test_eof + _test_eof1986: + cs = 1986 + goto _test_eof + _test_eof1987: + cs = 1987 + goto _test_eof + _test_eof1988: + cs = 1988 + goto _test_eof + _test_eof1989: + cs = 1989 + goto _test_eof + _test_eof1990: + cs = 1990 + goto _test_eof + _test_eof1991: + cs = 1991 + goto _test_eof + _test_eof1992: + cs = 1992 + goto _test_eof + _test_eof1993: + cs = 1993 + goto _test_eof + _test_eof1994: + cs = 1994 + goto _test_eof + _test_eof1995: + cs = 1995 + goto _test_eof + _test_eof1996: + cs = 1996 + goto _test_eof + _test_eof1997: + cs = 1997 + goto _test_eof + _test_eof1998: + cs = 1998 + goto _test_eof + _test_eof1999: + cs = 1999 + goto _test_eof + _test_eof2000: + cs = 2000 + goto _test_eof + _test_eof2001: + cs = 2001 + goto _test_eof + _test_eof2002: + cs = 2002 + goto _test_eof + _test_eof2003: + cs = 2003 + goto _test_eof + _test_eof2004: + cs = 2004 + goto _test_eof + _test_eof2005: + cs = 2005 + goto _test_eof + _test_eof2006: + cs = 2006 + goto _test_eof + _test_eof2007: + cs = 2007 + goto _test_eof + _test_eof2008: + cs = 2008 + goto _test_eof + _test_eof2009: + cs = 2009 + goto _test_eof + _test_eof2010: + cs = 2010 + goto _test_eof + _test_eof2011: + cs = 2011 + goto _test_eof + _test_eof2012: + cs = 2012 + goto _test_eof + _test_eof2013: + cs = 2013 + goto _test_eof + _test_eof2014: + cs = 2014 + goto _test_eof + _test_eof2015: + cs = 2015 + goto _test_eof + _test_eof2016: + cs = 2016 + goto _test_eof + _test_eof2017: + cs = 2017 + goto _test_eof + _test_eof2018: + cs = 2018 + goto _test_eof + _test_eof2019: + cs = 2019 + goto _test_eof + _test_eof2020: + cs = 2020 + goto _test_eof + _test_eof2021: + cs = 2021 + goto _test_eof + _test_eof2022: + cs = 2022 + goto _test_eof + _test_eof2023: + cs = 2023 + goto _test_eof + _test_eof2024: + cs = 2024 + goto _test_eof + _test_eof2025: + cs = 2025 + goto _test_eof + _test_eof2026: + cs = 2026 + goto _test_eof + _test_eof2027: + cs = 2027 + goto _test_eof + _test_eof2028: + cs = 2028 + goto _test_eof + _test_eof2029: + cs = 2029 + goto _test_eof + _test_eof2030: + cs = 2030 + goto _test_eof + _test_eof2031: + cs = 2031 + goto _test_eof + _test_eof2032: + cs = 2032 + goto _test_eof + _test_eof2033: + cs = 2033 + goto _test_eof + _test_eof2034: + cs = 2034 + goto _test_eof + _test_eof2035: + cs = 2035 + goto _test_eof + _test_eof2036: + cs = 2036 + goto _test_eof + _test_eof2037: + cs = 2037 + goto _test_eof + _test_eof2038: + cs = 2038 + goto _test_eof + _test_eof2039: + cs = 2039 + goto _test_eof + _test_eof2040: + cs = 2040 + goto _test_eof + _test_eof2041: + cs = 2041 + goto _test_eof + _test_eof2042: + cs = 2042 + goto _test_eof + _test_eof2043: + cs = 2043 + goto _test_eof + _test_eof2044: + cs = 2044 + goto _test_eof + _test_eof2045: + cs = 2045 + goto _test_eof + _test_eof2046: + cs = 2046 + goto _test_eof + _test_eof2047: + cs = 2047 + goto _test_eof + _test_eof2048: + cs = 2048 + goto _test_eof + _test_eof2049: + cs = 2049 + goto _test_eof + _test_eof2050: + cs = 2050 + goto _test_eof + _test_eof2051: + cs = 2051 + goto _test_eof + _test_eof2052: + cs = 2052 + goto _test_eof + _test_eof2053: + cs = 2053 + goto _test_eof + _test_eof2054: + cs = 2054 + goto _test_eof + _test_eof2055: + cs = 2055 + goto _test_eof + _test_eof2056: + cs = 2056 + goto _test_eof + _test_eof2057: + cs = 2057 + goto _test_eof + _test_eof2058: + cs = 2058 + goto _test_eof + _test_eof2059: + cs = 2059 + goto _test_eof + _test_eof2060: + cs = 2060 + goto _test_eof + _test_eof2061: + cs = 2061 + goto _test_eof + _test_eof2062: + cs = 2062 + goto _test_eof + _test_eof2063: + cs = 2063 + goto _test_eof + _test_eof2064: + cs = 2064 + goto _test_eof + _test_eof2065: + cs = 2065 + goto _test_eof + _test_eof2066: + cs = 2066 + goto _test_eof + _test_eof2067: + cs = 2067 + goto _test_eof + _test_eof2068: + cs = 2068 + goto _test_eof + _test_eof2069: + cs = 2069 + goto _test_eof + _test_eof2070: + cs = 2070 + goto _test_eof + _test_eof2071: + cs = 2071 + goto _test_eof + _test_eof2072: + cs = 2072 + goto _test_eof + _test_eof2073: + cs = 2073 + goto _test_eof + _test_eof2074: + cs = 2074 + goto _test_eof + _test_eof2075: + cs = 2075 + goto _test_eof + _test_eof2076: + cs = 2076 + goto _test_eof + _test_eof2077: + cs = 2077 + goto _test_eof + _test_eof2078: + cs = 2078 + goto _test_eof + _test_eof2079: + cs = 2079 + goto _test_eof + _test_eof2080: + cs = 2080 + goto _test_eof + _test_eof2081: + cs = 2081 + goto _test_eof + _test_eof2082: + cs = 2082 + goto _test_eof + _test_eof2083: + cs = 2083 + goto _test_eof + _test_eof2084: + cs = 2084 + goto _test_eof + _test_eof2085: + cs = 2085 + goto _test_eof + _test_eof2086: + cs = 2086 + goto _test_eof + _test_eof2087: + cs = 2087 + goto _test_eof + _test_eof2088: + cs = 2088 + goto _test_eof + _test_eof2089: + cs = 2089 + goto _test_eof + _test_eof2090: + cs = 2090 + goto _test_eof + _test_eof2091: + cs = 2091 + goto _test_eof + _test_eof2092: + cs = 2092 + goto _test_eof + _test_eof2093: + cs = 2093 + goto _test_eof + _test_eof2094: + cs = 2094 + goto _test_eof + _test_eof2095: + cs = 2095 + goto _test_eof + _test_eof2096: + cs = 2096 + goto _test_eof + _test_eof2097: + cs = 2097 + goto _test_eof + _test_eof2098: + cs = 2098 + goto _test_eof + _test_eof2099: + cs = 2099 + goto _test_eof + _test_eof2100: + cs = 2100 + goto _test_eof + _test_eof2101: + cs = 2101 + goto _test_eof + _test_eof2102: + cs = 2102 + goto _test_eof + _test_eof2103: + cs = 2103 + goto _test_eof + _test_eof2104: + cs = 2104 + goto _test_eof + _test_eof2105: + cs = 2105 + goto _test_eof + _test_eof2106: + cs = 2106 + goto _test_eof + _test_eof2107: + cs = 2107 + goto _test_eof + _test_eof2108: + cs = 2108 + goto _test_eof + _test_eof2109: + cs = 2109 + goto _test_eof + _test_eof2110: + cs = 2110 + goto _test_eof + _test_eof2111: + cs = 2111 + goto _test_eof + _test_eof2112: + cs = 2112 + goto _test_eof + _test_eof2113: + cs = 2113 + goto _test_eof + _test_eof2114: + cs = 2114 + goto _test_eof + _test_eof2115: + cs = 2115 + goto _test_eof + _test_eof2116: + cs = 2116 + goto _test_eof + _test_eof2117: + cs = 2117 + goto _test_eof + _test_eof2118: + cs = 2118 + goto _test_eof + _test_eof2119: + cs = 2119 + goto _test_eof + _test_eof2120: + cs = 2120 + goto _test_eof + _test_eof2121: + cs = 2121 + goto _test_eof + _test_eof2122: + cs = 2122 + goto _test_eof + _test_eof2123: + cs = 2123 + goto _test_eof + _test_eof2124: + cs = 2124 + goto _test_eof + _test_eof2125: + cs = 2125 + goto _test_eof + _test_eof2126: + cs = 2126 + goto _test_eof + _test_eof2127: + cs = 2127 + goto _test_eof + _test_eof2128: + cs = 2128 + goto _test_eof + _test_eof2129: + cs = 2129 + goto _test_eof + _test_eof2130: + cs = 2130 + goto _test_eof + _test_eof2131: + cs = 2131 + goto _test_eof + _test_eof2132: + cs = 2132 + goto _test_eof + _test_eof2133: + cs = 2133 + goto _test_eof + _test_eof2134: + cs = 2134 + goto _test_eof + _test_eof2135: + cs = 2135 + goto _test_eof + _test_eof2136: + cs = 2136 + goto _test_eof + _test_eof2137: + cs = 2137 + goto _test_eof + _test_eof2138: + cs = 2138 + goto _test_eof + _test_eof2139: + cs = 2139 + goto _test_eof + _test_eof2140: + cs = 2140 + goto _test_eof + _test_eof2141: + cs = 2141 + goto _test_eof + _test_eof2142: + cs = 2142 + goto _test_eof + _test_eof2143: + cs = 2143 + goto _test_eof + _test_eof2144: + cs = 2144 + goto _test_eof + _test_eof2145: + cs = 2145 + goto _test_eof + _test_eof2146: + cs = 2146 + goto _test_eof + _test_eof2147: + cs = 2147 + goto _test_eof + _test_eof2148: + cs = 2148 + goto _test_eof + _test_eof2149: + cs = 2149 + goto _test_eof + _test_eof2150: + cs = 2150 + goto _test_eof + _test_eof2151: + cs = 2151 + goto _test_eof + _test_eof2152: + cs = 2152 + goto _test_eof + _test_eof2153: + cs = 2153 + goto _test_eof + _test_eof2154: + cs = 2154 + goto _test_eof + _test_eof2155: + cs = 2155 + goto _test_eof + _test_eof2156: + cs = 2156 + goto _test_eof + _test_eof2157: + cs = 2157 + goto _test_eof + _test_eof2158: + cs = 2158 + goto _test_eof + _test_eof2159: + cs = 2159 + goto _test_eof + _test_eof2160: + cs = 2160 + goto _test_eof + _test_eof2161: + cs = 2161 + goto _test_eof + _test_eof2162: + cs = 2162 + goto _test_eof + _test_eof2163: + cs = 2163 + goto _test_eof + _test_eof2164: + cs = 2164 + goto _test_eof + _test_eof2165: + cs = 2165 + goto _test_eof + _test_eof2166: + cs = 2166 + goto _test_eof + _test_eof2167: + cs = 2167 + goto _test_eof + _test_eof2168: + cs = 2168 + goto _test_eof + _test_eof2169: + cs = 2169 + goto _test_eof + _test_eof2170: + cs = 2170 + goto _test_eof + _test_eof2171: + cs = 2171 + goto _test_eof + _test_eof2172: + cs = 2172 + goto _test_eof + _test_eof2173: + cs = 2173 + goto _test_eof + _test_eof2174: + cs = 2174 + goto _test_eof + _test_eof2175: + cs = 2175 + goto _test_eof + _test_eof2176: + cs = 2176 + goto _test_eof + _test_eof2177: + cs = 2177 + goto _test_eof + _test_eof2178: + cs = 2178 + goto _test_eof + _test_eof2179: + cs = 2179 + goto _test_eof + _test_eof2180: + cs = 2180 + goto _test_eof + _test_eof2181: + cs = 2181 + goto _test_eof + _test_eof2182: + cs = 2182 + goto _test_eof + _test_eof2183: + cs = 2183 + goto _test_eof + _test_eof2184: + cs = 2184 + goto _test_eof + _test_eof2185: + cs = 2185 + goto _test_eof + _test_eof2186: + cs = 2186 + goto _test_eof + _test_eof2187: + cs = 2187 + goto _test_eof + _test_eof2188: + cs = 2188 + goto _test_eof + _test_eof2189: + cs = 2189 + goto _test_eof + _test_eof2190: + cs = 2190 + goto _test_eof + _test_eof2191: + cs = 2191 + goto _test_eof + _test_eof2192: + cs = 2192 + goto _test_eof + _test_eof4874: + cs = 4874 + goto _test_eof + _test_eof2193: + cs = 2193 + goto _test_eof + _test_eof2194: + cs = 2194 + goto _test_eof + _test_eof2195: + cs = 2195 + goto _test_eof + _test_eof2196: + cs = 2196 + goto _test_eof + _test_eof2197: + cs = 2197 + goto _test_eof + _test_eof2198: + cs = 2198 + goto _test_eof + _test_eof2199: + cs = 2199 + goto _test_eof + _test_eof2200: + cs = 2200 + goto _test_eof + _test_eof2201: + cs = 2201 + goto _test_eof + _test_eof2202: + cs = 2202 + goto _test_eof + _test_eof2203: + cs = 2203 + goto _test_eof + _test_eof2204: + cs = 2204 + goto _test_eof + _test_eof2205: + cs = 2205 + goto _test_eof + _test_eof2206: + cs = 2206 + goto _test_eof + _test_eof2207: + cs = 2207 + goto _test_eof + _test_eof2208: + cs = 2208 + goto _test_eof + _test_eof2209: + cs = 2209 + goto _test_eof + _test_eof2210: + cs = 2210 + goto _test_eof + _test_eof2211: + cs = 2211 + goto _test_eof + _test_eof2212: + cs = 2212 + goto _test_eof + _test_eof2213: + cs = 2213 + goto _test_eof + _test_eof2214: + cs = 2214 + goto _test_eof + _test_eof2215: + cs = 2215 + goto _test_eof + _test_eof2216: + cs = 2216 + goto _test_eof + _test_eof2217: + cs = 2217 + goto _test_eof + _test_eof2218: + cs = 2218 + goto _test_eof + _test_eof2219: + cs = 2219 + goto _test_eof + _test_eof2220: + cs = 2220 + goto _test_eof + _test_eof2221: + cs = 2221 + goto _test_eof + _test_eof2222: + cs = 2222 + goto _test_eof + _test_eof2223: + cs = 2223 + goto _test_eof + _test_eof2224: + cs = 2224 + goto _test_eof + _test_eof2225: + cs = 2225 + goto _test_eof + _test_eof2226: + cs = 2226 + goto _test_eof + _test_eof2227: + cs = 2227 + goto _test_eof + _test_eof2228: + cs = 2228 + goto _test_eof + _test_eof2229: + cs = 2229 + goto _test_eof + _test_eof2230: + cs = 2230 + goto _test_eof + _test_eof2231: + cs = 2231 + goto _test_eof + _test_eof2232: + cs = 2232 + goto _test_eof + _test_eof2233: + cs = 2233 + goto _test_eof + _test_eof2234: + cs = 2234 + goto _test_eof + _test_eof2235: + cs = 2235 + goto _test_eof + _test_eof2236: + cs = 2236 + goto _test_eof + _test_eof2237: + cs = 2237 + goto _test_eof + _test_eof2238: + cs = 2238 + goto _test_eof + _test_eof2239: + cs = 2239 + goto _test_eof + _test_eof2240: + cs = 2240 + goto _test_eof + _test_eof2241: + cs = 2241 + goto _test_eof + _test_eof2242: + cs = 2242 + goto _test_eof + _test_eof2243: + cs = 2243 + goto _test_eof + _test_eof2244: + cs = 2244 + goto _test_eof + _test_eof2245: + cs = 2245 + goto _test_eof + _test_eof2246: + cs = 2246 + goto _test_eof + _test_eof2247: + cs = 2247 + goto _test_eof + _test_eof2248: + cs = 2248 + goto _test_eof + _test_eof2249: + cs = 2249 + goto _test_eof + _test_eof2250: + cs = 2250 + goto _test_eof + _test_eof2251: + cs = 2251 + goto _test_eof + _test_eof2252: + cs = 2252 + goto _test_eof + _test_eof2253: + cs = 2253 + goto _test_eof + _test_eof2254: + cs = 2254 + goto _test_eof + _test_eof2255: + cs = 2255 + goto _test_eof + _test_eof2256: + cs = 2256 + goto _test_eof + _test_eof2257: + cs = 2257 + goto _test_eof + _test_eof2258: + cs = 2258 + goto _test_eof + _test_eof2259: + cs = 2259 + goto _test_eof + _test_eof2260: + cs = 2260 + goto _test_eof + _test_eof2261: + cs = 2261 + goto _test_eof + _test_eof2262: + cs = 2262 + goto _test_eof + _test_eof2263: + cs = 2263 + goto _test_eof + _test_eof2264: + cs = 2264 + goto _test_eof + _test_eof2265: + cs = 2265 + goto _test_eof + _test_eof2266: + cs = 2266 + goto _test_eof + _test_eof2267: + cs = 2267 + goto _test_eof + _test_eof2268: + cs = 2268 + goto _test_eof + _test_eof2269: + cs = 2269 + goto _test_eof + _test_eof2270: + cs = 2270 + goto _test_eof + _test_eof2271: + cs = 2271 + goto _test_eof + _test_eof2272: + cs = 2272 + goto _test_eof + _test_eof2273: + cs = 2273 + goto _test_eof + _test_eof2274: + cs = 2274 + goto _test_eof + _test_eof2275: + cs = 2275 + goto _test_eof + _test_eof2276: + cs = 2276 + goto _test_eof + _test_eof2277: + cs = 2277 + goto _test_eof + _test_eof2278: + cs = 2278 + goto _test_eof + _test_eof2279: + cs = 2279 + goto _test_eof + _test_eof2280: + cs = 2280 + goto _test_eof + _test_eof2281: + cs = 2281 + goto _test_eof + _test_eof2282: + cs = 2282 + goto _test_eof + _test_eof2283: + cs = 2283 + goto _test_eof + _test_eof2284: + cs = 2284 + goto _test_eof + _test_eof2285: + cs = 2285 + goto _test_eof + _test_eof2286: + cs = 2286 + goto _test_eof + _test_eof2287: + cs = 2287 + goto _test_eof + _test_eof2288: + cs = 2288 + goto _test_eof + _test_eof2289: + cs = 2289 + goto _test_eof + _test_eof2290: + cs = 2290 + goto _test_eof + _test_eof2291: + cs = 2291 + goto _test_eof + _test_eof2292: + cs = 2292 + goto _test_eof + _test_eof2293: + cs = 2293 + goto _test_eof + _test_eof2294: + cs = 2294 + goto _test_eof + _test_eof2295: + cs = 2295 + goto _test_eof + _test_eof2296: + cs = 2296 + goto _test_eof + _test_eof2297: + cs = 2297 + goto _test_eof + _test_eof2298: + cs = 2298 + goto _test_eof + _test_eof2299: + cs = 2299 + goto _test_eof + _test_eof2300: + cs = 2300 + goto _test_eof + _test_eof2301: + cs = 2301 + goto _test_eof + _test_eof2302: + cs = 2302 + goto _test_eof + _test_eof2303: + cs = 2303 + goto _test_eof + _test_eof2304: + cs = 2304 + goto _test_eof + _test_eof2305: + cs = 2305 + goto _test_eof + _test_eof2306: + cs = 2306 + goto _test_eof + _test_eof2307: + cs = 2307 + goto _test_eof + _test_eof2308: + cs = 2308 + goto _test_eof + _test_eof2309: + cs = 2309 + goto _test_eof + _test_eof2310: + cs = 2310 + goto _test_eof + _test_eof2311: + cs = 2311 + goto _test_eof + _test_eof2312: + cs = 2312 + goto _test_eof + _test_eof2313: + cs = 2313 + goto _test_eof + _test_eof2314: + cs = 2314 + goto _test_eof + _test_eof2315: + cs = 2315 + goto _test_eof + _test_eof2316: + cs = 2316 + goto _test_eof + _test_eof2317: + cs = 2317 + goto _test_eof + _test_eof2318: + cs = 2318 + goto _test_eof + _test_eof2319: + cs = 2319 + goto _test_eof + _test_eof2320: + cs = 2320 + goto _test_eof + _test_eof2321: + cs = 2321 + goto _test_eof + _test_eof2322: + cs = 2322 + goto _test_eof + _test_eof2323: + cs = 2323 + goto _test_eof + _test_eof2324: + cs = 2324 + goto _test_eof + _test_eof2325: + cs = 2325 + goto _test_eof + _test_eof2326: + cs = 2326 + goto _test_eof + _test_eof2327: + cs = 2327 + goto _test_eof + _test_eof2328: + cs = 2328 + goto _test_eof + _test_eof2329: + cs = 2329 + goto _test_eof + _test_eof2330: + cs = 2330 + goto _test_eof + _test_eof2331: + cs = 2331 + goto _test_eof + _test_eof2332: + cs = 2332 + goto _test_eof + _test_eof2333: + cs = 2333 + goto _test_eof + _test_eof2334: + cs = 2334 + goto _test_eof + _test_eof2335: + cs = 2335 + goto _test_eof + _test_eof2336: + cs = 2336 + goto _test_eof + _test_eof2337: + cs = 2337 + goto _test_eof + _test_eof2338: + cs = 2338 + goto _test_eof + _test_eof2339: + cs = 2339 + goto _test_eof + _test_eof4875: + cs = 4875 + goto _test_eof + _test_eof4876: + cs = 4876 + goto _test_eof + _test_eof2340: + cs = 2340 + goto _test_eof + _test_eof2341: + cs = 2341 + goto _test_eof + _test_eof2342: + cs = 2342 + goto _test_eof + _test_eof2343: + cs = 2343 + goto _test_eof + _test_eof2344: + cs = 2344 + goto _test_eof + _test_eof2345: + cs = 2345 + goto _test_eof + _test_eof2346: + cs = 2346 + goto _test_eof + _test_eof2347: + cs = 2347 + goto _test_eof + _test_eof2348: + cs = 2348 + goto _test_eof + _test_eof2349: + cs = 2349 + goto _test_eof + _test_eof2350: + cs = 2350 + goto _test_eof + _test_eof2351: + cs = 2351 + goto _test_eof + _test_eof2352: + cs = 2352 + goto _test_eof + _test_eof2353: + cs = 2353 + goto _test_eof + _test_eof2354: + cs = 2354 + goto _test_eof + _test_eof2355: + cs = 2355 + goto _test_eof + _test_eof2356: + cs = 2356 + goto _test_eof + _test_eof2357: + cs = 2357 + goto _test_eof + _test_eof2358: + cs = 2358 + goto _test_eof + _test_eof2359: + cs = 2359 + goto _test_eof + _test_eof2360: + cs = 2360 + goto _test_eof + _test_eof2361: + cs = 2361 + goto _test_eof + _test_eof2362: + cs = 2362 + goto _test_eof + _test_eof2363: + cs = 2363 + goto _test_eof + _test_eof2364: + cs = 2364 + goto _test_eof + _test_eof2365: + cs = 2365 + goto _test_eof + _test_eof2366: + cs = 2366 + goto _test_eof + _test_eof2367: + cs = 2367 + goto _test_eof + _test_eof2368: + cs = 2368 + goto _test_eof + _test_eof2369: + cs = 2369 + goto _test_eof + _test_eof2370: + cs = 2370 + goto _test_eof + _test_eof2371: + cs = 2371 + goto _test_eof + _test_eof2372: + cs = 2372 + goto _test_eof + _test_eof2373: + cs = 2373 + goto _test_eof + _test_eof2374: + cs = 2374 + goto _test_eof + _test_eof2375: + cs = 2375 + goto _test_eof + _test_eof2376: + cs = 2376 + goto _test_eof + _test_eof2377: + cs = 2377 + goto _test_eof + _test_eof2378: + cs = 2378 + goto _test_eof + _test_eof2379: + cs = 2379 + goto _test_eof + _test_eof2380: + cs = 2380 + goto _test_eof + _test_eof2381: + cs = 2381 + goto _test_eof + _test_eof2382: + cs = 2382 + goto _test_eof + _test_eof2383: + cs = 2383 + goto _test_eof + _test_eof2384: + cs = 2384 + goto _test_eof + _test_eof2385: + cs = 2385 + goto _test_eof + _test_eof2386: + cs = 2386 + goto _test_eof + _test_eof2387: + cs = 2387 + goto _test_eof + _test_eof2388: + cs = 2388 + goto _test_eof + _test_eof2389: + cs = 2389 + goto _test_eof + _test_eof2390: + cs = 2390 + goto _test_eof + _test_eof2391: + cs = 2391 + goto _test_eof + _test_eof2392: + cs = 2392 + goto _test_eof + _test_eof2393: + cs = 2393 + goto _test_eof + _test_eof2394: + cs = 2394 + goto _test_eof + _test_eof2395: + cs = 2395 + goto _test_eof + _test_eof2396: + cs = 2396 + goto _test_eof + _test_eof2397: + cs = 2397 + goto _test_eof + _test_eof2398: + cs = 2398 + goto _test_eof + _test_eof2399: + cs = 2399 + goto _test_eof + _test_eof2400: + cs = 2400 + goto _test_eof + _test_eof2401: + cs = 2401 + goto _test_eof + _test_eof2402: + cs = 2402 + goto _test_eof + _test_eof2403: + cs = 2403 + goto _test_eof + _test_eof2404: + cs = 2404 + goto _test_eof + _test_eof2405: + cs = 2405 + goto _test_eof + _test_eof2406: + cs = 2406 + goto _test_eof + _test_eof2407: + cs = 2407 + goto _test_eof + _test_eof2408: + cs = 2408 + goto _test_eof + _test_eof2409: + cs = 2409 + goto _test_eof + _test_eof2410: + cs = 2410 + goto _test_eof + _test_eof2411: + cs = 2411 + goto _test_eof + _test_eof2412: + cs = 2412 + goto _test_eof + _test_eof2413: + cs = 2413 + goto _test_eof + _test_eof2414: + cs = 2414 + goto _test_eof + _test_eof2415: + cs = 2415 + goto _test_eof + _test_eof2416: + cs = 2416 + goto _test_eof + _test_eof2417: + cs = 2417 + goto _test_eof + _test_eof2418: + cs = 2418 + goto _test_eof + _test_eof2419: + cs = 2419 + goto _test_eof + _test_eof2420: + cs = 2420 + goto _test_eof + _test_eof2421: + cs = 2421 + goto _test_eof + _test_eof2422: + cs = 2422 + goto _test_eof + _test_eof2423: + cs = 2423 + goto _test_eof + _test_eof2424: + cs = 2424 + goto _test_eof + _test_eof2425: + cs = 2425 + goto _test_eof + _test_eof2426: + cs = 2426 + goto _test_eof + _test_eof2427: + cs = 2427 + goto _test_eof + _test_eof2428: + cs = 2428 + goto _test_eof + _test_eof2429: + cs = 2429 + goto _test_eof + _test_eof2430: + cs = 2430 + goto _test_eof + _test_eof2431: + cs = 2431 + goto _test_eof + _test_eof2432: + cs = 2432 + goto _test_eof + _test_eof2433: + cs = 2433 + goto _test_eof + _test_eof2434: + cs = 2434 + goto _test_eof + _test_eof2435: + cs = 2435 + goto _test_eof + _test_eof2436: + cs = 2436 + goto _test_eof + _test_eof2437: + cs = 2437 + goto _test_eof + _test_eof2438: + cs = 2438 + goto _test_eof + _test_eof2439: + cs = 2439 + goto _test_eof + _test_eof2440: + cs = 2440 + goto _test_eof + _test_eof2441: + cs = 2441 + goto _test_eof + _test_eof2442: + cs = 2442 + goto _test_eof + _test_eof2443: + cs = 2443 + goto _test_eof + _test_eof2444: + cs = 2444 + goto _test_eof + _test_eof2445: + cs = 2445 + goto _test_eof + _test_eof2446: + cs = 2446 + goto _test_eof + _test_eof2447: + cs = 2447 + goto _test_eof + _test_eof2448: + cs = 2448 + goto _test_eof + _test_eof2449: + cs = 2449 + goto _test_eof + _test_eof2450: + cs = 2450 + goto _test_eof + _test_eof2451: + cs = 2451 + goto _test_eof + _test_eof2452: + cs = 2452 + goto _test_eof + _test_eof2453: + cs = 2453 + goto _test_eof + _test_eof2454: + cs = 2454 + goto _test_eof + _test_eof2455: + cs = 2455 + goto _test_eof + _test_eof2456: + cs = 2456 + goto _test_eof + _test_eof2457: + cs = 2457 + goto _test_eof + _test_eof2458: + cs = 2458 + goto _test_eof + _test_eof2459: + cs = 2459 + goto _test_eof + _test_eof2460: + cs = 2460 + goto _test_eof + _test_eof2461: + cs = 2461 + goto _test_eof + _test_eof2462: + cs = 2462 + goto _test_eof + _test_eof2463: + cs = 2463 + goto _test_eof + _test_eof2464: + cs = 2464 + goto _test_eof + _test_eof2465: + cs = 2465 + goto _test_eof + _test_eof2466: + cs = 2466 + goto _test_eof + _test_eof2467: + cs = 2467 + goto _test_eof + _test_eof2468: + cs = 2468 + goto _test_eof + _test_eof2469: + cs = 2469 + goto _test_eof + _test_eof2470: + cs = 2470 + goto _test_eof + _test_eof2471: + cs = 2471 + goto _test_eof + _test_eof2472: + cs = 2472 + goto _test_eof + _test_eof2473: + cs = 2473 + goto _test_eof + _test_eof2474: + cs = 2474 + goto _test_eof + _test_eof2475: + cs = 2475 + goto _test_eof + _test_eof2476: + cs = 2476 + goto _test_eof + _test_eof2477: + cs = 2477 + goto _test_eof + _test_eof2478: + cs = 2478 + goto _test_eof + _test_eof2479: + cs = 2479 + goto _test_eof + _test_eof2480: + cs = 2480 + goto _test_eof + _test_eof2481: + cs = 2481 + goto _test_eof + _test_eof2482: + cs = 2482 + goto _test_eof + _test_eof2483: + cs = 2483 + goto _test_eof + _test_eof2484: + cs = 2484 + goto _test_eof + _test_eof2485: + cs = 2485 + goto _test_eof + _test_eof2486: + cs = 2486 + goto _test_eof + _test_eof2487: + cs = 2487 + goto _test_eof + _test_eof2488: + cs = 2488 + goto _test_eof + _test_eof2489: + cs = 2489 + goto _test_eof + _test_eof2490: + cs = 2490 + goto _test_eof + _test_eof2491: + cs = 2491 + goto _test_eof + _test_eof2492: + cs = 2492 + goto _test_eof + _test_eof2493: + cs = 2493 + goto _test_eof + _test_eof2494: + cs = 2494 + goto _test_eof + _test_eof2495: + cs = 2495 + goto _test_eof + _test_eof2496: + cs = 2496 + goto _test_eof + _test_eof2497: + cs = 2497 + goto _test_eof + _test_eof2498: + cs = 2498 + goto _test_eof + _test_eof2499: + cs = 2499 + goto _test_eof + _test_eof2500: + cs = 2500 + goto _test_eof + _test_eof2501: + cs = 2501 + goto _test_eof + _test_eof2502: + cs = 2502 + goto _test_eof + _test_eof2503: + cs = 2503 + goto _test_eof + _test_eof2504: + cs = 2504 + goto _test_eof + _test_eof2505: + cs = 2505 + goto _test_eof + _test_eof2506: + cs = 2506 + goto _test_eof + _test_eof2507: + cs = 2507 + goto _test_eof + _test_eof2508: + cs = 2508 + goto _test_eof + _test_eof2509: + cs = 2509 + goto _test_eof + _test_eof2510: + cs = 2510 + goto _test_eof + _test_eof2511: + cs = 2511 + goto _test_eof + _test_eof2512: + cs = 2512 + goto _test_eof + _test_eof2513: + cs = 2513 + goto _test_eof + _test_eof2514: + cs = 2514 + goto _test_eof + _test_eof2515: + cs = 2515 + goto _test_eof + _test_eof2516: + cs = 2516 + goto _test_eof + _test_eof2517: + cs = 2517 + goto _test_eof + _test_eof2518: + cs = 2518 + goto _test_eof + _test_eof2519: + cs = 2519 + goto _test_eof + _test_eof2520: + cs = 2520 + goto _test_eof + _test_eof2521: + cs = 2521 + goto _test_eof + _test_eof2522: + cs = 2522 + goto _test_eof + _test_eof2523: + cs = 2523 + goto _test_eof + _test_eof2524: + cs = 2524 + goto _test_eof + _test_eof2525: + cs = 2525 + goto _test_eof + _test_eof2526: + cs = 2526 + goto _test_eof + _test_eof2527: + cs = 2527 + goto _test_eof + _test_eof2528: + cs = 2528 + goto _test_eof + _test_eof2529: + cs = 2529 + goto _test_eof + _test_eof2530: + cs = 2530 + goto _test_eof + _test_eof2531: + cs = 2531 + goto _test_eof + _test_eof2532: + cs = 2532 + goto _test_eof + _test_eof2533: + cs = 2533 + goto _test_eof + _test_eof2534: + cs = 2534 + goto _test_eof + _test_eof2535: + cs = 2535 + goto _test_eof + _test_eof2536: + cs = 2536 + goto _test_eof + _test_eof2537: + cs = 2537 + goto _test_eof + _test_eof2538: + cs = 2538 + goto _test_eof + _test_eof2539: + cs = 2539 + goto _test_eof + _test_eof2540: + cs = 2540 + goto _test_eof + _test_eof2541: + cs = 2541 + goto _test_eof + _test_eof2542: + cs = 2542 + goto _test_eof + _test_eof2543: + cs = 2543 + goto _test_eof + _test_eof2544: + cs = 2544 + goto _test_eof + _test_eof2545: + cs = 2545 + goto _test_eof + _test_eof2546: + cs = 2546 + goto _test_eof + _test_eof2547: + cs = 2547 + goto _test_eof + _test_eof2548: + cs = 2548 + goto _test_eof + _test_eof2549: + cs = 2549 + goto _test_eof + _test_eof2550: + cs = 2550 + goto _test_eof + _test_eof2551: + cs = 2551 + goto _test_eof + _test_eof2552: + cs = 2552 + goto _test_eof + _test_eof2553: + cs = 2553 + goto _test_eof + _test_eof2554: + cs = 2554 + goto _test_eof + _test_eof2555: + cs = 2555 + goto _test_eof + _test_eof2556: + cs = 2556 + goto _test_eof + _test_eof2557: + cs = 2557 + goto _test_eof + _test_eof2558: + cs = 2558 + goto _test_eof + _test_eof2559: + cs = 2559 + goto _test_eof + _test_eof2560: + cs = 2560 + goto _test_eof + _test_eof2561: + cs = 2561 + goto _test_eof + _test_eof2562: + cs = 2562 + goto _test_eof + _test_eof2563: + cs = 2563 + goto _test_eof + _test_eof2564: + cs = 2564 + goto _test_eof + _test_eof2565: + cs = 2565 + goto _test_eof + _test_eof2566: + cs = 2566 + goto _test_eof + _test_eof2567: + cs = 2567 + goto _test_eof + _test_eof2568: + cs = 2568 + goto _test_eof + _test_eof2569: + cs = 2569 + goto _test_eof + _test_eof2570: + cs = 2570 + goto _test_eof + _test_eof2571: + cs = 2571 + goto _test_eof + _test_eof2572: + cs = 2572 + goto _test_eof + _test_eof2573: + cs = 2573 + goto _test_eof + _test_eof2574: + cs = 2574 + goto _test_eof + _test_eof2575: + cs = 2575 + goto _test_eof + _test_eof2576: + cs = 2576 + goto _test_eof + _test_eof2577: + cs = 2577 + goto _test_eof + _test_eof2578: + cs = 2578 + goto _test_eof + _test_eof2579: + cs = 2579 + goto _test_eof + _test_eof2580: + cs = 2580 + goto _test_eof + _test_eof2581: + cs = 2581 + goto _test_eof + _test_eof2582: + cs = 2582 + goto _test_eof + _test_eof2583: + cs = 2583 + goto _test_eof + _test_eof2584: + cs = 2584 + goto _test_eof + _test_eof2585: + cs = 2585 + goto _test_eof + _test_eof2586: + cs = 2586 + goto _test_eof + _test_eof2587: + cs = 2587 + goto _test_eof + _test_eof2588: + cs = 2588 + goto _test_eof + _test_eof2589: + cs = 2589 + goto _test_eof + _test_eof2590: + cs = 2590 + goto _test_eof + _test_eof2591: + cs = 2591 + goto _test_eof + _test_eof2592: + cs = 2592 + goto _test_eof + _test_eof2593: + cs = 2593 + goto _test_eof + _test_eof2594: + cs = 2594 + goto _test_eof + _test_eof2595: + cs = 2595 + goto _test_eof + _test_eof2596: + cs = 2596 + goto _test_eof + _test_eof2597: + cs = 2597 + goto _test_eof + _test_eof2598: + cs = 2598 + goto _test_eof + _test_eof2599: + cs = 2599 + goto _test_eof + _test_eof2600: + cs = 2600 + goto _test_eof + _test_eof2601: + cs = 2601 + goto _test_eof + _test_eof2602: + cs = 2602 + goto _test_eof + _test_eof2603: + cs = 2603 + goto _test_eof + _test_eof2604: + cs = 2604 + goto _test_eof + _test_eof2605: + cs = 2605 + goto _test_eof + _test_eof2606: + cs = 2606 + goto _test_eof + _test_eof2607: + cs = 2607 + goto _test_eof + _test_eof2608: + cs = 2608 + goto _test_eof + _test_eof2609: + cs = 2609 + goto _test_eof + _test_eof2610: + cs = 2610 + goto _test_eof + _test_eof2611: + cs = 2611 + goto _test_eof + _test_eof2612: + cs = 2612 + goto _test_eof + _test_eof2613: + cs = 2613 + goto _test_eof + _test_eof2614: + cs = 2614 + goto _test_eof + _test_eof2615: + cs = 2615 + goto _test_eof + _test_eof2616: + cs = 2616 + goto _test_eof + _test_eof2617: + cs = 2617 + goto _test_eof + _test_eof2618: + cs = 2618 + goto _test_eof + _test_eof2619: + cs = 2619 + goto _test_eof + _test_eof2620: + cs = 2620 + goto _test_eof + _test_eof2621: + cs = 2621 + goto _test_eof + _test_eof2622: + cs = 2622 + goto _test_eof + _test_eof2623: + cs = 2623 + goto _test_eof + _test_eof2624: + cs = 2624 + goto _test_eof + _test_eof2625: + cs = 2625 + goto _test_eof + _test_eof2626: + cs = 2626 + goto _test_eof + _test_eof2627: + cs = 2627 + goto _test_eof + _test_eof2628: + cs = 2628 + goto _test_eof + _test_eof2629: + cs = 2629 + goto _test_eof + _test_eof2630: + cs = 2630 + goto _test_eof + _test_eof2631: + cs = 2631 + goto _test_eof + _test_eof2632: + cs = 2632 + goto _test_eof + _test_eof2633: + cs = 2633 + goto _test_eof + _test_eof2634: + cs = 2634 + goto _test_eof + _test_eof2635: + cs = 2635 + goto _test_eof + _test_eof4877: + cs = 4877 + goto _test_eof + _test_eof4878: + cs = 4878 + goto _test_eof + _test_eof2636: + cs = 2636 + goto _test_eof + _test_eof2637: + cs = 2637 + goto _test_eof + _test_eof2638: + cs = 2638 + goto _test_eof + _test_eof2639: + cs = 2639 + goto _test_eof + _test_eof2640: + cs = 2640 + goto _test_eof + _test_eof2641: + cs = 2641 + goto _test_eof + _test_eof2642: + cs = 2642 + goto _test_eof + _test_eof2643: + cs = 2643 + goto _test_eof + _test_eof2644: + cs = 2644 + goto _test_eof + _test_eof2645: + cs = 2645 + goto _test_eof + _test_eof2646: + cs = 2646 + goto _test_eof + _test_eof2647: + cs = 2647 + goto _test_eof + _test_eof2648: + cs = 2648 + goto _test_eof + _test_eof2649: + cs = 2649 + goto _test_eof + _test_eof2650: + cs = 2650 + goto _test_eof + _test_eof2651: + cs = 2651 + goto _test_eof + _test_eof2652: + cs = 2652 + goto _test_eof + _test_eof2653: + cs = 2653 + goto _test_eof + _test_eof2654: + cs = 2654 + goto _test_eof + _test_eof2655: + cs = 2655 + goto _test_eof + _test_eof2656: + cs = 2656 + goto _test_eof + _test_eof2657: + cs = 2657 + goto _test_eof + _test_eof2658: + cs = 2658 + goto _test_eof + _test_eof2659: + cs = 2659 + goto _test_eof + _test_eof2660: + cs = 2660 + goto _test_eof + _test_eof2661: + cs = 2661 + goto _test_eof + _test_eof2662: + cs = 2662 + goto _test_eof + _test_eof2663: + cs = 2663 + goto _test_eof + _test_eof2664: + cs = 2664 + goto _test_eof + _test_eof2665: + cs = 2665 + goto _test_eof + _test_eof2666: + cs = 2666 + goto _test_eof + _test_eof2667: + cs = 2667 + goto _test_eof + _test_eof2668: + cs = 2668 + goto _test_eof + _test_eof2669: + cs = 2669 + goto _test_eof + _test_eof2670: + cs = 2670 + goto _test_eof + _test_eof2671: + cs = 2671 + goto _test_eof + _test_eof2672: + cs = 2672 + goto _test_eof + _test_eof2673: + cs = 2673 + goto _test_eof + _test_eof2674: + cs = 2674 + goto _test_eof + _test_eof2675: + cs = 2675 + goto _test_eof + _test_eof2676: + cs = 2676 + goto _test_eof + _test_eof2677: + cs = 2677 + goto _test_eof + _test_eof2678: + cs = 2678 + goto _test_eof + _test_eof2679: + cs = 2679 + goto _test_eof + _test_eof2680: + cs = 2680 + goto _test_eof + _test_eof2681: + cs = 2681 + goto _test_eof + _test_eof2682: + cs = 2682 + goto _test_eof + _test_eof2683: + cs = 2683 + goto _test_eof + _test_eof2684: + cs = 2684 + goto _test_eof + _test_eof2685: + cs = 2685 + goto _test_eof + _test_eof2686: + cs = 2686 + goto _test_eof + _test_eof2687: + cs = 2687 + goto _test_eof + _test_eof2688: + cs = 2688 + goto _test_eof + _test_eof2689: + cs = 2689 + goto _test_eof + _test_eof2690: + cs = 2690 + goto _test_eof + _test_eof2691: + cs = 2691 + goto _test_eof + _test_eof2692: + cs = 2692 + goto _test_eof + _test_eof2693: + cs = 2693 + goto _test_eof + _test_eof2694: + cs = 2694 + goto _test_eof + _test_eof2695: + cs = 2695 + goto _test_eof + _test_eof2696: + cs = 2696 + goto _test_eof + _test_eof2697: + cs = 2697 + goto _test_eof + _test_eof2698: + cs = 2698 + goto _test_eof + _test_eof2699: + cs = 2699 + goto _test_eof + _test_eof2700: + cs = 2700 + goto _test_eof + _test_eof2701: + cs = 2701 + goto _test_eof + _test_eof2702: + cs = 2702 + goto _test_eof + _test_eof2703: + cs = 2703 + goto _test_eof + _test_eof2704: + cs = 2704 + goto _test_eof + _test_eof2705: + cs = 2705 + goto _test_eof + _test_eof2706: + cs = 2706 + goto _test_eof + _test_eof2707: + cs = 2707 + goto _test_eof + _test_eof2708: + cs = 2708 + goto _test_eof + _test_eof2709: + cs = 2709 + goto _test_eof + _test_eof2710: + cs = 2710 + goto _test_eof + _test_eof2711: + cs = 2711 + goto _test_eof + _test_eof2712: + cs = 2712 + goto _test_eof + _test_eof2713: + cs = 2713 + goto _test_eof + _test_eof2714: + cs = 2714 + goto _test_eof + _test_eof2715: + cs = 2715 + goto _test_eof + _test_eof2716: + cs = 2716 + goto _test_eof + _test_eof2717: + cs = 2717 + goto _test_eof + _test_eof2718: + cs = 2718 + goto _test_eof + _test_eof2719: + cs = 2719 + goto _test_eof + _test_eof2720: + cs = 2720 + goto _test_eof + _test_eof2721: + cs = 2721 + goto _test_eof + _test_eof2722: + cs = 2722 + goto _test_eof + _test_eof2723: + cs = 2723 + goto _test_eof + _test_eof2724: + cs = 2724 + goto _test_eof + _test_eof2725: + cs = 2725 + goto _test_eof + _test_eof2726: + cs = 2726 + goto _test_eof + _test_eof2727: + cs = 2727 + goto _test_eof + _test_eof2728: + cs = 2728 + goto _test_eof + _test_eof2729: + cs = 2729 + goto _test_eof + _test_eof2730: + cs = 2730 + goto _test_eof + _test_eof2731: + cs = 2731 + goto _test_eof + _test_eof2732: + cs = 2732 + goto _test_eof + _test_eof2733: + cs = 2733 + goto _test_eof + _test_eof2734: + cs = 2734 + goto _test_eof + _test_eof2735: + cs = 2735 + goto _test_eof + _test_eof2736: + cs = 2736 + goto _test_eof + _test_eof2737: + cs = 2737 + goto _test_eof + _test_eof2738: + cs = 2738 + goto _test_eof + _test_eof2739: + cs = 2739 + goto _test_eof + _test_eof2740: + cs = 2740 + goto _test_eof + _test_eof2741: + cs = 2741 + goto _test_eof + _test_eof2742: + cs = 2742 + goto _test_eof + _test_eof2743: + cs = 2743 + goto _test_eof + _test_eof2744: + cs = 2744 + goto _test_eof + _test_eof2745: + cs = 2745 + goto _test_eof + _test_eof2746: + cs = 2746 + goto _test_eof + _test_eof2747: + cs = 2747 + goto _test_eof + _test_eof2748: + cs = 2748 + goto _test_eof + _test_eof2749: + cs = 2749 + goto _test_eof + _test_eof2750: + cs = 2750 + goto _test_eof + _test_eof2751: + cs = 2751 + goto _test_eof + _test_eof2752: + cs = 2752 + goto _test_eof + _test_eof2753: + cs = 2753 + goto _test_eof + _test_eof2754: + cs = 2754 + goto _test_eof + _test_eof2755: + cs = 2755 + goto _test_eof + _test_eof2756: + cs = 2756 + goto _test_eof + _test_eof2757: + cs = 2757 + goto _test_eof + _test_eof2758: + cs = 2758 + goto _test_eof + _test_eof2759: + cs = 2759 + goto _test_eof + _test_eof2760: + cs = 2760 + goto _test_eof + _test_eof2761: + cs = 2761 + goto _test_eof + _test_eof2762: + cs = 2762 + goto _test_eof + _test_eof2763: + cs = 2763 + goto _test_eof + _test_eof2764: + cs = 2764 + goto _test_eof + _test_eof2765: + cs = 2765 + goto _test_eof + _test_eof2766: + cs = 2766 + goto _test_eof + _test_eof2767: + cs = 2767 + goto _test_eof + _test_eof2768: + cs = 2768 + goto _test_eof + _test_eof2769: + cs = 2769 + goto _test_eof + _test_eof2770: + cs = 2770 + goto _test_eof + _test_eof2771: + cs = 2771 + goto _test_eof + _test_eof2772: + cs = 2772 + goto _test_eof + _test_eof2773: + cs = 2773 + goto _test_eof + _test_eof2774: + cs = 2774 + goto _test_eof + _test_eof2775: + cs = 2775 + goto _test_eof + _test_eof2776: + cs = 2776 + goto _test_eof + _test_eof4879: + cs = 4879 + goto _test_eof + _test_eof4880: + cs = 4880 + goto _test_eof + _test_eof4881: + cs = 4881 + goto _test_eof + _test_eof4882: + cs = 4882 + goto _test_eof + _test_eof4883: + cs = 4883 + goto _test_eof + _test_eof4884: + cs = 4884 + goto _test_eof + _test_eof4885: + cs = 4885 + goto _test_eof + _test_eof2777: + cs = 2777 + goto _test_eof + _test_eof2778: + cs = 2778 + goto _test_eof + _test_eof2779: + cs = 2779 + goto _test_eof + _test_eof2780: + cs = 2780 + goto _test_eof + _test_eof2781: + cs = 2781 + goto _test_eof + _test_eof2782: + cs = 2782 + goto _test_eof + _test_eof2783: + cs = 2783 + goto _test_eof + _test_eof2784: + cs = 2784 + goto _test_eof + _test_eof2785: + cs = 2785 + goto _test_eof + _test_eof2786: + cs = 2786 + goto _test_eof + _test_eof2787: + cs = 2787 + goto _test_eof + _test_eof2788: + cs = 2788 + goto _test_eof + _test_eof2789: + cs = 2789 + goto _test_eof + _test_eof2790: + cs = 2790 + goto _test_eof + _test_eof2791: + cs = 2791 + goto _test_eof + _test_eof2792: + cs = 2792 + goto _test_eof + _test_eof2793: + cs = 2793 + goto _test_eof + _test_eof2794: + cs = 2794 + goto _test_eof + _test_eof2795: + cs = 2795 + goto _test_eof + _test_eof2796: + cs = 2796 + goto _test_eof + _test_eof2797: + cs = 2797 + goto _test_eof + _test_eof2798: + cs = 2798 + goto _test_eof + _test_eof2799: + cs = 2799 + goto _test_eof + _test_eof2800: + cs = 2800 + goto _test_eof + _test_eof2801: + cs = 2801 + goto _test_eof + _test_eof2802: + cs = 2802 + goto _test_eof + _test_eof2803: + cs = 2803 + goto _test_eof + _test_eof2804: + cs = 2804 + goto _test_eof + _test_eof2805: + cs = 2805 + goto _test_eof + _test_eof2806: + cs = 2806 + goto _test_eof + _test_eof2807: + cs = 2807 + goto _test_eof + _test_eof2808: + cs = 2808 + goto _test_eof + _test_eof2809: + cs = 2809 + goto _test_eof + _test_eof2810: + cs = 2810 + goto _test_eof + _test_eof2811: + cs = 2811 + goto _test_eof + _test_eof2812: + cs = 2812 + goto _test_eof + _test_eof2813: + cs = 2813 + goto _test_eof + _test_eof2814: + cs = 2814 + goto _test_eof + _test_eof2815: + cs = 2815 + goto _test_eof + _test_eof2816: + cs = 2816 + goto _test_eof + _test_eof2817: + cs = 2817 + goto _test_eof + _test_eof2818: + cs = 2818 + goto _test_eof + _test_eof2819: + cs = 2819 + goto _test_eof + _test_eof2820: + cs = 2820 + goto _test_eof + _test_eof2821: + cs = 2821 + goto _test_eof + _test_eof2822: + cs = 2822 + goto _test_eof + _test_eof2823: + cs = 2823 + goto _test_eof + _test_eof2824: + cs = 2824 + goto _test_eof + _test_eof2825: + cs = 2825 + goto _test_eof + _test_eof2826: + cs = 2826 + goto _test_eof + _test_eof2827: + cs = 2827 + goto _test_eof + _test_eof2828: + cs = 2828 + goto _test_eof + _test_eof2829: + cs = 2829 + goto _test_eof + _test_eof2830: + cs = 2830 + goto _test_eof + _test_eof2831: + cs = 2831 + goto _test_eof + _test_eof2832: + cs = 2832 + goto _test_eof + _test_eof2833: + cs = 2833 + goto _test_eof + _test_eof2834: + cs = 2834 + goto _test_eof + _test_eof2835: + cs = 2835 + goto _test_eof + _test_eof2836: + cs = 2836 + goto _test_eof + _test_eof2837: + cs = 2837 + goto _test_eof + _test_eof2838: + cs = 2838 + goto _test_eof + _test_eof2839: + cs = 2839 + goto _test_eof + _test_eof2840: + cs = 2840 + goto _test_eof + _test_eof2841: + cs = 2841 + goto _test_eof + _test_eof2842: + cs = 2842 + goto _test_eof + _test_eof2843: + cs = 2843 + goto _test_eof + _test_eof2844: + cs = 2844 + goto _test_eof + _test_eof2845: + cs = 2845 + goto _test_eof + _test_eof2846: + cs = 2846 + goto _test_eof + _test_eof2847: + cs = 2847 + goto _test_eof + _test_eof2848: + cs = 2848 + goto _test_eof + _test_eof2849: + cs = 2849 + goto _test_eof + _test_eof2850: + cs = 2850 + goto _test_eof + _test_eof2851: + cs = 2851 + goto _test_eof + _test_eof2852: + cs = 2852 + goto _test_eof + _test_eof2853: + cs = 2853 + goto _test_eof + _test_eof2854: + cs = 2854 + goto _test_eof + _test_eof2855: + cs = 2855 + goto _test_eof + _test_eof2856: + cs = 2856 + goto _test_eof + _test_eof2857: + cs = 2857 + goto _test_eof + _test_eof2858: + cs = 2858 + goto _test_eof + _test_eof2859: + cs = 2859 + goto _test_eof + _test_eof2860: + cs = 2860 + goto _test_eof + _test_eof2861: + cs = 2861 + goto _test_eof + _test_eof2862: + cs = 2862 + goto _test_eof + _test_eof2863: + cs = 2863 + goto _test_eof + _test_eof2864: + cs = 2864 + goto _test_eof + _test_eof2865: + cs = 2865 + goto _test_eof + _test_eof2866: + cs = 2866 + goto _test_eof + _test_eof2867: + cs = 2867 + goto _test_eof + _test_eof2868: + cs = 2868 + goto _test_eof + _test_eof2869: + cs = 2869 + goto _test_eof + _test_eof2870: + cs = 2870 + goto _test_eof + _test_eof2871: + cs = 2871 + goto _test_eof + _test_eof2872: + cs = 2872 + goto _test_eof + _test_eof2873: + cs = 2873 + goto _test_eof + _test_eof2874: + cs = 2874 + goto _test_eof + _test_eof2875: + cs = 2875 + goto _test_eof + _test_eof2876: + cs = 2876 + goto _test_eof + _test_eof2877: + cs = 2877 + goto _test_eof + _test_eof2878: + cs = 2878 + goto _test_eof + _test_eof2879: + cs = 2879 + goto _test_eof + _test_eof2880: + cs = 2880 + goto _test_eof + _test_eof2881: + cs = 2881 + goto _test_eof + _test_eof2882: + cs = 2882 + goto _test_eof + _test_eof2883: + cs = 2883 + goto _test_eof + _test_eof2884: + cs = 2884 + goto _test_eof + _test_eof2885: + cs = 2885 + goto _test_eof + _test_eof2886: + cs = 2886 + goto _test_eof + _test_eof2887: + cs = 2887 + goto _test_eof + _test_eof2888: + cs = 2888 + goto _test_eof + _test_eof2889: + cs = 2889 + goto _test_eof + _test_eof2890: + cs = 2890 + goto _test_eof + _test_eof2891: + cs = 2891 + goto _test_eof + _test_eof2892: + cs = 2892 + goto _test_eof + _test_eof2893: + cs = 2893 + goto _test_eof + _test_eof2894: + cs = 2894 + goto _test_eof + _test_eof2895: + cs = 2895 + goto _test_eof + _test_eof2896: + cs = 2896 + goto _test_eof + _test_eof2897: + cs = 2897 + goto _test_eof + _test_eof2898: + cs = 2898 + goto _test_eof + _test_eof2899: + cs = 2899 + goto _test_eof + _test_eof2900: + cs = 2900 + goto _test_eof + _test_eof2901: + cs = 2901 + goto _test_eof + _test_eof2902: + cs = 2902 + goto _test_eof + _test_eof2903: + cs = 2903 + goto _test_eof + _test_eof2904: + cs = 2904 + goto _test_eof + _test_eof2905: + cs = 2905 + goto _test_eof + _test_eof2906: + cs = 2906 + goto _test_eof + _test_eof2907: + cs = 2907 + goto _test_eof + _test_eof2908: + cs = 2908 + goto _test_eof + _test_eof2909: + cs = 2909 + goto _test_eof + _test_eof2910: + cs = 2910 + goto _test_eof + _test_eof2911: + cs = 2911 + goto _test_eof + _test_eof2912: + cs = 2912 + goto _test_eof + _test_eof2913: + cs = 2913 + goto _test_eof + _test_eof2914: + cs = 2914 + goto _test_eof + _test_eof2915: + cs = 2915 + goto _test_eof + _test_eof2916: + cs = 2916 + goto _test_eof + _test_eof2917: + cs = 2917 + goto _test_eof + _test_eof2918: + cs = 2918 + goto _test_eof + _test_eof2919: + cs = 2919 + goto _test_eof + _test_eof2920: + cs = 2920 + goto _test_eof + _test_eof2921: + cs = 2921 + goto _test_eof + _test_eof2922: + cs = 2922 + goto _test_eof + _test_eof2923: + cs = 2923 + goto _test_eof + _test_eof4886: + cs = 4886 + goto _test_eof + _test_eof2924: + cs = 2924 + goto _test_eof + _test_eof2925: + cs = 2925 + goto _test_eof + _test_eof2926: + cs = 2926 + goto _test_eof + _test_eof2927: + cs = 2927 + goto _test_eof + _test_eof2928: + cs = 2928 + goto _test_eof + _test_eof2929: + cs = 2929 + goto _test_eof + _test_eof2930: + cs = 2930 + goto _test_eof + _test_eof2931: + cs = 2931 + goto _test_eof + _test_eof2932: + cs = 2932 + goto _test_eof + _test_eof2933: + cs = 2933 + goto _test_eof + _test_eof2934: + cs = 2934 + goto _test_eof + _test_eof2935: + cs = 2935 + goto _test_eof + _test_eof2936: + cs = 2936 + goto _test_eof + _test_eof2937: + cs = 2937 + goto _test_eof + _test_eof2938: + cs = 2938 + goto _test_eof + _test_eof2939: + cs = 2939 + goto _test_eof + _test_eof2940: + cs = 2940 + goto _test_eof + _test_eof2941: + cs = 2941 + goto _test_eof + _test_eof2942: + cs = 2942 + goto _test_eof + _test_eof2943: + cs = 2943 + goto _test_eof + _test_eof2944: + cs = 2944 + goto _test_eof + _test_eof2945: + cs = 2945 + goto _test_eof + _test_eof2946: + cs = 2946 + goto _test_eof + _test_eof2947: + cs = 2947 + goto _test_eof + _test_eof2948: + cs = 2948 + goto _test_eof + _test_eof2949: + cs = 2949 + goto _test_eof + _test_eof2950: + cs = 2950 + goto _test_eof + _test_eof2951: + cs = 2951 + goto _test_eof + _test_eof2952: + cs = 2952 + goto _test_eof + _test_eof2953: + cs = 2953 + goto _test_eof + _test_eof2954: + cs = 2954 + goto _test_eof + _test_eof2955: + cs = 2955 + goto _test_eof + _test_eof2956: + cs = 2956 + goto _test_eof + _test_eof2957: + cs = 2957 + goto _test_eof + _test_eof2958: + cs = 2958 + goto _test_eof + _test_eof2959: + cs = 2959 + goto _test_eof + _test_eof2960: + cs = 2960 + goto _test_eof + _test_eof2961: + cs = 2961 + goto _test_eof + _test_eof2962: + cs = 2962 + goto _test_eof + _test_eof2963: + cs = 2963 + goto _test_eof + _test_eof2964: + cs = 2964 + goto _test_eof + _test_eof2965: + cs = 2965 + goto _test_eof + _test_eof2966: + cs = 2966 + goto _test_eof + _test_eof2967: + cs = 2967 + goto _test_eof + _test_eof2968: + cs = 2968 + goto _test_eof + _test_eof2969: + cs = 2969 + goto _test_eof + _test_eof2970: + cs = 2970 + goto _test_eof + _test_eof2971: + cs = 2971 + goto _test_eof + _test_eof2972: + cs = 2972 + goto _test_eof + _test_eof2973: + cs = 2973 + goto _test_eof + _test_eof2974: + cs = 2974 + goto _test_eof + _test_eof2975: + cs = 2975 + goto _test_eof + _test_eof2976: + cs = 2976 + goto _test_eof + _test_eof2977: + cs = 2977 + goto _test_eof + _test_eof2978: + cs = 2978 + goto _test_eof + _test_eof2979: + cs = 2979 + goto _test_eof + _test_eof2980: + cs = 2980 + goto _test_eof + _test_eof2981: + cs = 2981 + goto _test_eof + _test_eof2982: + cs = 2982 + goto _test_eof + _test_eof2983: + cs = 2983 + goto _test_eof + _test_eof2984: + cs = 2984 + goto _test_eof + _test_eof2985: + cs = 2985 + goto _test_eof + _test_eof2986: + cs = 2986 + goto _test_eof + _test_eof2987: + cs = 2987 + goto _test_eof + _test_eof2988: + cs = 2988 + goto _test_eof + _test_eof2989: + cs = 2989 + goto _test_eof + _test_eof2990: + cs = 2990 + goto _test_eof + _test_eof2991: + cs = 2991 + goto _test_eof + _test_eof2992: + cs = 2992 + goto _test_eof + _test_eof2993: + cs = 2993 + goto _test_eof + _test_eof2994: + cs = 2994 + goto _test_eof + _test_eof2995: + cs = 2995 + goto _test_eof + _test_eof2996: + cs = 2996 + goto _test_eof + _test_eof2997: + cs = 2997 + goto _test_eof + _test_eof2998: + cs = 2998 + goto _test_eof + _test_eof2999: + cs = 2999 + goto _test_eof + _test_eof3000: + cs = 3000 + goto _test_eof + _test_eof3001: + cs = 3001 + goto _test_eof + _test_eof3002: + cs = 3002 + goto _test_eof + _test_eof3003: + cs = 3003 + goto _test_eof + _test_eof3004: + cs = 3004 + goto _test_eof + _test_eof3005: + cs = 3005 + goto _test_eof + _test_eof3006: + cs = 3006 + goto _test_eof + _test_eof3007: + cs = 3007 + goto _test_eof + _test_eof3008: + cs = 3008 + goto _test_eof + _test_eof3009: + cs = 3009 + goto _test_eof + _test_eof3010: + cs = 3010 + goto _test_eof + _test_eof3011: + cs = 3011 + goto _test_eof + _test_eof3012: + cs = 3012 + goto _test_eof + _test_eof3013: + cs = 3013 + goto _test_eof + _test_eof3014: + cs = 3014 + goto _test_eof + _test_eof3015: + cs = 3015 + goto _test_eof + _test_eof3016: + cs = 3016 + goto _test_eof + _test_eof3017: + cs = 3017 + goto _test_eof + _test_eof3018: + cs = 3018 + goto _test_eof + _test_eof3019: + cs = 3019 + goto _test_eof + _test_eof3020: + cs = 3020 + goto _test_eof + _test_eof3021: + cs = 3021 + goto _test_eof + _test_eof3022: + cs = 3022 + goto _test_eof + _test_eof3023: + cs = 3023 + goto _test_eof + _test_eof3024: + cs = 3024 + goto _test_eof + _test_eof3025: + cs = 3025 + goto _test_eof + _test_eof3026: + cs = 3026 + goto _test_eof + _test_eof3027: + cs = 3027 + goto _test_eof + _test_eof3028: + cs = 3028 + goto _test_eof + _test_eof3029: + cs = 3029 + goto _test_eof + _test_eof3030: + cs = 3030 + goto _test_eof + _test_eof3031: + cs = 3031 + goto _test_eof + _test_eof3032: + cs = 3032 + goto _test_eof + _test_eof3033: + cs = 3033 + goto _test_eof + _test_eof3034: + cs = 3034 + goto _test_eof + _test_eof3035: + cs = 3035 + goto _test_eof + _test_eof3036: + cs = 3036 + goto _test_eof + _test_eof3037: + cs = 3037 + goto _test_eof + _test_eof3038: + cs = 3038 + goto _test_eof + _test_eof3039: + cs = 3039 + goto _test_eof + _test_eof3040: + cs = 3040 + goto _test_eof + _test_eof3041: + cs = 3041 + goto _test_eof + _test_eof3042: + cs = 3042 + goto _test_eof + _test_eof3043: + cs = 3043 + goto _test_eof + _test_eof3044: + cs = 3044 + goto _test_eof + _test_eof3045: + cs = 3045 + goto _test_eof + _test_eof3046: + cs = 3046 + goto _test_eof + _test_eof3047: + cs = 3047 + goto _test_eof + _test_eof3048: + cs = 3048 + goto _test_eof + _test_eof3049: + cs = 3049 + goto _test_eof + _test_eof3050: + cs = 3050 + goto _test_eof + _test_eof3051: + cs = 3051 + goto _test_eof + _test_eof3052: + cs = 3052 + goto _test_eof + _test_eof3053: + cs = 3053 + goto _test_eof + _test_eof3054: + cs = 3054 + goto _test_eof + _test_eof3055: + cs = 3055 + goto _test_eof + _test_eof3056: + cs = 3056 + goto _test_eof + _test_eof3057: + cs = 3057 + goto _test_eof + _test_eof3058: + cs = 3058 + goto _test_eof + _test_eof3059: + cs = 3059 + goto _test_eof + _test_eof3060: + cs = 3060 + goto _test_eof + _test_eof3061: + cs = 3061 + goto _test_eof + _test_eof3062: + cs = 3062 + goto _test_eof + _test_eof3063: + cs = 3063 + goto _test_eof + _test_eof3064: + cs = 3064 + goto _test_eof + _test_eof3065: + cs = 3065 + goto _test_eof + _test_eof3066: + cs = 3066 + goto _test_eof + _test_eof3067: + cs = 3067 + goto _test_eof + _test_eof3068: + cs = 3068 + goto _test_eof + _test_eof3069: + cs = 3069 + goto _test_eof + _test_eof3070: + cs = 3070 + goto _test_eof + _test_eof4887: + cs = 4887 + goto _test_eof + _test_eof3071: + cs = 3071 + goto _test_eof + _test_eof3072: + cs = 3072 + goto _test_eof + _test_eof3073: + cs = 3073 + goto _test_eof + _test_eof3074: + cs = 3074 + goto _test_eof + _test_eof3075: + cs = 3075 + goto _test_eof + _test_eof3076: + cs = 3076 + goto _test_eof + _test_eof3077: + cs = 3077 + goto _test_eof + _test_eof3078: + cs = 3078 + goto _test_eof + _test_eof3079: + cs = 3079 + goto _test_eof + _test_eof3080: + cs = 3080 + goto _test_eof + _test_eof3081: + cs = 3081 + goto _test_eof + _test_eof3082: + cs = 3082 + goto _test_eof + _test_eof3083: + cs = 3083 + goto _test_eof + _test_eof3084: + cs = 3084 + goto _test_eof + _test_eof3085: + cs = 3085 + goto _test_eof + _test_eof3086: + cs = 3086 + goto _test_eof + _test_eof3087: + cs = 3087 + goto _test_eof + _test_eof3088: + cs = 3088 + goto _test_eof + _test_eof3089: + cs = 3089 + goto _test_eof + _test_eof3090: + cs = 3090 + goto _test_eof + _test_eof3091: + cs = 3091 + goto _test_eof + _test_eof3092: + cs = 3092 + goto _test_eof + _test_eof3093: + cs = 3093 + goto _test_eof + _test_eof3094: + cs = 3094 + goto _test_eof + _test_eof3095: + cs = 3095 + goto _test_eof + _test_eof3096: + cs = 3096 + goto _test_eof + _test_eof3097: + cs = 3097 + goto _test_eof + _test_eof3098: + cs = 3098 + goto _test_eof + _test_eof3099: + cs = 3099 + goto _test_eof + _test_eof3100: + cs = 3100 + goto _test_eof + _test_eof3101: + cs = 3101 + goto _test_eof + _test_eof3102: + cs = 3102 + goto _test_eof + _test_eof3103: + cs = 3103 + goto _test_eof + _test_eof3104: + cs = 3104 + goto _test_eof + _test_eof3105: + cs = 3105 + goto _test_eof + _test_eof3106: + cs = 3106 + goto _test_eof + _test_eof3107: + cs = 3107 + goto _test_eof + _test_eof3108: + cs = 3108 + goto _test_eof + _test_eof3109: + cs = 3109 + goto _test_eof + _test_eof3110: + cs = 3110 + goto _test_eof + _test_eof3111: + cs = 3111 + goto _test_eof + _test_eof3112: + cs = 3112 + goto _test_eof + _test_eof3113: + cs = 3113 + goto _test_eof + _test_eof3114: + cs = 3114 + goto _test_eof + _test_eof3115: + cs = 3115 + goto _test_eof + _test_eof3116: + cs = 3116 + goto _test_eof + _test_eof3117: + cs = 3117 + goto _test_eof + _test_eof3118: + cs = 3118 + goto _test_eof + _test_eof3119: + cs = 3119 + goto _test_eof + _test_eof3120: + cs = 3120 + goto _test_eof + _test_eof3121: + cs = 3121 + goto _test_eof + _test_eof3122: + cs = 3122 + goto _test_eof + _test_eof3123: + cs = 3123 + goto _test_eof + _test_eof3124: + cs = 3124 + goto _test_eof + _test_eof3125: + cs = 3125 + goto _test_eof + _test_eof3126: + cs = 3126 + goto _test_eof + _test_eof3127: + cs = 3127 + goto _test_eof + _test_eof3128: + cs = 3128 + goto _test_eof + _test_eof3129: + cs = 3129 + goto _test_eof + _test_eof3130: + cs = 3130 + goto _test_eof + _test_eof3131: + cs = 3131 + goto _test_eof + _test_eof3132: + cs = 3132 + goto _test_eof + _test_eof3133: + cs = 3133 + goto _test_eof + _test_eof3134: + cs = 3134 + goto _test_eof + _test_eof3135: + cs = 3135 + goto _test_eof + _test_eof3136: + cs = 3136 + goto _test_eof + _test_eof3137: + cs = 3137 + goto _test_eof + _test_eof3138: + cs = 3138 + goto _test_eof + _test_eof3139: + cs = 3139 + goto _test_eof + _test_eof3140: + cs = 3140 + goto _test_eof + _test_eof3141: + cs = 3141 + goto _test_eof + _test_eof3142: + cs = 3142 + goto _test_eof + _test_eof3143: + cs = 3143 + goto _test_eof + _test_eof3144: + cs = 3144 + goto _test_eof + _test_eof3145: + cs = 3145 + goto _test_eof + _test_eof3146: + cs = 3146 + goto _test_eof + _test_eof3147: + cs = 3147 + goto _test_eof + _test_eof3148: + cs = 3148 + goto _test_eof + _test_eof3149: + cs = 3149 + goto _test_eof + _test_eof3150: + cs = 3150 + goto _test_eof + _test_eof3151: + cs = 3151 + goto _test_eof + _test_eof3152: + cs = 3152 + goto _test_eof + _test_eof3153: + cs = 3153 + goto _test_eof + _test_eof3154: + cs = 3154 + goto _test_eof + _test_eof3155: + cs = 3155 + goto _test_eof + _test_eof3156: + cs = 3156 + goto _test_eof + _test_eof3157: + cs = 3157 + goto _test_eof + _test_eof3158: + cs = 3158 + goto _test_eof + _test_eof3159: + cs = 3159 + goto _test_eof + _test_eof3160: + cs = 3160 + goto _test_eof + _test_eof3161: + cs = 3161 + goto _test_eof + _test_eof3162: + cs = 3162 + goto _test_eof + _test_eof3163: + cs = 3163 + goto _test_eof + _test_eof3164: + cs = 3164 + goto _test_eof + _test_eof3165: + cs = 3165 + goto _test_eof + _test_eof3166: + cs = 3166 + goto _test_eof + _test_eof3167: + cs = 3167 + goto _test_eof + _test_eof3168: + cs = 3168 + goto _test_eof + _test_eof3169: + cs = 3169 + goto _test_eof + _test_eof3170: + cs = 3170 + goto _test_eof + _test_eof3171: + cs = 3171 + goto _test_eof + _test_eof3172: + cs = 3172 + goto _test_eof + _test_eof3173: + cs = 3173 + goto _test_eof + _test_eof3174: + cs = 3174 + goto _test_eof + _test_eof3175: + cs = 3175 + goto _test_eof + _test_eof3176: + cs = 3176 + goto _test_eof + _test_eof3177: + cs = 3177 + goto _test_eof + _test_eof3178: + cs = 3178 + goto _test_eof + _test_eof3179: + cs = 3179 + goto _test_eof + _test_eof3180: + cs = 3180 + goto _test_eof + _test_eof3181: + cs = 3181 + goto _test_eof + _test_eof3182: + cs = 3182 + goto _test_eof + _test_eof3183: + cs = 3183 + goto _test_eof + _test_eof3184: + cs = 3184 + goto _test_eof + _test_eof3185: + cs = 3185 + goto _test_eof + _test_eof3186: + cs = 3186 + goto _test_eof + _test_eof3187: + cs = 3187 + goto _test_eof + _test_eof3188: + cs = 3188 + goto _test_eof + _test_eof3189: + cs = 3189 + goto _test_eof + _test_eof3190: + cs = 3190 + goto _test_eof + _test_eof3191: + cs = 3191 + goto _test_eof + _test_eof3192: + cs = 3192 + goto _test_eof + _test_eof3193: + cs = 3193 + goto _test_eof + _test_eof3194: + cs = 3194 + goto _test_eof + _test_eof3195: + cs = 3195 + goto _test_eof + _test_eof3196: + cs = 3196 + goto _test_eof + _test_eof3197: + cs = 3197 + goto _test_eof + _test_eof3198: + cs = 3198 + goto _test_eof + _test_eof3199: + cs = 3199 + goto _test_eof + _test_eof3200: + cs = 3200 + goto _test_eof + _test_eof3201: + cs = 3201 + goto _test_eof + _test_eof3202: + cs = 3202 + goto _test_eof + _test_eof3203: + cs = 3203 + goto _test_eof + _test_eof3204: + cs = 3204 + goto _test_eof + _test_eof3205: + cs = 3205 + goto _test_eof + _test_eof3206: + cs = 3206 + goto _test_eof + _test_eof3207: + cs = 3207 + goto _test_eof + _test_eof3208: + cs = 3208 + goto _test_eof + _test_eof3209: + cs = 3209 + goto _test_eof + _test_eof3210: + cs = 3210 + goto _test_eof + _test_eof3211: + cs = 3211 + goto _test_eof + _test_eof3212: + cs = 3212 + goto _test_eof + _test_eof3213: + cs = 3213 + goto _test_eof + _test_eof3214: + cs = 3214 + goto _test_eof + _test_eof3215: + cs = 3215 + goto _test_eof + _test_eof3216: + cs = 3216 + goto _test_eof + _test_eof3217: + cs = 3217 + goto _test_eof + _test_eof4888: + cs = 4888 + goto _test_eof + _test_eof4889: + cs = 4889 + goto _test_eof + _test_eof4890: + cs = 4890 + goto _test_eof + _test_eof4891: + cs = 4891 + goto _test_eof + _test_eof4892: + cs = 4892 + goto _test_eof + _test_eof4893: + cs = 4893 + goto _test_eof + _test_eof4894: + cs = 4894 + goto _test_eof + _test_eof4895: + cs = 4895 + goto _test_eof + _test_eof4896: + cs = 4896 + goto _test_eof + _test_eof4897: + cs = 4897 + goto _test_eof + _test_eof4898: + cs = 4898 + goto _test_eof + _test_eof4899: + cs = 4899 + goto _test_eof + _test_eof4900: + cs = 4900 + goto _test_eof + _test_eof4901: + cs = 4901 + goto _test_eof + _test_eof4902: + cs = 4902 + goto _test_eof + _test_eof4903: + cs = 4903 + goto _test_eof + _test_eof4904: + cs = 4904 + goto _test_eof + _test_eof4905: + cs = 4905 + goto _test_eof + _test_eof4906: + cs = 4906 + goto _test_eof + _test_eof4907: + cs = 4907 + goto _test_eof + _test_eof4908: + cs = 4908 + goto _test_eof + _test_eof4909: + cs = 4909 + goto _test_eof + _test_eof4910: + cs = 4910 + goto _test_eof + _test_eof4911: + cs = 4911 + goto _test_eof + _test_eof4912: + cs = 4912 + goto _test_eof + _test_eof4913: + cs = 4913 + goto _test_eof + _test_eof4914: + cs = 4914 + goto _test_eof + _test_eof4915: + cs = 4915 + goto _test_eof + _test_eof4916: + cs = 4916 + goto _test_eof + _test_eof4917: + cs = 4917 + goto _test_eof + _test_eof4918: + cs = 4918 + goto _test_eof + _test_eof4919: + cs = 4919 + goto _test_eof + _test_eof4920: + cs = 4920 + goto _test_eof + _test_eof4921: + cs = 4921 + goto _test_eof + _test_eof4922: + cs = 4922 + goto _test_eof + _test_eof4923: + cs = 4923 + goto _test_eof + _test_eof4924: + cs = 4924 + goto _test_eof + _test_eof4925: + cs = 4925 + goto _test_eof + _test_eof4926: + cs = 4926 + goto _test_eof + _test_eof4927: + cs = 4927 + goto _test_eof + _test_eof4928: + cs = 4928 + goto _test_eof + _test_eof3218: + cs = 3218 + goto _test_eof + _test_eof3219: + cs = 3219 + goto _test_eof + _test_eof3220: + cs = 3220 + goto _test_eof + _test_eof3221: + cs = 3221 + goto _test_eof + _test_eof3222: + cs = 3222 + goto _test_eof + _test_eof3223: + cs = 3223 + goto _test_eof + _test_eof3224: + cs = 3224 + goto _test_eof + _test_eof3225: + cs = 3225 + goto _test_eof + _test_eof3226: + cs = 3226 + goto _test_eof + _test_eof3227: + cs = 3227 + goto _test_eof + _test_eof3228: + cs = 3228 + goto _test_eof + _test_eof3229: + cs = 3229 + goto _test_eof + _test_eof3230: + cs = 3230 + goto _test_eof + _test_eof3231: + cs = 3231 + goto _test_eof + _test_eof4929: + cs = 4929 + goto _test_eof + _test_eof4930: + cs = 4930 + goto _test_eof + _test_eof4931: + cs = 4931 + goto _test_eof + _test_eof4932: + cs = 4932 + goto _test_eof + _test_eof3232: + cs = 3232 + goto _test_eof + _test_eof4933: + cs = 4933 + goto _test_eof + _test_eof4934: + cs = 4934 + goto _test_eof + _test_eof4935: + cs = 4935 + goto _test_eof + _test_eof4936: + cs = 4936 + goto _test_eof + _test_eof4937: + cs = 4937 + goto _test_eof + _test_eof4938: + cs = 4938 + goto _test_eof + _test_eof4939: + cs = 4939 + goto _test_eof + _test_eof4940: + cs = 4940 + goto _test_eof + _test_eof4941: + cs = 4941 + goto _test_eof + _test_eof4942: + cs = 4942 + goto _test_eof + _test_eof4943: + cs = 4943 + goto _test_eof + _test_eof4944: + cs = 4944 + goto _test_eof + _test_eof4945: + cs = 4945 + goto _test_eof + _test_eof4946: + cs = 4946 + goto _test_eof + _test_eof4947: + cs = 4947 + goto _test_eof + _test_eof4948: + cs = 4948 + goto _test_eof + _test_eof4949: + cs = 4949 + goto _test_eof + _test_eof4950: + cs = 4950 + goto _test_eof + _test_eof4951: + cs = 4951 + goto _test_eof + _test_eof4952: + cs = 4952 + goto _test_eof + _test_eof4953: + cs = 4953 + goto _test_eof + _test_eof4954: + cs = 4954 + goto _test_eof + _test_eof4955: + cs = 4955 + goto _test_eof + _test_eof4956: + cs = 4956 + goto _test_eof + _test_eof4957: + cs = 4957 + goto _test_eof + _test_eof3233: + cs = 3233 + goto _test_eof + _test_eof4958: + cs = 4958 + goto _test_eof + _test_eof4959: + cs = 4959 + goto _test_eof + _test_eof4960: + cs = 4960 + goto _test_eof + _test_eof4961: + cs = 4961 + goto _test_eof + _test_eof4962: + cs = 4962 + goto _test_eof + _test_eof4963: + cs = 4963 + goto _test_eof + _test_eof3234: + cs = 3234 + goto _test_eof + _test_eof4964: + cs = 4964 + goto _test_eof + _test_eof4965: + cs = 4965 + goto _test_eof + _test_eof3235: + cs = 3235 + goto _test_eof + _test_eof4966: + cs = 4966 + goto _test_eof + _test_eof4967: + cs = 4967 + goto _test_eof + _test_eof4968: + cs = 4968 + goto _test_eof + _test_eof4969: + cs = 4969 + goto _test_eof + _test_eof4970: + cs = 4970 + goto _test_eof + _test_eof4971: + cs = 4971 + goto _test_eof + _test_eof4972: + cs = 4972 + goto _test_eof + _test_eof4973: + cs = 4973 + goto _test_eof + _test_eof4974: + cs = 4974 + goto _test_eof + _test_eof4975: + cs = 4975 + goto _test_eof + _test_eof4976: + cs = 4976 + goto _test_eof + _test_eof4977: + cs = 4977 + goto _test_eof + _test_eof4978: + cs = 4978 + goto _test_eof + _test_eof4979: + cs = 4979 + goto _test_eof + _test_eof4980: + cs = 4980 + goto _test_eof + _test_eof3236: + cs = 3236 + goto _test_eof + _test_eof4981: + cs = 4981 + goto _test_eof + _test_eof4982: + cs = 4982 + goto _test_eof + _test_eof4983: + cs = 4983 + goto _test_eof + _test_eof3237: + cs = 3237 + goto _test_eof + _test_eof4984: + cs = 4984 + goto _test_eof + _test_eof4985: + cs = 4985 + goto _test_eof + _test_eof4986: + cs = 4986 + goto _test_eof + _test_eof4987: + cs = 4987 + goto _test_eof + _test_eof4988: + cs = 4988 + goto _test_eof + _test_eof4989: + cs = 4989 + goto _test_eof + _test_eof3238: + cs = 3238 + goto _test_eof + _test_eof4990: + cs = 4990 + goto _test_eof + _test_eof4991: + cs = 4991 + goto _test_eof + _test_eof4992: + cs = 4992 + goto _test_eof + _test_eof4993: + cs = 4993 + goto _test_eof + _test_eof4994: + cs = 4994 + goto _test_eof + _test_eof4995: + cs = 4995 + goto _test_eof + _test_eof4996: + cs = 4996 + goto _test_eof + _test_eof4997: + cs = 4997 + goto _test_eof + _test_eof4998: + cs = 4998 + goto _test_eof + _test_eof4999: + cs = 4999 + goto _test_eof + _test_eof5000: + cs = 5000 + goto _test_eof + _test_eof5001: + cs = 5001 + goto _test_eof + _test_eof5002: + cs = 5002 + goto _test_eof + _test_eof5003: + cs = 5003 + goto _test_eof + _test_eof5004: + cs = 5004 + goto _test_eof + _test_eof5005: + cs = 5005 + goto _test_eof + _test_eof5006: + cs = 5006 + goto _test_eof + _test_eof5007: + cs = 5007 + goto _test_eof + _test_eof5008: + cs = 5008 + goto _test_eof + _test_eof5009: + cs = 5009 + goto _test_eof + _test_eof5010: + cs = 5010 + goto _test_eof + _test_eof5011: + cs = 5011 + goto _test_eof + _test_eof5012: + cs = 5012 + goto _test_eof + _test_eof5013: + cs = 5013 + goto _test_eof + _test_eof5014: + cs = 5014 + goto _test_eof + _test_eof5015: + cs = 5015 + goto _test_eof + _test_eof5016: + cs = 5016 + goto _test_eof + _test_eof5017: + cs = 5017 + goto _test_eof + _test_eof5018: + cs = 5018 + goto _test_eof + _test_eof5019: + cs = 5019 + goto _test_eof + _test_eof5020: + cs = 5020 + goto _test_eof + _test_eof5021: + cs = 5021 + goto _test_eof + _test_eof5022: + cs = 5022 + goto _test_eof + _test_eof5023: + cs = 5023 + goto _test_eof + _test_eof5024: + cs = 5024 + goto _test_eof + _test_eof5025: + cs = 5025 + goto _test_eof + _test_eof5026: + cs = 5026 + goto _test_eof + _test_eof5027: + cs = 5027 + goto _test_eof + _test_eof5028: + cs = 5028 + goto _test_eof + _test_eof5029: + cs = 5029 + goto _test_eof + _test_eof5030: + cs = 5030 + goto _test_eof + _test_eof5031: + cs = 5031 + goto _test_eof + _test_eof5032: + cs = 5032 + goto _test_eof + _test_eof5033: + cs = 5033 + goto _test_eof + _test_eof5034: + cs = 5034 + goto _test_eof + _test_eof5035: + cs = 5035 + goto _test_eof + _test_eof5036: + cs = 5036 + goto _test_eof + _test_eof5037: + cs = 5037 + goto _test_eof + _test_eof5038: + cs = 5038 + goto _test_eof + _test_eof5039: + cs = 5039 + goto _test_eof + _test_eof5040: + cs = 5040 + goto _test_eof + _test_eof5041: + cs = 5041 + goto _test_eof + _test_eof5042: + cs = 5042 + goto _test_eof + _test_eof5043: + cs = 5043 + goto _test_eof + _test_eof5044: + cs = 5044 + goto _test_eof + _test_eof5045: + cs = 5045 + goto _test_eof + _test_eof5046: + cs = 5046 + goto _test_eof + _test_eof5047: + cs = 5047 + goto _test_eof + _test_eof5048: + cs = 5048 + goto _test_eof + _test_eof5049: + cs = 5049 + goto _test_eof + _test_eof5050: + cs = 5050 + goto _test_eof + _test_eof5051: + cs = 5051 + goto _test_eof + _test_eof5052: + cs = 5052 + goto _test_eof + _test_eof5053: + cs = 5053 + goto _test_eof + _test_eof5054: + cs = 5054 + goto _test_eof + _test_eof5055: + cs = 5055 + goto _test_eof + _test_eof5056: + cs = 5056 + goto _test_eof + _test_eof5057: + cs = 5057 + goto _test_eof + _test_eof5058: + cs = 5058 + goto _test_eof + _test_eof5059: + cs = 5059 + goto _test_eof + _test_eof5060: + cs = 5060 + goto _test_eof + _test_eof5061: + cs = 5061 + goto _test_eof + _test_eof5062: + cs = 5062 + goto _test_eof + _test_eof5063: + cs = 5063 + goto _test_eof + _test_eof5064: + cs = 5064 + goto _test_eof + _test_eof5065: + cs = 5065 + goto _test_eof + _test_eof5066: + cs = 5066 + goto _test_eof + _test_eof5067: + cs = 5067 + goto _test_eof + _test_eof5068: + cs = 5068 + goto _test_eof + _test_eof5069: + cs = 5069 + goto _test_eof + _test_eof5070: + cs = 5070 + goto _test_eof + _test_eof5071: + cs = 5071 + goto _test_eof + _test_eof3239: + cs = 3239 + goto _test_eof + _test_eof3240: + cs = 3240 + goto _test_eof + _test_eof3241: + cs = 3241 + goto _test_eof + _test_eof3242: + cs = 3242 + goto _test_eof + _test_eof3243: + cs = 3243 + goto _test_eof + _test_eof3244: + cs = 3244 + goto _test_eof + _test_eof3245: + cs = 3245 + goto _test_eof + _test_eof3246: + cs = 3246 + goto _test_eof + _test_eof3247: + cs = 3247 + goto _test_eof + _test_eof3248: + cs = 3248 + goto _test_eof + _test_eof3249: + cs = 3249 + goto _test_eof + _test_eof3250: + cs = 3250 + goto _test_eof + _test_eof3251: + cs = 3251 + goto _test_eof + _test_eof3252: + cs = 3252 + goto _test_eof + _test_eof3253: + cs = 3253 + goto _test_eof + _test_eof3254: + cs = 3254 + goto _test_eof + _test_eof3255: + cs = 3255 + goto _test_eof + _test_eof3256: + cs = 3256 + goto _test_eof + _test_eof3257: + cs = 3257 + goto _test_eof + _test_eof3258: + cs = 3258 + goto _test_eof + _test_eof3259: + cs = 3259 + goto _test_eof + _test_eof3260: + cs = 3260 + goto _test_eof + _test_eof3261: + cs = 3261 + goto _test_eof + _test_eof3262: + cs = 3262 + goto _test_eof + _test_eof3263: + cs = 3263 + goto _test_eof + _test_eof3264: + cs = 3264 + goto _test_eof + _test_eof3265: + cs = 3265 + goto _test_eof + _test_eof5072: + cs = 5072 + goto _test_eof + _test_eof3266: + cs = 3266 + goto _test_eof + _test_eof3267: + cs = 3267 + goto _test_eof + _test_eof3268: + cs = 3268 + goto _test_eof + _test_eof5073: + cs = 5073 + goto _test_eof + _test_eof3269: + cs = 3269 + goto _test_eof + _test_eof3270: + cs = 3270 + goto _test_eof + _test_eof3271: + cs = 3271 + goto _test_eof + _test_eof3272: + cs = 3272 + goto _test_eof + _test_eof3273: + cs = 3273 + goto _test_eof + _test_eof3274: + cs = 3274 + goto _test_eof + _test_eof3275: + cs = 3275 + goto _test_eof + _test_eof3276: + cs = 3276 + goto _test_eof + _test_eof3277: + cs = 3277 + goto _test_eof + _test_eof3278: + cs = 3278 + goto _test_eof + _test_eof3279: + cs = 3279 + goto _test_eof + _test_eof3280: + cs = 3280 + goto _test_eof + _test_eof3281: + cs = 3281 + goto _test_eof + _test_eof3282: + cs = 3282 + goto _test_eof + _test_eof3283: + cs = 3283 + goto _test_eof + _test_eof3284: + cs = 3284 + goto _test_eof + _test_eof3285: + cs = 3285 + goto _test_eof + _test_eof3286: + cs = 3286 + goto _test_eof + _test_eof3287: + cs = 3287 + goto _test_eof + _test_eof3288: + cs = 3288 + goto _test_eof + _test_eof3289: + cs = 3289 + goto _test_eof + _test_eof3290: + cs = 3290 + goto _test_eof + _test_eof3291: + cs = 3291 + goto _test_eof + _test_eof3292: + cs = 3292 + goto _test_eof + _test_eof3293: + cs = 3293 + goto _test_eof + _test_eof3294: + cs = 3294 + goto _test_eof + _test_eof3295: + cs = 3295 + goto _test_eof + _test_eof3296: + cs = 3296 + goto _test_eof + _test_eof3297: + cs = 3297 + goto _test_eof + _test_eof3298: + cs = 3298 + goto _test_eof + _test_eof3299: + cs = 3299 + goto _test_eof + _test_eof3300: + cs = 3300 + goto _test_eof + _test_eof3301: + cs = 3301 + goto _test_eof + _test_eof3302: + cs = 3302 + goto _test_eof + _test_eof3303: + cs = 3303 + goto _test_eof + _test_eof3304: + cs = 3304 + goto _test_eof + _test_eof3305: + cs = 3305 + goto _test_eof + _test_eof3306: + cs = 3306 + goto _test_eof + _test_eof3307: + cs = 3307 + goto _test_eof + _test_eof3308: + cs = 3308 + goto _test_eof + _test_eof3309: + cs = 3309 + goto _test_eof + _test_eof3310: + cs = 3310 + goto _test_eof + _test_eof3311: + cs = 3311 + goto _test_eof + _test_eof3312: + cs = 3312 + goto _test_eof + _test_eof3313: + cs = 3313 + goto _test_eof + _test_eof3314: + cs = 3314 + goto _test_eof + _test_eof3315: + cs = 3315 + goto _test_eof + _test_eof3316: + cs = 3316 + goto _test_eof + _test_eof3317: + cs = 3317 + goto _test_eof + _test_eof3318: + cs = 3318 + goto _test_eof + _test_eof3319: + cs = 3319 + goto _test_eof + _test_eof3320: + cs = 3320 + goto _test_eof + _test_eof3321: + cs = 3321 + goto _test_eof + _test_eof3322: + cs = 3322 + goto _test_eof + _test_eof3323: + cs = 3323 + goto _test_eof + _test_eof3324: + cs = 3324 + goto _test_eof + _test_eof3325: + cs = 3325 + goto _test_eof + _test_eof3326: + cs = 3326 + goto _test_eof + _test_eof3327: + cs = 3327 + goto _test_eof + _test_eof3328: + cs = 3328 + goto _test_eof + _test_eof3329: + cs = 3329 + goto _test_eof + _test_eof3330: + cs = 3330 + goto _test_eof + _test_eof3331: + cs = 3331 + goto _test_eof + _test_eof3332: + cs = 3332 + goto _test_eof + _test_eof3333: + cs = 3333 + goto _test_eof + _test_eof3334: + cs = 3334 + goto _test_eof + _test_eof3335: + cs = 3335 + goto _test_eof + _test_eof3336: + cs = 3336 + goto _test_eof + _test_eof3337: + cs = 3337 + goto _test_eof + _test_eof3338: + cs = 3338 + goto _test_eof + _test_eof3339: + cs = 3339 + goto _test_eof + _test_eof3340: + cs = 3340 + goto _test_eof + _test_eof3341: + cs = 3341 + goto _test_eof + _test_eof3342: + cs = 3342 + goto _test_eof + _test_eof3343: + cs = 3343 + goto _test_eof + _test_eof3344: + cs = 3344 + goto _test_eof + _test_eof3345: + cs = 3345 + goto _test_eof + _test_eof3346: + cs = 3346 + goto _test_eof + _test_eof3347: + cs = 3347 + goto _test_eof + _test_eof3348: + cs = 3348 + goto _test_eof + _test_eof3349: + cs = 3349 + goto _test_eof + _test_eof3350: + cs = 3350 + goto _test_eof + _test_eof5074: + cs = 5074 + goto _test_eof + _test_eof3351: + cs = 3351 + goto _test_eof + _test_eof3352: + cs = 3352 + goto _test_eof + _test_eof3353: + cs = 3353 + goto _test_eof + _test_eof3354: + cs = 3354 + goto _test_eof + _test_eof3355: + cs = 3355 + goto _test_eof + _test_eof3356: + cs = 3356 + goto _test_eof + _test_eof3357: + cs = 3357 + goto _test_eof + _test_eof3358: + cs = 3358 + goto _test_eof + _test_eof3359: + cs = 3359 + goto _test_eof + _test_eof3360: + cs = 3360 + goto _test_eof + _test_eof3361: + cs = 3361 + goto _test_eof + _test_eof3362: + cs = 3362 + goto _test_eof + _test_eof3363: + cs = 3363 + goto _test_eof + _test_eof3364: + cs = 3364 + goto _test_eof + _test_eof3365: + cs = 3365 + goto _test_eof + _test_eof3366: + cs = 3366 + goto _test_eof + _test_eof3367: + cs = 3367 + goto _test_eof + _test_eof3368: + cs = 3368 + goto _test_eof + _test_eof3369: + cs = 3369 + goto _test_eof + _test_eof3370: + cs = 3370 + goto _test_eof + _test_eof3371: + cs = 3371 + goto _test_eof + _test_eof3372: + cs = 3372 + goto _test_eof + _test_eof3373: + cs = 3373 + goto _test_eof + _test_eof3374: + cs = 3374 + goto _test_eof + _test_eof3375: + cs = 3375 + goto _test_eof + _test_eof3376: + cs = 3376 + goto _test_eof + _test_eof3377: + cs = 3377 + goto _test_eof + _test_eof3378: + cs = 3378 + goto _test_eof + _test_eof3379: + cs = 3379 + goto _test_eof + _test_eof3380: + cs = 3380 + goto _test_eof + _test_eof3381: + cs = 3381 + goto _test_eof + _test_eof3382: + cs = 3382 + goto _test_eof + _test_eof3383: + cs = 3383 + goto _test_eof + _test_eof3384: + cs = 3384 + goto _test_eof + _test_eof3385: + cs = 3385 + goto _test_eof + _test_eof3386: + cs = 3386 + goto _test_eof + _test_eof3387: + cs = 3387 + goto _test_eof + _test_eof3388: + cs = 3388 + goto _test_eof + _test_eof3389: + cs = 3389 + goto _test_eof + _test_eof3390: + cs = 3390 + goto _test_eof + _test_eof3391: + cs = 3391 + goto _test_eof + _test_eof3392: + cs = 3392 + goto _test_eof + _test_eof3393: + cs = 3393 + goto _test_eof + _test_eof3394: + cs = 3394 + goto _test_eof + _test_eof3395: + cs = 3395 + goto _test_eof + _test_eof3396: + cs = 3396 + goto _test_eof + _test_eof3397: + cs = 3397 + goto _test_eof + _test_eof3398: + cs = 3398 + goto _test_eof + _test_eof3399: + cs = 3399 + goto _test_eof + _test_eof3400: + cs = 3400 + goto _test_eof + _test_eof3401: + cs = 3401 + goto _test_eof + _test_eof3402: + cs = 3402 + goto _test_eof + _test_eof3403: + cs = 3403 + goto _test_eof + _test_eof3404: + cs = 3404 + goto _test_eof + _test_eof3405: + cs = 3405 + goto _test_eof + _test_eof3406: + cs = 3406 + goto _test_eof + _test_eof3407: + cs = 3407 + goto _test_eof + _test_eof3408: + cs = 3408 + goto _test_eof + _test_eof3409: + cs = 3409 + goto _test_eof + _test_eof3410: + cs = 3410 + goto _test_eof + _test_eof3411: + cs = 3411 + goto _test_eof + _test_eof3412: + cs = 3412 + goto _test_eof + _test_eof3413: + cs = 3413 + goto _test_eof + _test_eof3414: + cs = 3414 + goto _test_eof + _test_eof3415: + cs = 3415 + goto _test_eof + _test_eof3416: + cs = 3416 + goto _test_eof + _test_eof3417: + cs = 3417 + goto _test_eof + _test_eof3418: + cs = 3418 + goto _test_eof + _test_eof3419: + cs = 3419 + goto _test_eof + _test_eof3420: + cs = 3420 + goto _test_eof + _test_eof3421: + cs = 3421 + goto _test_eof + _test_eof3422: + cs = 3422 + goto _test_eof + _test_eof3423: + cs = 3423 + goto _test_eof + _test_eof3424: + cs = 3424 + goto _test_eof + _test_eof3425: + cs = 3425 + goto _test_eof + _test_eof3426: + cs = 3426 + goto _test_eof + _test_eof3427: + cs = 3427 + goto _test_eof + _test_eof3428: + cs = 3428 + goto _test_eof + _test_eof3429: + cs = 3429 + goto _test_eof + _test_eof3430: + cs = 3430 + goto _test_eof + _test_eof3431: + cs = 3431 + goto _test_eof + _test_eof3432: + cs = 3432 + goto _test_eof + _test_eof3433: + cs = 3433 + goto _test_eof + _test_eof3434: + cs = 3434 + goto _test_eof + _test_eof3435: + cs = 3435 + goto _test_eof + _test_eof3436: + cs = 3436 + goto _test_eof + _test_eof3437: + cs = 3437 + goto _test_eof + _test_eof3438: + cs = 3438 + goto _test_eof + _test_eof3439: + cs = 3439 + goto _test_eof + _test_eof3440: + cs = 3440 + goto _test_eof + _test_eof3441: + cs = 3441 + goto _test_eof + _test_eof3442: + cs = 3442 + goto _test_eof + _test_eof3443: + cs = 3443 + goto _test_eof + _test_eof3444: + cs = 3444 + goto _test_eof + _test_eof3445: + cs = 3445 + goto _test_eof + _test_eof3446: + cs = 3446 + goto _test_eof + _test_eof3447: + cs = 3447 + goto _test_eof + _test_eof3448: + cs = 3448 + goto _test_eof + _test_eof3449: + cs = 3449 + goto _test_eof + _test_eof3450: + cs = 3450 + goto _test_eof + _test_eof3451: + cs = 3451 + goto _test_eof + _test_eof3452: + cs = 3452 + goto _test_eof + _test_eof3453: + cs = 3453 + goto _test_eof + _test_eof3454: + cs = 3454 + goto _test_eof + _test_eof3455: + cs = 3455 + goto _test_eof + _test_eof3456: + cs = 3456 + goto _test_eof + _test_eof3457: + cs = 3457 + goto _test_eof + _test_eof3458: + cs = 3458 + goto _test_eof + _test_eof3459: + cs = 3459 + goto _test_eof + _test_eof3460: + cs = 3460 + goto _test_eof + _test_eof3461: + cs = 3461 + goto _test_eof + _test_eof3462: + cs = 3462 + goto _test_eof + _test_eof3463: + cs = 3463 + goto _test_eof + _test_eof3464: + cs = 3464 + goto _test_eof + _test_eof3465: + cs = 3465 + goto _test_eof + _test_eof3466: + cs = 3466 + goto _test_eof + _test_eof3467: + cs = 3467 + goto _test_eof + _test_eof3468: + cs = 3468 + goto _test_eof + _test_eof3469: + cs = 3469 + goto _test_eof + _test_eof3470: + cs = 3470 + goto _test_eof + _test_eof3471: + cs = 3471 + goto _test_eof + _test_eof3472: + cs = 3472 + goto _test_eof + _test_eof3473: + cs = 3473 + goto _test_eof + _test_eof3474: + cs = 3474 + goto _test_eof + _test_eof3475: + cs = 3475 + goto _test_eof + _test_eof3476: + cs = 3476 + goto _test_eof + _test_eof3477: + cs = 3477 + goto _test_eof + _test_eof3478: + cs = 3478 + goto _test_eof + _test_eof3479: + cs = 3479 + goto _test_eof + _test_eof3480: + cs = 3480 + goto _test_eof + _test_eof3481: + cs = 3481 + goto _test_eof + _test_eof3482: + cs = 3482 + goto _test_eof + _test_eof3483: + cs = 3483 + goto _test_eof + _test_eof3484: + cs = 3484 + goto _test_eof + _test_eof3485: + cs = 3485 + goto _test_eof + _test_eof3486: + cs = 3486 + goto _test_eof + _test_eof3487: + cs = 3487 + goto _test_eof + _test_eof3488: + cs = 3488 + goto _test_eof + _test_eof3489: + cs = 3489 + goto _test_eof + _test_eof3490: + cs = 3490 + goto _test_eof + _test_eof3491: + cs = 3491 + goto _test_eof + _test_eof3492: + cs = 3492 + goto _test_eof + _test_eof3493: + cs = 3493 + goto _test_eof + _test_eof3494: + cs = 3494 + goto _test_eof + _test_eof3495: + cs = 3495 + goto _test_eof + _test_eof3496: + cs = 3496 + goto _test_eof + _test_eof3497: + cs = 3497 + goto _test_eof + _test_eof3498: + cs = 3498 + goto _test_eof + _test_eof3499: + cs = 3499 + goto _test_eof + _test_eof3500: + cs = 3500 + goto _test_eof + _test_eof3501: + cs = 3501 + goto _test_eof + _test_eof3502: + cs = 3502 + goto _test_eof + _test_eof3503: + cs = 3503 + goto _test_eof + _test_eof3504: + cs = 3504 + goto _test_eof + _test_eof3505: + cs = 3505 + goto _test_eof + _test_eof3506: + cs = 3506 + goto _test_eof + _test_eof3507: + cs = 3507 + goto _test_eof + _test_eof3508: + cs = 3508 + goto _test_eof + _test_eof3509: + cs = 3509 + goto _test_eof + _test_eof3510: + cs = 3510 + goto _test_eof + _test_eof3511: + cs = 3511 + goto _test_eof + _test_eof3512: + cs = 3512 + goto _test_eof + _test_eof3513: + cs = 3513 + goto _test_eof + _test_eof3514: + cs = 3514 + goto _test_eof + _test_eof3515: + cs = 3515 + goto _test_eof + _test_eof3516: + cs = 3516 + goto _test_eof + _test_eof3517: + cs = 3517 + goto _test_eof + _test_eof3518: + cs = 3518 + goto _test_eof + _test_eof3519: + cs = 3519 + goto _test_eof + _test_eof3520: + cs = 3520 + goto _test_eof + _test_eof3521: + cs = 3521 + goto _test_eof + _test_eof3522: + cs = 3522 + goto _test_eof + _test_eof3523: + cs = 3523 + goto _test_eof + _test_eof3524: + cs = 3524 + goto _test_eof + _test_eof3525: + cs = 3525 + goto _test_eof + _test_eof3526: + cs = 3526 + goto _test_eof + _test_eof3527: + cs = 3527 + goto _test_eof + _test_eof3528: + cs = 3528 + goto _test_eof + _test_eof3529: + cs = 3529 + goto _test_eof + _test_eof3530: + cs = 3530 + goto _test_eof + _test_eof3531: + cs = 3531 + goto _test_eof + _test_eof3532: + cs = 3532 + goto _test_eof + _test_eof3533: + cs = 3533 + goto _test_eof + _test_eof3534: + cs = 3534 + goto _test_eof + _test_eof3535: + cs = 3535 + goto _test_eof + _test_eof3536: + cs = 3536 + goto _test_eof + _test_eof3537: + cs = 3537 + goto _test_eof + _test_eof3538: + cs = 3538 + goto _test_eof + _test_eof3539: + cs = 3539 + goto _test_eof + _test_eof3540: + cs = 3540 + goto _test_eof + _test_eof3541: + cs = 3541 + goto _test_eof + _test_eof3542: + cs = 3542 + goto _test_eof + _test_eof3543: + cs = 3543 + goto _test_eof + _test_eof3544: + cs = 3544 + goto _test_eof + _test_eof3545: + cs = 3545 + goto _test_eof + _test_eof3546: + cs = 3546 + goto _test_eof + _test_eof3547: + cs = 3547 + goto _test_eof + _test_eof3548: + cs = 3548 + goto _test_eof + _test_eof3549: + cs = 3549 + goto _test_eof + _test_eof3550: + cs = 3550 + goto _test_eof + _test_eof3551: + cs = 3551 + goto _test_eof + _test_eof3552: + cs = 3552 + goto _test_eof + _test_eof3553: + cs = 3553 + goto _test_eof + _test_eof3554: + cs = 3554 + goto _test_eof + _test_eof3555: + cs = 3555 + goto _test_eof + _test_eof3556: + cs = 3556 + goto _test_eof + _test_eof3557: + cs = 3557 + goto _test_eof + _test_eof3558: + cs = 3558 + goto _test_eof + _test_eof3559: + cs = 3559 + goto _test_eof + _test_eof3560: + cs = 3560 + goto _test_eof + _test_eof3561: + cs = 3561 + goto _test_eof + _test_eof3562: + cs = 3562 + goto _test_eof + _test_eof3563: + cs = 3563 + goto _test_eof + _test_eof3564: + cs = 3564 + goto _test_eof + _test_eof3565: + cs = 3565 + goto _test_eof + _test_eof3566: + cs = 3566 + goto _test_eof + _test_eof3567: + cs = 3567 + goto _test_eof + _test_eof3568: + cs = 3568 + goto _test_eof + _test_eof3569: + cs = 3569 + goto _test_eof + _test_eof3570: + cs = 3570 + goto _test_eof + _test_eof3571: + cs = 3571 + goto _test_eof + _test_eof3572: + cs = 3572 + goto _test_eof + _test_eof3573: + cs = 3573 + goto _test_eof + _test_eof3574: + cs = 3574 + goto _test_eof + _test_eof3575: + cs = 3575 + goto _test_eof + _test_eof3576: + cs = 3576 + goto _test_eof + _test_eof3577: + cs = 3577 + goto _test_eof + _test_eof3578: + cs = 3578 + goto _test_eof + _test_eof3579: + cs = 3579 + goto _test_eof + _test_eof3580: + cs = 3580 + goto _test_eof + _test_eof3581: + cs = 3581 + goto _test_eof + _test_eof3582: + cs = 3582 + goto _test_eof + _test_eof3583: + cs = 3583 + goto _test_eof + _test_eof3584: + cs = 3584 + goto _test_eof + _test_eof3585: + cs = 3585 + goto _test_eof + _test_eof3586: + cs = 3586 + goto _test_eof + _test_eof3587: + cs = 3587 + goto _test_eof + _test_eof5075: + cs = 5075 + goto _test_eof + _test_eof3588: + cs = 3588 + goto _test_eof + _test_eof3589: + cs = 3589 + goto _test_eof + _test_eof3590: + cs = 3590 + goto _test_eof + _test_eof3591: + cs = 3591 + goto _test_eof + _test_eof3592: + cs = 3592 + goto _test_eof + _test_eof3593: + cs = 3593 + goto _test_eof + _test_eof5076: + cs = 5076 + goto _test_eof + _test_eof3594: + cs = 3594 + goto _test_eof + _test_eof3595: + cs = 3595 + goto _test_eof + _test_eof3596: + cs = 3596 + goto _test_eof + _test_eof3597: + cs = 3597 + goto _test_eof + _test_eof3598: + cs = 3598 + goto _test_eof + _test_eof3599: + cs = 3599 + goto _test_eof + _test_eof3600: + cs = 3600 + goto _test_eof + _test_eof3601: + cs = 3601 + goto _test_eof + _test_eof3602: + cs = 3602 + goto _test_eof + _test_eof3603: + cs = 3603 + goto _test_eof + _test_eof3604: + cs = 3604 + goto _test_eof + _test_eof3605: + cs = 3605 + goto _test_eof + _test_eof3606: + cs = 3606 + goto _test_eof + _test_eof3607: + cs = 3607 + goto _test_eof + _test_eof3608: + cs = 3608 + goto _test_eof + _test_eof3609: + cs = 3609 + goto _test_eof + _test_eof3610: + cs = 3610 + goto _test_eof + _test_eof3611: + cs = 3611 + goto _test_eof + _test_eof3612: + cs = 3612 + goto _test_eof + _test_eof3613: + cs = 3613 + goto _test_eof + _test_eof3614: + cs = 3614 + goto _test_eof + _test_eof3615: + cs = 3615 + goto _test_eof + _test_eof3616: + cs = 3616 + goto _test_eof + _test_eof3617: + cs = 3617 + goto _test_eof + _test_eof3618: + cs = 3618 + goto _test_eof + _test_eof3619: + cs = 3619 + goto _test_eof + _test_eof3620: + cs = 3620 + goto _test_eof + _test_eof3621: + cs = 3621 + goto _test_eof + _test_eof3622: + cs = 3622 + goto _test_eof + _test_eof3623: + cs = 3623 + goto _test_eof + _test_eof3624: + cs = 3624 + goto _test_eof + _test_eof3625: + cs = 3625 + goto _test_eof + _test_eof3626: + cs = 3626 + goto _test_eof + _test_eof3627: + cs = 3627 + goto _test_eof + _test_eof3628: + cs = 3628 + goto _test_eof + _test_eof3629: + cs = 3629 + goto _test_eof + _test_eof3630: + cs = 3630 + goto _test_eof + _test_eof3631: + cs = 3631 + goto _test_eof + _test_eof3632: + cs = 3632 + goto _test_eof + _test_eof3633: + cs = 3633 + goto _test_eof + _test_eof3634: + cs = 3634 + goto _test_eof + _test_eof3635: + cs = 3635 + goto _test_eof + _test_eof3636: + cs = 3636 + goto _test_eof + _test_eof3637: + cs = 3637 + goto _test_eof + _test_eof3638: + cs = 3638 + goto _test_eof + _test_eof3639: + cs = 3639 + goto _test_eof + _test_eof3640: + cs = 3640 + goto _test_eof + _test_eof3641: + cs = 3641 + goto _test_eof + _test_eof3642: + cs = 3642 + goto _test_eof + _test_eof3643: + cs = 3643 + goto _test_eof + _test_eof3644: + cs = 3644 + goto _test_eof + _test_eof3645: + cs = 3645 + goto _test_eof + _test_eof3646: + cs = 3646 + goto _test_eof + _test_eof3647: + cs = 3647 + goto _test_eof + _test_eof3648: + cs = 3648 + goto _test_eof + _test_eof3649: + cs = 3649 + goto _test_eof + _test_eof3650: + cs = 3650 + goto _test_eof + _test_eof3651: + cs = 3651 + goto _test_eof + _test_eof3652: + cs = 3652 + goto _test_eof + _test_eof3653: + cs = 3653 + goto _test_eof + _test_eof3654: + cs = 3654 + goto _test_eof + _test_eof3655: + cs = 3655 + goto _test_eof + _test_eof3656: + cs = 3656 + goto _test_eof + _test_eof3657: + cs = 3657 + goto _test_eof + _test_eof3658: + cs = 3658 + goto _test_eof + _test_eof3659: + cs = 3659 + goto _test_eof + _test_eof3660: + cs = 3660 + goto _test_eof + _test_eof3661: + cs = 3661 + goto _test_eof + _test_eof3662: + cs = 3662 + goto _test_eof + _test_eof3663: + cs = 3663 + goto _test_eof + _test_eof3664: + cs = 3664 + goto _test_eof + _test_eof3665: + cs = 3665 + goto _test_eof + _test_eof3666: + cs = 3666 + goto _test_eof + _test_eof3667: + cs = 3667 + goto _test_eof + _test_eof3668: + cs = 3668 + goto _test_eof + _test_eof3669: + cs = 3669 + goto _test_eof + _test_eof3670: + cs = 3670 + goto _test_eof + _test_eof3671: + cs = 3671 + goto _test_eof + _test_eof3672: + cs = 3672 + goto _test_eof + _test_eof3673: + cs = 3673 + goto _test_eof + _test_eof3674: + cs = 3674 + goto _test_eof + _test_eof3675: + cs = 3675 + goto _test_eof + _test_eof3676: + cs = 3676 + goto _test_eof + _test_eof3677: + cs = 3677 + goto _test_eof + _test_eof3678: + cs = 3678 + goto _test_eof + _test_eof3679: + cs = 3679 + goto _test_eof + _test_eof3680: + cs = 3680 + goto _test_eof + _test_eof3681: + cs = 3681 + goto _test_eof + _test_eof3682: + cs = 3682 + goto _test_eof + _test_eof3683: + cs = 3683 + goto _test_eof + _test_eof3684: + cs = 3684 + goto _test_eof + _test_eof3685: + cs = 3685 + goto _test_eof + _test_eof3686: + cs = 3686 + goto _test_eof + _test_eof3687: + cs = 3687 + goto _test_eof + _test_eof3688: + cs = 3688 + goto _test_eof + _test_eof3689: + cs = 3689 + goto _test_eof + _test_eof3690: + cs = 3690 + goto _test_eof + _test_eof3691: + cs = 3691 + goto _test_eof + _test_eof3692: + cs = 3692 + goto _test_eof + _test_eof3693: + cs = 3693 + goto _test_eof + _test_eof3694: + cs = 3694 + goto _test_eof + _test_eof3695: + cs = 3695 + goto _test_eof + _test_eof3696: + cs = 3696 + goto _test_eof + _test_eof3697: + cs = 3697 + goto _test_eof + _test_eof3698: + cs = 3698 + goto _test_eof + _test_eof3699: + cs = 3699 + goto _test_eof + _test_eof3700: + cs = 3700 + goto _test_eof + _test_eof3701: + cs = 3701 + goto _test_eof + _test_eof3702: + cs = 3702 + goto _test_eof + _test_eof3703: + cs = 3703 + goto _test_eof + _test_eof3704: + cs = 3704 + goto _test_eof + _test_eof3705: + cs = 3705 + goto _test_eof + _test_eof3706: + cs = 3706 + goto _test_eof + _test_eof3707: + cs = 3707 + goto _test_eof + _test_eof3708: + cs = 3708 + goto _test_eof + _test_eof3709: + cs = 3709 + goto _test_eof + _test_eof3710: + cs = 3710 + goto _test_eof + _test_eof3711: + cs = 3711 + goto _test_eof + _test_eof3712: + cs = 3712 + goto _test_eof + _test_eof3713: + cs = 3713 + goto _test_eof + _test_eof3714: + cs = 3714 + goto _test_eof + _test_eof3715: + cs = 3715 + goto _test_eof + _test_eof3716: + cs = 3716 + goto _test_eof + _test_eof3717: + cs = 3717 + goto _test_eof + _test_eof3718: + cs = 3718 + goto _test_eof + _test_eof3719: + cs = 3719 + goto _test_eof + _test_eof3720: + cs = 3720 + goto _test_eof + _test_eof3721: + cs = 3721 + goto _test_eof + _test_eof3722: + cs = 3722 + goto _test_eof + _test_eof3723: + cs = 3723 + goto _test_eof + _test_eof3724: + cs = 3724 + goto _test_eof + _test_eof3725: + cs = 3725 + goto _test_eof + _test_eof3726: + cs = 3726 + goto _test_eof + _test_eof3727: + cs = 3727 + goto _test_eof + _test_eof3728: + cs = 3728 + goto _test_eof + _test_eof3729: + cs = 3729 + goto _test_eof + _test_eof3730: + cs = 3730 + goto _test_eof + _test_eof3731: + cs = 3731 + goto _test_eof + _test_eof3732: + cs = 3732 + goto _test_eof + _test_eof3733: + cs = 3733 + goto _test_eof + _test_eof3734: + cs = 3734 + goto _test_eof + _test_eof3735: + cs = 3735 + goto _test_eof + _test_eof3736: + cs = 3736 + goto _test_eof + _test_eof5077: + cs = 5077 + goto _test_eof + _test_eof3737: + cs = 3737 + goto _test_eof + _test_eof5078: + cs = 5078 + goto _test_eof + _test_eof3738: + cs = 3738 + goto _test_eof + _test_eof3739: + cs = 3739 + goto _test_eof + _test_eof3740: + cs = 3740 + goto _test_eof + _test_eof3741: + cs = 3741 + goto _test_eof + _test_eof3742: + cs = 3742 + goto _test_eof + _test_eof3743: + cs = 3743 + goto _test_eof + _test_eof3744: + cs = 3744 + goto _test_eof + _test_eof3745: + cs = 3745 + goto _test_eof + _test_eof3746: + cs = 3746 + goto _test_eof + _test_eof3747: + cs = 3747 + goto _test_eof + _test_eof3748: + cs = 3748 + goto _test_eof + _test_eof3749: + cs = 3749 + goto _test_eof + _test_eof3750: + cs = 3750 + goto _test_eof + _test_eof3751: + cs = 3751 + goto _test_eof + _test_eof3752: + cs = 3752 + goto _test_eof + _test_eof3753: + cs = 3753 + goto _test_eof + _test_eof3754: + cs = 3754 + goto _test_eof + _test_eof3755: + cs = 3755 + goto _test_eof + _test_eof3756: + cs = 3756 + goto _test_eof + _test_eof3757: + cs = 3757 + goto _test_eof + _test_eof3758: + cs = 3758 + goto _test_eof + _test_eof3759: + cs = 3759 + goto _test_eof + _test_eof3760: + cs = 3760 + goto _test_eof + _test_eof3761: + cs = 3761 + goto _test_eof + _test_eof3762: + cs = 3762 + goto _test_eof + _test_eof3763: + cs = 3763 + goto _test_eof + _test_eof3764: + cs = 3764 + goto _test_eof + _test_eof3765: + cs = 3765 + goto _test_eof + _test_eof3766: + cs = 3766 + goto _test_eof + _test_eof3767: + cs = 3767 + goto _test_eof + _test_eof3768: + cs = 3768 + goto _test_eof + _test_eof3769: + cs = 3769 + goto _test_eof + _test_eof3770: + cs = 3770 + goto _test_eof + _test_eof3771: + cs = 3771 + goto _test_eof + _test_eof3772: + cs = 3772 + goto _test_eof + _test_eof3773: + cs = 3773 + goto _test_eof + _test_eof3774: + cs = 3774 + goto _test_eof + _test_eof3775: + cs = 3775 + goto _test_eof + _test_eof3776: + cs = 3776 + goto _test_eof + _test_eof3777: + cs = 3777 + goto _test_eof + _test_eof3778: + cs = 3778 + goto _test_eof + _test_eof3779: + cs = 3779 + goto _test_eof + _test_eof3780: + cs = 3780 + goto _test_eof + _test_eof3781: + cs = 3781 + goto _test_eof + _test_eof3782: + cs = 3782 + goto _test_eof + _test_eof3783: + cs = 3783 + goto _test_eof + _test_eof3784: + cs = 3784 + goto _test_eof + _test_eof3785: + cs = 3785 + goto _test_eof + _test_eof3786: + cs = 3786 + goto _test_eof + _test_eof3787: + cs = 3787 + goto _test_eof + _test_eof3788: + cs = 3788 + goto _test_eof + _test_eof3789: + cs = 3789 + goto _test_eof + _test_eof3790: + cs = 3790 + goto _test_eof + _test_eof3791: + cs = 3791 + goto _test_eof + _test_eof3792: + cs = 3792 + goto _test_eof + _test_eof3793: + cs = 3793 + goto _test_eof + _test_eof3794: + cs = 3794 + goto _test_eof + _test_eof3795: + cs = 3795 + goto _test_eof + _test_eof3796: + cs = 3796 + goto _test_eof + _test_eof3797: + cs = 3797 + goto _test_eof + _test_eof3798: + cs = 3798 + goto _test_eof + _test_eof3799: + cs = 3799 + goto _test_eof + _test_eof3800: + cs = 3800 + goto _test_eof + _test_eof3801: + cs = 3801 + goto _test_eof + _test_eof3802: + cs = 3802 + goto _test_eof + _test_eof3803: + cs = 3803 + goto _test_eof + _test_eof3804: + cs = 3804 + goto _test_eof + _test_eof3805: + cs = 3805 + goto _test_eof + _test_eof3806: + cs = 3806 + goto _test_eof + _test_eof3807: + cs = 3807 + goto _test_eof + _test_eof3808: + cs = 3808 + goto _test_eof + _test_eof3809: + cs = 3809 + goto _test_eof + _test_eof3810: + cs = 3810 + goto _test_eof + _test_eof3811: + cs = 3811 + goto _test_eof + _test_eof3812: + cs = 3812 + goto _test_eof + _test_eof3813: + cs = 3813 + goto _test_eof + _test_eof3814: + cs = 3814 + goto _test_eof + _test_eof3815: + cs = 3815 + goto _test_eof + _test_eof3816: + cs = 3816 + goto _test_eof + _test_eof3817: + cs = 3817 + goto _test_eof + _test_eof3818: + cs = 3818 + goto _test_eof + _test_eof3819: + cs = 3819 + goto _test_eof + _test_eof3820: + cs = 3820 + goto _test_eof + _test_eof3821: + cs = 3821 + goto _test_eof + _test_eof3822: + cs = 3822 + goto _test_eof + _test_eof3823: + cs = 3823 + goto _test_eof + _test_eof3824: + cs = 3824 + goto _test_eof + _test_eof3825: + cs = 3825 + goto _test_eof + _test_eof3826: + cs = 3826 + goto _test_eof + _test_eof3827: + cs = 3827 + goto _test_eof + _test_eof3828: + cs = 3828 + goto _test_eof + _test_eof3829: + cs = 3829 + goto _test_eof + _test_eof3830: + cs = 3830 + goto _test_eof + _test_eof3831: + cs = 3831 + goto _test_eof + _test_eof3832: + cs = 3832 + goto _test_eof + _test_eof3833: + cs = 3833 + goto _test_eof + _test_eof3834: + cs = 3834 + goto _test_eof + _test_eof3835: + cs = 3835 + goto _test_eof + _test_eof3836: + cs = 3836 + goto _test_eof + _test_eof3837: + cs = 3837 + goto _test_eof + _test_eof3838: + cs = 3838 + goto _test_eof + _test_eof3839: + cs = 3839 + goto _test_eof + _test_eof3840: + cs = 3840 + goto _test_eof + _test_eof3841: + cs = 3841 + goto _test_eof + _test_eof3842: + cs = 3842 + goto _test_eof + _test_eof3843: + cs = 3843 + goto _test_eof + _test_eof3844: + cs = 3844 + goto _test_eof + _test_eof3845: + cs = 3845 + goto _test_eof + _test_eof3846: + cs = 3846 + goto _test_eof + _test_eof3847: + cs = 3847 + goto _test_eof + _test_eof3848: + cs = 3848 + goto _test_eof + _test_eof3849: + cs = 3849 + goto _test_eof + _test_eof3850: + cs = 3850 + goto _test_eof + _test_eof3851: + cs = 3851 + goto _test_eof + _test_eof3852: + cs = 3852 + goto _test_eof + _test_eof3853: + cs = 3853 + goto _test_eof + _test_eof3854: + cs = 3854 + goto _test_eof + _test_eof3855: + cs = 3855 + goto _test_eof + _test_eof3856: + cs = 3856 + goto _test_eof + _test_eof3857: + cs = 3857 + goto _test_eof + _test_eof3858: + cs = 3858 + goto _test_eof + _test_eof3859: + cs = 3859 + goto _test_eof + _test_eof3860: + cs = 3860 + goto _test_eof + _test_eof3861: + cs = 3861 + goto _test_eof + _test_eof3862: + cs = 3862 + goto _test_eof + _test_eof3863: + cs = 3863 + goto _test_eof + _test_eof3864: + cs = 3864 + goto _test_eof + _test_eof3865: + cs = 3865 + goto _test_eof + _test_eof3866: + cs = 3866 + goto _test_eof + _test_eof3867: + cs = 3867 + goto _test_eof + _test_eof3868: + cs = 3868 + goto _test_eof + _test_eof3869: + cs = 3869 + goto _test_eof + _test_eof3870: + cs = 3870 + goto _test_eof + _test_eof3871: + cs = 3871 + goto _test_eof + _test_eof3872: + cs = 3872 + goto _test_eof + _test_eof3873: + cs = 3873 + goto _test_eof + _test_eof3874: + cs = 3874 + goto _test_eof + _test_eof3875: + cs = 3875 + goto _test_eof + _test_eof3876: + cs = 3876 + goto _test_eof + _test_eof3877: + cs = 3877 + goto _test_eof + _test_eof3878: + cs = 3878 + goto _test_eof + _test_eof3879: + cs = 3879 + goto _test_eof + _test_eof3880: + cs = 3880 + goto _test_eof + _test_eof3881: + cs = 3881 + goto _test_eof + _test_eof3882: + cs = 3882 + goto _test_eof + _test_eof3883: + cs = 3883 + goto _test_eof + _test_eof3884: + cs = 3884 + goto _test_eof + _test_eof5079: + cs = 5079 + goto _test_eof + _test_eof3885: + cs = 3885 + goto _test_eof + _test_eof3886: + cs = 3886 + goto _test_eof + _test_eof3887: + cs = 3887 + goto _test_eof + _test_eof3888: + cs = 3888 + goto _test_eof + _test_eof3889: + cs = 3889 + goto _test_eof + _test_eof3890: + cs = 3890 + goto _test_eof + _test_eof3891: + cs = 3891 + goto _test_eof + _test_eof3892: + cs = 3892 + goto _test_eof + _test_eof3893: + cs = 3893 + goto _test_eof + _test_eof3894: + cs = 3894 + goto _test_eof + _test_eof3895: + cs = 3895 + goto _test_eof + _test_eof3896: + cs = 3896 + goto _test_eof + _test_eof3897: + cs = 3897 + goto _test_eof + _test_eof3898: + cs = 3898 + goto _test_eof + _test_eof3899: + cs = 3899 + goto _test_eof + _test_eof3900: + cs = 3900 + goto _test_eof + _test_eof3901: + cs = 3901 + goto _test_eof + _test_eof3902: + cs = 3902 + goto _test_eof + _test_eof3903: + cs = 3903 + goto _test_eof + _test_eof3904: + cs = 3904 + goto _test_eof + _test_eof3905: + cs = 3905 + goto _test_eof + _test_eof3906: + cs = 3906 + goto _test_eof + _test_eof3907: + cs = 3907 + goto _test_eof + _test_eof3908: + cs = 3908 + goto _test_eof + _test_eof3909: + cs = 3909 + goto _test_eof + _test_eof3910: + cs = 3910 + goto _test_eof + _test_eof3911: + cs = 3911 + goto _test_eof + _test_eof3912: + cs = 3912 + goto _test_eof + _test_eof3913: + cs = 3913 + goto _test_eof + _test_eof3914: + cs = 3914 + goto _test_eof + _test_eof3915: + cs = 3915 + goto _test_eof + _test_eof3916: + cs = 3916 + goto _test_eof + _test_eof3917: + cs = 3917 + goto _test_eof + _test_eof3918: + cs = 3918 + goto _test_eof + _test_eof3919: + cs = 3919 + goto _test_eof + _test_eof3920: + cs = 3920 + goto _test_eof + _test_eof3921: + cs = 3921 + goto _test_eof + _test_eof3922: + cs = 3922 + goto _test_eof + _test_eof3923: + cs = 3923 + goto _test_eof + _test_eof3924: + cs = 3924 + goto _test_eof + _test_eof3925: + cs = 3925 + goto _test_eof + _test_eof3926: + cs = 3926 + goto _test_eof + _test_eof3927: + cs = 3927 + goto _test_eof + _test_eof3928: + cs = 3928 + goto _test_eof + _test_eof3929: + cs = 3929 + goto _test_eof + _test_eof3930: + cs = 3930 + goto _test_eof + _test_eof3931: + cs = 3931 + goto _test_eof + _test_eof3932: + cs = 3932 + goto _test_eof + _test_eof3933: + cs = 3933 + goto _test_eof + _test_eof3934: + cs = 3934 + goto _test_eof + _test_eof3935: + cs = 3935 + goto _test_eof + _test_eof3936: + cs = 3936 + goto _test_eof + _test_eof3937: + cs = 3937 + goto _test_eof + _test_eof3938: + cs = 3938 + goto _test_eof + _test_eof3939: + cs = 3939 + goto _test_eof + _test_eof3940: + cs = 3940 + goto _test_eof + _test_eof3941: + cs = 3941 + goto _test_eof + _test_eof3942: + cs = 3942 + goto _test_eof + _test_eof3943: + cs = 3943 + goto _test_eof + _test_eof3944: + cs = 3944 + goto _test_eof + _test_eof3945: + cs = 3945 + goto _test_eof + _test_eof3946: + cs = 3946 + goto _test_eof + _test_eof3947: + cs = 3947 + goto _test_eof + _test_eof3948: + cs = 3948 + goto _test_eof + _test_eof3949: + cs = 3949 + goto _test_eof + _test_eof3950: + cs = 3950 + goto _test_eof + _test_eof3951: + cs = 3951 + goto _test_eof + _test_eof3952: + cs = 3952 + goto _test_eof + _test_eof3953: + cs = 3953 + goto _test_eof + _test_eof3954: + cs = 3954 + goto _test_eof + _test_eof3955: + cs = 3955 + goto _test_eof + _test_eof3956: + cs = 3956 + goto _test_eof + _test_eof3957: + cs = 3957 + goto _test_eof + _test_eof3958: + cs = 3958 + goto _test_eof + _test_eof3959: + cs = 3959 + goto _test_eof + _test_eof3960: + cs = 3960 + goto _test_eof + _test_eof3961: + cs = 3961 + goto _test_eof + _test_eof3962: + cs = 3962 + goto _test_eof + _test_eof3963: + cs = 3963 + goto _test_eof + _test_eof3964: + cs = 3964 + goto _test_eof + _test_eof3965: + cs = 3965 + goto _test_eof + _test_eof3966: + cs = 3966 + goto _test_eof + _test_eof3967: + cs = 3967 + goto _test_eof + _test_eof3968: + cs = 3968 + goto _test_eof + _test_eof3969: + cs = 3969 + goto _test_eof + _test_eof3970: + cs = 3970 + goto _test_eof + _test_eof3971: + cs = 3971 + goto _test_eof + _test_eof3972: + cs = 3972 + goto _test_eof + _test_eof3973: + cs = 3973 + goto _test_eof + _test_eof3974: + cs = 3974 + goto _test_eof + _test_eof3975: + cs = 3975 + goto _test_eof + _test_eof3976: + cs = 3976 + goto _test_eof + _test_eof3977: + cs = 3977 + goto _test_eof + _test_eof3978: + cs = 3978 + goto _test_eof + _test_eof3979: + cs = 3979 + goto _test_eof + _test_eof3980: + cs = 3980 + goto _test_eof + _test_eof3981: + cs = 3981 + goto _test_eof + _test_eof3982: + cs = 3982 + goto _test_eof + _test_eof3983: + cs = 3983 + goto _test_eof + _test_eof3984: + cs = 3984 + goto _test_eof + _test_eof3985: + cs = 3985 + goto _test_eof + _test_eof3986: + cs = 3986 + goto _test_eof + _test_eof3987: + cs = 3987 + goto _test_eof + _test_eof3988: + cs = 3988 + goto _test_eof + _test_eof3989: + cs = 3989 + goto _test_eof + _test_eof3990: + cs = 3990 + goto _test_eof + _test_eof3991: + cs = 3991 + goto _test_eof + _test_eof3992: + cs = 3992 + goto _test_eof + _test_eof3993: + cs = 3993 + goto _test_eof + _test_eof3994: + cs = 3994 + goto _test_eof + _test_eof3995: + cs = 3995 + goto _test_eof + _test_eof3996: + cs = 3996 + goto _test_eof + _test_eof3997: + cs = 3997 + goto _test_eof + _test_eof3998: + cs = 3998 + goto _test_eof + _test_eof3999: + cs = 3999 + goto _test_eof + _test_eof4000: + cs = 4000 + goto _test_eof + _test_eof4001: + cs = 4001 + goto _test_eof + _test_eof4002: + cs = 4002 + goto _test_eof + _test_eof4003: + cs = 4003 + goto _test_eof + _test_eof4004: + cs = 4004 + goto _test_eof + _test_eof4005: + cs = 4005 + goto _test_eof + _test_eof4006: + cs = 4006 + goto _test_eof + _test_eof4007: + cs = 4007 + goto _test_eof + _test_eof4008: + cs = 4008 + goto _test_eof + _test_eof4009: + cs = 4009 + goto _test_eof + _test_eof4010: + cs = 4010 + goto _test_eof + _test_eof4011: + cs = 4011 + goto _test_eof + _test_eof4012: + cs = 4012 + goto _test_eof + _test_eof4013: + cs = 4013 + goto _test_eof + _test_eof4014: + cs = 4014 + goto _test_eof + _test_eof4015: + cs = 4015 + goto _test_eof + _test_eof4016: + cs = 4016 + goto _test_eof + _test_eof4017: + cs = 4017 + goto _test_eof + _test_eof4018: + cs = 4018 + goto _test_eof + _test_eof4019: + cs = 4019 + goto _test_eof + _test_eof4020: + cs = 4020 + goto _test_eof + _test_eof4021: + cs = 4021 + goto _test_eof + _test_eof4022: + cs = 4022 + goto _test_eof + _test_eof4023: + cs = 4023 + goto _test_eof + _test_eof4024: + cs = 4024 + goto _test_eof + _test_eof4025: + cs = 4025 + goto _test_eof + _test_eof4026: + cs = 4026 + goto _test_eof + _test_eof5080: + cs = 5080 + goto _test_eof + _test_eof4027: + cs = 4027 + goto _test_eof + _test_eof4028: + cs = 4028 + goto _test_eof + _test_eof4029: + cs = 4029 + goto _test_eof + _test_eof4030: + cs = 4030 + goto _test_eof + _test_eof4031: + cs = 4031 + goto _test_eof + _test_eof4032: + cs = 4032 + goto _test_eof + _test_eof4033: + cs = 4033 + goto _test_eof + _test_eof4034: + cs = 4034 + goto _test_eof + _test_eof4035: + cs = 4035 + goto _test_eof + _test_eof4036: + cs = 4036 + goto _test_eof + _test_eof4037: + cs = 4037 + goto _test_eof + _test_eof4038: + cs = 4038 + goto _test_eof + _test_eof4039: + cs = 4039 + goto _test_eof + _test_eof4040: + cs = 4040 + goto _test_eof + _test_eof4041: + cs = 4041 + goto _test_eof + _test_eof4042: + cs = 4042 + goto _test_eof + _test_eof4043: + cs = 4043 + goto _test_eof + _test_eof4044: + cs = 4044 + goto _test_eof + _test_eof4045: + cs = 4045 + goto _test_eof + _test_eof4046: + cs = 4046 + goto _test_eof + _test_eof4047: + cs = 4047 + goto _test_eof + _test_eof4048: + cs = 4048 + goto _test_eof + _test_eof4049: + cs = 4049 + goto _test_eof + _test_eof4050: + cs = 4050 + goto _test_eof + _test_eof4051: + cs = 4051 + goto _test_eof + _test_eof4052: + cs = 4052 + goto _test_eof + _test_eof4053: + cs = 4053 + goto _test_eof + _test_eof4054: + cs = 4054 + goto _test_eof + _test_eof4055: + cs = 4055 + goto _test_eof + _test_eof4056: + cs = 4056 + goto _test_eof + _test_eof4057: + cs = 4057 + goto _test_eof + _test_eof4058: + cs = 4058 + goto _test_eof + _test_eof4059: + cs = 4059 + goto _test_eof + _test_eof4060: + cs = 4060 + goto _test_eof + _test_eof4061: + cs = 4061 + goto _test_eof + _test_eof4062: + cs = 4062 + goto _test_eof + _test_eof4063: + cs = 4063 + goto _test_eof + _test_eof4064: + cs = 4064 + goto _test_eof + _test_eof4065: + cs = 4065 + goto _test_eof + _test_eof4066: + cs = 4066 + goto _test_eof + _test_eof4067: + cs = 4067 + goto _test_eof + _test_eof4068: + cs = 4068 + goto _test_eof + _test_eof4069: + cs = 4069 + goto _test_eof + _test_eof4070: + cs = 4070 + goto _test_eof + _test_eof4071: + cs = 4071 + goto _test_eof + _test_eof4072: + cs = 4072 + goto _test_eof + _test_eof4073: + cs = 4073 + goto _test_eof + _test_eof4074: + cs = 4074 + goto _test_eof + _test_eof4075: + cs = 4075 + goto _test_eof + _test_eof4076: + cs = 4076 + goto _test_eof + _test_eof4077: + cs = 4077 + goto _test_eof + _test_eof4078: + cs = 4078 + goto _test_eof + _test_eof4079: + cs = 4079 + goto _test_eof + _test_eof4080: + cs = 4080 + goto _test_eof + _test_eof4081: + cs = 4081 + goto _test_eof + _test_eof4082: + cs = 4082 + goto _test_eof + _test_eof4083: + cs = 4083 + goto _test_eof + _test_eof4084: + cs = 4084 + goto _test_eof + _test_eof4085: + cs = 4085 + goto _test_eof + _test_eof4086: + cs = 4086 + goto _test_eof + _test_eof4087: + cs = 4087 + goto _test_eof + _test_eof4088: + cs = 4088 + goto _test_eof + _test_eof4089: + cs = 4089 + goto _test_eof + _test_eof4090: + cs = 4090 + goto _test_eof + _test_eof4091: + cs = 4091 + goto _test_eof + _test_eof4092: + cs = 4092 + goto _test_eof + _test_eof4093: + cs = 4093 + goto _test_eof + _test_eof4094: + cs = 4094 + goto _test_eof + _test_eof4095: + cs = 4095 + goto _test_eof + _test_eof4096: + cs = 4096 + goto _test_eof + _test_eof4097: + cs = 4097 + goto _test_eof + _test_eof4098: + cs = 4098 + goto _test_eof + _test_eof4099: + cs = 4099 + goto _test_eof + _test_eof4100: + cs = 4100 + goto _test_eof + _test_eof4101: + cs = 4101 + goto _test_eof + _test_eof4102: + cs = 4102 + goto _test_eof + _test_eof4103: + cs = 4103 + goto _test_eof + _test_eof4104: + cs = 4104 + goto _test_eof + _test_eof4105: + cs = 4105 + goto _test_eof + _test_eof4106: + cs = 4106 + goto _test_eof + _test_eof4107: + cs = 4107 + goto _test_eof + _test_eof4108: + cs = 4108 + goto _test_eof + _test_eof4109: + cs = 4109 + goto _test_eof + _test_eof4110: + cs = 4110 + goto _test_eof + _test_eof4111: + cs = 4111 + goto _test_eof + _test_eof4112: + cs = 4112 + goto _test_eof + _test_eof4113: + cs = 4113 + goto _test_eof + _test_eof4114: + cs = 4114 + goto _test_eof + _test_eof4115: + cs = 4115 + goto _test_eof + _test_eof4116: + cs = 4116 + goto _test_eof + _test_eof4117: + cs = 4117 + goto _test_eof + _test_eof4118: + cs = 4118 + goto _test_eof + _test_eof4119: + cs = 4119 + goto _test_eof + _test_eof4120: + cs = 4120 + goto _test_eof + _test_eof4121: + cs = 4121 + goto _test_eof + _test_eof4122: + cs = 4122 + goto _test_eof + _test_eof4123: + cs = 4123 + goto _test_eof + _test_eof4124: + cs = 4124 + goto _test_eof + _test_eof4125: + cs = 4125 + goto _test_eof + _test_eof4126: + cs = 4126 + goto _test_eof + _test_eof4127: + cs = 4127 + goto _test_eof + _test_eof4128: + cs = 4128 + goto _test_eof + _test_eof4129: + cs = 4129 + goto _test_eof + _test_eof4130: + cs = 4130 + goto _test_eof + _test_eof4131: + cs = 4131 + goto _test_eof + _test_eof4132: + cs = 4132 + goto _test_eof + _test_eof4133: + cs = 4133 + goto _test_eof + _test_eof4134: + cs = 4134 + goto _test_eof + _test_eof4135: + cs = 4135 + goto _test_eof + _test_eof4136: + cs = 4136 + goto _test_eof + _test_eof4137: + cs = 4137 + goto _test_eof + _test_eof4138: + cs = 4138 + goto _test_eof + _test_eof4139: + cs = 4139 + goto _test_eof + _test_eof4140: + cs = 4140 + goto _test_eof + _test_eof4141: + cs = 4141 + goto _test_eof + _test_eof4142: + cs = 4142 + goto _test_eof + _test_eof4143: + cs = 4143 + goto _test_eof + _test_eof4144: + cs = 4144 + goto _test_eof + _test_eof4145: + cs = 4145 + goto _test_eof + _test_eof4146: + cs = 4146 + goto _test_eof + _test_eof4147: + cs = 4147 + goto _test_eof + _test_eof4148: + cs = 4148 + goto _test_eof + _test_eof4149: + cs = 4149 + goto _test_eof + _test_eof4150: + cs = 4150 + goto _test_eof + _test_eof4151: + cs = 4151 + goto _test_eof + _test_eof4152: + cs = 4152 + goto _test_eof + _test_eof4153: + cs = 4153 + goto _test_eof + _test_eof4154: + cs = 4154 + goto _test_eof + _test_eof4155: + cs = 4155 + goto _test_eof + _test_eof4156: + cs = 4156 + goto _test_eof + _test_eof4157: + cs = 4157 + goto _test_eof + _test_eof4158: + cs = 4158 + goto _test_eof + _test_eof4159: + cs = 4159 + goto _test_eof + _test_eof4160: + cs = 4160 + goto _test_eof + _test_eof4161: + cs = 4161 + goto _test_eof + _test_eof4162: + cs = 4162 + goto _test_eof + _test_eof4163: + cs = 4163 + goto _test_eof + _test_eof4164: + cs = 4164 + goto _test_eof + _test_eof4165: + cs = 4165 + goto _test_eof + _test_eof4166: + cs = 4166 + goto _test_eof + _test_eof4167: + cs = 4167 + goto _test_eof + _test_eof4168: + cs = 4168 + goto _test_eof + _test_eof4169: + cs = 4169 + goto _test_eof + _test_eof4170: + cs = 4170 + goto _test_eof + _test_eof4171: + cs = 4171 + goto _test_eof + _test_eof4172: + cs = 4172 + goto _test_eof + _test_eof4173: + cs = 4173 + goto _test_eof + _test_eof4174: + cs = 4174 + goto _test_eof + _test_eof4175: + cs = 4175 + goto _test_eof + _test_eof5081: + cs = 5081 + goto _test_eof + _test_eof4176: + cs = 4176 + goto _test_eof + _test_eof4177: + cs = 4177 + goto _test_eof + _test_eof4178: + cs = 4178 + goto _test_eof + _test_eof4179: + cs = 4179 + goto _test_eof + _test_eof4180: + cs = 4180 + goto _test_eof + _test_eof4181: + cs = 4181 + goto _test_eof + _test_eof4182: + cs = 4182 + goto _test_eof + _test_eof4183: + cs = 4183 + goto _test_eof + _test_eof4184: + cs = 4184 + goto _test_eof + _test_eof4185: + cs = 4185 + goto _test_eof + _test_eof4186: + cs = 4186 + goto _test_eof + _test_eof4187: + cs = 4187 + goto _test_eof + _test_eof4188: + cs = 4188 + goto _test_eof + _test_eof4189: + cs = 4189 + goto _test_eof + _test_eof4190: + cs = 4190 + goto _test_eof + _test_eof4191: + cs = 4191 + goto _test_eof + _test_eof4192: + cs = 4192 + goto _test_eof + _test_eof4193: + cs = 4193 + goto _test_eof + _test_eof4194: + cs = 4194 + goto _test_eof + _test_eof4195: + cs = 4195 + goto _test_eof + _test_eof4196: + cs = 4196 + goto _test_eof + _test_eof4197: + cs = 4197 + goto _test_eof + _test_eof4198: + cs = 4198 + goto _test_eof + _test_eof4199: + cs = 4199 + goto _test_eof + _test_eof4200: + cs = 4200 + goto _test_eof + _test_eof4201: + cs = 4201 + goto _test_eof + _test_eof4202: + cs = 4202 + goto _test_eof + _test_eof4203: + cs = 4203 + goto _test_eof + _test_eof4204: + cs = 4204 + goto _test_eof + _test_eof4205: + cs = 4205 + goto _test_eof + _test_eof4206: + cs = 4206 + goto _test_eof + _test_eof4207: + cs = 4207 + goto _test_eof + _test_eof4208: + cs = 4208 + goto _test_eof + _test_eof4209: + cs = 4209 + goto _test_eof + _test_eof4210: + cs = 4210 + goto _test_eof + _test_eof4211: + cs = 4211 + goto _test_eof + _test_eof4212: + cs = 4212 + goto _test_eof + _test_eof4213: + cs = 4213 + goto _test_eof + _test_eof4214: + cs = 4214 + goto _test_eof + _test_eof4215: + cs = 4215 + goto _test_eof + _test_eof4216: + cs = 4216 + goto _test_eof + _test_eof4217: + cs = 4217 + goto _test_eof + _test_eof4218: + cs = 4218 + goto _test_eof + _test_eof4219: + cs = 4219 + goto _test_eof + _test_eof4220: + cs = 4220 + goto _test_eof + _test_eof4221: + cs = 4221 + goto _test_eof + _test_eof4222: + cs = 4222 + goto _test_eof + _test_eof4223: + cs = 4223 + goto _test_eof + _test_eof4224: + cs = 4224 + goto _test_eof + _test_eof4225: + cs = 4225 + goto _test_eof + _test_eof4226: + cs = 4226 + goto _test_eof + _test_eof4227: + cs = 4227 + goto _test_eof + _test_eof4228: + cs = 4228 + goto _test_eof + _test_eof4229: + cs = 4229 + goto _test_eof + _test_eof4230: + cs = 4230 + goto _test_eof + _test_eof4231: + cs = 4231 + goto _test_eof + _test_eof4232: + cs = 4232 + goto _test_eof + _test_eof4233: + cs = 4233 + goto _test_eof + _test_eof4234: + cs = 4234 + goto _test_eof + _test_eof4235: + cs = 4235 + goto _test_eof + _test_eof4236: + cs = 4236 + goto _test_eof + _test_eof4237: + cs = 4237 + goto _test_eof + _test_eof4238: + cs = 4238 + goto _test_eof + _test_eof4239: + cs = 4239 + goto _test_eof + _test_eof4240: + cs = 4240 + goto _test_eof + _test_eof4241: + cs = 4241 + goto _test_eof + _test_eof4242: + cs = 4242 + goto _test_eof + _test_eof4243: + cs = 4243 + goto _test_eof + _test_eof4244: + cs = 4244 + goto _test_eof + _test_eof4245: + cs = 4245 + goto _test_eof + _test_eof4246: + cs = 4246 + goto _test_eof + _test_eof4247: + cs = 4247 + goto _test_eof + _test_eof4248: + cs = 4248 + goto _test_eof + _test_eof4249: + cs = 4249 + goto _test_eof + _test_eof4250: + cs = 4250 + goto _test_eof + _test_eof4251: + cs = 4251 + goto _test_eof + _test_eof4252: + cs = 4252 + goto _test_eof + _test_eof4253: + cs = 4253 + goto _test_eof + _test_eof4254: + cs = 4254 + goto _test_eof + _test_eof4255: + cs = 4255 + goto _test_eof + _test_eof4256: + cs = 4256 + goto _test_eof + _test_eof4257: + cs = 4257 + goto _test_eof + _test_eof4258: + cs = 4258 + goto _test_eof + _test_eof4259: + cs = 4259 + goto _test_eof + _test_eof4260: + cs = 4260 + goto _test_eof + _test_eof4261: + cs = 4261 + goto _test_eof + _test_eof4262: + cs = 4262 + goto _test_eof + _test_eof4263: + cs = 4263 + goto _test_eof + _test_eof4264: + cs = 4264 + goto _test_eof + _test_eof4265: + cs = 4265 + goto _test_eof + _test_eof4266: + cs = 4266 + goto _test_eof + _test_eof4267: + cs = 4267 + goto _test_eof + _test_eof4268: + cs = 4268 + goto _test_eof + _test_eof4269: + cs = 4269 + goto _test_eof + _test_eof4270: + cs = 4270 + goto _test_eof + _test_eof4271: + cs = 4271 + goto _test_eof + _test_eof4272: + cs = 4272 + goto _test_eof + _test_eof4273: + cs = 4273 + goto _test_eof + _test_eof4274: + cs = 4274 + goto _test_eof + _test_eof4275: + cs = 4275 + goto _test_eof + _test_eof4276: + cs = 4276 + goto _test_eof + _test_eof4277: + cs = 4277 + goto _test_eof + _test_eof4278: + cs = 4278 + goto _test_eof + _test_eof4279: + cs = 4279 + goto _test_eof + _test_eof4280: + cs = 4280 + goto _test_eof + _test_eof4281: + cs = 4281 + goto _test_eof + _test_eof4282: + cs = 4282 + goto _test_eof + _test_eof4283: + cs = 4283 + goto _test_eof + _test_eof4284: + cs = 4284 + goto _test_eof + _test_eof4285: + cs = 4285 + goto _test_eof + _test_eof4286: + cs = 4286 + goto _test_eof + _test_eof4287: + cs = 4287 + goto _test_eof + _test_eof4288: + cs = 4288 + goto _test_eof + _test_eof4289: + cs = 4289 + goto _test_eof + _test_eof4290: + cs = 4290 + goto _test_eof + _test_eof4291: + cs = 4291 + goto _test_eof + _test_eof4292: + cs = 4292 + goto _test_eof + _test_eof4293: + cs = 4293 + goto _test_eof + _test_eof4294: + cs = 4294 + goto _test_eof + _test_eof4295: + cs = 4295 + goto _test_eof + _test_eof4296: + cs = 4296 + goto _test_eof + _test_eof4297: + cs = 4297 + goto _test_eof + _test_eof4298: + cs = 4298 + goto _test_eof + _test_eof4299: + cs = 4299 + goto _test_eof + _test_eof4300: + cs = 4300 + goto _test_eof + _test_eof4301: + cs = 4301 + goto _test_eof + _test_eof4302: + cs = 4302 + goto _test_eof + _test_eof4303: + cs = 4303 + goto _test_eof + _test_eof4304: + cs = 4304 + goto _test_eof + _test_eof4305: + cs = 4305 + goto _test_eof + _test_eof4306: + cs = 4306 + goto _test_eof + _test_eof4307: + cs = 4307 + goto _test_eof + _test_eof4308: + cs = 4308 + goto _test_eof + _test_eof4309: + cs = 4309 + goto _test_eof + _test_eof4310: + cs = 4310 + goto _test_eof + _test_eof4311: + cs = 4311 + goto _test_eof + _test_eof4312: + cs = 4312 + goto _test_eof + _test_eof4313: + cs = 4313 + goto _test_eof + _test_eof4314: + cs = 4314 + goto _test_eof + _test_eof4315: + cs = 4315 + goto _test_eof + _test_eof4316: + cs = 4316 + goto _test_eof + _test_eof4317: + cs = 4317 + goto _test_eof + _test_eof4318: + cs = 4318 + goto _test_eof + _test_eof5082: + cs = 5082 + goto _test_eof + _test_eof4319: + cs = 4319 + goto _test_eof + _test_eof4320: + cs = 4320 + goto _test_eof + _test_eof4321: + cs = 4321 + goto _test_eof + _test_eof4322: + cs = 4322 + goto _test_eof + _test_eof4323: + cs = 4323 + goto _test_eof + _test_eof4324: + cs = 4324 + goto _test_eof + _test_eof4325: + cs = 4325 + goto _test_eof + _test_eof4326: + cs = 4326 + goto _test_eof + _test_eof4327: + cs = 4327 + goto _test_eof + _test_eof4328: + cs = 4328 + goto _test_eof + _test_eof4329: + cs = 4329 + goto _test_eof + _test_eof4330: + cs = 4330 + goto _test_eof + _test_eof4331: + cs = 4331 + goto _test_eof + _test_eof4332: + cs = 4332 + goto _test_eof + _test_eof4333: + cs = 4333 + goto _test_eof + _test_eof4334: + cs = 4334 + goto _test_eof + _test_eof4335: + cs = 4335 + goto _test_eof + _test_eof4336: + cs = 4336 + goto _test_eof + _test_eof4337: + cs = 4337 + goto _test_eof + _test_eof4338: + cs = 4338 + goto _test_eof + _test_eof4339: + cs = 4339 + goto _test_eof + _test_eof4340: + cs = 4340 + goto _test_eof + _test_eof4341: + cs = 4341 + goto _test_eof + _test_eof4342: + cs = 4342 + goto _test_eof + _test_eof4343: + cs = 4343 + goto _test_eof + _test_eof4344: + cs = 4344 + goto _test_eof + _test_eof4345: + cs = 4345 + goto _test_eof + _test_eof4346: + cs = 4346 + goto _test_eof + _test_eof4347: + cs = 4347 + goto _test_eof + _test_eof4348: + cs = 4348 + goto _test_eof + _test_eof4349: + cs = 4349 + goto _test_eof + _test_eof4350: + cs = 4350 + goto _test_eof + _test_eof4351: + cs = 4351 + goto _test_eof + _test_eof4352: + cs = 4352 + goto _test_eof + _test_eof4353: + cs = 4353 + goto _test_eof + _test_eof4354: + cs = 4354 + goto _test_eof + _test_eof4355: + cs = 4355 + goto _test_eof + _test_eof4356: + cs = 4356 + goto _test_eof + _test_eof4357: + cs = 4357 + goto _test_eof + _test_eof4358: + cs = 4358 + goto _test_eof + _test_eof4359: + cs = 4359 + goto _test_eof + _test_eof4360: + cs = 4360 + goto _test_eof + _test_eof4361: + cs = 4361 + goto _test_eof + _test_eof4362: + cs = 4362 + goto _test_eof + _test_eof4363: + cs = 4363 + goto _test_eof + _test_eof4364: + cs = 4364 + goto _test_eof + _test_eof4365: + cs = 4365 + goto _test_eof + _test_eof4366: + cs = 4366 + goto _test_eof + _test_eof4367: + cs = 4367 + goto _test_eof + _test_eof4368: + cs = 4368 + goto _test_eof + _test_eof4369: + cs = 4369 + goto _test_eof + _test_eof4370: + cs = 4370 + goto _test_eof + _test_eof4371: + cs = 4371 + goto _test_eof + _test_eof4372: + cs = 4372 + goto _test_eof + _test_eof4373: + cs = 4373 + goto _test_eof + _test_eof4374: + cs = 4374 + goto _test_eof + _test_eof4375: + cs = 4375 + goto _test_eof + _test_eof4376: + cs = 4376 + goto _test_eof + _test_eof4377: + cs = 4377 + goto _test_eof + _test_eof4378: + cs = 4378 + goto _test_eof + _test_eof4379: + cs = 4379 + goto _test_eof + _test_eof4380: + cs = 4380 + goto _test_eof + _test_eof4381: + cs = 4381 + goto _test_eof + _test_eof4382: + cs = 4382 + goto _test_eof + _test_eof4383: + cs = 4383 + goto _test_eof + _test_eof4384: + cs = 4384 + goto _test_eof + _test_eof4385: + cs = 4385 + goto _test_eof + _test_eof4386: + cs = 4386 + goto _test_eof + _test_eof4387: + cs = 4387 + goto _test_eof + _test_eof4388: + cs = 4388 + goto _test_eof + _test_eof4389: + cs = 4389 + goto _test_eof + _test_eof4390: + cs = 4390 + goto _test_eof + _test_eof4391: + cs = 4391 + goto _test_eof + _test_eof4392: + cs = 4392 + goto _test_eof + _test_eof4393: + cs = 4393 + goto _test_eof + _test_eof4394: + cs = 4394 + goto _test_eof + _test_eof4395: + cs = 4395 + goto _test_eof + _test_eof4396: + cs = 4396 + goto _test_eof + _test_eof4397: + cs = 4397 + goto _test_eof + _test_eof4398: + cs = 4398 + goto _test_eof + _test_eof4399: + cs = 4399 + goto _test_eof + _test_eof4400: + cs = 4400 + goto _test_eof + _test_eof4401: + cs = 4401 + goto _test_eof + _test_eof4402: + cs = 4402 + goto _test_eof + _test_eof4403: + cs = 4403 + goto _test_eof + _test_eof4404: + cs = 4404 + goto _test_eof + _test_eof4405: + cs = 4405 + goto _test_eof + _test_eof4406: + cs = 4406 + goto _test_eof + _test_eof4407: + cs = 4407 + goto _test_eof + _test_eof4408: + cs = 4408 + goto _test_eof + _test_eof4409: + cs = 4409 + goto _test_eof + _test_eof4410: + cs = 4410 + goto _test_eof + _test_eof4411: + cs = 4411 + goto _test_eof + _test_eof4412: + cs = 4412 + goto _test_eof + _test_eof4413: + cs = 4413 + goto _test_eof + _test_eof4414: + cs = 4414 + goto _test_eof + _test_eof4415: + cs = 4415 + goto _test_eof + _test_eof4416: + cs = 4416 + goto _test_eof + _test_eof4417: + cs = 4417 + goto _test_eof + _test_eof4418: + cs = 4418 + goto _test_eof + _test_eof4419: + cs = 4419 + goto _test_eof + _test_eof4420: + cs = 4420 + goto _test_eof + _test_eof4421: + cs = 4421 + goto _test_eof + _test_eof4422: + cs = 4422 + goto _test_eof + _test_eof4423: + cs = 4423 + goto _test_eof + _test_eof4424: + cs = 4424 + goto _test_eof + _test_eof4425: + cs = 4425 + goto _test_eof + _test_eof4426: + cs = 4426 + goto _test_eof + _test_eof4427: + cs = 4427 + goto _test_eof + _test_eof4428: + cs = 4428 + goto _test_eof + _test_eof4429: + cs = 4429 + goto _test_eof + _test_eof4430: + cs = 4430 + goto _test_eof + _test_eof4431: + cs = 4431 + goto _test_eof + _test_eof4432: + cs = 4432 + goto _test_eof + _test_eof4433: + cs = 4433 + goto _test_eof + _test_eof4434: + cs = 4434 + goto _test_eof + _test_eof4435: + cs = 4435 + goto _test_eof + _test_eof4436: + cs = 4436 + goto _test_eof + _test_eof4437: + cs = 4437 + goto _test_eof + _test_eof4438: + cs = 4438 + goto _test_eof + _test_eof4439: + cs = 4439 + goto _test_eof + _test_eof4440: + cs = 4440 + goto _test_eof + _test_eof4441: + cs = 4441 + goto _test_eof + _test_eof4442: + cs = 4442 + goto _test_eof + _test_eof4443: + cs = 4443 + goto _test_eof + _test_eof4444: + cs = 4444 + goto _test_eof + _test_eof4445: + cs = 4445 + goto _test_eof + _test_eof4446: + cs = 4446 + goto _test_eof + _test_eof4447: + cs = 4447 + goto _test_eof + _test_eof4448: + cs = 4448 + goto _test_eof + _test_eof4449: + cs = 4449 + goto _test_eof + _test_eof4450: + cs = 4450 + goto _test_eof + _test_eof4451: + cs = 4451 + goto _test_eof + _test_eof4452: + cs = 4452 + goto _test_eof + _test_eof4453: + cs = 4453 + goto _test_eof + _test_eof4454: + cs = 4454 + goto _test_eof + _test_eof4455: + cs = 4455 + goto _test_eof + _test_eof4456: + cs = 4456 + goto _test_eof + _test_eof4457: + cs = 4457 + goto _test_eof + _test_eof4458: + cs = 4458 + goto _test_eof + _test_eof4459: + cs = 4459 + goto _test_eof + _test_eof4460: + cs = 4460 + goto _test_eof + _test_eof4461: + cs = 4461 + goto _test_eof + _test_eof4462: + cs = 4462 + goto _test_eof + _test_eof4463: + cs = 4463 + goto _test_eof + _test_eof4464: + cs = 4464 + goto _test_eof + _test_eof4465: + cs = 4465 + goto _test_eof + _test_eof4466: + cs = 4466 + goto _test_eof + _test_eof4467: + cs = 4467 + goto _test_eof + _test_eof4468: + cs = 4468 + goto _test_eof + _test_eof4469: + cs = 4469 + goto _test_eof + _test_eof4470: + cs = 4470 + goto _test_eof + _test_eof4471: + cs = 4471 + goto _test_eof + _test_eof4472: + cs = 4472 + goto _test_eof + _test_eof5083: + cs = 5083 + goto _test_eof + _test_eof5084: + cs = 5084 + goto _test_eof + _test_eof5085: + cs = 5085 + goto _test_eof + _test_eof5086: + cs = 5086 + goto _test_eof + _test_eof5087: + cs = 5087 + goto _test_eof + _test_eof5088: + cs = 5088 + goto _test_eof + _test_eof5089: + cs = 5089 + goto _test_eof + _test_eof5090: + cs = 5090 + goto _test_eof + _test_eof5091: + cs = 5091 + goto _test_eof + _test_eof5092: + cs = 5092 + goto _test_eof + _test_eof5093: + cs = 5093 + goto _test_eof + _test_eof5094: + cs = 5094 + goto _test_eof + _test_eof5095: + cs = 5095 + goto _test_eof + _test_eof5096: + cs = 5096 + goto _test_eof + _test_eof5097: + cs = 5097 + goto _test_eof + _test_eof5098: + cs = 5098 + goto _test_eof + _test_eof5099: + cs = 5099 + goto _test_eof + _test_eof5100: + cs = 5100 + goto _test_eof + _test_eof5101: + cs = 5101 + goto _test_eof + _test_eof5102: + cs = 5102 + goto _test_eof + _test_eof5103: + cs = 5103 + goto _test_eof + _test_eof5104: + cs = 5104 + goto _test_eof + _test_eof5105: + cs = 5105 + goto _test_eof + _test_eof5106: + cs = 5106 + goto _test_eof + _test_eof5107: + cs = 5107 + goto _test_eof + _test_eof5108: + cs = 5108 + goto _test_eof + _test_eof5109: + cs = 5109 + goto _test_eof + _test_eof5110: + cs = 5110 + goto _test_eof + _test_eof5111: + cs = 5111 + goto _test_eof + _test_eof5112: + cs = 5112 + goto _test_eof + _test_eof5113: + cs = 5113 + goto _test_eof + _test_eof5114: + cs = 5114 + goto _test_eof + _test_eof5115: + cs = 5115 + goto _test_eof + _test_eof5116: + cs = 5116 + goto _test_eof + _test_eof5117: + cs = 5117 + goto _test_eof + _test_eof5118: + cs = 5118 + goto _test_eof + _test_eof5119: + cs = 5119 + goto _test_eof + _test_eof5120: + cs = 5120 + goto _test_eof + _test_eof5121: + cs = 5121 + goto _test_eof + _test_eof5122: + cs = 5122 + goto _test_eof + _test_eof5123: + cs = 5123 + goto _test_eof + _test_eof5124: + cs = 5124 + goto _test_eof + _test_eof5125: + cs = 5125 + goto _test_eof + _test_eof5126: + cs = 5126 + goto _test_eof + _test_eof5127: + cs = 5127 + goto _test_eof + _test_eof5128: + cs = 5128 + goto _test_eof + _test_eof5129: + cs = 5129 + goto _test_eof + _test_eof5130: + cs = 5130 + goto _test_eof + _test_eof5131: + cs = 5131 + goto _test_eof + _test_eof5132: + cs = 5132 + goto _test_eof + _test_eof5133: + cs = 5133 + goto _test_eof + _test_eof5134: + cs = 5134 + goto _test_eof + _test_eof5135: + cs = 5135 + goto _test_eof + _test_eof5136: + cs = 5136 + goto _test_eof + _test_eof5137: + cs = 5137 + goto _test_eof + _test_eof5138: + cs = 5138 + goto _test_eof + _test_eof5139: + cs = 5139 + goto _test_eof + _test_eof5140: + cs = 5140 + goto _test_eof + _test_eof5141: + cs = 5141 + goto _test_eof + _test_eof5142: + cs = 5142 + goto _test_eof + _test_eof5143: + cs = 5143 + goto _test_eof + _test_eof5144: + cs = 5144 + goto _test_eof + _test_eof5145: + cs = 5145 + goto _test_eof + _test_eof5146: + cs = 5146 + goto _test_eof + _test_eof5147: + cs = 5147 + goto _test_eof + _test_eof5148: + cs = 5148 + goto _test_eof + _test_eof5149: + cs = 5149 + goto _test_eof + _test_eof5150: + cs = 5150 + goto _test_eof + _test_eof5151: + cs = 5151 + goto _test_eof + _test_eof5152: + cs = 5152 + goto _test_eof + _test_eof4473: + cs = 4473 + goto _test_eof + _test_eof5153: + cs = 5153 + goto _test_eof + _test_eof5154: + cs = 5154 + goto _test_eof + _test_eof5155: + cs = 5155 + goto _test_eof + _test_eof5156: + cs = 5156 + goto _test_eof + _test_eof5157: + cs = 5157 + goto _test_eof + _test_eof5158: + cs = 5158 + goto _test_eof + _test_eof5159: + cs = 5159 + goto _test_eof + _test_eof5160: + cs = 5160 + goto _test_eof + _test_eof5161: + cs = 5161 + goto _test_eof + _test_eof5162: + cs = 5162 + goto _test_eof + _test_eof5163: + cs = 5163 + goto _test_eof + _test_eof5164: + cs = 5164 + goto _test_eof + _test_eof5165: + cs = 5165 + goto _test_eof + _test_eof5166: + cs = 5166 + goto _test_eof + _test_eof5167: + cs = 5167 + goto _test_eof + _test_eof5168: + cs = 5168 + goto _test_eof + _test_eof5169: + cs = 5169 + goto _test_eof + _test_eof5170: + cs = 5170 + goto _test_eof + _test_eof5171: + cs = 5171 + goto _test_eof + _test_eof5172: + cs = 5172 + goto _test_eof + _test_eof5173: + cs = 5173 + goto _test_eof + _test_eof4474: + cs = 4474 + goto _test_eof + _test_eof5174: + cs = 5174 + goto _test_eof + _test_eof5175: + cs = 5175 + goto _test_eof + _test_eof5176: + cs = 5176 + goto _test_eof + _test_eof5177: + cs = 5177 + goto _test_eof + _test_eof5178: + cs = 5178 + goto _test_eof + _test_eof5179: + cs = 5179 + goto _test_eof + _test_eof4475: + cs = 4475 + goto _test_eof + _test_eof5180: + cs = 5180 + goto _test_eof + _test_eof5181: + cs = 5181 + goto _test_eof + _test_eof4476: + cs = 4476 + goto _test_eof + _test_eof5182: + cs = 5182 + goto _test_eof + _test_eof5183: + cs = 5183 + goto _test_eof + _test_eof5184: + cs = 5184 + goto _test_eof + _test_eof5185: + cs = 5185 + goto _test_eof + _test_eof5186: + cs = 5186 + goto _test_eof + _test_eof5187: + cs = 5187 + goto _test_eof + _test_eof5188: + cs = 5188 + goto _test_eof + _test_eof5189: + cs = 5189 + goto _test_eof + _test_eof5190: + cs = 5190 + goto _test_eof + _test_eof5191: + cs = 5191 + goto _test_eof + _test_eof5192: + cs = 5192 + goto _test_eof + _test_eof5193: + cs = 5193 + goto _test_eof + _test_eof5194: + cs = 5194 + goto _test_eof + _test_eof5195: + cs = 5195 + goto _test_eof + _test_eof5196: + cs = 5196 + goto _test_eof + _test_eof4477: + cs = 4477 + goto _test_eof + _test_eof5197: + cs = 5197 + goto _test_eof + _test_eof5198: + cs = 5198 + goto _test_eof + _test_eof5199: + cs = 5199 + goto _test_eof + _test_eof4478: + cs = 4478 + goto _test_eof + _test_eof5200: + cs = 5200 + goto _test_eof + _test_eof5201: + cs = 5201 + goto _test_eof + _test_eof5202: + cs = 5202 + goto _test_eof + _test_eof5203: + cs = 5203 + goto _test_eof + _test_eof5204: + cs = 5204 + goto _test_eof + _test_eof5205: + cs = 5205 + goto _test_eof + _test_eof4479: + cs = 4479 + goto _test_eof + _test_eof5206: + cs = 5206 + goto _test_eof + _test_eof5207: + cs = 5207 + goto _test_eof + _test_eof4480: + cs = 4480 + goto _test_eof + _test_eof5208: + cs = 5208 + goto _test_eof + _test_eof5209: + cs = 5209 + goto _test_eof + _test_eof5210: + cs = 5210 + goto _test_eof + _test_eof4481: + cs = 4481 + goto _test_eof + _test_eof4482: + cs = 4482 + goto _test_eof + _test_eof4483: + cs = 4483 + goto _test_eof + _test_eof4484: + cs = 4484 + goto _test_eof + _test_eof4485: + cs = 4485 + goto _test_eof + _test_eof4486: + cs = 4486 + goto _test_eof + _test_eof4487: + cs = 4487 + goto _test_eof + _test_eof4488: + cs = 4488 + goto _test_eof + _test_eof4489: + cs = 4489 + goto _test_eof + _test_eof4490: + cs = 4490 + goto _test_eof + _test_eof4491: + cs = 4491 + goto _test_eof + _test_eof4492: + cs = 4492 + goto _test_eof + _test_eof4493: + cs = 4493 + goto _test_eof + _test_eof4494: + cs = 4494 + goto _test_eof + _test_eof4495: + cs = 4495 + goto _test_eof + _test_eof5211: + cs = 5211 + goto _test_eof + _test_eof4496: + cs = 4496 + goto _test_eof + _test_eof4497: + cs = 4497 + goto _test_eof + _test_eof4498: + cs = 4498 + goto _test_eof + _test_eof4499: + cs = 4499 + goto _test_eof + _test_eof4500: + cs = 4500 + goto _test_eof + _test_eof4501: + cs = 4501 + goto _test_eof + _test_eof4502: + cs = 4502 + goto _test_eof + _test_eof4503: + cs = 4503 + goto _test_eof + _test_eof4504: + cs = 4504 + goto _test_eof + _test_eof4505: + cs = 4505 + goto _test_eof + _test_eof4506: + cs = 4506 + goto _test_eof + _test_eof4507: + cs = 4507 + goto _test_eof + _test_eof4508: + cs = 4508 + goto _test_eof + _test_eof4509: + cs = 4509 + goto _test_eof + _test_eof4510: + cs = 4510 + goto _test_eof + _test_eof4511: + cs = 4511 + goto _test_eof + _test_eof4512: + cs = 4512 + goto _test_eof + _test_eof4513: + cs = 4513 + goto _test_eof + _test_eof4514: + cs = 4514 + goto _test_eof + _test_eof4515: + cs = 4515 + goto _test_eof + _test_eof4516: + cs = 4516 + goto _test_eof + _test_eof4517: + cs = 4517 + goto _test_eof + _test_eof4518: + cs = 4518 + goto _test_eof + _test_eof4519: + cs = 4519 + goto _test_eof + _test_eof4520: + cs = 4520 + goto _test_eof + _test_eof4521: + cs = 4521 + goto _test_eof + _test_eof4522: + cs = 4522 + goto _test_eof + _test_eof4523: + cs = 4523 + goto _test_eof + _test_eof4524: + cs = 4524 + goto _test_eof + _test_eof4525: + cs = 4525 + goto _test_eof + _test_eof4526: + cs = 4526 + goto _test_eof + _test_eof4527: + cs = 4527 + goto _test_eof + _test_eof4528: + cs = 4528 + goto _test_eof + _test_eof4529: + cs = 4529 + goto _test_eof + _test_eof4530: + cs = 4530 + goto _test_eof + _test_eof4531: + cs = 4531 + goto _test_eof + _test_eof4532: + cs = 4532 + goto _test_eof + _test_eof4533: + cs = 4533 + goto _test_eof + _test_eof4534: + cs = 4534 + goto _test_eof + _test_eof4535: + cs = 4535 + goto _test_eof + _test_eof4536: + cs = 4536 + goto _test_eof + _test_eof4537: + cs = 4537 + goto _test_eof + _test_eof4538: + cs = 4538 + goto _test_eof + _test_eof4539: + cs = 4539 + goto _test_eof + _test_eof4540: + cs = 4540 + goto _test_eof + _test_eof4541: + cs = 4541 + goto _test_eof + _test_eof4542: + cs = 4542 + goto _test_eof + _test_eof4543: + cs = 4543 + goto _test_eof + _test_eof4544: + cs = 4544 + goto _test_eof + _test_eof4545: + cs = 4545 + goto _test_eof + _test_eof4546: + cs = 4546 + goto _test_eof + _test_eof4547: + cs = 4547 + goto _test_eof + _test_eof4548: + cs = 4548 + goto _test_eof + _test_eof4549: + cs = 4549 + goto _test_eof + _test_eof4550: + cs = 4550 + goto _test_eof + _test_eof4551: + cs = 4551 + goto _test_eof + _test_eof4552: + cs = 4552 + goto _test_eof + _test_eof4553: + cs = 4553 + goto _test_eof + _test_eof4554: + cs = 4554 + goto _test_eof + _test_eof4555: + cs = 4555 + goto _test_eof + _test_eof4556: + cs = 4556 + goto _test_eof + _test_eof4557: + cs = 4557 + goto _test_eof + _test_eof4558: + cs = 4558 + goto _test_eof + _test_eof4559: + cs = 4559 + goto _test_eof + _test_eof4560: + cs = 4560 + goto _test_eof + _test_eof4561: + cs = 4561 + goto _test_eof + _test_eof4562: + cs = 4562 + goto _test_eof + _test_eof4563: + cs = 4563 + goto _test_eof + _test_eof4564: + cs = 4564 + goto _test_eof + _test_eof4565: + cs = 4565 + goto _test_eof + _test_eof4566: + cs = 4566 + goto _test_eof + _test_eof4567: + cs = 4567 + goto _test_eof + _test_eof4568: + cs = 4568 + goto _test_eof + _test_eof4569: + cs = 4569 + goto _test_eof + _test_eof4570: + cs = 4570 + goto _test_eof + _test_eof4571: + cs = 4571 + goto _test_eof + _test_eof4572: + cs = 4572 + goto _test_eof + _test_eof4573: + cs = 4573 + goto _test_eof + _test_eof4574: + cs = 4574 + goto _test_eof + _test_eof4575: + cs = 4575 + goto _test_eof + _test_eof4576: + cs = 4576 + goto _test_eof + _test_eof4577: + cs = 4577 + goto _test_eof + _test_eof4578: + cs = 4578 + goto _test_eof + _test_eof4579: + cs = 4579 + goto _test_eof + _test_eof4580: + cs = 4580 + goto _test_eof + _test_eof4581: + cs = 4581 + goto _test_eof + _test_eof4582: + cs = 4582 + goto _test_eof + _test_eof4583: + cs = 4583 + goto _test_eof + _test_eof4584: + cs = 4584 + goto _test_eof + _test_eof4585: + cs = 4585 + goto _test_eof + _test_eof4586: + cs = 4586 + goto _test_eof + _test_eof4587: + cs = 4587 + goto _test_eof + _test_eof4588: + cs = 4588 + goto _test_eof + _test_eof4589: + cs = 4589 + goto _test_eof + _test_eof4590: + cs = 4590 + goto _test_eof + _test_eof4591: + cs = 4591 + goto _test_eof + _test_eof4592: + cs = 4592 + goto _test_eof + _test_eof4593: + cs = 4593 + goto _test_eof + _test_eof4594: + cs = 4594 + goto _test_eof + _test_eof4595: + cs = 4595 + goto _test_eof + _test_eof4596: + cs = 4596 + goto _test_eof + _test_eof4597: + cs = 4597 + goto _test_eof + _test_eof4598: + cs = 4598 + goto _test_eof + _test_eof4599: + cs = 4599 + goto _test_eof + _test_eof4600: + cs = 4600 + goto _test_eof + _test_eof4601: + cs = 4601 + goto _test_eof + _test_eof4602: + cs = 4602 + goto _test_eof + _test_eof4603: + cs = 4603 + goto _test_eof + _test_eof4604: + cs = 4604 + goto _test_eof + _test_eof4605: + cs = 4605 + goto _test_eof + _test_eof4606: + cs = 4606 + goto _test_eof + _test_eof4607: + cs = 4607 + goto _test_eof + _test_eof4608: + cs = 4608 + goto _test_eof + _test_eof4609: + cs = 4609 + goto _test_eof + _test_eof4610: + cs = 4610 + goto _test_eof + _test_eof4611: + cs = 4611 + goto _test_eof + _test_eof4612: + cs = 4612 + goto _test_eof + _test_eof4613: + cs = 4613 + goto _test_eof + _test_eof4614: + cs = 4614 + goto _test_eof + _test_eof4615: + cs = 4615 + goto _test_eof + _test_eof4616: + cs = 4616 + goto _test_eof + _test_eof4617: + cs = 4617 + goto _test_eof + _test_eof4618: + cs = 4618 + goto _test_eof + _test_eof4619: + cs = 4619 + goto _test_eof + _test_eof4620: + cs = 4620 + goto _test_eof + _test_eof4621: + cs = 4621 + goto _test_eof + _test_eof4622: + cs = 4622 + goto _test_eof + _test_eof4623: + cs = 4623 + goto _test_eof + _test_eof4624: + cs = 4624 + goto _test_eof + _test_eof4625: + cs = 4625 + goto _test_eof + _test_eof4626: + cs = 4626 + goto _test_eof + _test_eof4627: + cs = 4627 + goto _test_eof + _test_eof4628: + cs = 4628 + goto _test_eof + _test_eof4629: + cs = 4629 + goto _test_eof + _test_eof4630: + cs = 4630 + goto _test_eof + _test_eof4631: + cs = 4631 + goto _test_eof + _test_eof4632: + cs = 4632 + goto _test_eof + _test_eof4633: + cs = 4633 + goto _test_eof + _test_eof4634: + cs = 4634 + goto _test_eof + _test_eof4635: + cs = 4635 + goto _test_eof + _test_eof4636: + cs = 4636 + goto _test_eof + _test_eof4637: + cs = 4637 + goto _test_eof + _test_eof4638: + cs = 4638 + goto _test_eof + _test_eof4639: + cs = 4639 + goto _test_eof + _test_eof4640: + cs = 4640 + goto _test_eof + _test_eof4641: + cs = 4641 + goto _test_eof + _test_eof4642: + cs = 4642 + goto _test_eof + _test_eof4643: + cs = 4643 + goto _test_eof + _test_eof4644: + cs = 4644 + goto _test_eof + _test_eof4645: + cs = 4645 + goto _test_eof + _test_eof4646: + cs = 4646 + goto _test_eof + _test_eof4647: + cs = 4647 + goto _test_eof + _test_eof4648: + cs = 4648 + goto _test_eof + _test_eof4649: + cs = 4649 + goto _test_eof + _test_eof4650: + cs = 4650 + goto _test_eof + _test_eof4651: + cs = 4651 + goto _test_eof + _test_eof4652: + cs = 4652 + goto _test_eof + _test_eof4653: + cs = 4653 + goto _test_eof + _test_eof4654: + cs = 4654 + goto _test_eof + _test_eof4655: + cs = 4655 + goto _test_eof + _test_eof5212: + cs = 5212 + goto _test_eof + _test_eof5213: + cs = 5213 + goto _test_eof + _test_eof5214: + cs = 5214 + goto _test_eof + _test_eof5215: + cs = 5215 + goto _test_eof + _test_eof5216: + cs = 5216 + goto _test_eof + _test_eof5217: + cs = 5217 + goto _test_eof + _test_eof5218: + cs = 5218 + goto _test_eof + _test_eof5219: + cs = 5219 + goto _test_eof + _test_eof5220: + cs = 5220 + goto _test_eof + _test_eof5221: + cs = 5221 + goto _test_eof + _test_eof5222: + cs = 5222 + goto _test_eof + _test_eof5223: + cs = 5223 + goto _test_eof + _test_eof5224: + cs = 5224 + goto _test_eof + _test_eof5225: + cs = 5225 + goto _test_eof + _test_eof5226: + cs = 5226 + goto _test_eof + _test_eof5227: + cs = 5227 + goto _test_eof + _test_eof5228: + cs = 5228 + goto _test_eof + _test_eof5229: + cs = 5229 + goto _test_eof + _test_eof5230: + cs = 5230 + goto _test_eof + _test_eof5231: + cs = 5231 + goto _test_eof + _test_eof5232: + cs = 5232 + goto _test_eof + _test_eof5233: + cs = 5233 + goto _test_eof + _test_eof5234: + cs = 5234 + goto _test_eof + _test_eof5235: + cs = 5235 + goto _test_eof + _test_eof5236: + cs = 5236 + goto _test_eof + _test_eof5237: + cs = 5237 + goto _test_eof + _test_eof5238: + cs = 5238 + goto _test_eof + _test_eof5239: + cs = 5239 + goto _test_eof + _test_eof5240: + cs = 5240 + goto _test_eof + _test_eof5241: + cs = 5241 + goto _test_eof + _test_eof5242: + cs = 5242 + goto _test_eof + _test_eof4656: + cs = 4656 + goto _test_eof + _test_eof5243: + cs = 5243 + goto _test_eof + _test_eof5244: + cs = 5244 + goto _test_eof + _test_eof5245: + cs = 5245 + goto _test_eof + _test_eof5246: + cs = 5246 + goto _test_eof + _test_eof5247: + cs = 5247 + goto _test_eof + _test_eof5248: + cs = 5248 + goto _test_eof + _test_eof5249: + cs = 5249 + goto _test_eof + _test_eof5250: + cs = 5250 + goto _test_eof + _test_eof4657: + cs = 4657 + goto _test_eof + _test_eof5251: + cs = 5251 + goto _test_eof + _test_eof5252: + cs = 5252 + goto _test_eof + _test_eof5253: + cs = 5253 + goto _test_eof + _test_eof5254: + cs = 5254 + goto _test_eof + _test_eof5255: + cs = 5255 + goto _test_eof + _test_eof5256: + cs = 5256 + goto _test_eof + _test_eof4658: + cs = 4658 + goto _test_eof + _test_eof5257: + cs = 5257 + goto _test_eof + _test_eof5258: + cs = 5258 + goto _test_eof + _test_eof4659: + cs = 4659 + goto _test_eof + _test_eof5259: + cs = 5259 + goto _test_eof + _test_eof5260: + cs = 5260 + goto _test_eof + _test_eof5261: + cs = 5261 + goto _test_eof + _test_eof5262: + cs = 5262 + goto _test_eof + _test_eof5263: + cs = 5263 + goto _test_eof + _test_eof5264: + cs = 5264 + goto _test_eof + _test_eof5265: + cs = 5265 + goto _test_eof + _test_eof5266: + cs = 5266 + goto _test_eof + _test_eof5267: + cs = 5267 + goto _test_eof + _test_eof5268: + cs = 5268 + goto _test_eof + _test_eof5269: + cs = 5269 + goto _test_eof + _test_eof5270: + cs = 5270 + goto _test_eof + _test_eof5271: + cs = 5271 + goto _test_eof + _test_eof5272: + cs = 5272 + goto _test_eof + _test_eof5273: + cs = 5273 + goto _test_eof + _test_eof5274: + cs = 5274 + goto _test_eof + _test_eof5275: + cs = 5275 + goto _test_eof + _test_eof5276: + cs = 5276 + goto _test_eof + _test_eof5277: + cs = 5277 + goto _test_eof + _test_eof4660: + cs = 4660 + goto _test_eof + _test_eof5278: + cs = 5278 + goto _test_eof + _test_eof5279: + cs = 5279 + goto _test_eof + _test_eof5280: + cs = 5280 + goto _test_eof + _test_eof4661: + cs = 4661 + goto _test_eof + _test_eof5281: + cs = 5281 + goto _test_eof + _test_eof5282: + cs = 5282 + goto _test_eof + _test_eof5283: + cs = 5283 + goto _test_eof + _test_eof5284: + cs = 5284 + goto _test_eof + _test_eof5285: + cs = 5285 + goto _test_eof + _test_eof5286: + cs = 5286 + goto _test_eof + _test_eof4662: + cs = 4662 + goto _test_eof + _test_eof5287: + cs = 5287 + goto _test_eof + _test_eof5288: + cs = 5288 + goto _test_eof + _test_eof5289: + cs = 5289 + goto _test_eof + _test_eof5290: + cs = 5290 + goto _test_eof + _test_eof5291: + cs = 5291 + goto _test_eof + _test_eof5292: + cs = 5292 + goto _test_eof + _test_eof5293: + cs = 5293 + goto _test_eof + _test_eof5294: + cs = 5294 + goto _test_eof + _test_eof5295: + cs = 5295 + goto _test_eof + _test_eof5296: + cs = 5296 + goto _test_eof + _test_eof5297: + cs = 5297 + goto _test_eof + _test_eof5298: + cs = 5298 + goto _test_eof + _test_eof5299: + cs = 5299 + goto _test_eof + _test_eof5300: + cs = 5300 + goto _test_eof + _test_eof5301: + cs = 5301 + goto _test_eof + _test_eof5302: + cs = 5302 + goto _test_eof + _test_eof5303: + cs = 5303 + goto _test_eof + _test_eof5304: + cs = 5304 + goto _test_eof + _test_eof5305: + cs = 5305 + goto _test_eof + _test_eof5306: + cs = 5306 + goto _test_eof + _test_eof5307: + cs = 5307 + goto _test_eof + _test_eof5308: + cs = 5308 + goto _test_eof + _test_eof5309: + cs = 5309 + goto _test_eof + _test_eof5310: + cs = 5310 + goto _test_eof + _test_eof5311: + cs = 5311 + goto _test_eof + _test_eof5312: + cs = 5312 + goto _test_eof + _test_eof5313: + cs = 5313 + goto _test_eof + _test_eof5314: + cs = 5314 + goto _test_eof + _test_eof5315: + cs = 5315 + goto _test_eof + _test_eof5316: + cs = 5316 + goto _test_eof + _test_eof5317: + cs = 5317 + goto _test_eof + _test_eof5318: + cs = 5318 + goto _test_eof + _test_eof5319: + cs = 5319 + goto _test_eof + _test_eof5320: + cs = 5320 + goto _test_eof + _test_eof5321: + cs = 5321 + goto _test_eof + _test_eof5322: + cs = 5322 + goto _test_eof + _test_eof5323: + cs = 5323 + goto _test_eof + _test_eof5324: + cs = 5324 + goto _test_eof + _test_eof5325: + cs = 5325 + goto _test_eof + _test_eof5326: + cs = 5326 + goto _test_eof + _test_eof5327: + cs = 5327 + goto _test_eof + _test_eof5328: + cs = 5328 + goto _test_eof + _test_eof5329: + cs = 5329 + goto _test_eof + _test_eof5330: + cs = 5330 + goto _test_eof + _test_eof5331: + cs = 5331 + goto _test_eof + _test_eof5332: + cs = 5332 + goto _test_eof + _test_eof5333: + cs = 5333 + goto _test_eof + _test_eof5334: + cs = 5334 + goto _test_eof + _test_eof5335: + cs = 5335 + goto _test_eof + _test_eof5336: + cs = 5336 + goto _test_eof + _test_eof5337: + cs = 5337 + goto _test_eof + _test_eof5338: + cs = 5338 + goto _test_eof + _test_eof4663: + cs = 4663 + goto _test_eof + _test_eof4664: + cs = 4664 + goto _test_eof + _test_eof4665: + cs = 4665 + goto _test_eof + _test_eof4666: + cs = 4666 + goto _test_eof + _test_eof4667: + cs = 4667 + goto _test_eof + _test_eof4668: + cs = 4668 + goto _test_eof + _test_eof4669: + cs = 4669 + goto _test_eof + _test_eof4670: + cs = 4670 + goto _test_eof + _test_eof5339: + cs = 5339 + goto _test_eof + _test_eof4671: + cs = 4671 + goto _test_eof + _test_eof4672: + cs = 4672 + goto _test_eof + _test_eof4673: + cs = 4673 + goto _test_eof + _test_eof4674: + cs = 4674 + goto _test_eof + _test_eof4675: + cs = 4675 + goto _test_eof + _test_eof4676: + cs = 4676 + goto _test_eof + _test_eof4677: + cs = 4677 + goto _test_eof + _test_eof4678: + cs = 4678 + goto _test_eof + _test_eof4679: + cs = 4679 + goto _test_eof + _test_eof4680: + cs = 4680 + goto _test_eof + _test_eof4681: + cs = 4681 + goto _test_eof + _test_eof4682: + cs = 4682 + goto _test_eof + _test_eof4683: + cs = 4683 + goto _test_eof + _test_eof4684: + cs = 4684 + goto _test_eof + _test_eof4685: + cs = 4685 + goto _test_eof + _test_eof4686: + cs = 4686 + goto _test_eof + _test_eof4687: + cs = 4687 + goto _test_eof + _test_eof4688: + cs = 4688 + goto _test_eof + _test_eof4689: + cs = 4689 + goto _test_eof + _test_eof4690: + cs = 4690 + goto _test_eof + _test_eof4691: + cs = 4691 + goto _test_eof + _test_eof4692: + cs = 4692 + goto _test_eof + _test_eof4693: + cs = 4693 + goto _test_eof + _test_eof4694: + cs = 4694 + goto _test_eof + _test_eof4695: + cs = 4695 + goto _test_eof + _test_eof4696: + cs = 4696 + goto _test_eof + _test_eof4697: + cs = 4697 + goto _test_eof + _test_eof4698: + cs = 4698 + goto _test_eof + _test_eof4699: + cs = 4699 + goto _test_eof + _test_eof4700: + cs = 4700 + goto _test_eof + _test_eof4701: + cs = 4701 + goto _test_eof + _test_eof4702: + cs = 4702 + goto _test_eof + _test_eof4703: + cs = 4703 + goto _test_eof + _test_eof4704: + cs = 4704 + goto _test_eof + _test_eof4705: + cs = 4705 + goto _test_eof + _test_eof4706: + cs = 4706 + goto _test_eof + _test_eof4707: + cs = 4707 + goto _test_eof + _test_eof5340: + cs = 5340 + goto _test_eof + _test_eof4708: + cs = 4708 + goto _test_eof + _test_eof4709: + cs = 4709 + goto _test_eof + _test_eof4710: + cs = 4710 + goto _test_eof + _test_eof4711: + cs = 4711 + goto _test_eof + _test_eof4712: + cs = 4712 + goto _test_eof + _test_eof4713: + cs = 4713 + goto _test_eof + _test_eof4714: + cs = 4714 + goto _test_eof + _test_eof4715: + cs = 4715 + goto _test_eof + _test_eof4716: + cs = 4716 + goto _test_eof + _test_eof4717: + cs = 4717 + goto _test_eof + _test_eof4718: + cs = 4718 + goto _test_eof + _test_eof4719: + cs = 4719 + goto _test_eof + _test_eof4720: + cs = 4720 + goto _test_eof + _test_eof4721: + cs = 4721 + goto _test_eof + _test_eof4722: + cs = 4722 + goto _test_eof + _test_eof4723: + cs = 4723 + goto _test_eof + _test_eof4724: + cs = 4724 + goto _test_eof + _test_eof4725: + cs = 4725 + goto _test_eof + _test_eof4726: + cs = 4726 + goto _test_eof + _test_eof4727: + cs = 4727 + goto _test_eof + _test_eof4728: + cs = 4728 + goto _test_eof + _test_eof4729: + cs = 4729 + goto _test_eof + _test_eof4730: + cs = 4730 + goto _test_eof + _test_eof4731: + cs = 4731 + goto _test_eof + _test_eof4732: + cs = 4732 + goto _test_eof + _test_eof4733: + cs = 4733 + goto _test_eof + _test_eof4734: + cs = 4734 + goto _test_eof + _test_eof4735: + cs = 4735 + goto _test_eof + _test_eof4736: + cs = 4736 + goto _test_eof + _test_eof4737: + cs = 4737 + goto _test_eof + _test_eof4738: + cs = 4738 + goto _test_eof + _test_eof4739: + cs = 4739 + goto _test_eof + _test_eof4740: + cs = 4740 + goto _test_eof + _test_eof4741: + cs = 4741 + goto _test_eof + _test_eof4742: + cs = 4742 + goto _test_eof + _test_eof4743: + cs = 4743 + goto _test_eof + _test_eof4744: + cs = 4744 + goto _test_eof + _test_eof4745: + cs = 4745 + goto _test_eof + _test_eof4746: + cs = 4746 + goto _test_eof + _test_eof4747: + cs = 4747 + goto _test_eof + _test_eof4748: + cs = 4748 + goto _test_eof + _test_eof4749: + cs = 4749 + goto _test_eof + _test_eof4750: + cs = 4750 + goto _test_eof + _test_eof4751: + cs = 4751 + goto _test_eof + _test_eof4752: + cs = 4752 + goto _test_eof + _test_eof4753: + cs = 4753 + goto _test_eof + _test_eof4754: + cs = 4754 + goto _test_eof + _test_eof4755: + cs = 4755 + goto _test_eof + _test_eof4756: + cs = 4756 + goto _test_eof + _test_eof4757: + cs = 4757 + goto _test_eof + _test_eof4758: + cs = 4758 + goto _test_eof + _test_eof4759: + cs = 4759 + goto _test_eof + _test_eof4760: + cs = 4760 + goto _test_eof + _test_eof4761: + cs = 4761 + goto _test_eof + _test_eof4762: + cs = 4762 + goto _test_eof + _test_eof4763: + cs = 4763 + goto _test_eof + _test_eof4764: + cs = 4764 + goto _test_eof + _test_eof4765: + cs = 4765 + goto _test_eof + _test_eof4766: + cs = 4766 + goto _test_eof + _test_eof4767: + cs = 4767 + goto _test_eof + _test_eof4768: + cs = 4768 + goto _test_eof + _test_eof4769: + cs = 4769 + goto _test_eof + _test_eof4770: + cs = 4770 + goto _test_eof + _test_eof4771: + cs = 4771 + goto _test_eof + _test_eof4772: + cs = 4772 + goto _test_eof + _test_eof4773: + cs = 4773 + goto _test_eof + _test_eof4774: + cs = 4774 + goto _test_eof + _test_eof4775: + cs = 4775 + goto _test_eof + _test_eof4776: + cs = 4776 + goto _test_eof + _test_eof4777: + cs = 4777 + goto _test_eof + _test_eof4778: + cs = 4778 + goto _test_eof + _test_eof4779: + cs = 4779 + goto _test_eof + _test_eof4780: + cs = 4780 + goto _test_eof + _test_eof4781: + cs = 4781 + goto _test_eof + _test_eof4782: + cs = 4782 + goto _test_eof + _test_eof4783: + cs = 4783 + goto _test_eof + _test_eof4784: + cs = 4784 + goto _test_eof + _test_eof4785: + cs = 4785 + goto _test_eof + _test_eof4786: + cs = 4786 + goto _test_eof + _test_eof4787: + cs = 4787 + goto _test_eof + _test_eof4788: + cs = 4788 + goto _test_eof + _test_eof4789: + cs = 4789 + goto _test_eof + _test_eof4790: + cs = 4790 + goto _test_eof + _test_eof4791: + cs = 4791 + goto _test_eof + _test_eof4792: + cs = 4792 + goto _test_eof + _test_eof4793: + cs = 4793 + goto _test_eof + _test_eof4794: + cs = 4794 + goto _test_eof + _test_eof4795: + cs = 4795 + goto _test_eof + _test_eof4796: + cs = 4796 + goto _test_eof + _test_eof4797: + cs = 4797 + goto _test_eof + _test_eof4798: + cs = 4798 + goto _test_eof + _test_eof4799: + cs = 4799 + goto _test_eof + _test_eof4800: + cs = 4800 + goto _test_eof + _test_eof4801: + cs = 4801 + goto _test_eof + _test_eof4802: + cs = 4802 + goto _test_eof + _test_eof4803: + cs = 4803 + goto _test_eof + _test_eof4804: + cs = 4804 + goto _test_eof + _test_eof4805: + cs = 4805 + goto _test_eof + _test_eof4806: + cs = 4806 + goto _test_eof + _test_eof4807: + cs = 4807 + goto _test_eof + _test_eof4808: + cs = 4808 + goto _test_eof + _test_eof4809: + cs = 4809 + goto _test_eof + _test_eof4810: + cs = 4810 + goto _test_eof + _test_eof4811: + cs = 4811 + goto _test_eof + _test_eof4812: + cs = 4812 + goto _test_eof + _test_eof4813: + cs = 4813 + goto _test_eof + _test_eof4814: + cs = 4814 + goto _test_eof + _test_eof4815: + cs = 4815 + goto _test_eof + _test_eof4816: + cs = 4816 + goto _test_eof + _test_eof4817: + cs = 4817 + goto _test_eof + _test_eof4818: + cs = 4818 + goto _test_eof + _test_eof4819: + cs = 4819 + goto _test_eof + _test_eof4820: + cs = 4820 + goto _test_eof + _test_eof4821: + cs = 4821 + goto _test_eof + _test_eof4822: + cs = 4822 + goto _test_eof + _test_eof4823: + cs = 4823 + goto _test_eof + _test_eof4824: + cs = 4824 + goto _test_eof + _test_eof4825: + cs = 4825 + goto _test_eof + _test_eof4826: + cs = 4826 + goto _test_eof + _test_eof4827: + cs = 4827 + goto _test_eof + _test_eof4828: + cs = 4828 + goto _test_eof + _test_eof4829: + cs = 4829 + goto _test_eof + _test_eof4830: + cs = 4830 + goto _test_eof + _test_eof4831: + cs = 4831 + goto _test_eof + _test_eof4832: + cs = 4832 + goto _test_eof + _test_eof4833: + cs = 4833 + goto _test_eof + _test_eof4834: + cs = 4834 + goto _test_eof + _test_eof4835: + cs = 4835 + goto _test_eof + _test_eof4836: + cs = 4836 + goto _test_eof + _test_eof4837: + cs = 4837 + goto _test_eof + _test_eof4838: + cs = 4838 + goto _test_eof + _test_eof4839: + cs = 4839 + goto _test_eof + _test_eof4840: + cs = 4840 + goto _test_eof + _test_eof4841: + cs = 4841 + goto _test_eof + _test_eof4842: + cs = 4842 + goto _test_eof + _test_eof4843: + cs = 4843 + goto _test_eof + _test_eof4844: + cs = 4844 + goto _test_eof + _test_eof4845: + cs = 4845 + goto _test_eof + _test_eof4846: + cs = 4846 + goto _test_eof + _test_eof4847: + cs = 4847 + goto _test_eof + _test_eof4848: + cs = 4848 + goto _test_eof + _test_eof4849: + cs = 4849 + goto _test_eof + _test_eof4850: + cs = 4850 + goto _test_eof + _test_eof4851: + cs = 4851 + goto _test_eof + _test_eof4852: + cs = 4852 + goto _test_eof + _test_eof4853: + cs = 4853 + goto _test_eof + _test_eof4854: + cs = 4854 + goto _test_eof + _test_eof4855: + cs = 4855 + goto _test_eof + _test_eof4856: + cs = 4856 + goto _test_eof + _test_eof4857: + cs = 4857 + goto _test_eof + _test_eof4858: + cs = 4858 + goto _test_eof + _test_eof4859: + cs = 4859 + goto _test_eof + _test_eof4860: + cs = 4860 + goto _test_eof + _test_eof4861: + cs = 4861 + goto _test_eof - _test_eof: {} - if p == eof { - switch cs { - case 4863: - goto tr4499 - case 0: - goto tr0 - case 1: - goto tr2 - case 2: - goto tr2 - case 3: - goto tr0 - case 4: - goto tr0 - case 5: - goto tr0 - case 6: - goto tr0 - case 7: - goto tr0 - case 8: - goto tr0 - case 9: - goto tr0 - case 10: - goto tr0 - case 11: - goto tr0 - case 12: - goto tr0 - case 13: - goto tr0 - case 14: - goto tr2 - case 15: - goto tr2 - case 16: - goto tr2 - case 17: - goto tr2 - case 18: - goto tr2 - case 19: - goto tr2 - case 20: - goto tr2 - case 21: - goto tr2 - case 22: - goto tr2 - case 23: - goto tr2 - case 24: - goto tr2 - case 25: - goto tr2 - case 26: - goto tr2 - case 27: - goto tr2 - case 28: - goto tr2 - case 29: - goto tr2 - case 30: - goto tr2 - case 31: - goto tr2 - case 32: - goto tr2 - case 33: - goto tr2 - case 34: - goto tr2 - case 35: - goto tr2 - case 36: - goto tr2 - case 37: - goto tr2 - case 38: - goto tr2 - case 39: - goto tr2 - case 40: - goto tr2 - case 41: - goto tr2 - case 42: - goto tr0 - case 43: - goto tr2 - case 44: - goto tr2 - case 45: - goto tr2 - case 46: - goto tr2 - case 47: - goto tr2 - case 48: - goto tr2 - case 49: - goto tr2 - case 50: - goto tr2 - case 51: - goto tr2 - case 52: - goto tr2 - case 53: - goto tr2 - case 54: - goto tr2 - case 55: - goto tr2 - case 56: - goto tr2 - case 57: - goto tr2 - case 58: - goto tr2 - case 59: - goto tr2 - case 60: - goto tr2 - case 61: - goto tr2 - case 62: - goto tr2 - case 63: - goto tr2 - case 64: - goto tr0 - case 65: - goto tr2 - case 66: - goto tr2 - case 67: - goto tr2 - case 68: - goto tr2 - case 69: - goto tr2 - case 70: - goto tr2 - case 71: - goto tr0 - case 72: - goto tr2 - case 73: - goto tr2 - case 74: - goto tr0 - case 75: - goto tr2 - case 76: - goto tr2 - case 77: - goto tr2 - case 78: - goto tr2 - case 79: - goto tr2 - case 80: - goto tr2 - case 81: - goto tr2 - case 82: - goto tr2 - case 83: - goto tr2 - case 84: - goto tr2 - case 85: - goto tr2 - case 86: - goto tr2 - case 87: - goto tr2 - case 88: - goto tr2 - case 89: - goto tr2 - case 90: - goto tr0 - case 91: - goto tr2 - case 92: - goto tr2 - case 93: - goto tr2 - case 94: - goto tr0 - case 95: - goto tr2 - case 96: - goto tr2 - case 97: - goto tr2 - case 98: - goto tr2 - case 99: - goto tr2 - case 100: - goto tr2 - case 101: - goto tr2 - case 102: - goto tr2 - case 103: - goto tr2 - case 104: - goto tr2 - case 105: - goto tr2 - case 106: - goto tr2 - case 107: - goto tr2 - case 108: - goto tr2 - case 109: - goto tr2 - case 110: - goto tr2 - case 111: - goto tr2 - case 112: - goto tr2 - case 113: - goto tr2 - case 114: - goto tr2 - case 115: - goto tr2 - case 116: - goto tr2 - case 117: - goto tr2 - case 118: - goto tr2 - case 119: - goto tr2 - case 120: - goto tr2 - case 121: - goto tr2 - case 122: - goto tr2 - case 123: - goto tr2 - case 124: - goto tr2 - case 125: - goto tr2 - case 126: - goto tr2 - case 127: - goto tr2 - case 128: - goto tr2 - case 129: - goto tr2 - case 130: - goto tr2 - case 131: - goto tr2 - case 132: - goto tr2 - case 133: - goto tr2 - case 134: - goto tr2 - case 135: - goto tr2 - case 136: - goto tr0 - case 137: - goto tr2 - case 138: - goto tr2 - case 139: - goto tr2 - case 140: - goto tr2 - case 4864: - goto tr4519 - case 4865: - goto tr4521 - case 141: - goto tr125 - case 4866: - goto tr4521 - case 4867: - goto tr4562 - case 142: - goto tr2 - case 143: - goto tr2 - case 144: - goto tr2 - case 145: - goto tr2 - case 146: - goto tr2 - case 147: - goto tr2 - case 148: - goto tr2 - case 149: - goto tr2 - case 150: - goto tr2 - case 151: - goto tr2 - case 152: - goto tr2 - case 153: - goto tr2 - case 154: - goto tr2 - case 155: - goto tr2 - case 156: - goto tr2 - case 157: - goto tr2 - case 158: - goto tr2 - case 159: - goto tr2 - case 160: - goto tr2 - case 161: - goto tr2 - case 162: - goto tr2 - case 163: - goto tr2 - case 164: - goto tr2 - case 165: - goto tr2 - case 166: - goto tr2 - case 167: - goto tr2 - case 168: - goto tr2 - case 169: - goto tr2 - case 170: - goto tr2 - case 171: - goto tr2 - case 172: - goto tr2 - case 173: - goto tr2 - case 174: - goto tr2 - case 175: - goto tr2 - case 176: - goto tr2 - case 177: - goto tr2 - case 178: - goto tr2 - case 179: - goto tr2 - case 180: - goto tr2 - case 181: - goto tr2 - case 182: - goto tr2 - case 183: - goto tr2 - case 184: - goto tr2 - case 185: - goto tr2 - case 186: - goto tr2 - case 187: - goto tr2 - case 188: - goto tr2 - case 189: - goto tr2 - case 190: - goto tr2 - case 191: - goto tr2 - case 192: - goto tr2 - case 193: - goto tr2 - case 194: - goto tr2 - case 195: - goto tr2 - case 196: - goto tr2 - case 197: - goto tr2 - case 198: - goto tr2 - case 199: - goto tr2 - case 200: - goto tr2 - case 201: - goto tr2 - case 202: - goto tr2 - case 203: - goto tr2 - case 204: - goto tr2 - case 205: - goto tr2 - case 206: - goto tr2 - case 207: - goto tr2 - case 208: - goto tr2 - case 209: - goto tr2 - case 210: - goto tr2 - case 211: - goto tr2 - case 212: - goto tr2 - case 213: - goto tr2 - case 214: - goto tr2 - case 215: - goto tr2 - case 216: - goto tr2 - case 217: - goto tr2 - case 218: - goto tr2 - case 219: - goto tr2 - case 220: - goto tr2 - case 221: - goto tr2 - case 222: - goto tr2 - case 223: - goto tr2 - case 224: - goto tr2 - case 225: - goto tr2 - case 226: - goto tr2 - case 227: - goto tr2 - case 228: - goto tr2 - case 229: - goto tr2 - case 230: - goto tr2 - case 231: - goto tr2 - case 232: - goto tr2 - case 233: - goto tr2 - case 234: - goto tr2 - case 235: - goto tr2 - case 236: - goto tr2 - case 237: - goto tr2 - case 238: - goto tr2 - case 239: - goto tr2 - case 240: - goto tr2 - case 241: - goto tr2 - case 242: - goto tr2 - case 243: - goto tr2 - case 244: - goto tr2 - case 245: - goto tr2 - case 246: - goto tr2 - case 247: - goto tr2 - case 248: - goto tr2 - case 249: - goto tr2 - case 250: - goto tr2 - case 251: - goto tr2 - case 252: - goto tr2 - case 253: - goto tr2 - case 254: - goto tr2 - case 255: - goto tr2 - case 256: - goto tr2 - case 257: - goto tr2 - case 258: - goto tr2 - case 259: - goto tr2 - case 260: - goto tr2 - case 261: - goto tr2 - case 262: - goto tr2 - case 263: - goto tr2 - case 264: - goto tr2 - case 265: - goto tr2 - case 266: - goto tr2 - case 267: - goto tr2 - case 268: - goto tr2 - case 269: - goto tr2 - case 270: - goto tr2 - case 271: - goto tr2 - case 272: - goto tr2 - case 273: - goto tr2 - case 274: - goto tr2 - case 275: - goto tr2 - case 276: - goto tr2 - case 277: - goto tr2 - case 278: - goto tr2 - case 279: - goto tr2 - case 280: - goto tr2 - case 281: - goto tr2 - case 282: - goto tr2 - case 283: - goto tr2 - case 284: - goto tr2 - case 285: - goto tr2 - case 286: - goto tr2 - case 287: - goto tr2 - case 288: - goto tr2 - case 289: - goto tr2 - case 290: - goto tr2 - case 291: - goto tr2 - case 292: - goto tr2 - case 293: - goto tr2 - case 294: - goto tr2 - case 295: - goto tr2 - case 296: - goto tr2 - case 297: - goto tr2 - case 298: - goto tr2 - case 299: - goto tr2 - case 300: - goto tr2 - case 301: - goto tr2 - case 302: - goto tr2 - case 303: - goto tr2 - case 304: - goto tr2 - case 305: - goto tr2 - case 306: - goto tr2 - case 307: - goto tr2 - case 308: - goto tr2 - case 309: - goto tr2 - case 310: - goto tr2 - case 311: - goto tr2 - case 312: - goto tr2 - case 313: - goto tr2 - case 314: - goto tr2 - case 315: - goto tr2 - case 316: - goto tr2 - case 317: - goto tr2 - case 318: - goto tr2 - case 319: - goto tr2 - case 320: - goto tr2 - case 321: - goto tr2 - case 322: - goto tr2 - case 323: - goto tr2 - case 324: - goto tr2 - case 325: - goto tr2 - case 326: - goto tr2 - case 327: - goto tr2 - case 328: - goto tr2 - case 329: - goto tr2 - case 330: - goto tr2 - case 331: - goto tr2 - case 332: - goto tr2 - case 333: - goto tr2 - case 334: - goto tr2 - case 335: - goto tr2 - case 336: - goto tr2 - case 337: - goto tr2 - case 338: - goto tr2 - case 339: - goto tr2 - case 340: - goto tr2 - case 341: - goto tr2 - case 342: - goto tr2 - case 343: - goto tr2 - case 344: - goto tr2 - case 345: - goto tr2 - case 346: - goto tr2 - case 347: - goto tr2 - case 348: - goto tr2 - case 349: - goto tr2 - case 350: - goto tr2 - case 351: - goto tr2 - case 352: - goto tr2 - case 353: - goto tr2 - case 354: - goto tr2 - case 355: - goto tr2 - case 356: - goto tr2 - case 357: - goto tr2 - case 358: - goto tr2 - case 359: - goto tr2 - case 360: - goto tr2 - case 361: - goto tr2 - case 362: - goto tr2 - case 363: - goto tr2 - case 364: - goto tr2 - case 365: - goto tr2 - case 366: - goto tr2 - case 367: - goto tr2 - case 368: - goto tr2 - case 369: - goto tr2 - case 370: - goto tr2 - case 371: - goto tr2 - case 372: - goto tr2 - case 373: - goto tr2 - case 374: - goto tr2 - case 375: - goto tr2 - case 376: - goto tr2 - case 377: - goto tr2 - case 378: - goto tr2 - case 379: - goto tr2 - case 380: - goto tr2 - case 381: - goto tr2 - case 382: - goto tr2 - case 383: - goto tr2 - case 384: - goto tr2 - case 385: - goto tr2 - case 386: - goto tr2 - case 387: - goto tr2 - case 388: - goto tr2 - case 389: - goto tr2 - case 390: - goto tr2 - case 391: - goto tr2 - case 392: - goto tr2 - case 393: - goto tr2 - case 394: - goto tr2 - case 395: - goto tr2 - case 396: - goto tr2 - case 397: - goto tr2 - case 398: - goto tr2 - case 399: - goto tr2 - case 400: - goto tr2 - case 401: - goto tr2 - case 402: - goto tr2 - case 403: - goto tr2 - case 404: - goto tr2 - case 405: - goto tr2 - case 406: - goto tr2 - case 407: - goto tr2 - case 408: - goto tr2 - case 409: - goto tr2 - case 410: - goto tr2 - case 411: - goto tr2 - case 412: - goto tr2 - case 4868: - goto tr4562 - case 413: - goto tr420 - case 414: - goto tr420 - case 415: - goto tr420 - case 416: - goto tr420 - case 417: - goto tr420 - case 418: - goto tr420 - case 419: - goto tr420 - case 420: - goto tr420 - case 421: - goto tr420 - case 422: - goto tr420 - case 423: - goto tr420 - case 424: - goto tr420 - case 425: - goto tr420 - case 426: - goto tr420 - case 427: - goto tr420 - case 428: - goto tr420 - case 429: - goto tr420 - case 430: - goto tr420 - case 431: - goto tr420 - case 432: - goto tr420 - case 433: - goto tr420 - case 434: - goto tr420 - case 435: - goto tr420 - case 436: - goto tr420 - case 437: - goto tr420 - case 438: - goto tr420 - case 439: - goto tr420 - case 440: - goto tr420 - case 441: - goto tr420 - case 442: - goto tr420 - case 443: - goto tr420 - case 444: - goto tr420 - case 445: - goto tr420 - case 446: - goto tr420 - case 447: - goto tr420 - case 448: - goto tr420 - case 449: - goto tr420 - case 450: - goto tr420 - case 451: - goto tr420 - case 452: - goto tr420 - case 453: - goto tr420 - case 454: - goto tr420 - case 455: - goto tr420 - case 456: - goto tr420 - case 457: - goto tr420 - case 458: - goto tr420 - case 459: - goto tr420 - case 460: - goto tr420 - case 461: - goto tr420 - case 462: - goto tr420 - case 463: - goto tr420 - case 464: - goto tr420 - case 465: - goto tr420 - case 466: - goto tr420 - case 467: - goto tr420 - case 468: - goto tr2 - case 469: - goto tr2 - case 470: - goto tr420 - case 471: - goto tr420 - case 472: - goto tr420 - case 473: - goto tr420 - case 474: - goto tr420 - case 475: - goto tr420 - case 476: - goto tr420 - case 477: - goto tr420 - case 478: - goto tr420 - case 479: - goto tr420 - case 480: - goto tr420 - case 481: - goto tr420 - case 482: - goto tr420 - case 483: - goto tr420 - case 484: - goto tr420 - case 485: - goto tr420 - case 486: - goto tr420 - case 487: - goto tr420 - case 488: - goto tr420 - case 489: - goto tr420 - case 490: - goto tr420 - case 491: - goto tr420 - case 492: - goto tr420 - case 493: - goto tr420 - case 494: - goto tr420 - case 495: - goto tr420 - case 496: - goto tr420 - case 497: - goto tr420 - case 498: - goto tr420 - case 499: - goto tr420 - case 500: - goto tr420 - case 501: - goto tr420 - case 502: - goto tr420 - case 503: - goto tr420 - case 504: - goto tr420 - case 505: - goto tr420 - case 506: - goto tr420 - case 507: - goto tr420 - case 508: - goto tr420 - case 509: - goto tr420 - case 510: - goto tr420 - case 511: - goto tr420 - case 512: - goto tr420 - case 513: - goto tr420 - case 514: - goto tr420 - case 515: - goto tr420 - case 516: - goto tr420 - case 517: - goto tr420 - case 518: - goto tr420 - case 519: - goto tr420 - case 520: - goto tr420 - case 521: - goto tr420 - case 522: - goto tr420 - case 523: - goto tr420 - case 524: - goto tr420 - case 525: - goto tr420 - case 526: - goto tr420 - case 527: - goto tr420 - case 528: - goto tr420 - case 529: - goto tr420 - case 530: - goto tr420 - case 531: - goto tr420 - case 532: - goto tr420 - case 533: - goto tr420 - case 534: - goto tr420 - case 535: - goto tr420 - case 536: - goto tr420 - case 537: - goto tr420 - case 538: - goto tr2 - case 539: - goto tr420 - case 540: - goto tr420 - case 541: - goto tr420 - case 542: - goto tr420 - case 543: - goto tr420 - case 544: - goto tr420 - case 545: - goto tr420 - case 546: - goto tr420 - case 547: - goto tr420 - case 548: - goto tr420 - case 549: - goto tr420 - case 550: - goto tr420 - case 551: - goto tr420 - case 552: - goto tr420 - case 553: - goto tr420 - case 554: - goto tr420 - case 555: - goto tr420 - case 556: - goto tr420 - case 557: - goto tr420 - case 558: - goto tr420 - case 559: - goto tr420 - case 560: - goto tr420 - case 561: - goto tr420 - case 4869: - goto tr4562 - case 562: - goto tr420 - case 563: - goto tr420 - case 564: - goto tr420 - case 565: - goto tr420 - case 566: - goto tr420 - case 567: - goto tr420 - case 4870: - goto tr4562 - case 568: - goto tr420 - case 569: - goto tr420 - case 570: - goto tr420 - case 571: - goto tr420 - case 572: - goto tr420 - case 573: - goto tr420 - case 574: - goto tr420 - case 4871: - goto tr4562 - case 575: - goto tr420 - case 576: - goto tr420 - case 577: - goto tr420 - case 578: - goto tr420 - case 579: - goto tr420 - case 580: - goto tr420 - case 581: - goto tr420 - case 582: - goto tr420 - case 583: - goto tr420 - case 584: - goto tr420 - case 585: - goto tr420 - case 586: - goto tr420 - case 587: - goto tr420 - case 588: - goto tr420 - case 589: - goto tr420 - case 590: - goto tr420 - case 591: - goto tr420 - case 592: - goto tr420 - case 593: - goto tr420 - case 594: - goto tr420 - case 595: - goto tr420 - case 596: - goto tr420 - case 597: - goto tr420 - case 598: - goto tr420 - case 599: - goto tr420 - case 600: - goto tr420 - case 601: - goto tr420 - case 602: - goto tr420 - case 603: - goto tr420 - case 604: - goto tr420 - case 605: - goto tr420 - case 606: - goto tr420 - case 607: - goto tr420 - case 608: - goto tr420 - case 609: - goto tr420 - case 610: - goto tr420 - case 611: - goto tr420 - case 612: - goto tr420 - case 613: - goto tr420 - case 614: - goto tr420 - case 615: - goto tr420 - case 616: - goto tr420 - case 617: - goto tr420 - case 618: - goto tr420 - case 619: - goto tr420 - case 620: - goto tr420 - case 621: - goto tr420 - case 622: - goto tr420 - case 623: - goto tr420 - case 624: - goto tr420 - case 625: - goto tr420 - case 626: - goto tr420 - case 627: - goto tr420 - case 628: - goto tr420 - case 629: - goto tr420 - case 630: - goto tr420 - case 631: - goto tr420 - case 632: - goto tr420 - case 633: - goto tr420 - case 634: - goto tr420 - case 635: - goto tr420 - case 636: - goto tr420 - case 637: - goto tr420 - case 638: - goto tr420 - case 639: - goto tr420 - case 640: - goto tr2 - case 641: - goto tr420 - case 642: - goto tr420 - case 643: - goto tr420 - case 644: - goto tr420 - case 645: - goto tr420 - case 646: - goto tr420 - case 647: - goto tr420 - case 648: - goto tr420 - case 649: - goto tr420 - case 650: - goto tr420 - case 651: - goto tr420 - case 652: - goto tr420 - case 653: - goto tr420 - case 654: - goto tr2 - case 655: - goto tr420 - case 656: - goto tr420 - case 657: - goto tr420 - case 658: - goto tr420 - case 659: - goto tr420 - case 660: - goto tr420 - case 661: - goto tr420 - case 662: - goto tr420 - case 663: - goto tr420 - case 664: - goto tr420 - case 665: - goto tr420 - case 666: - goto tr420 - case 667: - goto tr420 - case 668: - goto tr420 - case 669: - goto tr420 - case 670: - goto tr420 - case 671: - goto tr420 - case 672: - goto tr2 - case 673: - goto tr420 - case 674: - goto tr420 - case 675: - goto tr420 - case 676: - goto tr420 - case 677: - goto tr420 - case 678: - goto tr420 - case 679: - goto tr420 - case 680: - goto tr420 - case 681: - goto tr420 - case 682: - goto tr420 - case 683: - goto tr420 - case 684: - goto tr2 - case 685: - goto tr420 - case 686: - goto tr420 - case 687: - goto tr420 - case 688: - goto tr420 - case 689: - goto tr420 - case 690: - goto tr420 - case 691: - goto tr2 - case 692: - goto tr420 - case 693: - goto tr420 - case 694: - goto tr420 - case 695: - goto tr420 - case 696: - goto tr420 - case 697: - goto tr420 - case 698: - goto tr420 - case 699: - goto tr420 - case 700: - goto tr420 - case 701: - goto tr420 - case 702: - goto tr420 - case 703: - goto tr420 - case 704: - goto tr420 - case 705: - goto tr420 - case 706: - goto tr420 - case 707: - goto tr2 - case 708: - goto tr420 - case 709: - goto tr2 - case 710: - goto tr420 - case 711: - goto tr420 - case 712: - goto tr2 - case 713: - goto tr420 - case 714: - goto tr420 - case 715: - goto tr420 - case 716: - goto tr420 - case 717: - goto tr420 - case 718: - goto tr420 - case 719: - goto tr420 - case 720: - goto tr420 - case 721: - goto tr2 - case 722: - goto tr420 - case 723: - goto tr420 - case 724: - goto tr420 - case 725: - goto tr420 - case 726: - goto tr420 - case 727: - goto tr420 - case 728: - goto tr420 - case 729: - goto tr420 - case 730: - goto tr420 - case 731: - goto tr420 - case 732: - goto tr420 - case 733: - goto tr420 - case 734: - goto tr420 - case 735: - goto tr420 - case 736: - goto tr420 - case 737: - goto tr420 - case 738: - goto tr420 - case 739: - goto tr420 - case 740: - goto tr420 - case 741: - goto tr420 - case 742: - goto tr420 - case 743: - goto tr420 - case 744: - goto tr420 - case 745: - goto tr420 - case 746: - goto tr420 - case 747: - goto tr420 - case 748: - goto tr420 - case 749: - goto tr420 - case 750: - goto tr420 - case 751: - goto tr420 - case 752: - goto tr420 - case 753: - goto tr420 - case 754: - goto tr420 - case 755: - goto tr420 - case 756: - goto tr420 - case 757: - goto tr420 - case 758: - goto tr420 - case 759: - goto tr420 - case 760: - goto tr420 - case 761: - goto tr420 - case 762: - goto tr420 - case 763: - goto tr420 - case 764: - goto tr420 - case 765: - goto tr420 - case 766: - goto tr420 - case 767: - goto tr420 - case 768: - goto tr420 - case 769: - goto tr420 - case 770: - goto tr420 - case 771: - goto tr420 - case 772: - goto tr420 - case 773: - goto tr420 - case 774: - goto tr420 - case 775: - goto tr420 - case 776: - goto tr420 - case 777: - goto tr420 - case 778: - goto tr420 - case 779: - goto tr420 - case 780: - goto tr420 - case 781: - goto tr420 - case 782: - goto tr420 - case 783: - goto tr420 - case 784: - goto tr420 - case 785: - goto tr420 - case 786: - goto tr420 - case 787: - goto tr420 - case 788: - goto tr420 - case 789: - goto tr420 - case 790: - goto tr420 - case 791: - goto tr420 - case 792: - goto tr420 - case 793: - goto tr420 - case 794: - goto tr420 - case 795: - goto tr420 - case 796: - goto tr420 - case 797: - goto tr420 - case 798: - goto tr420 - case 799: - goto tr420 - case 800: - goto tr420 - case 801: - goto tr420 - case 802: - goto tr420 - case 803: - goto tr420 - case 804: - goto tr420 - case 805: - goto tr420 - case 806: - goto tr420 - case 807: - goto tr420 - case 808: - goto tr420 - case 809: - goto tr420 - case 810: - goto tr420 - case 811: - goto tr420 - case 812: - goto tr420 - case 813: - goto tr420 - case 814: - goto tr420 - case 815: - goto tr420 - case 816: - goto tr420 - case 817: - goto tr420 - case 818: - goto tr420 - case 819: - goto tr420 - case 820: - goto tr420 - case 821: - goto tr420 - case 822: - goto tr420 - case 823: - goto tr420 - case 824: - goto tr420 - case 825: - goto tr420 - case 826: - goto tr420 - case 827: - goto tr420 - case 828: - goto tr420 - case 829: - goto tr420 - case 830: - goto tr420 - case 831: - goto tr420 - case 832: - goto tr420 - case 833: - goto tr420 - case 834: - goto tr420 - case 835: - goto tr420 - case 836: - goto tr420 - case 837: - goto tr420 - case 838: - goto tr420 - case 839: - goto tr420 - case 840: - goto tr420 - case 841: - goto tr420 - case 842: - goto tr420 - case 843: - goto tr420 - case 844: - goto tr420 - case 845: - goto tr420 - case 846: - goto tr420 - case 847: - goto tr420 - case 848: - goto tr420 - case 849: - goto tr420 - case 850: - goto tr420 - case 851: - goto tr420 - case 852: - goto tr420 - case 853: - goto tr420 - case 854: - goto tr420 - case 855: - goto tr420 - case 856: - goto tr420 - case 857: - goto tr420 - case 858: - goto tr420 - case 859: - goto tr420 - case 860: - goto tr420 - case 861: - goto tr420 - case 862: - goto tr420 - case 863: - goto tr420 - case 864: - goto tr420 - case 865: - goto tr420 - case 866: - goto tr420 - case 867: - goto tr420 - case 868: - goto tr420 - case 869: - goto tr420 - case 870: - goto tr2 - case 871: - goto tr420 - case 872: - goto tr420 - case 873: - goto tr2 - case 874: - goto tr420 - case 875: - goto tr420 - case 876: - goto tr420 - case 877: - goto tr420 - case 878: - goto tr420 - case 879: - goto tr420 - case 880: - goto tr420 - case 881: - goto tr420 - case 882: - goto tr420 - case 883: - goto tr420 - case 884: - goto tr420 - case 885: - goto tr420 - case 886: - goto tr420 - case 887: - goto tr420 - case 888: - goto tr420 - case 889: - goto tr420 - case 890: - goto tr420 - case 891: - goto tr420 - case 892: - goto tr420 - case 893: - goto tr420 - case 894: - goto tr420 - case 895: - goto tr420 - case 896: - goto tr420 - case 897: - goto tr420 - case 898: - goto tr420 - case 899: - goto tr420 - case 900: - goto tr420 - case 901: - goto tr420 - case 902: - goto tr420 - case 903: - goto tr420 - case 904: - goto tr420 - case 905: - goto tr420 - case 906: - goto tr420 - case 907: - goto tr420 - case 908: - goto tr420 - case 909: - goto tr420 - case 910: - goto tr420 - case 911: - goto tr420 - case 912: - goto tr420 - case 913: - goto tr420 - case 914: - goto tr420 - case 915: - goto tr420 - case 916: - goto tr420 - case 917: - goto tr420 - case 918: - goto tr420 - case 919: - goto tr420 - case 920: - goto tr420 - case 921: - goto tr420 - case 922: - goto tr420 - case 923: - goto tr420 - case 924: - goto tr420 - case 925: - goto tr420 - case 926: - goto tr420 - case 927: - goto tr420 - case 928: - goto tr420 - case 929: - goto tr420 - case 930: - goto tr420 - case 931: - goto tr420 - case 932: - goto tr420 - case 933: - goto tr420 - case 934: - goto tr420 - case 935: - goto tr420 - case 936: - goto tr420 - case 937: - goto tr420 - case 938: - goto tr420 - case 939: - goto tr420 - case 940: - goto tr420 - case 941: - goto tr420 - case 942: - goto tr420 - case 943: - goto tr420 - case 944: - goto tr420 - case 945: - goto tr420 - case 946: - goto tr420 - case 947: - goto tr420 - case 948: - goto tr420 - case 949: - goto tr420 - case 950: - goto tr420 - case 951: - goto tr420 - case 952: - goto tr420 - case 953: - goto tr420 - case 954: - goto tr420 - case 955: - goto tr420 - case 956: - goto tr420 - case 957: - goto tr420 - case 958: - goto tr420 - case 959: - goto tr420 - case 960: - goto tr420 - case 961: - goto tr420 - case 962: - goto tr420 - case 963: - goto tr420 - case 964: - goto tr420 - case 965: - goto tr420 - case 966: - goto tr420 - case 967: - goto tr2 - case 968: - goto tr420 - case 969: - goto tr2 - case 970: - goto tr420 - case 971: - goto tr420 - case 972: - goto tr420 - case 973: - goto tr420 - case 974: - goto tr420 - case 975: - goto tr420 - case 976: - goto tr420 - case 977: - goto tr420 - case 978: - goto tr420 - case 979: - goto tr420 - case 980: - goto tr420 - case 981: - goto tr420 - case 982: - goto tr420 - case 983: - goto tr420 - case 984: - goto tr420 - case 985: - goto tr420 - case 986: - goto tr420 - case 987: - goto tr420 - case 988: - goto tr420 - case 989: - goto tr420 - case 990: - goto tr420 - case 991: - goto tr420 - case 992: - goto tr420 - case 993: - goto tr420 - case 994: - goto tr420 - case 995: - goto tr420 - case 996: - goto tr420 - case 997: - goto tr420 - case 998: - goto tr420 - case 999: - goto tr420 - case 1000: - goto tr420 - case 1001: - goto tr420 - case 1002: - goto tr420 - case 1003: - goto tr420 - case 1004: - goto tr420 - case 1005: - goto tr420 - case 1006: - goto tr420 - case 1007: - goto tr420 - case 1008: - goto tr420 - case 1009: - goto tr420 - case 1010: - goto tr420 - case 1011: - goto tr420 - case 1012: - goto tr420 - case 1013: - goto tr420 - case 1014: - goto tr420 - case 1015: - goto tr420 - case 1016: - goto tr420 - case 1017: - goto tr420 - case 1018: - goto tr420 - case 1019: - goto tr420 - case 1020: - goto tr420 - case 1021: - goto tr420 - case 1022: - goto tr420 - case 1023: - goto tr420 - case 1024: - goto tr420 - case 1025: - goto tr420 - case 1026: - goto tr420 - case 1027: - goto tr420 - case 1028: - goto tr420 - case 1029: - goto tr420 - case 1030: - goto tr420 - case 1031: - goto tr420 - case 1032: - goto tr420 - case 1033: - goto tr420 - case 1034: - goto tr420 - case 1035: - goto tr420 - case 1036: - goto tr420 - case 1037: - goto tr420 - case 1038: - goto tr420 - case 1039: - goto tr420 - case 1040: - goto tr420 - case 1041: - goto tr420 - case 1042: - goto tr420 - case 1043: - goto tr420 - case 1044: - goto tr420 - case 1045: - goto tr420 - case 1046: - goto tr420 - case 1047: - goto tr420 - case 1048: - goto tr420 - case 1049: - goto tr420 - case 1050: - goto tr420 - case 1051: - goto tr420 - case 1052: - goto tr420 - case 1053: - goto tr420 - case 1054: - goto tr420 - case 1055: - goto tr420 - case 1056: - goto tr420 - case 1057: - goto tr420 - case 1058: - goto tr420 - case 1059: - goto tr420 - case 1060: - goto tr420 - case 1061: - goto tr420 - case 1062: - goto tr420 - case 1063: - goto tr420 - case 1064: - goto tr420 - case 1065: - goto tr420 - case 1066: - goto tr420 - case 1067: - goto tr420 - case 1068: - goto tr420 - case 1069: - goto tr420 - case 1070: - goto tr420 - case 1071: - goto tr420 - case 1072: - goto tr420 - case 1073: - goto tr420 - case 1074: - goto tr420 - case 1075: - goto tr420 - case 1076: - goto tr420 - case 1077: - goto tr420 - case 1078: - goto tr420 - case 1079: - goto tr420 - case 1080: - goto tr420 - case 1081: - goto tr420 - case 1082: - goto tr420 - case 1083: - goto tr420 - case 1084: - goto tr420 - case 1085: - goto tr420 - case 1086: - goto tr420 - case 1087: - goto tr420 - case 1088: - goto tr420 - case 1089: - goto tr420 - case 4872: - goto tr4562 - case 1090: - goto tr420 - case 1091: - goto tr2 - case 1092: - goto tr420 - case 1093: - goto tr420 - case 1094: - goto tr420 - case 1095: - goto tr420 - case 1096: - goto tr420 - case 1097: - goto tr420 - case 1098: - goto tr420 - case 1099: - goto tr420 - case 1100: - goto tr420 - case 1101: - goto tr420 - case 1102: - goto tr420 - case 1103: - goto tr420 - case 1104: - goto tr420 - case 1105: - goto tr420 - case 1106: - goto tr420 - case 1107: - goto tr420 - case 1108: - goto tr420 - case 1109: - goto tr420 - case 1110: - goto tr420 - case 1111: - goto tr420 - case 1112: - goto tr420 - case 1113: - goto tr420 - case 1114: - goto tr420 - case 1115: - goto tr420 - case 1116: - goto tr420 - case 1117: - goto tr420 - case 1118: - goto tr420 - case 1119: - goto tr420 - case 1120: - goto tr420 - case 1121: - goto tr420 - case 1122: - goto tr420 - case 1123: - goto tr420 - case 1124: - goto tr420 - case 1125: - goto tr420 - case 1126: - goto tr420 - case 1127: - goto tr420 - case 1128: - goto tr420 - case 1129: - goto tr420 - case 1130: - goto tr420 - case 1131: - goto tr420 - case 1132: - goto tr420 - case 1133: - goto tr420 - case 1134: - goto tr420 - case 1135: - goto tr420 - case 1136: - goto tr420 - case 1137: - goto tr420 - case 1138: - goto tr420 - case 1139: - goto tr420 - case 1140: - goto tr420 - case 1141: - goto tr420 - case 1142: - goto tr420 - case 1143: - goto tr420 - case 1144: - goto tr420 - case 1145: - goto tr420 - case 1146: - goto tr420 - case 1147: - goto tr420 - case 1148: - goto tr420 - case 1149: - goto tr420 - case 1150: - goto tr420 - case 1151: - goto tr420 - case 1152: - goto tr420 - case 1153: - goto tr420 - case 1154: - goto tr420 - case 1155: - goto tr420 - case 1156: - goto tr420 - case 1157: - goto tr420 - case 1158: - goto tr420 - case 1159: - goto tr420 - case 1160: - goto tr420 - case 1161: - goto tr420 - case 1162: - goto tr420 - case 1163: - goto tr420 - case 1164: - goto tr2 - case 1165: - goto tr2 - case 1166: - goto tr2 - case 1167: - goto tr2 - case 1168: - goto tr420 - case 1169: - goto tr420 - case 1170: - goto tr420 - case 1171: - goto tr420 - case 1172: - goto tr420 - case 1173: - goto tr420 - case 1174: - goto tr420 - case 1175: - goto tr420 - case 1176: - goto tr420 - case 1177: - goto tr420 - case 1178: - goto tr420 - case 1179: - goto tr420 - case 1180: - goto tr420 - case 1181: - goto tr420 - case 1182: - goto tr420 - case 1183: - goto tr420 - case 1184: - goto tr420 - case 1185: - goto tr420 - case 1186: - goto tr420 - case 1187: - goto tr2 - case 1188: - goto tr2 - case 1189: - goto tr420 - case 1190: - goto tr420 - case 1191: - goto tr420 - case 1192: - goto tr420 - case 1193: - goto tr420 - case 1194: - goto tr420 - case 1195: - goto tr420 - case 1196: - goto tr420 - case 1197: - goto tr420 - case 1198: - goto tr420 - case 1199: - goto tr420 - case 1200: - goto tr420 - case 1201: - goto tr420 - case 1202: - goto tr420 - case 1203: - goto tr420 - case 1204: - goto tr420 - case 1205: - goto tr420 - case 1206: - goto tr420 - case 1207: - goto tr420 - case 1208: - goto tr420 - case 1209: - goto tr420 - case 1210: - goto tr420 - case 1211: - goto tr420 - case 1212: - goto tr420 - case 1213: - goto tr420 - case 1214: - goto tr420 - case 1215: - goto tr420 - case 1216: - goto tr420 - case 1217: - goto tr420 - case 1218: - goto tr420 - case 1219: - goto tr420 - case 1220: - goto tr420 - case 1221: - goto tr420 - case 1222: - goto tr420 - case 1223: - goto tr420 - case 1224: - goto tr2 - case 1225: - goto tr420 - case 1226: - goto tr420 - case 1227: - goto tr420 - case 1228: - goto tr420 - case 1229: - goto tr420 - case 1230: - goto tr420 - case 1231: - goto tr420 - case 1232: - goto tr420 - case 1233: - goto tr420 - case 1234: - goto tr420 - case 1235: - goto tr420 - case 1236: - goto tr420 - case 1237: - goto tr420 - case 1238: - goto tr420 - case 1239: - goto tr420 - case 1240: - goto tr420 - case 1241: - goto tr420 - case 1242: - goto tr420 - case 1243: - goto tr420 - case 1244: - goto tr420 - case 1245: - goto tr420 - case 1246: - goto tr420 - case 1247: - goto tr420 - case 1248: - goto tr420 - case 1249: - goto tr420 - case 1250: - goto tr420 - case 1251: - goto tr420 - case 1252: - goto tr420 - case 1253: - goto tr420 - case 1254: - goto tr420 - case 1255: - goto tr420 - case 1256: - goto tr420 - case 1257: - goto tr420 - case 1258: - goto tr420 - case 1259: - goto tr420 - case 1260: - goto tr420 - case 1261: - goto tr2 - case 1262: - goto tr420 - case 1263: - goto tr420 - case 1264: - goto tr420 - case 1265: - goto tr420 - case 1266: - goto tr420 - case 1267: - goto tr420 - case 1268: - goto tr420 - case 1269: - goto tr420 - case 1270: - goto tr420 - case 1271: - goto tr420 - case 1272: - goto tr420 - case 1273: - goto tr420 - case 1274: - goto tr420 - case 1275: - goto tr420 - case 1276: - goto tr420 - case 1277: - goto tr420 - case 1278: - goto tr420 - case 1279: - goto tr420 - case 1280: - goto tr420 - case 1281: - goto tr420 - case 1282: - goto tr420 - case 1283: - goto tr420 - case 1284: - goto tr420 - case 1285: - goto tr420 - case 1286: - goto tr420 - case 1287: - goto tr420 - case 1288: - goto tr420 - case 1289: - goto tr420 - case 1290: - goto tr420 - case 1291: - goto tr420 - case 1292: - goto tr420 - case 1293: - goto tr420 - case 1294: - goto tr420 - case 1295: - goto tr420 - case 1296: - goto tr420 - case 1297: - goto tr420 - case 1298: - goto tr420 - case 1299: - goto tr420 - case 1300: - goto tr420 - case 1301: - goto tr420 - case 1302: - goto tr420 - case 1303: - goto tr420 - case 1304: - goto tr420 - case 1305: - goto tr420 - case 1306: - goto tr420 - case 1307: - goto tr420 - case 1308: - goto tr420 - case 1309: - goto tr420 - case 1310: - goto tr420 - case 1311: - goto tr420 - case 1312: - goto tr420 - case 1313: - goto tr420 - case 1314: - goto tr420 - case 1315: - goto tr420 - case 1316: - goto tr420 - case 1317: - goto tr420 - case 1318: - goto tr420 - case 1319: - goto tr420 - case 1320: - goto tr420 - case 1321: - goto tr420 - case 1322: - goto tr420 - case 1323: - goto tr420 - case 1324: - goto tr420 - case 1325: - goto tr420 - case 1326: - goto tr420 - case 1327: - goto tr420 - case 1328: - goto tr420 - case 1329: - goto tr420 - case 1330: - goto tr420 - case 1331: - goto tr420 - case 1332: - goto tr420 - case 1333: - goto tr420 - case 1334: - goto tr420 - case 1335: - goto tr420 - case 1336: - goto tr420 - case 1337: - goto tr420 - case 1338: - goto tr420 - case 1339: - goto tr420 - case 1340: - goto tr420 - case 1341: - goto tr420 - case 1342: - goto tr420 - case 1343: - goto tr420 - case 1344: - goto tr420 - case 1345: - goto tr420 - case 1346: - goto tr420 - case 1347: - goto tr420 - case 1348: - goto tr420 - case 1349: - goto tr420 - case 1350: - goto tr420 - case 1351: - goto tr420 - case 1352: - goto tr420 - case 1353: - goto tr420 - case 1354: - goto tr420 - case 1355: - goto tr420 - case 1356: - goto tr420 - case 1357: - goto tr420 - case 1358: - goto tr420 - case 1359: - goto tr420 - case 1360: - goto tr420 - case 1361: - goto tr420 - case 1362: - goto tr420 - case 1363: - goto tr420 - case 1364: - goto tr420 - case 1365: - goto tr420 - case 1366: - goto tr420 - case 1367: - goto tr420 - case 1368: - goto tr420 - case 1369: - goto tr420 - case 1370: - goto tr420 - case 1371: - goto tr420 - case 1372: - goto tr420 - case 1373: - goto tr420 - case 1374: - goto tr420 - case 1375: - goto tr420 - case 1376: - goto tr420 - case 1377: - goto tr420 - case 1378: - goto tr420 - case 1379: - goto tr420 - case 1380: - goto tr420 - case 1381: - goto tr420 - case 1382: - goto tr420 - case 1383: - goto tr420 - case 1384: - goto tr420 - case 1385: - goto tr420 - case 1386: - goto tr420 - case 1387: - goto tr420 - case 1388: - goto tr420 - case 1389: - goto tr420 - case 1390: - goto tr420 - case 1391: - goto tr420 - case 1392: - goto tr420 - case 1393: - goto tr420 - case 1394: - goto tr420 - case 1395: - goto tr420 - case 1396: - goto tr420 - case 1397: - goto tr420 - case 1398: - goto tr420 - case 1399: - goto tr420 - case 1400: - goto tr420 - case 1401: - goto tr420 - case 1402: - goto tr420 - case 1403: - goto tr420 - case 1404: - goto tr420 - case 1405: - goto tr420 - case 1406: - goto tr420 - case 1407: - goto tr420 - case 1408: - goto tr420 - case 1409: - goto tr420 - case 1410: - goto tr420 - case 1411: - goto tr420 - case 1412: - goto tr420 - case 1413: - goto tr420 - case 1414: - goto tr420 - case 1415: - goto tr420 - case 1416: - goto tr420 - case 1417: - goto tr420 - case 1418: - goto tr420 - case 1419: - goto tr420 - case 1420: - goto tr420 - case 1421: - goto tr420 - case 1422: - goto tr420 - case 1423: - goto tr420 - case 1424: - goto tr420 - case 1425: - goto tr420 - case 1426: - goto tr420 - case 1427: - goto tr420 - case 1428: - goto tr420 - case 1429: - goto tr420 - case 1430: - goto tr420 - case 1431: - goto tr420 - case 1432: - goto tr420 - case 1433: - goto tr420 - case 1434: - goto tr420 - case 1435: - goto tr420 - case 1436: - goto tr420 - case 1437: - goto tr420 - case 1438: - goto tr420 - case 1439: - goto tr420 - case 1440: - goto tr420 - case 1441: - goto tr420 - case 1442: - goto tr420 - case 1443: - goto tr420 - case 1444: - goto tr420 - case 1445: - goto tr420 - case 1446: - goto tr420 - case 1447: - goto tr420 - case 1448: - goto tr420 - case 1449: - goto tr420 - case 1450: - goto tr420 - case 1451: - goto tr420 - case 1452: - goto tr420 - case 1453: - goto tr420 - case 1454: - goto tr420 - case 1455: - goto tr420 - case 1456: - goto tr420 - case 1457: - goto tr420 - case 1458: - goto tr420 - case 1459: - goto tr420 - case 1460: - goto tr420 - case 1461: - goto tr420 - case 1462: - goto tr420 - case 1463: - goto tr420 - case 1464: - goto tr420 - case 1465: - goto tr420 - case 1466: - goto tr420 - case 1467: - goto tr420 - case 1468: - goto tr420 - case 1469: - goto tr420 - case 1470: - goto tr420 - case 1471: - goto tr420 - case 1472: - goto tr420 - case 1473: - goto tr2 - case 1474: - goto tr2 - case 1475: - goto tr2 - case 1476: - goto tr2 - case 1477: - goto tr2 - case 1478: - goto tr2 - case 1479: - goto tr2 - case 1480: - goto tr2 - case 1481: - goto tr2 - case 1482: - goto tr2 - case 1483: - goto tr2 - case 1484: - goto tr2 - case 1485: - goto tr2 - case 1486: - goto tr2 - case 1487: - goto tr2 - case 1488: - goto tr2 - case 1489: - goto tr2 - case 1490: - goto tr2 - case 1491: - goto tr2 - case 1492: - goto tr2 - case 1493: - goto tr2 - case 1494: - goto tr2 - case 1495: - goto tr2 - case 1496: - goto tr2 - case 1497: - goto tr2 - case 1498: - goto tr2 - case 1499: - goto tr2 - case 1500: - goto tr2 - case 1501: - goto tr2 - case 1502: - goto tr2 - case 1503: - goto tr420 - case 1504: - goto tr2 - case 1505: - goto tr2 - case 1506: - goto tr2 - case 1507: - goto tr2 - case 1508: - goto tr2 - case 1509: - goto tr2 - case 1510: - goto tr2 - case 1511: - goto tr2 - case 1512: - goto tr2 - case 1513: - goto tr2 - case 1514: - goto tr2 - case 1515: - goto tr2 - case 1516: - goto tr2 - case 1517: - goto tr2 - case 1518: - goto tr2 - case 1519: - goto tr2 - case 1520: - goto tr2 - case 1521: - goto tr2 - case 1522: - goto tr2 - case 1523: - goto tr420 - case 1524: - goto tr2 - case 1525: - goto tr2 - case 1526: - goto tr2 - case 1527: - goto tr2 - case 1528: - goto tr2 - case 1529: - goto tr2 - case 1530: - goto tr420 - case 1531: - goto tr2 - case 1532: - goto tr2 - case 1533: - goto tr420 - case 1534: - goto tr2 - case 1535: - goto tr2 - case 1536: - goto tr2 - case 1537: - goto tr2 - case 1538: - goto tr2 - case 1539: - goto tr2 - case 1540: - goto tr2 - case 1541: - goto tr2 - case 1542: - goto tr2 - case 1543: - goto tr2 - case 1544: - goto tr2 - case 1545: - goto tr420 - case 1546: - goto tr2 - case 1547: - goto tr2 - case 1548: - goto tr2 - case 1549: - goto tr2 - case 1550: - goto tr2 - case 1551: - goto tr420 - case 1552: - goto tr2 - case 1553: - goto tr2 - case 1554: - goto tr2 - case 1555: - goto tr2 - case 1556: - goto tr2 - case 1557: - goto tr2 - case 1558: - goto tr2 - case 1559: - goto tr2 - case 1560: - goto tr2 - case 1561: - goto tr2 - case 1562: - goto tr2 - case 1563: - goto tr2 - case 1564: - goto tr2 - case 1565: - goto tr2 - case 1566: - goto tr2 - case 1567: - goto tr2 - case 1568: - goto tr2 - case 1569: - goto tr2 - case 1570: - goto tr2 - case 1571: - goto tr2 - case 1572: - goto tr2 - case 1573: - goto tr2 - case 1574: - goto tr2 - case 1575: - goto tr2 - case 1576: - goto tr2 - case 1577: - goto tr2 - case 1578: - goto tr2 - case 1579: - goto tr2 - case 1580: - goto tr2 - case 1581: - goto tr2 - case 1582: - goto tr2 - case 1583: - goto tr2 - case 1584: - goto tr2 - case 1585: - goto tr2 - case 1586: - goto tr2 - case 1587: - goto tr2 - case 1588: - goto tr420 - case 1589: - goto tr2 - case 1590: - goto tr2 - case 1591: - goto tr2 - case 4873: - goto tr4521 - case 1592: - goto tr125 - case 1593: - goto tr125 - case 1594: - goto tr125 - case 1595: - goto tr125 - case 1596: - goto tr125 - case 1597: - goto tr125 - case 1598: - goto tr125 - case 1599: - goto tr125 - case 1600: - goto tr125 - case 1601: - goto tr125 - case 1602: - goto tr125 - case 1603: - goto tr125 - case 1604: - goto tr125 - case 1605: - goto tr125 - case 1606: - goto tr125 - case 1607: - goto tr125 - case 1608: - goto tr125 - case 1609: - goto tr125 - case 1610: - goto tr125 - case 1611: - goto tr125 - case 1612: - goto tr125 - case 1613: - goto tr125 - case 1614: - goto tr125 - case 1615: - goto tr125 - case 1616: - goto tr125 - case 1617: - goto tr125 - case 1618: - goto tr125 - case 1619: - goto tr125 - case 1620: - goto tr125 - case 1621: - goto tr125 - case 1622: - goto tr125 - case 1623: - goto tr125 - case 1624: - goto tr125 - case 1625: - goto tr125 - case 1626: - goto tr125 - case 1627: - goto tr125 - case 1628: - goto tr125 - case 1629: - goto tr125 - case 1630: - goto tr125 - case 1631: - goto tr125 - case 1632: - goto tr125 - case 1633: - goto tr125 - case 1634: - goto tr125 - case 1635: - goto tr125 - case 1636: - goto tr125 - case 1637: - goto tr125 - case 1638: - goto tr125 - case 1639: - goto tr125 - case 1640: - goto tr125 - case 1641: - goto tr125 - case 1642: - goto tr125 - case 1643: - goto tr125 - case 1644: - goto tr125 - case 1645: - goto tr125 - case 1646: - goto tr125 - case 1647: - goto tr125 - case 1648: - goto tr125 - case 1649: - goto tr2 - case 1650: - goto tr2 - case 1651: - goto tr125 - case 1652: - goto tr125 - case 1653: - goto tr125 - case 1654: - goto tr125 - case 1655: - goto tr125 - case 1656: - goto tr125 - case 1657: - goto tr125 - case 1658: - goto tr125 - case 1659: - goto tr2 - case 1660: - goto tr125 - case 1661: - goto tr125 - case 1662: - goto tr125 - case 1663: - goto tr125 - case 1664: - goto tr125 - case 1665: - goto tr125 - case 1666: - goto tr125 - case 1667: - goto tr125 - case 1668: - goto tr125 - case 1669: - goto tr125 - case 1670: - goto tr125 - case 1671: - goto tr125 - case 1672: - goto tr125 - case 1673: - goto tr2 - case 1674: - goto tr125 - case 1675: - goto tr125 - case 1676: - goto tr125 - case 1677: - goto tr125 - case 1678: - goto tr125 - case 1679: - goto tr125 - case 1680: - goto tr125 - case 1681: - goto tr125 - case 1682: - goto tr125 - case 1683: - goto tr125 - case 1684: - goto tr125 - case 1685: - goto tr125 - case 1686: - goto tr125 - case 1687: - goto tr125 - case 1688: - goto tr125 - case 1689: - goto tr125 - case 1690: - goto tr125 - case 1691: - goto tr125 - case 1692: - goto tr125 - case 1693: - goto tr125 - case 1694: - goto tr125 - case 1695: - goto tr125 - case 1696: - goto tr125 - case 1697: - goto tr125 - case 1698: - goto tr125 - case 1699: - goto tr125 - case 1700: - goto tr125 - case 1701: - goto tr125 - case 1702: - goto tr2 - case 1703: - goto tr125 - case 1704: - goto tr125 - case 1705: - goto tr125 - case 1706: - goto tr125 - case 1707: - goto tr125 - case 1708: - goto tr125 - case 1709: - goto tr2 - case 1710: - goto tr125 - case 1711: - goto tr125 - case 1712: - goto tr125 - case 1713: - goto tr125 - case 1714: - goto tr125 - case 1715: - goto tr125 - case 1716: - goto tr125 - case 1717: - goto tr125 - case 1718: - goto tr125 - case 1719: - goto tr125 - case 1720: - goto tr125 - case 1721: - goto tr125 - case 1722: - goto tr125 - case 1723: - goto tr125 - case 1724: - goto tr2 - case 1725: - goto tr125 - case 1726: - goto tr2 - case 1727: - goto tr125 - case 1728: - goto tr2 - case 1729: - goto tr125 - case 1730: - goto tr125 - case 1731: - goto tr2 - case 1732: - goto tr125 - case 1733: - goto tr125 - case 1734: - goto tr125 - case 1735: - goto tr125 - case 1736: - goto tr125 - case 1737: - goto tr125 - case 1738: - goto tr125 - case 1739: - goto tr125 - case 1740: - goto tr2 - case 1741: - goto tr125 - case 1742: - goto tr125 - case 1743: - goto tr125 - case 1744: - goto tr125 - case 1745: - goto tr125 - case 1746: - goto tr125 - case 1747: - goto tr125 - case 1748: - goto tr125 - case 1749: - goto tr125 - case 1750: - goto tr125 - case 1751: - goto tr125 - case 1752: - goto tr125 - case 1753: - goto tr125 - case 1754: - goto tr125 - case 1755: - goto tr125 - case 1756: - goto tr125 - case 1757: - goto tr125 - case 1758: - goto tr125 - case 1759: - goto tr125 - case 1760: - goto tr125 - case 1761: - goto tr125 - case 1762: - goto tr125 - case 1763: - goto tr125 - case 1764: - goto tr125 - case 1765: - goto tr125 - case 1766: - goto tr125 - case 1767: - goto tr125 - case 1768: - goto tr125 - case 1769: - goto tr125 - case 1770: - goto tr125 - case 1771: - goto tr125 - case 1772: - goto tr125 - case 1773: - goto tr125 - case 1774: - goto tr125 - case 1775: - goto tr125 - case 1776: - goto tr125 - case 1777: - goto tr125 - case 1778: - goto tr125 - case 1779: - goto tr125 - case 1780: - goto tr125 - case 1781: - goto tr125 - case 1782: - goto tr125 - case 1783: - goto tr125 - case 1784: - goto tr125 - case 1785: - goto tr125 - case 1786: - goto tr125 - case 1787: - goto tr125 - case 1788: - goto tr125 - case 1789: - goto tr125 - case 1790: - goto tr125 - case 1791: - goto tr125 - case 1792: - goto tr125 - case 1793: - goto tr125 - case 1794: - goto tr125 - case 1795: - goto tr125 - case 1796: - goto tr125 - case 1797: - goto tr125 - case 1798: - goto tr125 - case 1799: - goto tr125 - case 1800: - goto tr125 - case 1801: - goto tr125 - case 1802: - goto tr125 - case 1803: - goto tr125 - case 1804: - goto tr125 - case 1805: - goto tr125 - case 1806: - goto tr125 - case 1807: - goto tr125 - case 1808: - goto tr125 - case 1809: - goto tr125 - case 1810: - goto tr125 - case 1811: - goto tr125 - case 1812: - goto tr125 - case 1813: - goto tr125 - case 1814: - goto tr125 - case 1815: - goto tr125 - case 1816: - goto tr125 - case 1817: - goto tr125 - case 1818: - goto tr125 - case 1819: - goto tr125 - case 1820: - goto tr125 - case 1821: - goto tr125 - case 1822: - goto tr125 - case 1823: - goto tr125 - case 1824: - goto tr125 - case 1825: - goto tr125 - case 1826: - goto tr125 - case 1827: - goto tr125 - case 1828: - goto tr125 - case 1829: - goto tr125 - case 1830: - goto tr125 - case 1831: - goto tr125 - case 1832: - goto tr125 - case 1833: - goto tr125 - case 1834: - goto tr125 - case 1835: - goto tr125 - case 1836: - goto tr125 - case 1837: - goto tr125 - case 1838: - goto tr125 - case 1839: - goto tr125 - case 1840: - goto tr125 - case 1841: - goto tr125 - case 1842: - goto tr125 - case 1843: - goto tr125 - case 1844: - goto tr125 - case 1845: - goto tr125 - case 1846: - goto tr125 - case 1847: - goto tr125 - case 1848: - goto tr125 - case 1849: - goto tr125 - case 1850: - goto tr125 - case 1851: - goto tr125 - case 1852: - goto tr125 - case 1853: - goto tr125 - case 1854: - goto tr125 - case 1855: - goto tr125 - case 1856: - goto tr125 - case 1857: - goto tr125 - case 1858: - goto tr125 - case 1859: - goto tr125 - case 1860: - goto tr125 - case 1861: - goto tr125 - case 1862: - goto tr125 - case 1863: - goto tr125 - case 1864: - goto tr125 - case 1865: - goto tr125 - case 1866: - goto tr125 - case 1867: - goto tr125 - case 1868: - goto tr125 - case 1869: - goto tr125 - case 1870: - goto tr125 - case 1871: - goto tr125 - case 1872: - goto tr125 - case 1873: - goto tr125 - case 1874: - goto tr125 - case 1875: - goto tr125 - case 1876: - goto tr125 - case 1877: - goto tr125 - case 1878: - goto tr125 - case 1879: - goto tr125 - case 1880: - goto tr125 - case 1881: - goto tr125 - case 1882: - goto tr125 - case 1883: - goto tr125 - case 1884: - goto tr125 - case 1885: - goto tr125 - case 1886: - goto tr125 - case 1887: - goto tr125 - case 1888: - goto tr125 - case 1889: - goto tr125 - case 1890: - goto tr125 - case 1891: - goto tr125 - case 1892: - goto tr125 - case 1893: - goto tr125 - case 1894: - goto tr125 - case 1895: - goto tr125 - case 1896: - goto tr125 - case 1897: - goto tr125 - case 1898: - goto tr125 - case 1899: - goto tr125 - case 1900: - goto tr125 - case 1901: - goto tr125 - case 1902: - goto tr125 - case 1903: - goto tr125 - case 1904: - goto tr125 - case 1905: - goto tr125 - case 1906: - goto tr125 - case 1907: - goto tr125 - case 1908: - goto tr125 - case 1909: - goto tr125 - case 1910: - goto tr125 - case 1911: - goto tr125 - case 1912: - goto tr125 - case 1913: - goto tr125 - case 1914: - goto tr125 - case 1915: - goto tr125 - case 1916: - goto tr125 - case 1917: - goto tr125 - case 1918: - goto tr125 - case 1919: - goto tr125 - case 1920: - goto tr125 - case 1921: - goto tr125 - case 1922: - goto tr125 - case 1923: - goto tr125 - case 1924: - goto tr125 - case 1925: - goto tr125 - case 1926: - goto tr125 - case 1927: - goto tr125 - case 1928: - goto tr125 - case 1929: - goto tr125 - case 1930: - goto tr125 - case 1931: - goto tr125 - case 1932: - goto tr125 - case 1933: - goto tr125 - case 1934: - goto tr125 - case 1935: - goto tr125 - case 1936: - goto tr125 - case 1937: - goto tr125 - case 1938: - goto tr125 - case 1939: - goto tr125 - case 1940: - goto tr125 - case 1941: - goto tr125 - case 1942: - goto tr125 - case 1943: - goto tr125 - case 1944: - goto tr125 - case 1945: - goto tr125 - case 1946: - goto tr125 - case 1947: - goto tr125 - case 1948: - goto tr125 - case 1949: - goto tr125 - case 1950: - goto tr125 - case 1951: - goto tr125 - case 1952: - goto tr125 - case 1953: - goto tr125 - case 1954: - goto tr125 - case 1955: - goto tr125 - case 1956: - goto tr125 - case 1957: - goto tr125 - case 1958: - goto tr125 - case 1959: - goto tr125 - case 1960: - goto tr125 - case 1961: - goto tr125 - case 1962: - goto tr125 - case 1963: - goto tr125 - case 1964: - goto tr125 - case 1965: - goto tr125 - case 1966: - goto tr125 - case 1967: - goto tr125 - case 1968: - goto tr125 - case 1969: - goto tr125 - case 1970: - goto tr125 - case 1971: - goto tr125 - case 1972: - goto tr125 - case 1973: - goto tr125 - case 1974: - goto tr125 - case 1975: - goto tr125 - case 1976: - goto tr125 - case 1977: - goto tr125 - case 1978: - goto tr125 - case 1979: - goto tr125 - case 1980: - goto tr125 - case 1981: - goto tr125 - case 1982: - goto tr125 - case 1983: - goto tr125 - case 1984: - goto tr125 - case 1985: - goto tr125 - case 1986: - goto tr125 - case 1987: - goto tr125 - case 1988: - goto tr125 - case 1989: - goto tr125 - case 1990: - goto tr125 - case 1991: - goto tr125 - case 1992: - goto tr125 - case 1993: - goto tr125 - case 1994: - goto tr125 - case 1995: - goto tr125 - case 1996: - goto tr125 - case 1997: - goto tr125 - case 1998: - goto tr125 - case 1999: - goto tr125 - case 2000: - goto tr125 - case 2001: - goto tr125 - case 2002: - goto tr125 - case 2003: - goto tr125 - case 2004: - goto tr125 - case 2005: - goto tr125 - case 2006: - goto tr125 - case 2007: - goto tr125 - case 2008: - goto tr125 - case 2009: - goto tr125 - case 2010: - goto tr125 - case 2011: - goto tr125 - case 2012: - goto tr125 - case 2013: - goto tr125 - case 2014: - goto tr125 - case 2015: - goto tr125 - case 2016: - goto tr125 - case 2017: - goto tr125 - case 2018: - goto tr125 - case 2019: - goto tr125 - case 2020: - goto tr125 - case 2021: - goto tr125 - case 2022: - goto tr125 - case 2023: - goto tr125 - case 2024: - goto tr125 - case 2025: - goto tr125 - case 2026: - goto tr125 - case 2027: - goto tr125 - case 2028: - goto tr125 - case 2029: - goto tr125 - case 2030: - goto tr125 - case 2031: - goto tr125 - case 2032: - goto tr125 - case 2033: - goto tr125 - case 2034: - goto tr125 - case 2035: - goto tr125 - case 2036: - goto tr125 - case 2037: - goto tr125 - case 2038: - goto tr125 - case 2039: - goto tr125 - case 2040: - goto tr125 - case 2041: - goto tr125 - case 2042: - goto tr125 - case 2043: - goto tr125 - case 2044: - goto tr125 - case 2045: - goto tr125 - case 2046: - goto tr125 - case 2047: - goto tr125 - case 2048: - goto tr125 - case 2049: - goto tr125 - case 2050: - goto tr125 - case 2051: - goto tr125 - case 2052: - goto tr125 - case 2053: - goto tr125 - case 2054: - goto tr125 - case 2055: - goto tr125 - case 2056: - goto tr125 - case 2057: - goto tr125 - case 2058: - goto tr125 - case 2059: - goto tr125 - case 2060: - goto tr125 - case 2061: - goto tr125 - case 2062: - goto tr125 - case 2063: - goto tr125 - case 2064: - goto tr125 - case 2065: - goto tr125 - case 2066: - goto tr125 - case 2067: - goto tr125 - case 2068: - goto tr125 - case 2069: - goto tr125 - case 2070: - goto tr125 - case 2071: - goto tr125 - case 2072: - goto tr125 - case 2073: - goto tr125 - case 2074: - goto tr125 - case 2075: - goto tr125 - case 2076: - goto tr125 - case 2077: - goto tr125 - case 2078: - goto tr125 - case 2079: - goto tr125 - case 2080: - goto tr125 - case 2081: - goto tr125 - case 2082: - goto tr125 - case 2083: - goto tr125 - case 2084: - goto tr125 - case 2085: - goto tr125 - case 2086: - goto tr125 - case 2087: - goto tr125 - case 2088: - goto tr125 - case 2089: - goto tr125 - case 2090: - goto tr125 - case 2091: - goto tr125 - case 2092: - goto tr125 - case 2093: - goto tr125 - case 2094: - goto tr125 - case 2095: - goto tr125 - case 2096: - goto tr125 - case 2097: - goto tr125 - case 2098: - goto tr125 - case 2099: - goto tr125 - case 2100: - goto tr125 - case 2101: - goto tr125 - case 2102: - goto tr125 - case 2103: - goto tr125 - case 2104: - goto tr125 - case 2105: - goto tr125 - case 2106: - goto tr125 - case 2107: - goto tr125 - case 2108: - goto tr125 - case 2109: - goto tr125 - case 2110: - goto tr125 - case 2111: - goto tr125 - case 2112: - goto tr125 - case 2113: - goto tr125 - case 2114: - goto tr125 - case 2115: - goto tr125 - case 2116: - goto tr125 - case 2117: - goto tr125 - case 2118: - goto tr125 - case 2119: - goto tr125 - case 2120: - goto tr125 - case 2121: - goto tr125 - case 2122: - goto tr125 - case 2123: - goto tr125 - case 2124: - goto tr125 - case 2125: - goto tr125 - case 2126: - goto tr125 - case 2127: - goto tr125 - case 2128: - goto tr125 - case 2129: - goto tr125 - case 2130: - goto tr125 - case 2131: - goto tr125 - case 2132: - goto tr125 - case 2133: - goto tr125 - case 2134: - goto tr125 - case 2135: - goto tr125 - case 2136: - goto tr125 - case 2137: - goto tr125 - case 2138: - goto tr125 - case 2139: - goto tr125 - case 2140: - goto tr125 - case 2141: - goto tr125 - case 2142: - goto tr125 - case 2143: - goto tr125 - case 2144: - goto tr125 - case 2145: - goto tr125 - case 2146: - goto tr125 - case 2147: - goto tr125 - case 2148: - goto tr125 - case 2149: - goto tr125 - case 2150: - goto tr125 - case 2151: - goto tr125 - case 2152: - goto tr125 - case 2153: - goto tr125 - case 2154: - goto tr125 - case 2155: - goto tr125 - case 2156: - goto tr125 - case 2157: - goto tr125 - case 2158: - goto tr125 - case 2159: - goto tr125 - case 2160: - goto tr125 - case 2161: - goto tr125 - case 2162: - goto tr125 - case 2163: - goto tr125 - case 2164: - goto tr125 - case 2165: - goto tr125 - case 2166: - goto tr125 - case 2167: - goto tr125 - case 2168: - goto tr125 - case 2169: - goto tr125 - case 2170: - goto tr125 - case 2171: - goto tr125 - case 2172: - goto tr125 - case 2173: - goto tr125 - case 2174: - goto tr125 - case 2175: - goto tr125 - case 2176: - goto tr125 - case 2177: - goto tr125 - case 2178: - goto tr125 - case 2179: - goto tr125 - case 2180: - goto tr125 - case 2181: - goto tr125 - case 2182: - goto tr125 - case 2183: - goto tr125 - case 2184: - goto tr125 - case 2185: - goto tr125 - case 2186: - goto tr125 - case 2187: - goto tr125 - case 2188: - goto tr125 - case 2189: - goto tr125 - case 2190: - goto tr125 - case 2191: - goto tr125 - case 2192: - goto tr125 - case 4874: - goto tr4562 - case 2193: - goto tr420 - case 2194: - goto tr420 - case 2195: - goto tr420 - case 2196: - goto tr420 - case 2197: - goto tr420 - case 2198: - goto tr420 - case 2199: - goto tr420 - case 2200: - goto tr420 - case 2201: - goto tr420 - case 2202: - goto tr420 - case 2203: - goto tr420 - case 2204: - goto tr420 - case 2205: - goto tr420 - case 2206: - goto tr420 - case 2207: - goto tr420 - case 2208: - goto tr420 - case 2209: - goto tr420 - case 2210: - goto tr420 - case 2211: - goto tr420 - case 2212: - goto tr420 - case 2213: - goto tr420 - case 2214: - goto tr420 - case 2215: - goto tr420 - case 2216: - goto tr420 - case 2217: - goto tr420 - case 2218: - goto tr420 - case 2219: - goto tr420 - case 2220: - goto tr420 - case 2221: - goto tr420 - case 2222: - goto tr420 - case 2223: - goto tr420 - case 2224: - goto tr420 - case 2225: - goto tr420 - case 2226: - goto tr420 - case 2227: - goto tr420 - case 2228: - goto tr420 - case 2229: - goto tr420 - case 2230: - goto tr420 - case 2231: - goto tr420 - case 2232: - goto tr420 - case 2233: - goto tr420 - case 2234: - goto tr420 - case 2235: - goto tr420 - case 2236: - goto tr420 - case 2237: - goto tr420 - case 2238: - goto tr420 - case 2239: - goto tr420 - case 2240: - goto tr420 - case 2241: - goto tr420 - case 2242: - goto tr420 - case 2243: - goto tr420 - case 2244: - goto tr420 - case 2245: - goto tr420 - case 2246: - goto tr420 - case 2247: - goto tr420 - case 2248: - goto tr420 - case 2249: - goto tr420 - case 2250: - goto tr420 - case 2251: - goto tr420 - case 2252: - goto tr420 - case 2253: - goto tr420 - case 2254: - goto tr420 - case 2255: - goto tr420 - case 2256: - goto tr420 - case 2257: - goto tr420 - case 2258: - goto tr420 - case 2259: - goto tr420 - case 2260: - goto tr420 - case 2261: - goto tr420 - case 2262: - goto tr420 - case 2263: - goto tr420 - case 2264: - goto tr420 - case 2265: - goto tr420 - case 2266: - goto tr420 - case 2267: - goto tr420 - case 2268: - goto tr420 - case 2269: - goto tr420 - case 2270: - goto tr420 - case 2271: - goto tr420 - case 2272: - goto tr420 - case 2273: - goto tr420 - case 2274: - goto tr420 - case 2275: - goto tr420 - case 2276: - goto tr420 - case 2277: - goto tr420 - case 2278: - goto tr420 - case 2279: - goto tr420 - case 2280: - goto tr420 - case 2281: - goto tr420 - case 2282: - goto tr420 - case 2283: - goto tr420 - case 2284: - goto tr420 - case 2285: - goto tr420 - case 2286: - goto tr420 - case 2287: - goto tr420 - case 2288: - goto tr420 - case 2289: - goto tr420 - case 2290: - goto tr420 - case 2291: - goto tr420 - case 2292: - goto tr420 - case 2293: - goto tr420 - case 2294: - goto tr420 - case 2295: - goto tr420 - case 2296: - goto tr420 - case 2297: - goto tr420 - case 2298: - goto tr420 - case 2299: - goto tr420 - case 2300: - goto tr420 - case 2301: - goto tr420 - case 2302: - goto tr420 - case 2303: - goto tr420 - case 2304: - goto tr420 - case 2305: - goto tr420 - case 2306: - goto tr420 - case 2307: - goto tr420 - case 2308: - goto tr420 - case 2309: - goto tr420 - case 2310: - goto tr420 - case 2311: - goto tr420 - case 2312: - goto tr420 - case 2313: - goto tr420 - case 2314: - goto tr420 - case 2315: - goto tr420 - case 2316: - goto tr420 - case 2317: - goto tr420 - case 2318: - goto tr420 - case 2319: - goto tr420 - case 2320: - goto tr420 - case 2321: - goto tr420 - case 2322: - goto tr420 - case 2323: - goto tr420 - case 2324: - goto tr420 - case 2325: - goto tr420 - case 2326: - goto tr420 - case 2327: - goto tr420 - case 2328: - goto tr420 - case 2329: - goto tr420 - case 2330: - goto tr420 - case 2331: - goto tr420 - case 2332: - goto tr420 - case 2333: - goto tr420 - case 2334: - goto tr420 - case 2335: - goto tr420 - case 2336: - goto tr420 - case 2337: - goto tr420 - case 2338: - goto tr420 - case 2339: - goto tr420 - case 4875: - goto tr4562 - case 4876: - goto tr4562 - case 2340: - goto tr420 - case 2341: - goto tr420 - case 2342: - goto tr420 - case 2343: - goto tr420 - case 2344: - goto tr420 - case 2345: - goto tr420 - case 2346: - goto tr420 - case 2347: - goto tr420 - case 2348: - goto tr420 - case 2349: - goto tr420 - case 2350: - goto tr420 - case 2351: - goto tr420 - case 2352: - goto tr420 - case 2353: - goto tr420 - case 2354: - goto tr420 - case 2355: - goto tr420 - case 2356: - goto tr420 - case 2357: - goto tr420 - case 2358: - goto tr420 - case 2359: - goto tr420 - case 2360: - goto tr420 - case 2361: - goto tr420 - case 2362: - goto tr420 - case 2363: - goto tr420 - case 2364: - goto tr420 - case 2365: - goto tr420 - case 2366: - goto tr420 - case 2367: - goto tr420 - case 2368: - goto tr420 - case 2369: - goto tr420 - case 2370: - goto tr420 - case 2371: - goto tr420 - case 2372: - goto tr420 - case 2373: - goto tr420 - case 2374: - goto tr420 - case 2375: - goto tr420 - case 2376: - goto tr420 - case 2377: - goto tr420 - case 2378: - goto tr420 - case 2379: - goto tr420 - case 2380: - goto tr420 - case 2381: - goto tr420 - case 2382: - goto tr420 - case 2383: - goto tr420 - case 2384: - goto tr420 - case 2385: - goto tr420 - case 2386: - goto tr420 - case 2387: - goto tr420 - case 2388: - goto tr420 - case 2389: - goto tr420 - case 2390: - goto tr420 - case 2391: - goto tr420 - case 2392: - goto tr420 - case 2393: - goto tr420 - case 2394: - goto tr420 - case 2395: - goto tr420 - case 2396: - goto tr420 - case 2397: - goto tr420 - case 2398: - goto tr420 - case 2399: - goto tr420 - case 2400: - goto tr420 - case 2401: - goto tr420 - case 2402: - goto tr420 - case 2403: - goto tr420 - case 2404: - goto tr420 - case 2405: - goto tr420 - case 2406: - goto tr420 - case 2407: - goto tr420 - case 2408: - goto tr420 - case 2409: - goto tr420 - case 2410: - goto tr420 - case 2411: - goto tr420 - case 2412: - goto tr420 - case 2413: - goto tr420 - case 2414: - goto tr420 - case 2415: - goto tr420 - case 2416: - goto tr420 - case 2417: - goto tr420 - case 2418: - goto tr420 - case 2419: - goto tr420 - case 2420: - goto tr420 - case 2421: - goto tr420 - case 2422: - goto tr420 - case 2423: - goto tr420 - case 2424: - goto tr420 - case 2425: - goto tr420 - case 2426: - goto tr420 - case 2427: - goto tr420 - case 2428: - goto tr420 - case 2429: - goto tr420 - case 2430: - goto tr420 - case 2431: - goto tr420 - case 2432: - goto tr420 - case 2433: - goto tr420 - case 2434: - goto tr420 - case 2435: - goto tr420 - case 2436: - goto tr2 - case 2437: - goto tr420 - case 2438: - goto tr2 - case 2439: - goto tr420 - case 2440: - goto tr420 - case 2441: - goto tr420 - case 2442: - goto tr420 - case 2443: - goto tr420 - case 2444: - goto tr420 - case 2445: - goto tr420 - case 2446: - goto tr420 - case 2447: - goto tr420 - case 2448: - goto tr420 - case 2449: - goto tr420 - case 2450: - goto tr420 - case 2451: - goto tr420 - case 2452: - goto tr420 - case 2453: - goto tr420 - case 2454: - goto tr420 - case 2455: - goto tr420 - case 2456: - goto tr420 - case 2457: - goto tr420 - case 2458: - goto tr420 - case 2459: - goto tr420 - case 2460: - goto tr420 - case 2461: - goto tr420 - case 2462: - goto tr420 - case 2463: - goto tr420 - case 2464: - goto tr420 - case 2465: - goto tr420 - case 2466: - goto tr420 - case 2467: - goto tr420 - case 2468: - goto tr420 - case 2469: - goto tr420 - case 2470: - goto tr420 - case 2471: - goto tr420 - case 2472: - goto tr420 - case 2473: - goto tr420 - case 2474: - goto tr420 - case 2475: - goto tr420 - case 2476: - goto tr420 - case 2477: - goto tr420 - case 2478: - goto tr420 - case 2479: - goto tr420 - case 2480: - goto tr420 - case 2481: - goto tr420 - case 2482: - goto tr420 - case 2483: - goto tr420 - case 2484: - goto tr420 - case 2485: - goto tr420 - case 2486: - goto tr420 - case 2487: - goto tr420 - case 2488: - goto tr420 - case 2489: - goto tr420 - case 2490: - goto tr420 - case 2491: - goto tr420 - case 2492: - goto tr420 - case 2493: - goto tr420 - case 2494: - goto tr420 - case 2495: - goto tr420 - case 2496: - goto tr420 - case 2497: - goto tr420 - case 2498: - goto tr420 - case 2499: - goto tr420 - case 2500: - goto tr420 - case 2501: - goto tr420 - case 2502: - goto tr420 - case 2503: - goto tr420 - case 2504: - goto tr420 - case 2505: - goto tr420 - case 2506: - goto tr420 - case 2507: - goto tr420 - case 2508: - goto tr420 - case 2509: - goto tr420 - case 2510: - goto tr420 - case 2511: - goto tr420 - case 2512: - goto tr420 - case 2513: - goto tr420 - case 2514: - goto tr420 - case 2515: - goto tr420 - case 2516: - goto tr420 - case 2517: - goto tr420 - case 2518: - goto tr420 - case 2519: - goto tr420 - case 2520: - goto tr420 - case 2521: - goto tr420 - case 2522: - goto tr420 - case 2523: - goto tr420 - case 2524: - goto tr420 - case 2525: - goto tr420 - case 2526: - goto tr420 - case 2527: - goto tr420 - case 2528: - goto tr420 - case 2529: - goto tr420 - case 2530: - goto tr420 - case 2531: - goto tr420 - case 2532: - goto tr420 - case 2533: - goto tr420 - case 2534: - goto tr420 - case 2535: - goto tr420 - case 2536: - goto tr420 - case 2537: - goto tr420 - case 2538: - goto tr420 - case 2539: - goto tr420 - case 2540: - goto tr420 - case 2541: - goto tr420 - case 2542: - goto tr420 - case 2543: - goto tr420 - case 2544: - goto tr420 - case 2545: - goto tr420 - case 2546: - goto tr420 - case 2547: - goto tr420 - case 2548: - goto tr420 - case 2549: - goto tr420 - case 2550: - goto tr420 - case 2551: - goto tr420 - case 2552: - goto tr420 - case 2553: - goto tr420 - case 2554: - goto tr420 - case 2555: - goto tr420 - case 2556: - goto tr420 - case 2557: - goto tr420 - case 2558: - goto tr420 - case 2559: - goto tr420 - case 2560: - goto tr420 - case 2561: - goto tr420 - case 2562: - goto tr420 - case 2563: - goto tr420 - case 2564: - goto tr420 - case 2565: - goto tr420 - case 2566: - goto tr420 - case 2567: - goto tr420 - case 2568: - goto tr420 - case 2569: - goto tr420 - case 2570: - goto tr420 - case 2571: - goto tr420 - case 2572: - goto tr420 - case 2573: - goto tr420 - case 2574: - goto tr420 - case 2575: - goto tr420 - case 2576: - goto tr420 - case 2577: - goto tr420 - case 2578: - goto tr420 - case 2579: - goto tr420 - case 2580: - goto tr420 - case 2581: - goto tr420 - case 2582: - goto tr420 - case 2583: - goto tr420 - case 2584: - goto tr420 - case 2585: - goto tr420 - case 2586: - goto tr420 - case 2587: - goto tr420 - case 2588: - goto tr420 - case 2589: - goto tr420 - case 2590: - goto tr420 - case 2591: - goto tr420 - case 2592: - goto tr420 - case 2593: - goto tr420 - case 2594: - goto tr420 - case 2595: - goto tr420 - case 2596: - goto tr420 - case 2597: - goto tr420 - case 2598: - goto tr420 - case 2599: - goto tr420 - case 2600: - goto tr420 - case 2601: - goto tr420 - case 2602: - goto tr420 - case 2603: - goto tr420 - case 2604: - goto tr420 - case 2605: - goto tr420 - case 2606: - goto tr420 - case 2607: - goto tr420 - case 2608: - goto tr420 - case 2609: - goto tr420 - case 2610: - goto tr420 - case 2611: - goto tr420 - case 2612: - goto tr420 - case 2613: - goto tr420 - case 2614: - goto tr420 - case 2615: - goto tr420 - case 2616: - goto tr420 - case 2617: - goto tr420 - case 2618: - goto tr420 - case 2619: - goto tr420 - case 2620: - goto tr420 - case 2621: - goto tr420 - case 2622: - goto tr420 - case 2623: - goto tr420 - case 2624: - goto tr420 - case 2625: - goto tr420 - case 2626: - goto tr420 - case 2627: - goto tr420 - case 2628: - goto tr420 - case 2629: - goto tr420 - case 2630: - goto tr420 - case 2631: - goto tr420 - case 2632: - goto tr420 - case 2633: - goto tr420 - case 2634: - goto tr420 - case 2635: - goto tr420 - case 4877: - goto tr4499 - case 4878: - goto tr4763 - case 2636: - goto tr2394 - case 2637: - goto tr2 - case 2638: - goto tr2 - case 2639: - goto tr2394 - case 2640: - goto tr2394 - case 2641: - goto tr2394 - case 2642: - goto tr2394 - case 2643: - goto tr2394 - case 2644: - goto tr2394 - case 2645: - goto tr2394 - case 2646: - goto tr2394 - case 2647: - goto tr2394 - case 2648: - goto tr2394 - case 2649: - goto tr2394 - case 2650: - goto tr2 - case 2651: - goto tr2 - case 2652: - goto tr2 - case 2653: - goto tr2 - case 2654: - goto tr2 - case 2655: - goto tr2 - case 2656: - goto tr2 - case 2657: - goto tr2 - case 2658: - goto tr2 - case 2659: - goto tr2 - case 2660: - goto tr2 - case 2661: - goto tr2 - case 2662: - goto tr2 - case 2663: - goto tr2 - case 2664: - goto tr2 - case 2665: - goto tr2 - case 2666: - goto tr2 - case 2667: - goto tr2 - case 2668: - goto tr2 - case 2669: - goto tr2 - case 2670: - goto tr2 - case 2671: - goto tr2 - case 2672: - goto tr2 - case 2673: - goto tr2 - case 2674: - goto tr2 - case 2675: - goto tr2 - case 2676: - goto tr2 - case 2677: - goto tr2 - case 2678: - goto tr2394 - case 2679: - goto tr2 - case 2680: - goto tr2 - case 2681: - goto tr2 - case 2682: - goto tr2 - case 2683: - goto tr2 - case 2684: - goto tr2 - case 2685: - goto tr2 - case 2686: - goto tr2 - case 2687: - goto tr2 - case 2688: - goto tr2 - case 2689: - goto tr2 - case 2690: - goto tr2 - case 2691: - goto tr2 - case 2692: - goto tr2 - case 2693: - goto tr2 - case 2694: - goto tr2 - case 2695: - goto tr2 - case 2696: - goto tr2 - case 2697: - goto tr2 - case 2698: - goto tr2 - case 2699: - goto tr2 - case 2700: - goto tr2394 - case 2701: - goto tr2 - case 2702: - goto tr2 - case 2703: - goto tr2 - case 2704: - goto tr2 - case 2705: - goto tr2 - case 2706: - goto tr2 - case 2707: - goto tr2394 - case 2708: - goto tr2 - case 2709: - goto tr2 - case 2710: - goto tr2394 - case 2711: - goto tr2 - case 2712: - goto tr2 - case 2713: - goto tr2 - case 2714: - goto tr2 - case 2715: - goto tr2 - case 2716: - goto tr2 - case 2717: - goto tr2 - case 2718: - goto tr2 - case 2719: - goto tr2 - case 2720: - goto tr2 - case 2721: - goto tr2 - case 2722: - goto tr2 - case 2723: - goto tr2 - case 2724: - goto tr2 - case 2725: - goto tr2 - case 2726: - goto tr2394 - case 2727: - goto tr2 - case 2728: - goto tr2 - case 2729: - goto tr2 - case 2730: - goto tr2394 - case 2731: - goto tr2 - case 2732: - goto tr2 - case 2733: - goto tr2 - case 2734: - goto tr2 - case 2735: - goto tr2 - case 2736: - goto tr2 - case 2737: - goto tr2 - case 2738: - goto tr2 - case 2739: - goto tr2 - case 2740: - goto tr2 - case 2741: - goto tr2 - case 2742: - goto tr2 - case 2743: - goto tr2 - case 2744: - goto tr2 - case 2745: - goto tr2 - case 2746: - goto tr2 - case 2747: - goto tr2 - case 2748: - goto tr2 - case 2749: - goto tr2 - case 2750: - goto tr2 - case 2751: - goto tr2 - case 2752: - goto tr2 - case 2753: - goto tr2 - case 2754: - goto tr2 - case 2755: - goto tr2 - case 2756: - goto tr2 - case 2757: - goto tr2 - case 2758: - goto tr2 - case 2759: - goto tr2 - case 2760: - goto tr2 - case 2761: - goto tr2 - case 2762: - goto tr2 - case 2763: - goto tr2 - case 2764: - goto tr2 - case 2765: - goto tr2 - case 2766: - goto tr2 - case 2767: - goto tr2 - case 2768: - goto tr2 - case 2769: - goto tr2 - case 2770: - goto tr2 - case 2771: - goto tr2 - case 2772: - goto tr2394 - case 2773: - goto tr2 - case 2774: - goto tr2 - case 2775: - goto tr2 - case 2776: - goto tr2 - case 4879: - goto tr4499 - case 4880: - goto tr4562 - case 4881: - goto tr4562 - case 4882: - goto tr4499 - case 4883: - goto tr4499 - case 4884: - goto tr4562 - case 4885: - goto tr4499 - case 2777: - goto tr0 - case 2778: - goto tr0 - case 2779: - goto tr0 - case 2780: - goto tr0 - case 2781: - goto tr0 - case 2782: - goto tr0 - case 2783: - goto tr0 - case 2784: - goto tr0 - case 2785: - goto tr0 - case 2786: - goto tr0 - case 2787: - goto tr0 - case 2788: - goto tr0 - case 2789: - goto tr0 - case 2790: - goto tr0 - case 2791: - goto tr0 - case 2792: - goto tr0 - case 2793: - goto tr0 - case 2794: - goto tr0 - case 2795: - goto tr0 - case 2796: - goto tr0 - case 2797: - goto tr0 - case 2798: - goto tr0 - case 2799: - goto tr0 - case 2800: - goto tr0 - case 2801: - goto tr0 - case 2802: - goto tr0 - case 2803: - goto tr0 - case 2804: - goto tr0 - case 2805: - goto tr0 - case 2806: - goto tr0 - case 2807: - goto tr0 - case 2808: - goto tr0 - case 2809: - goto tr0 - case 2810: - goto tr0 - case 2811: - goto tr0 - case 2812: - goto tr0 - case 2813: - goto tr0 - case 2814: - goto tr0 - case 2815: - goto tr0 - case 2816: - goto tr0 - case 2817: - goto tr0 - case 2818: - goto tr0 - case 2819: - goto tr0 - case 2820: - goto tr0 - case 2821: - goto tr0 - case 2822: - goto tr0 - case 2823: - goto tr0 - case 2824: - goto tr0 - case 2825: - goto tr0 - case 2826: - goto tr0 - case 2827: - goto tr0 - case 2828: - goto tr0 - case 2829: - goto tr0 - case 2830: - goto tr0 - case 2831: - goto tr0 - case 2832: - goto tr0 - case 2833: - goto tr0 - case 2834: - goto tr0 - case 2835: - goto tr0 - case 2836: - goto tr0 - case 2837: - goto tr0 - case 2838: - goto tr0 - case 2839: - goto tr0 - case 2840: - goto tr0 - case 2841: - goto tr0 - case 2842: - goto tr0 - case 2843: - goto tr0 - case 2844: - goto tr0 - case 2845: - goto tr0 - case 2846: - goto tr0 - case 2847: - goto tr0 - case 2848: - goto tr0 - case 2849: - goto tr0 - case 2850: - goto tr0 - case 2851: - goto tr0 - case 2852: - goto tr0 - case 2853: - goto tr0 - case 2854: - goto tr0 - case 2855: - goto tr0 - case 2856: - goto tr0 - case 2857: - goto tr0 - case 2858: - goto tr0 - case 2859: - goto tr0 - case 2860: - goto tr0 - case 2861: - goto tr0 - case 2862: - goto tr0 - case 2863: - goto tr0 - case 2864: - goto tr0 - case 2865: - goto tr0 - case 2866: - goto tr0 - case 2867: - goto tr0 - case 2868: - goto tr0 - case 2869: - goto tr0 - case 2870: - goto tr0 - case 2871: - goto tr0 - case 2872: - goto tr0 - case 2873: - goto tr0 - case 2874: - goto tr0 - case 2875: - goto tr0 - case 2876: - goto tr0 - case 2877: - goto tr0 - case 2878: - goto tr0 - case 2879: - goto tr0 - case 2880: - goto tr0 - case 2881: - goto tr0 - case 2882: - goto tr0 - case 2883: - goto tr0 - case 2884: - goto tr0 - case 2885: - goto tr0 - case 2886: - goto tr0 - case 2887: - goto tr0 - case 2888: - goto tr0 - case 2889: - goto tr0 - case 2890: - goto tr0 - case 2891: - goto tr0 - case 2892: - goto tr0 - case 2893: - goto tr0 - case 2894: - goto tr0 - case 2895: - goto tr0 - case 2896: - goto tr0 - case 2897: - goto tr0 - case 2898: - goto tr0 - case 2899: - goto tr0 - case 2900: - goto tr0 - case 2901: - goto tr0 - case 2902: - goto tr0 - case 2903: - goto tr0 - case 2904: - goto tr0 - case 2905: - goto tr0 - case 2906: - goto tr0 - case 2907: - goto tr0 - case 2908: - goto tr0 - case 2909: - goto tr0 - case 2910: - goto tr0 - case 2911: - goto tr0 - case 2912: - goto tr0 - case 2913: - goto tr0 - case 2914: - goto tr0 - case 2915: - goto tr0 - case 2916: - goto tr0 - case 2917: - goto tr0 - case 2918: - goto tr0 - case 2919: - goto tr0 - case 2920: - goto tr0 - case 2921: - goto tr0 - case 2922: - goto tr0 - case 2923: - goto tr0 - case 4886: - goto tr4562 - case 2924: - goto tr420 - case 2925: - goto tr420 - case 2926: - goto tr420 - case 2927: - goto tr420 - case 2928: - goto tr420 - case 2929: - goto tr420 - case 2930: - goto tr420 - case 2931: - goto tr420 - case 2932: - goto tr420 - case 2933: - goto tr420 - case 2934: - goto tr420 - case 2935: - goto tr420 - case 2936: - goto tr420 - case 2937: - goto tr420 - case 2938: - goto tr420 - case 2939: - goto tr420 - case 2940: - goto tr420 - case 2941: - goto tr420 - case 2942: - goto tr420 - case 2943: - goto tr420 - case 2944: - goto tr420 - case 2945: - goto tr420 - case 2946: - goto tr420 - case 2947: - goto tr420 - case 2948: - goto tr420 - case 2949: - goto tr420 - case 2950: - goto tr420 - case 2951: - goto tr420 - case 2952: - goto tr420 - case 2953: - goto tr420 - case 2954: - goto tr420 - case 2955: - goto tr420 - case 2956: - goto tr420 - case 2957: - goto tr420 - case 2958: - goto tr420 - case 2959: - goto tr420 - case 2960: - goto tr420 - case 2961: - goto tr420 - case 2962: - goto tr420 - case 2963: - goto tr420 - case 2964: - goto tr420 - case 2965: - goto tr420 - case 2966: - goto tr420 - case 2967: - goto tr420 - case 2968: - goto tr420 - case 2969: - goto tr420 - case 2970: - goto tr420 - case 2971: - goto tr420 - case 2972: - goto tr420 - case 2973: - goto tr420 - case 2974: - goto tr420 - case 2975: - goto tr420 - case 2976: - goto tr420 - case 2977: - goto tr420 - case 2978: - goto tr420 - case 2979: - goto tr420 - case 2980: - goto tr420 - case 2981: - goto tr420 - case 2982: - goto tr420 - case 2983: - goto tr420 - case 2984: - goto tr420 - case 2985: - goto tr420 - case 2986: - goto tr420 - case 2987: - goto tr420 - case 2988: - goto tr420 - case 2989: - goto tr420 - case 2990: - goto tr420 - case 2991: - goto tr420 - case 2992: - goto tr420 - case 2993: - goto tr420 - case 2994: - goto tr420 - case 2995: - goto tr420 - case 2996: - goto tr420 - case 2997: - goto tr420 - case 2998: - goto tr420 - case 2999: - goto tr420 - case 3000: - goto tr420 - case 3001: - goto tr420 - case 3002: - goto tr420 - case 3003: - goto tr420 - case 3004: - goto tr420 - case 3005: - goto tr420 - case 3006: - goto tr420 - case 3007: - goto tr420 - case 3008: - goto tr420 - case 3009: - goto tr420 - case 3010: - goto tr420 - case 3011: - goto tr420 - case 3012: - goto tr420 - case 3013: - goto tr420 - case 3014: - goto tr420 - case 3015: - goto tr420 - case 3016: - goto tr420 - case 3017: - goto tr420 - case 3018: - goto tr420 - case 3019: - goto tr420 - case 3020: - goto tr420 - case 3021: - goto tr420 - case 3022: - goto tr420 - case 3023: - goto tr420 - case 3024: - goto tr420 - case 3025: - goto tr420 - case 3026: - goto tr420 - case 3027: - goto tr420 - case 3028: - goto tr420 - case 3029: - goto tr420 - case 3030: - goto tr420 - case 3031: - goto tr420 - case 3032: - goto tr420 - case 3033: - goto tr420 - case 3034: - goto tr420 - case 3035: - goto tr420 - case 3036: - goto tr420 - case 3037: - goto tr420 - case 3038: - goto tr420 - case 3039: - goto tr420 - case 3040: - goto tr420 - case 3041: - goto tr420 - case 3042: - goto tr420 - case 3043: - goto tr420 - case 3044: - goto tr420 - case 3045: - goto tr420 - case 3046: - goto tr420 - case 3047: - goto tr420 - case 3048: - goto tr420 - case 3049: - goto tr420 - case 3050: - goto tr420 - case 3051: - goto tr420 - case 3052: - goto tr420 - case 3053: - goto tr420 - case 3054: - goto tr420 - case 3055: - goto tr420 - case 3056: - goto tr420 - case 3057: - goto tr420 - case 3058: - goto tr420 - case 3059: - goto tr420 - case 3060: - goto tr420 - case 3061: - goto tr420 - case 3062: - goto tr420 - case 3063: - goto tr420 - case 3064: - goto tr420 - case 3065: - goto tr420 - case 3066: - goto tr420 - case 3067: - goto tr420 - case 3068: - goto tr420 - case 3069: - goto tr420 - case 3070: - goto tr420 - case 4887: - goto tr4562 - case 3071: - goto tr420 - case 3072: - goto tr420 - case 3073: - goto tr420 - case 3074: - goto tr420 - case 3075: - goto tr420 - case 3076: - goto tr420 - case 3077: - goto tr420 - case 3078: - goto tr420 - case 3079: - goto tr420 - case 3080: - goto tr420 - case 3081: - goto tr420 - case 3082: - goto tr420 - case 3083: - goto tr420 - case 3084: - goto tr420 - case 3085: - goto tr420 - case 3086: - goto tr420 - case 3087: - goto tr420 - case 3088: - goto tr420 - case 3089: - goto tr420 - case 3090: - goto tr420 - case 3091: - goto tr420 - case 3092: - goto tr420 - case 3093: - goto tr420 - case 3094: - goto tr420 - case 3095: - goto tr420 - case 3096: - goto tr420 - case 3097: - goto tr420 - case 3098: - goto tr420 - case 3099: - goto tr420 - case 3100: - goto tr420 - case 3101: - goto tr420 - case 3102: - goto tr420 - case 3103: - goto tr420 - case 3104: - goto tr420 - case 3105: - goto tr420 - case 3106: - goto tr420 - case 3107: - goto tr420 - case 3108: - goto tr420 - case 3109: - goto tr420 - case 3110: - goto tr420 - case 3111: - goto tr420 - case 3112: - goto tr420 - case 3113: - goto tr420 - case 3114: - goto tr420 - case 3115: - goto tr420 - case 3116: - goto tr420 - case 3117: - goto tr420 - case 3118: - goto tr420 - case 3119: - goto tr420 - case 3120: - goto tr420 - case 3121: - goto tr420 - case 3122: - goto tr420 - case 3123: - goto tr420 - case 3124: - goto tr420 - case 3125: - goto tr420 - case 3126: - goto tr420 - case 3127: - goto tr420 - case 3128: - goto tr420 - case 3129: - goto tr420 - case 3130: - goto tr420 - case 3131: - goto tr420 - case 3132: - goto tr420 - case 3133: - goto tr420 - case 3134: - goto tr420 - case 3135: - goto tr420 - case 3136: - goto tr420 - case 3137: - goto tr420 - case 3138: - goto tr420 - case 3139: - goto tr420 - case 3140: - goto tr420 - case 3141: - goto tr420 - case 3142: - goto tr420 - case 3143: - goto tr420 - case 3144: - goto tr420 - case 3145: - goto tr420 - case 3146: - goto tr420 - case 3147: - goto tr420 - case 3148: - goto tr420 - case 3149: - goto tr420 - case 3150: - goto tr420 - case 3151: - goto tr420 - case 3152: - goto tr420 - case 3153: - goto tr420 - case 3154: - goto tr420 - case 3155: - goto tr420 - case 3156: - goto tr420 - case 3157: - goto tr420 - case 3158: - goto tr420 - case 3159: - goto tr420 - case 3160: - goto tr420 - case 3161: - goto tr420 - case 3162: - goto tr420 - case 3163: - goto tr420 - case 3164: - goto tr420 - case 3165: - goto tr420 - case 3166: - goto tr420 - case 3167: - goto tr420 - case 3168: - goto tr420 - case 3169: - goto tr420 - case 3170: - goto tr420 - case 3171: - goto tr420 - case 3172: - goto tr420 - case 3173: - goto tr420 - case 3174: - goto tr420 - case 3175: - goto tr420 - case 3176: - goto tr420 - case 3177: - goto tr420 - case 3178: - goto tr420 - case 3179: - goto tr420 - case 3180: - goto tr420 - case 3181: - goto tr420 - case 3182: - goto tr420 - case 3183: - goto tr420 - case 3184: - goto tr420 - case 3185: - goto tr420 - case 3186: - goto tr420 - case 3187: - goto tr420 - case 3188: - goto tr420 - case 3189: - goto tr420 - case 3190: - goto tr420 - case 3191: - goto tr420 - case 3192: - goto tr420 - case 3193: - goto tr420 - case 3194: - goto tr420 - case 3195: - goto tr420 - case 3196: - goto tr420 - case 3197: - goto tr420 - case 3198: - goto tr420 - case 3199: - goto tr420 - case 3200: - goto tr420 - case 3201: - goto tr420 - case 3202: - goto tr420 - case 3203: - goto tr420 - case 3204: - goto tr420 - case 3205: - goto tr420 - case 3206: - goto tr420 - case 3207: - goto tr420 - case 3208: - goto tr420 - case 3209: - goto tr420 - case 3210: - goto tr420 - case 3211: - goto tr420 - case 3212: - goto tr420 - case 3213: - goto tr420 - case 3214: - goto tr420 - case 3215: - goto tr420 - case 3216: - goto tr420 - case 3217: - goto tr420 - case 4888: - goto tr4562 - case 4889: - goto tr4562 - case 4890: - goto tr4562 - case 4891: - goto tr4562 - case 4892: - goto tr4562 - case 4893: - goto tr4562 - case 4894: - goto tr4562 - case 4895: - goto tr4499 - case 4896: - goto tr4499 - case 4897: - goto tr4562 - case 4898: - goto tr4562 - case 4899: - goto tr4562 - case 4900: - goto tr4562 - case 4901: - goto tr4562 - case 4902: - goto tr4562 - case 4903: - goto tr4562 - case 4904: - goto tr4562 - case 4905: - goto tr4562 - case 4906: - goto tr4562 - case 4907: - goto tr4562 - case 4908: - goto tr4499 - case 4909: - goto tr4499 - case 4910: - goto tr4499 - case 4911: - goto tr4499 - case 4912: - goto tr4499 - case 4913: - goto tr4499 - case 4914: - goto tr4499 - case 4915: - goto tr4499 - case 4916: - goto tr4499 - case 4917: - goto tr4499 - case 4918: - goto tr4499 - case 4919: - goto tr4499 - case 4920: - goto tr4499 - case 4921: - goto tr4499 - case 4922: - goto tr4499 - case 4923: - goto tr4499 - case 4924: - goto tr4499 - case 4925: - goto tr4499 - case 4926: - goto tr4499 - case 4927: - goto tr4499 - case 4928: - goto tr4499 - case 3218: - goto tr0 - case 3219: - goto tr0 - case 3220: - goto tr0 - case 3221: - goto tr0 - case 3222: - goto tr0 - case 3223: - goto tr0 - case 3224: - goto tr0 - case 3225: - goto tr0 - case 3226: - goto tr0 - case 3227: - goto tr0 - case 3228: - goto tr0 - case 3229: - goto tr0 - case 3230: - goto tr0 - case 3231: - goto tr0 - case 4929: - goto tr4562 - case 4930: - goto tr4562 - case 4931: - goto tr4562 - case 4932: - goto tr4499 - case 3232: - goto tr0 - case 4933: - goto tr4562 - case 4934: - goto tr4562 - case 4935: - goto tr4562 - case 4936: - goto tr4562 - case 4937: - goto tr4562 - case 4938: - goto tr4562 - case 4939: - goto tr4562 - case 4940: - goto tr4499 - case 4941: - goto tr4499 - case 4942: - goto tr4499 - case 4943: - goto tr4499 - case 4944: - goto tr4562 - case 4945: - goto tr4562 - case 4946: - goto tr4562 - case 4947: - goto tr4562 - case 4948: - goto tr4562 - case 4949: - goto tr4562 - case 4950: - goto tr4562 - case 4951: - goto tr4562 - case 4952: - goto tr4562 - case 4953: - goto tr4562 - case 4954: - goto tr4562 - case 4955: - goto tr4562 - case 4956: - goto tr4562 - case 4957: - goto tr4562 - case 3233: - goto tr0 - case 4958: - goto tr4562 - case 4959: - goto tr4562 - case 4960: - goto tr4562 - case 4961: - goto tr4562 - case 4962: - goto tr4562 - case 4963: - goto tr4562 - case 3234: - goto tr0 - case 4964: - goto tr4562 - case 4965: - goto tr4562 - case 3235: - goto tr0 - case 4966: - goto tr4562 - case 4967: - goto tr4562 - case 4968: - goto tr4562 - case 4969: - goto tr4562 - case 4970: - goto tr4562 - case 4971: - goto tr4562 - case 4972: - goto tr4562 - case 4973: - goto tr4562 - case 4974: - goto tr4562 - case 4975: - goto tr4562 - case 4976: - goto tr4562 - case 4977: - goto tr4562 - case 4978: - goto tr4562 - case 4979: - goto tr4562 - case 4980: - goto tr4562 - case 3236: - goto tr0 - case 4981: - goto tr4562 - case 4982: - goto tr4562 - case 4983: - goto tr4562 - case 3237: - goto tr0 - case 4984: - goto tr4562 - case 4985: - goto tr4562 - case 4986: - goto tr4562 - case 4987: - goto tr4562 - case 4988: - goto tr4562 - case 4989: - goto tr4562 - case 3238: - goto tr0 - case 4990: - goto tr4562 - case 4991: - goto tr4562 - case 4992: - goto tr4562 - case 4993: - goto tr4562 - case 4994: - goto tr4562 - case 4995: - goto tr4562 - case 4996: - goto tr4562 - case 4997: - goto tr4562 - case 4998: - goto tr4562 - case 4999: - goto tr4562 - case 5000: - goto tr4562 - case 5001: - goto tr4562 - case 5002: - goto tr4562 - case 5003: - goto tr4562 - case 5004: - goto tr4562 - case 5005: - goto tr4562 - case 5006: - goto tr4562 - case 5007: - goto tr4562 - case 5008: - goto tr4562 - case 5009: - goto tr4562 - case 5010: - goto tr4562 - case 5011: - goto tr4562 - case 5012: - goto tr4562 - case 5013: - goto tr4562 - case 5014: - goto tr4562 - case 5015: - goto tr4562 - case 5016: - goto tr4499 - case 5017: - goto tr4499 - case 5018: - goto tr4763 - case 5019: - goto tr4763 - case 5020: - goto tr4499 - case 5021: - goto tr4499 - case 5022: - goto tr4499 - case 5023: - goto tr4499 - case 5024: - goto tr4499 - case 5025: - goto tr4499 - case 5026: - goto tr4499 - case 5027: - goto tr4499 - case 5028: - goto tr4499 - case 5029: - goto tr4763 - case 5030: - goto tr4763 - case 5031: - goto tr4763 - case 5032: - goto tr4763 - case 5033: - goto tr4763 - case 5034: - goto tr4763 - case 5035: - goto tr4763 - case 5036: - goto tr4763 - case 5037: - goto tr4499 - case 5038: - goto tr4499 - case 5039: - goto tr4499 - case 5040: - goto tr4499 - case 5041: - goto tr4499 - case 5042: - goto tr4499 - case 5043: - goto tr4499 - case 5044: - goto tr4499 - case 5045: - goto tr4499 - case 5046: - goto tr4499 - case 5047: - goto tr4499 - case 5048: - goto tr4763 - case 5049: - goto tr4763 - case 5050: - goto tr4763 - case 5051: - goto tr4763 - case 5052: - goto tr4763 - case 5053: - goto tr4763 - case 5054: - goto tr4763 - case 5055: - goto tr4763 - case 5056: - goto tr4763 - case 5057: - goto tr4763 - case 5058: - goto tr4763 - case 5059: - goto tr4499 - case 5060: - goto tr4499 - case 5061: - goto tr4499 - case 5062: - goto tr4499 - case 5063: - goto tr4499 - case 5064: - goto tr4499 - case 5065: - goto tr4499 - case 5066: - goto tr4499 - case 5067: - goto tr4499 - case 5068: - goto tr4499 - case 5069: - goto tr4499 - case 5070: - goto tr4499 - case 5071: - goto tr4499 - case 3239: - goto tr0 - case 3240: - goto tr0 - case 3241: - goto tr0 - case 3242: - goto tr0 - case 3243: - goto tr0 - case 3244: - goto tr0 - case 3245: - goto tr0 - case 3246: - goto tr0 - case 3247: - goto tr0 - case 3248: - goto tr0 - case 3249: - goto tr0 - case 3250: - goto tr0 - case 3251: - goto tr0 - case 3252: - goto tr0 - case 3253: - goto tr0 - case 3254: - goto tr0 - case 3255: - goto tr0 - case 3256: - goto tr0 - case 3257: - goto tr0 - case 3258: - goto tr0 - case 3259: - goto tr0 - case 3260: - goto tr0 - case 3261: - goto tr0 - case 3262: - goto tr0 - case 3263: - goto tr0 - case 3264: - goto tr0 - case 3265: - goto tr0 - case 5072: - goto tr4499 - case 3266: - goto tr0 - case 3267: - goto tr0 - case 3268: - goto tr2 - case 5073: - goto tr5002 - case 3269: - goto tr2985 - case 3270: - goto tr2 - case 3271: - goto tr2985 - case 3272: - goto tr2985 - case 3273: - goto tr2985 - case 3274: - goto tr2985 - case 3275: - goto tr2985 - case 3276: - goto tr2985 - case 3277: - goto tr2985 - case 3278: - goto tr2985 - case 3279: - goto tr2985 - case 3280: - goto tr2985 - case 3281: - goto tr2985 - case 3282: - goto tr2985 - case 3283: - goto tr2 - case 3284: - goto tr2 - case 3285: - goto tr2 - case 3286: - goto tr2 - case 3287: - goto tr2 - case 3288: - goto tr2 - case 3289: - goto tr2 - case 3290: - goto tr2 - case 3291: - goto tr2 - case 3292: - goto tr2 - case 3293: - goto tr2 - case 3294: - goto tr2 - case 3295: - goto tr2 - case 3296: - goto tr2 - case 3297: - goto tr2 - case 3298: - goto tr2 - case 3299: - goto tr2 - case 3300: - goto tr2 - case 3301: - goto tr2 - case 3302: - goto tr2 - case 3303: - goto tr2 - case 3304: - goto tr2 - case 3305: - goto tr2 - case 3306: - goto tr2 - case 3307: - goto tr2 - case 3308: - goto tr2 - case 3309: - goto tr2 - case 3310: - goto tr2 - case 3311: - goto tr2 - case 3312: - goto tr2 - case 3313: - goto tr2 - case 3314: - goto tr2985 - case 3315: - goto tr2 - case 3316: - goto tr2 - case 3317: - goto tr2 - case 3318: - goto tr2 - case 3319: - goto tr2 - case 3320: - goto tr2 - case 3321: - goto tr2 - case 3322: - goto tr2 - case 3323: - goto tr2 - case 3324: - goto tr2 - case 3325: - goto tr2 - case 3326: - goto tr2 - case 3327: - goto tr2 - case 3328: - goto tr2 - case 3329: - goto tr2 - case 3330: - goto tr2 - case 3331: - goto tr2 - case 3332: - goto tr2 - case 3333: - goto tr2 - case 3334: - goto tr2 - case 3335: - goto tr2 - case 3336: - goto tr2 - case 3337: - goto tr2 - case 3338: - goto tr2985 - case 3339: - goto tr2 - case 3340: - goto tr2 - case 3341: - goto tr2 - case 3342: - goto tr2 - case 3343: - goto tr2 - case 3344: - goto tr2 - case 3345: - goto tr2985 - case 3346: - goto tr2 - case 3347: - goto tr2 - case 3348: - goto tr2 - case 3349: - goto tr2 - case 3350: - goto tr2 - case 5074: - goto tr5002 - case 3351: - goto tr2985 - case 3352: - goto tr2985 - case 3353: - goto tr2985 - case 3354: - goto tr2985 - case 3355: - goto tr2985 - case 3356: - goto tr2985 - case 3357: - goto tr2985 - case 3358: - goto tr2985 - case 3359: - goto tr2985 - case 3360: - goto tr2985 - case 3361: - goto tr2985 - case 3362: - goto tr2985 - case 3363: - goto tr2985 - case 3364: - goto tr2985 - case 3365: - goto tr2985 - case 3366: - goto tr2985 - case 3367: - goto tr2985 - case 3368: - goto tr2985 - case 3369: - goto tr2985 - case 3370: - goto tr2985 - case 3371: - goto tr2985 - case 3372: - goto tr2985 - case 3373: - goto tr2985 - case 3374: - goto tr2985 - case 3375: - goto tr2985 - case 3376: - goto tr2985 - case 3377: - goto tr2985 - case 3378: - goto tr2985 - case 3379: - goto tr2985 - case 3380: - goto tr2985 - case 3381: - goto tr2985 - case 3382: - goto tr2985 - case 3383: - goto tr2985 - case 3384: - goto tr2985 - case 3385: - goto tr2985 - case 3386: - goto tr2985 - case 3387: - goto tr2985 - case 3388: - goto tr2985 - case 3389: - goto tr2985 - case 3390: - goto tr2985 - case 3391: - goto tr2985 - case 3392: - goto tr2985 - case 3393: - goto tr2985 - case 3394: - goto tr2985 - case 3395: - goto tr2985 - case 3396: - goto tr2985 - case 3397: - goto tr2985 - case 3398: - goto tr2985 - case 3399: - goto tr2985 - case 3400: - goto tr2985 - case 3401: - goto tr2985 - case 3402: - goto tr2985 - case 3403: - goto tr2985 - case 3404: - goto tr2985 - case 3405: - goto tr2985 - case 3406: - goto tr2985 - case 3407: - goto tr2985 - case 3408: - goto tr2985 - case 3409: - goto tr2985 - case 3410: - goto tr2985 - case 3411: - goto tr2985 - case 3412: - goto tr2985 - case 3413: - goto tr2985 - case 3414: - goto tr2985 - case 3415: - goto tr2985 - case 3416: - goto tr2985 - case 3417: - goto tr2985 - case 3418: - goto tr2985 - case 3419: - goto tr2985 - case 3420: - goto tr2985 - case 3421: - goto tr2985 - case 3422: - goto tr2985 - case 3423: - goto tr2985 - case 3424: - goto tr2985 - case 3425: - goto tr2985 - case 3426: - goto tr2985 - case 3427: - goto tr2985 - case 3428: - goto tr2985 - case 3429: - goto tr2 - case 3430: - goto tr2985 - case 3431: - goto tr2985 - case 3432: - goto tr2985 - case 3433: - goto tr2985 - case 3434: - goto tr2985 - case 3435: - goto tr2985 - case 3436: - goto tr2985 - case 3437: - goto tr2985 - case 3438: - goto tr2985 - case 3439: - goto tr2985 - case 3440: - goto tr2985 - case 3441: - goto tr2985 - case 3442: - goto tr2985 - case 3443: - goto tr2985 - case 3444: - goto tr2985 - case 3445: - goto tr2985 - case 3446: - goto tr2985 - case 3447: - goto tr2985 - case 3448: - goto tr2985 - case 3449: - goto tr2985 - case 3450: - goto tr2985 - case 3451: - goto tr2985 - case 3452: - goto tr2985 - case 3453: - goto tr2985 - case 3454: - goto tr2985 - case 3455: - goto tr2985 - case 3456: - goto tr2985 - case 3457: - goto tr2985 - case 3458: - goto tr2985 - case 3459: - goto tr2985 - case 3460: - goto tr2985 - case 3461: - goto tr2985 - case 3462: - goto tr2985 - case 3463: - goto tr2985 - case 3464: - goto tr2985 - case 3465: - goto tr2985 - case 3466: - goto tr2985 - case 3467: - goto tr2985 - case 3468: - goto tr2985 - case 3469: - goto tr2985 - case 3470: - goto tr2985 - case 3471: - goto tr2985 - case 3472: - goto tr2985 - case 3473: - goto tr2985 - case 3474: - goto tr2985 - case 3475: - goto tr2985 - case 3476: - goto tr2985 - case 3477: - goto tr2985 - case 3478: - goto tr2985 - case 3479: - goto tr2985 - case 3480: - goto tr2985 - case 3481: - goto tr2985 - case 3482: - goto tr2985 - case 3483: - goto tr2985 - case 3484: - goto tr2985 - case 3485: - goto tr2985 - case 3486: - goto tr2985 - case 3487: - goto tr2985 - case 3488: - goto tr2985 - case 3489: - goto tr2985 - case 3490: - goto tr2985 - case 3491: - goto tr2985 - case 3492: - goto tr2985 - case 3493: - goto tr2985 - case 3494: - goto tr2985 - case 3495: - goto tr2985 - case 3496: - goto tr2985 - case 3497: - goto tr2985 - case 3498: - goto tr2985 - case 3499: - goto tr2985 - case 3500: - goto tr2985 - case 3501: - goto tr2 - case 3502: - goto tr2 - case 3503: - goto tr2 - case 3504: - goto tr2 - case 3505: - goto tr2 - case 3506: - goto tr2 - case 3507: - goto tr2 - case 3508: - goto tr2 - case 3509: - goto tr2 - case 3510: - goto tr2 - case 3511: - goto tr2 - case 3512: - goto tr2 - case 3513: - goto tr2 - case 3514: - goto tr2 - case 3515: - goto tr2 - case 3516: - goto tr2985 - case 3517: - goto tr2985 - case 3518: - goto tr2 - case 3519: - goto tr2 - case 3520: - goto tr2985 - case 3521: - goto tr2 - case 3522: - goto tr2 - case 3523: - goto tr2 - case 3524: - goto tr2 - case 3525: - goto tr2 - case 3526: - goto tr2985 - case 3527: - goto tr2 - case 3528: - goto tr2 - case 3529: - goto tr2 - case 3530: - goto tr2 - case 3531: - goto tr2 - case 3532: - goto tr2 - case 3533: - goto tr2 - case 3534: - goto tr2 - case 3535: - goto tr2 - case 3536: - goto tr2 - case 3537: - goto tr2 - case 3538: - goto tr2 - case 3539: - goto tr2 - case 3540: - goto tr2 - case 3541: - goto tr2 - case 3542: - goto tr2 - case 3543: - goto tr2 - case 3544: - goto tr2 - case 3545: - goto tr2 - case 3546: - goto tr2 - case 3547: - goto tr2 - case 3548: - goto tr2 - case 3549: - goto tr2 - case 3550: - goto tr2 - case 3551: - goto tr2 - case 3552: - goto tr2 - case 3553: - goto tr2 - case 3554: - goto tr2 - case 3555: - goto tr2 - case 3556: - goto tr2 - case 3557: - goto tr2 - case 3558: - goto tr2 - case 3559: - goto tr2 - case 3560: - goto tr2 - case 3561: - goto tr2 - case 3562: - goto tr2 - case 3563: - goto tr2 - case 3564: - goto tr2 - case 3565: - goto tr2 - case 3566: - goto tr2 - case 3567: - goto tr2 - case 3568: - goto tr2985 - case 3569: - goto tr2 - case 3570: - goto tr2 - case 3571: - goto tr2 - case 3572: - goto tr2 - case 3573: - goto tr0 - case 3574: - goto tr0 - case 3575: - goto tr0 - case 3576: - goto tr0 - case 3577: - goto tr0 - case 3578: - goto tr0 - case 3579: - goto tr0 - case 3580: - goto tr0 - case 3581: - goto tr0 - case 3582: - goto tr0 - case 3583: - goto tr0 - case 3584: - goto tr0 - case 3585: - goto tr0 - case 3586: - goto tr0 - case 3587: - goto tr0 - case 5075: - goto tr4499 - case 3588: - goto tr0 - case 3589: - goto tr0 - case 3590: - goto tr0 - case 3591: - goto tr0 - case 3592: - goto tr0 - case 3593: - goto tr0 - case 5076: - goto tr5054 - case 3594: - goto tr3251 - case 3595: - goto tr2 - case 3596: - goto tr2 - case 3597: - goto tr3251 - case 3598: - goto tr3251 - case 3599: - goto tr3251 - case 3600: - goto tr3251 - case 3601: - goto tr3251 - case 3602: - goto tr3251 - case 3603: - goto tr3251 - case 3604: - goto tr3251 - case 3605: - goto tr3251 - case 3606: - goto tr3251 - case 3607: - goto tr3251 - case 3608: - goto tr2 - case 3609: - goto tr2 - case 3610: - goto tr2 - case 3611: - goto tr2 - case 3612: - goto tr2 - case 3613: - goto tr2 - case 3614: - goto tr2 - case 3615: - goto tr2 - case 3616: - goto tr2 - case 3617: - goto tr2 - case 3618: - goto tr2 - case 3619: - goto tr2 - case 3620: - goto tr2 - case 3621: - goto tr2 - case 3622: - goto tr2 - case 3623: - goto tr2 - case 3624: - goto tr2 - case 3625: - goto tr2 - case 3626: - goto tr2 - case 3627: - goto tr2 - case 3628: - goto tr2 - case 3629: - goto tr2 - case 3630: - goto tr2 - case 3631: - goto tr2 - case 3632: - goto tr2 - case 3633: - goto tr2 - case 3634: - goto tr2 - case 3635: - goto tr2 - case 3636: - goto tr3251 - case 3637: - goto tr2 - case 3638: - goto tr2 - case 3639: - goto tr2 - case 3640: - goto tr2 - case 3641: - goto tr2 - case 3642: - goto tr2 - case 3643: - goto tr2 - case 3644: - goto tr2 - case 3645: - goto tr2 - case 3646: - goto tr2 - case 3647: - goto tr2 - case 3648: - goto tr2 - case 3649: - goto tr2 - case 3650: - goto tr2 - case 3651: - goto tr2 - case 3652: - goto tr2 - case 3653: - goto tr2 - case 3654: - goto tr2 - case 3655: - goto tr2 - case 3656: - goto tr2 - case 3657: - goto tr2 - case 3658: - goto tr3251 - case 3659: - goto tr2 - case 3660: - goto tr2 - case 3661: - goto tr2 - case 3662: - goto tr2 - case 3663: - goto tr2 - case 3664: - goto tr2 - case 3665: - goto tr3251 - case 3666: - goto tr2 - case 3667: - goto tr2 - case 3668: - goto tr3251 - case 3669: - goto tr2 - case 3670: - goto tr2 - case 3671: - goto tr2 - case 3672: - goto tr2 - case 3673: - goto tr2 - case 3674: - goto tr2 - case 3675: - goto tr2 - case 3676: - goto tr2 - case 3677: - goto tr2 - case 3678: - goto tr2 - case 3679: - goto tr2 - case 3680: - goto tr2 - case 3681: - goto tr2 - case 3682: - goto tr2 - case 3683: - goto tr2 - case 3684: - goto tr3251 - case 3685: - goto tr2 - case 3686: - goto tr2 - case 3687: - goto tr2 - case 3688: - goto tr3251 - case 3689: - goto tr2 - case 3690: - goto tr2 - case 3691: - goto tr2 - case 3692: - goto tr2 - case 3693: - goto tr2 - case 3694: - goto tr2 - case 3695: - goto tr2 - case 3696: - goto tr2 - case 3697: - goto tr2 - case 3698: - goto tr2 - case 3699: - goto tr2 - case 3700: - goto tr2 - case 3701: - goto tr2 - case 3702: - goto tr2 - case 3703: - goto tr2 - case 3704: - goto tr2 - case 3705: - goto tr2 - case 3706: - goto tr2 - case 3707: - goto tr2 - case 3708: - goto tr2 - case 3709: - goto tr2 - case 3710: - goto tr2 - case 3711: - goto tr2 - case 3712: - goto tr2 - case 3713: - goto tr2 - case 3714: - goto tr2 - case 3715: - goto tr2 - case 3716: - goto tr2 - case 3717: - goto tr2 - case 3718: - goto tr2 - case 3719: - goto tr2 - case 3720: - goto tr2 - case 3721: - goto tr2 - case 3722: - goto tr2 - case 3723: - goto tr2 - case 3724: - goto tr2 - case 3725: - goto tr2 - case 3726: - goto tr2 - case 3727: - goto tr2 - case 3728: - goto tr2 - case 3729: - goto tr2 - case 3730: - goto tr3251 - case 3731: - goto tr2 - case 3732: - goto tr2 - case 3733: - goto tr2 - case 3734: - goto tr2 - case 3735: - goto tr0 - case 3736: - goto tr0 - case 5077: - goto tr4499 - case 3737: - goto tr0 - case 5078: - goto tr4562 - case 3738: - goto tr420 - case 3739: - goto tr420 - case 3740: - goto tr420 - case 3741: - goto tr420 - case 3742: - goto tr420 - case 3743: - goto tr420 - case 3744: - goto tr420 - case 3745: - goto tr420 - case 3746: - goto tr420 - case 3747: - goto tr420 - case 3748: - goto tr420 - case 3749: - goto tr420 - case 3750: - goto tr420 - case 3751: - goto tr420 - case 3752: - goto tr420 - case 3753: - goto tr420 - case 3754: - goto tr420 - case 3755: - goto tr420 - case 3756: - goto tr420 - case 3757: - goto tr420 - case 3758: - goto tr420 - case 3759: - goto tr420 - case 3760: - goto tr420 - case 3761: - goto tr420 - case 3762: - goto tr420 - case 3763: - goto tr420 - case 3764: - goto tr420 - case 3765: - goto tr420 - case 3766: - goto tr420 - case 3767: - goto tr420 - case 3768: - goto tr420 - case 3769: - goto tr420 - case 3770: - goto tr420 - case 3771: - goto tr420 - case 3772: - goto tr420 - case 3773: - goto tr420 - case 3774: - goto tr420 - case 3775: - goto tr420 - case 3776: - goto tr420 - case 3777: - goto tr420 - case 3778: - goto tr420 - case 3779: - goto tr420 - case 3780: - goto tr420 - case 3781: - goto tr420 - case 3782: - goto tr420 - case 3783: - goto tr420 - case 3784: - goto tr420 - case 3785: - goto tr420 - case 3786: - goto tr420 - case 3787: - goto tr420 - case 3788: - goto tr420 - case 3789: - goto tr420 - case 3790: - goto tr420 - case 3791: - goto tr420 - case 3792: - goto tr420 - case 3793: - goto tr420 - case 3794: - goto tr420 - case 3795: - goto tr420 - case 3796: - goto tr420 - case 3797: - goto tr420 - case 3798: - goto tr420 - case 3799: - goto tr420 - case 3800: - goto tr420 - case 3801: - goto tr420 - case 3802: - goto tr420 - case 3803: - goto tr420 - case 3804: - goto tr420 - case 3805: - goto tr420 - case 3806: - goto tr420 - case 3807: - goto tr420 - case 3808: - goto tr420 - case 3809: - goto tr420 - case 3810: - goto tr420 - case 3811: - goto tr420 - case 3812: - goto tr420 - case 3813: - goto tr420 - case 3814: - goto tr420 - case 3815: - goto tr420 - case 3816: - goto tr420 - case 3817: - goto tr420 - case 3818: - goto tr420 - case 3819: - goto tr420 - case 3820: - goto tr420 - case 3821: - goto tr420 - case 3822: - goto tr420 - case 3823: - goto tr420 - case 3824: - goto tr420 - case 3825: - goto tr420 - case 3826: - goto tr420 - case 3827: - goto tr420 - case 3828: - goto tr420 - case 3829: - goto tr420 - case 3830: - goto tr420 - case 3831: - goto tr420 - case 3832: - goto tr420 - case 3833: - goto tr420 - case 3834: - goto tr420 - case 3835: - goto tr420 - case 3836: - goto tr420 - case 3837: - goto tr420 - case 3838: - goto tr420 - case 3839: - goto tr420 - case 3840: - goto tr420 - case 3841: - goto tr420 - case 3842: - goto tr420 - case 3843: - goto tr420 - case 3844: - goto tr420 - case 3845: - goto tr420 - case 3846: - goto tr420 - case 3847: - goto tr420 - case 3848: - goto tr420 - case 3849: - goto tr420 - case 3850: - goto tr420 - case 3851: - goto tr420 - case 3852: - goto tr420 - case 3853: - goto tr420 - case 3854: - goto tr420 - case 3855: - goto tr420 - case 3856: - goto tr420 - case 3857: - goto tr420 - case 3858: - goto tr420 - case 3859: - goto tr420 - case 3860: - goto tr420 - case 3861: - goto tr420 - case 3862: - goto tr420 - case 3863: - goto tr420 - case 3864: - goto tr420 - case 3865: - goto tr420 - case 3866: - goto tr420 - case 3867: - goto tr420 - case 3868: - goto tr420 - case 3869: - goto tr420 - case 3870: - goto tr420 - case 3871: - goto tr420 - case 3872: - goto tr420 - case 3873: - goto tr420 - case 3874: - goto tr420 - case 3875: - goto tr420 - case 3876: - goto tr420 - case 3877: - goto tr420 - case 3878: - goto tr420 - case 3879: - goto tr420 - case 3880: - goto tr420 - case 3881: - goto tr420 - case 3882: - goto tr420 - case 3883: - goto tr420 - case 3884: - goto tr420 - case 5079: - goto tr5002 - case 3885: - goto tr2985 - case 3886: - goto tr2985 - case 3887: - goto tr2985 - case 3888: - goto tr2985 - case 3889: - goto tr2985 - case 3890: - goto tr2985 - case 3891: - goto tr2985 - case 3892: - goto tr2985 - case 3893: - goto tr2985 - case 3894: - goto tr2985 - case 3895: - goto tr2985 - case 3896: - goto tr2985 - case 3897: - goto tr2985 - case 3898: - goto tr2985 - case 3899: - goto tr2985 - case 3900: - goto tr2985 - case 3901: - goto tr2985 - case 3902: - goto tr2985 - case 3903: - goto tr2985 - case 3904: - goto tr2985 - case 3905: - goto tr2985 - case 3906: - goto tr2985 - case 3907: - goto tr2985 - case 3908: - goto tr2985 - case 3909: - goto tr2985 - case 3910: - goto tr2985 - case 3911: - goto tr2985 - case 3912: - goto tr2985 - case 3913: - goto tr2985 - case 3914: - goto tr2985 - case 3915: - goto tr2985 - case 3916: - goto tr2985 - case 3917: - goto tr2985 - case 3918: - goto tr2985 - case 3919: - goto tr2985 - case 3920: - goto tr2985 - case 3921: - goto tr2985 - case 3922: - goto tr2985 - case 3923: - goto tr2985 - case 3924: - goto tr2985 - case 3925: - goto tr2985 - case 3926: - goto tr2985 - case 3927: - goto tr2985 - case 3928: - goto tr2985 - case 3929: - goto tr2985 - case 3930: - goto tr2985 - case 3931: - goto tr2985 - case 3932: - goto tr2985 - case 3933: - goto tr2985 - case 3934: - goto tr2985 - case 3935: - goto tr2985 - case 3936: - goto tr2985 - case 3937: - goto tr2985 - case 3938: - goto tr2985 - case 3939: - goto tr2985 - case 3940: - goto tr2985 - case 3941: - goto tr2985 - case 3942: - goto tr2985 - case 3943: - goto tr2985 - case 3944: - goto tr2985 - case 3945: - goto tr2985 - case 3946: - goto tr2985 - case 3947: - goto tr2985 - case 3948: - goto tr2985 - case 3949: - goto tr2985 - case 3950: - goto tr2985 - case 3951: - goto tr2985 - case 3952: - goto tr2985 - case 3953: - goto tr2985 - case 3954: - goto tr2985 - case 3955: - goto tr2985 - case 3956: - goto tr2985 - case 3957: - goto tr2985 - case 3958: - goto tr2985 - case 3959: - goto tr2985 - case 3960: - goto tr2985 - case 3961: - goto tr2985 - case 3962: - goto tr2985 - case 3963: - goto tr2985 - case 3964: - goto tr2985 - case 3965: - goto tr2985 - case 3966: - goto tr2985 - case 3967: - goto tr2985 - case 3968: - goto tr2985 - case 3969: - goto tr2985 - case 3970: - goto tr2985 - case 3971: - goto tr2985 - case 3972: - goto tr2985 - case 3973: - goto tr2985 - case 3974: - goto tr2985 - case 3975: - goto tr2985 - case 3976: - goto tr2985 - case 3977: - goto tr2985 - case 3978: - goto tr2985 - case 3979: - goto tr2985 - case 3980: - goto tr2985 - case 3981: - goto tr2985 - case 3982: - goto tr2985 - case 3983: - goto tr2985 - case 3984: - goto tr2985 - case 3985: - goto tr2985 - case 3986: - goto tr2985 - case 3987: - goto tr2985 - case 3988: - goto tr2985 - case 3989: - goto tr2985 - case 3990: - goto tr2985 - case 3991: - goto tr2985 - case 3992: - goto tr2985 - case 3993: - goto tr2985 - case 3994: - goto tr2985 - case 3995: - goto tr2985 - case 3996: - goto tr2985 - case 3997: - goto tr2985 - case 3998: - goto tr2985 - case 3999: - goto tr2985 - case 4000: - goto tr2985 - case 4001: - goto tr2985 - case 4002: - goto tr2985 - case 4003: - goto tr2985 - case 4004: - goto tr2985 - case 4005: - goto tr2985 - case 4006: - goto tr2985 - case 4007: - goto tr2985 - case 4008: - goto tr2985 - case 4009: - goto tr2985 - case 4010: - goto tr2985 - case 4011: - goto tr2985 - case 4012: - goto tr2985 - case 4013: - goto tr2985 - case 4014: - goto tr2985 - case 4015: - goto tr2985 - case 4016: - goto tr2985 - case 4017: - goto tr2985 - case 4018: - goto tr2985 - case 4019: - goto tr2985 - case 4020: - goto tr2985 - case 4021: - goto tr2985 - case 4022: - goto tr2985 - case 4023: - goto tr2985 - case 4024: - goto tr2985 - case 4025: - goto tr2985 - case 4026: - goto tr2985 - case 5080: - goto tr5137 - case 4027: - goto tr3627 - case 4028: - goto tr2 - case 4029: - goto tr3627 - case 4030: - goto tr3627 - case 4031: - goto tr3627 - case 4032: - goto tr3627 - case 4033: - goto tr3627 - case 4034: - goto tr3627 - case 4035: - goto tr3627 - case 4036: - goto tr3627 - case 4037: - goto tr3627 - case 4038: - goto tr3627 - case 4039: - goto tr3627 - case 4040: - goto tr3627 - case 4041: - goto tr3627 - case 4042: - goto tr3627 - case 4043: - goto tr3627 - case 4044: - goto tr3627 - case 4045: - goto tr3627 - case 4046: - goto tr3627 - case 4047: - goto tr3627 - case 4048: - goto tr3627 - case 4049: - goto tr3627 - case 4050: - goto tr3627 - case 4051: - goto tr3627 - case 4052: - goto tr3627 - case 4053: - goto tr3627 - case 4054: - goto tr3627 - case 4055: - goto tr3627 - case 4056: - goto tr3627 - case 4057: - goto tr3627 - case 4058: - goto tr3627 - case 4059: - goto tr3627 - case 4060: - goto tr3627 - case 4061: - goto tr3627 - case 4062: - goto tr3627 - case 4063: - goto tr3627 - case 4064: - goto tr3627 - case 4065: - goto tr3627 - case 4066: - goto tr3627 - case 4067: - goto tr3627 - case 4068: - goto tr3627 - case 4069: - goto tr3627 - case 4070: - goto tr3627 - case 4071: - goto tr3627 - case 4072: - goto tr3627 - case 4073: - goto tr3627 - case 4074: - goto tr3627 - case 4075: - goto tr3627 - case 4076: - goto tr3627 - case 4077: - goto tr3627 - case 4078: - goto tr3627 - case 4079: - goto tr3627 - case 4080: - goto tr3627 - case 4081: - goto tr3627 - case 4082: - goto tr3627 - case 4083: - goto tr3627 - case 4084: - goto tr3627 - case 4085: - goto tr3627 - case 4086: - goto tr3627 - case 4087: - goto tr3627 - case 4088: - goto tr3627 - case 4089: - goto tr3627 - case 4090: - goto tr3627 - case 4091: - goto tr3627 - case 4092: - goto tr3627 - case 4093: - goto tr3627 - case 4094: - goto tr3627 - case 4095: - goto tr3627 - case 4096: - goto tr3627 - case 4097: - goto tr3627 - case 4098: - goto tr3627 - case 4099: - goto tr3627 - case 4100: - goto tr3627 - case 4101: - goto tr2 - case 4102: - goto tr2 - case 4103: - goto tr2 - case 4104: - goto tr2 - case 4105: - goto tr3627 - case 4106: - goto tr3627 - case 4107: - goto tr3627 - case 4108: - goto tr3627 - case 4109: - goto tr3627 - case 4110: - goto tr3627 - case 4111: - goto tr3627 - case 4112: - goto tr3627 - case 4113: - goto tr3627 - case 4114: - goto tr3627 - case 4115: - goto tr3627 - case 4116: - goto tr3627 - case 4117: - goto tr3627 - case 4118: - goto tr3627 - case 4119: - goto tr3627 - case 4120: - goto tr3627 - case 4121: - goto tr3627 - case 4122: - goto tr3627 - case 4123: - goto tr3627 - case 4124: - goto tr3627 - case 4125: - goto tr3627 - case 4126: - goto tr3627 - case 4127: - goto tr3627 - case 4128: - goto tr3627 - case 4129: - goto tr3627 - case 4130: - goto tr3627 - case 4131: - goto tr3627 - case 4132: - goto tr3627 - case 4133: - goto tr3627 - case 4134: - goto tr3627 - case 4135: - goto tr3627 - case 4136: - goto tr3627 - case 4137: - goto tr3627 - case 4138: - goto tr3627 - case 4139: - goto tr3627 - case 4140: - goto tr3627 - case 4141: - goto tr3627 - case 4142: - goto tr3627 - case 4143: - goto tr3627 - case 4144: - goto tr3627 - case 4145: - goto tr3627 - case 4146: - goto tr3627 - case 4147: - goto tr3627 - case 4148: - goto tr3627 - case 4149: - goto tr3627 - case 4150: - goto tr3627 - case 4151: - goto tr3627 - case 4152: - goto tr3627 - case 4153: - goto tr3627 - case 4154: - goto tr3627 - case 4155: - goto tr3627 - case 4156: - goto tr3627 - case 4157: - goto tr3627 - case 4158: - goto tr3627 - case 4159: - goto tr3627 - case 4160: - goto tr3627 - case 4161: - goto tr3627 - case 4162: - goto tr3627 - case 4163: - goto tr3627 - case 4164: - goto tr3627 - case 4165: - goto tr3627 - case 4166: - goto tr3627 - case 4167: - goto tr3627 - case 4168: - goto tr3627 - case 4169: - goto tr3627 - case 4170: - goto tr3627 - case 4171: - goto tr3627 - case 4172: - goto tr3627 - case 4173: - goto tr3627 - case 4174: - goto tr3627 - case 4175: - goto tr0 - case 5081: - goto tr5157 - case 4176: - goto tr3758 - case 4177: - goto tr3758 - case 4178: - goto tr3758 - case 4179: - goto tr3758 - case 4180: - goto tr3758 - case 4181: - goto tr3758 - case 4182: - goto tr3758 - case 4183: - goto tr3758 - case 4184: - goto tr3758 - case 4185: - goto tr3758 - case 4186: - goto tr3758 - case 4187: - goto tr3758 - case 4188: - goto tr3758 - case 4189: - goto tr3758 - case 4190: - goto tr3758 - case 4191: - goto tr3758 - case 4192: - goto tr3758 - case 4193: - goto tr3758 - case 4194: - goto tr3758 - case 4195: - goto tr3758 - case 4196: - goto tr3758 - case 4197: - goto tr3758 - case 4198: - goto tr3758 - case 4199: - goto tr3758 - case 4200: - goto tr3758 - case 4201: - goto tr3758 - case 4202: - goto tr3758 - case 4203: - goto tr3758 - case 4204: - goto tr3758 - case 4205: - goto tr3758 - case 4206: - goto tr3758 - case 4207: - goto tr3758 - case 4208: - goto tr3758 - case 4209: - goto tr3758 - case 4210: - goto tr3758 - case 4211: - goto tr3758 - case 4212: - goto tr3758 - case 4213: - goto tr3758 - case 4214: - goto tr3758 - case 4215: - goto tr3758 - case 4216: - goto tr3758 - case 4217: - goto tr3758 - case 4218: - goto tr3758 - case 4219: - goto tr3758 - case 4220: - goto tr3758 - case 4221: - goto tr3758 - case 4222: - goto tr3758 - case 4223: - goto tr3758 - case 4224: - goto tr3758 - case 4225: - goto tr3758 - case 4226: - goto tr3758 - case 4227: - goto tr3758 - case 4228: - goto tr3758 - case 4229: - goto tr3758 - case 4230: - goto tr3758 - case 4231: - goto tr3758 - case 4232: - goto tr3758 - case 4233: - goto tr3758 - case 4234: - goto tr3758 - case 4235: - goto tr3758 - case 4236: - goto tr3758 - case 4237: - goto tr3758 - case 4238: - goto tr3758 - case 4239: - goto tr3758 - case 4240: - goto tr3758 - case 4241: - goto tr3758 - case 4242: - goto tr3758 - case 4243: - goto tr3758 - case 4244: - goto tr3758 - case 4245: - goto tr3758 - case 4246: - goto tr3758 - case 4247: - goto tr3758 - case 4248: - goto tr3758 - case 4249: - goto tr3758 - case 4250: - goto tr3758 - case 4251: - goto tr3758 - case 4252: - goto tr3758 - case 4253: - goto tr3758 - case 4254: - goto tr3758 - case 4255: - goto tr3758 - case 4256: - goto tr3758 - case 4257: - goto tr3758 - case 4258: - goto tr3758 - case 4259: - goto tr3758 - case 4260: - goto tr3758 - case 4261: - goto tr3758 - case 4262: - goto tr3758 - case 4263: - goto tr3758 - case 4264: - goto tr3758 - case 4265: - goto tr3758 - case 4266: - goto tr3758 - case 4267: - goto tr3758 - case 4268: - goto tr3758 - case 4269: - goto tr3758 - case 4270: - goto tr3758 - case 4271: - goto tr3758 - case 4272: - goto tr3758 - case 4273: - goto tr3758 - case 4274: - goto tr3758 - case 4275: - goto tr3758 - case 4276: - goto tr3758 - case 4277: - goto tr3758 - case 4278: - goto tr3758 - case 4279: - goto tr3758 - case 4280: - goto tr3758 - case 4281: - goto tr3758 - case 4282: - goto tr3758 - case 4283: - goto tr3758 - case 4284: - goto tr3758 - case 4285: - goto tr3758 - case 4286: - goto tr3758 - case 4287: - goto tr3758 - case 4288: - goto tr3758 - case 4289: - goto tr3758 - case 4290: - goto tr3758 - case 4291: - goto tr3758 - case 4292: - goto tr3758 - case 4293: - goto tr3758 - case 4294: - goto tr3758 - case 4295: - goto tr3758 - case 4296: - goto tr3758 - case 4297: - goto tr3758 - case 4298: - goto tr3758 - case 4299: - goto tr3758 - case 4300: - goto tr3758 - case 4301: - goto tr3758 - case 4302: - goto tr3758 - case 4303: - goto tr3758 - case 4304: - goto tr3758 - case 4305: - goto tr3758 - case 4306: - goto tr3758 - case 4307: - goto tr3758 - case 4308: - goto tr3758 - case 4309: - goto tr3758 - case 4310: - goto tr3758 - case 4311: - goto tr3758 - case 4312: - goto tr3758 - case 4313: - goto tr3758 - case 4314: - goto tr3758 - case 4315: - goto tr3758 - case 4316: - goto tr3758 - case 4317: - goto tr0 - case 4318: - goto tr0 - case 5082: - goto tr5054 - case 4319: - goto tr3251 - case 4320: - goto tr3251 - case 4321: - goto tr3251 - case 4322: - goto tr3251 - case 4323: - goto tr3251 - case 4324: - goto tr3251 - case 4325: - goto tr3251 - case 4326: - goto tr3251 - case 4327: - goto tr3251 - case 4328: - goto tr3251 - case 4329: - goto tr3251 - case 4330: - goto tr3251 - case 4331: - goto tr3251 - case 4332: - goto tr3251 - case 4333: - goto tr3251 - case 4334: - goto tr3251 - case 4335: - goto tr3251 - case 4336: - goto tr3251 - case 4337: - goto tr3251 - case 4338: - goto tr3251 - case 4339: - goto tr3251 - case 4340: - goto tr3251 - case 4341: - goto tr3251 - case 4342: - goto tr3251 - case 4343: - goto tr3251 - case 4344: - goto tr3251 - case 4345: - goto tr3251 - case 4346: - goto tr3251 - case 4347: - goto tr3251 - case 4348: - goto tr3251 - case 4349: - goto tr3251 - case 4350: - goto tr3251 - case 4351: - goto tr3251 - case 4352: - goto tr3251 - case 4353: - goto tr3251 - case 4354: - goto tr3251 - case 4355: - goto tr3251 - case 4356: - goto tr3251 - case 4357: - goto tr3251 - case 4358: - goto tr3251 - case 4359: - goto tr3251 - case 4360: - goto tr3251 - case 4361: - goto tr3251 - case 4362: - goto tr3251 - case 4363: - goto tr3251 - case 4364: - goto tr3251 - case 4365: - goto tr3251 - case 4366: - goto tr3251 - case 4367: - goto tr3251 - case 4368: - goto tr3251 - case 4369: - goto tr3251 - case 4370: - goto tr3251 - case 4371: - goto tr3251 - case 4372: - goto tr3251 - case 4373: - goto tr3251 - case 4374: - goto tr3251 - case 4375: - goto tr3251 - case 4376: - goto tr3251 - case 4377: - goto tr3251 - case 4378: - goto tr3251 - case 4379: - goto tr3251 - case 4380: - goto tr3251 - case 4381: - goto tr3251 - case 4382: - goto tr3251 - case 4383: - goto tr3251 - case 4384: - goto tr3251 - case 4385: - goto tr3251 - case 4386: - goto tr3251 - case 4387: - goto tr3251 - case 4388: - goto tr3251 - case 4389: - goto tr3251 - case 4390: - goto tr3251 - case 4391: - goto tr3251 - case 4392: - goto tr3251 - case 4393: - goto tr3251 - case 4394: - goto tr3251 - case 4395: - goto tr3251 - case 4396: - goto tr3251 - case 4397: - goto tr3251 - case 4398: - goto tr3251 - case 4399: - goto tr3251 - case 4400: - goto tr3251 - case 4401: - goto tr3251 - case 4402: - goto tr3251 - case 4403: - goto tr3251 - case 4404: - goto tr3251 - case 4405: - goto tr3251 - case 4406: - goto tr3251 - case 4407: - goto tr3251 - case 4408: - goto tr3251 - case 4409: - goto tr3251 - case 4410: - goto tr3251 - case 4411: - goto tr3251 - case 4412: - goto tr3251 - case 4413: - goto tr3251 - case 4414: - goto tr3251 - case 4415: - goto tr3251 - case 4416: - goto tr3251 - case 4417: - goto tr3251 - case 4418: - goto tr3251 - case 4419: - goto tr3251 - case 4420: - goto tr3251 - case 4421: - goto tr3251 - case 4422: - goto tr3251 - case 4423: - goto tr3251 - case 4424: - goto tr3251 - case 4425: - goto tr3251 - case 4426: - goto tr3251 - case 4427: - goto tr3251 - case 4428: - goto tr3251 - case 4429: - goto tr3251 - case 4430: - goto tr3251 - case 4431: - goto tr3251 - case 4432: - goto tr3251 - case 4433: - goto tr3251 - case 4434: - goto tr3251 - case 4435: - goto tr3251 - case 4436: - goto tr3251 - case 4437: - goto tr3251 - case 4438: - goto tr3251 - case 4439: - goto tr3251 - case 4440: - goto tr3251 - case 4441: - goto tr3251 - case 4442: - goto tr3251 - case 4443: - goto tr3251 - case 4444: - goto tr3251 - case 4445: - goto tr3251 - case 4446: - goto tr3251 - case 4447: - goto tr3251 - case 4448: - goto tr3251 - case 4449: - goto tr3251 - case 4450: - goto tr3251 - case 4451: - goto tr3251 - case 4452: - goto tr3251 - case 4453: - goto tr3251 - case 4454: - goto tr3251 - case 4455: - goto tr3251 - case 4456: - goto tr3251 - case 4457: - goto tr3251 - case 4458: - goto tr3251 - case 4459: - goto tr3251 - case 4460: - goto tr0 - case 4461: - goto tr0 - case 4462: - goto tr0 - case 4463: - goto tr0 - case 4464: - goto tr0 - case 4465: - goto tr0 - case 4466: - goto tr0 - case 4467: - goto tr0 - case 4468: - goto tr0 - case 4469: - goto tr0 - case 4470: - goto tr0 - case 4471: - goto tr0 - case 4472: - goto tr0 - case 5083: - goto tr5054 - case 5084: - goto tr5054 - case 5085: - goto tr5054 - case 5086: - goto tr4499 - case 5087: - goto tr4499 - case 5088: - goto tr5054 - case 5089: - goto tr5054 - case 5090: - goto tr4499 - case 5091: - goto tr4499 - case 5092: - goto tr4499 - case 5093: - goto tr4499 - case 5094: - goto tr4499 - case 5095: - goto tr4499 - case 5096: - goto tr4499 - case 5097: - goto tr4499 - case 5098: - goto tr5054 - case 5099: - goto tr5054 - case 5100: - goto tr5054 - case 5101: - goto tr5054 - case 5102: - goto tr5054 - case 5103: - goto tr5054 - case 5104: - goto tr5054 - case 5105: - goto tr5054 - case 5106: - goto tr4499 - case 5107: - goto tr4499 - case 5108: - goto tr4499 - case 5109: - goto tr4499 - case 5110: - goto tr4499 - case 5111: - goto tr4499 - case 5112: - goto tr4499 - case 5113: - goto tr4499 - case 5114: - goto tr4499 - case 5115: - goto tr4499 - case 5116: - goto tr4499 - case 5117: - goto tr5054 - case 5118: - goto tr5054 - case 5119: - goto tr5054 - case 5120: - goto tr5054 - case 5121: - goto tr5054 - case 5122: - goto tr5054 - case 5123: - goto tr5054 - case 5124: - goto tr5054 - case 5125: - goto tr5054 - case 5126: - goto tr5054 - case 5127: - goto tr5054 - case 5128: - goto tr5054 - case 5129: - goto tr5054 - case 5130: - goto tr5054 - case 5131: - goto tr5054 - case 5132: - goto tr5054 - case 5133: - goto tr5054 - case 5134: - goto tr5054 - case 5135: - goto tr5054 - case 5136: - goto tr5054 - case 5137: - goto tr5054 - case 5138: - goto tr5054 - case 5139: - goto tr5054 - case 5140: - goto tr5054 - case 5141: - goto tr5054 - case 5142: - goto tr5054 - case 5143: - goto tr5054 - case 5144: - goto tr5054 - case 5145: - goto tr5054 - case 5146: - goto tr5054 - case 5147: - goto tr5054 - case 5148: - goto tr5054 - case 5149: - goto tr5054 - case 5150: - goto tr5054 - case 5151: - goto tr5054 - case 5152: - goto tr5054 - case 4473: - goto tr0 - case 5153: - goto tr5054 - case 5154: - goto tr5054 - case 5155: - goto tr5054 - case 5156: - goto tr5054 - case 5157: - goto tr5054 - case 5158: - goto tr5054 - case 5159: - goto tr5054 - case 5160: - goto tr5054 - case 5161: - goto tr5054 - case 5162: - goto tr5054 - case 5163: - goto tr5054 - case 5164: - goto tr5054 - case 5165: - goto tr5054 - case 5166: - goto tr5054 - case 5167: - goto tr5054 - case 5168: - goto tr5054 - case 5169: - goto tr5054 - case 5170: - goto tr5054 - case 5171: - goto tr5054 - case 5172: - goto tr5054 - case 5173: - goto tr5054 - case 4474: - goto tr0 - case 5174: - goto tr5054 - case 5175: - goto tr5054 - case 5176: - goto tr5054 - case 5177: - goto tr5054 - case 5178: - goto tr5054 - case 5179: - goto tr5054 - case 4475: - goto tr0 - case 5180: - goto tr5054 - case 5181: - goto tr5054 - case 4476: - goto tr0 - case 5182: - goto tr5054 - case 5183: - goto tr5054 - case 5184: - goto tr5054 - case 5185: - goto tr5054 - case 5186: - goto tr5054 - case 5187: - goto tr5054 - case 5188: - goto tr5054 - case 5189: - goto tr5054 - case 5190: - goto tr5054 - case 5191: - goto tr5054 - case 5192: - goto tr5054 - case 5193: - goto tr5054 - case 5194: - goto tr5054 - case 5195: - goto tr5054 - case 5196: - goto tr5054 - case 4477: - goto tr0 - case 5197: - goto tr5054 - case 5198: - goto tr5054 - case 5199: - goto tr5054 - case 4478: - goto tr0 - case 5200: - goto tr5054 - case 5201: - goto tr5054 - case 5202: - goto tr5054 - case 5203: - goto tr5054 - case 5204: - goto tr5054 - case 5205: - goto tr5054 - case 4479: - goto tr0 - case 5206: - goto tr5054 - case 5207: - goto tr4499 - case 4480: - goto tr0 - case 5208: - goto tr4499 - case 5209: - goto tr4499 - case 5210: - goto tr4499 - case 4481: - goto tr0 - case 4482: - goto tr0 - case 4483: - goto tr0 - case 4484: - goto tr0 - case 4485: - goto tr0 - case 4486: - goto tr0 - case 4487: - goto tr0 - case 4488: - goto tr0 - case 4489: - goto tr0 - case 4490: - goto tr0 - case 4491: - goto tr0 - case 4492: - goto tr0 - case 4493: - goto tr0 - case 4494: - goto tr0 - case 4495: - goto tr0 - case 5211: - goto tr5002 - case 4496: - goto tr2985 - case 4497: - goto tr2985 - case 4498: - goto tr2985 - case 4499: - goto tr2985 - case 4500: - goto tr2985 - case 4501: - goto tr2985 - case 4502: - goto tr2985 - case 4503: - goto tr2985 - case 4504: - goto tr2985 - case 4505: - goto tr2985 - case 4506: - goto tr2985 - case 4507: - goto tr2985 - case 4508: - goto tr2985 - case 4509: - goto tr2985 - case 4510: - goto tr2985 - case 4511: - goto tr2985 - case 4512: - goto tr2985 - case 4513: - goto tr2985 - case 4514: - goto tr2985 - case 4515: - goto tr2985 - case 4516: - goto tr2985 - case 4517: - goto tr2985 - case 4518: - goto tr2985 - case 4519: - goto tr2985 - case 4520: - goto tr2985 - case 4521: - goto tr2985 - case 4522: - goto tr2985 - case 4523: - goto tr2985 - case 4524: - goto tr2985 - case 4525: - goto tr2985 - case 4526: - goto tr2985 - case 4527: - goto tr2985 - case 4528: - goto tr2985 - case 4529: - goto tr2985 - case 4530: - goto tr2985 - case 4531: - goto tr2985 - case 4532: - goto tr2985 - case 4533: - goto tr2985 - case 4534: - goto tr2985 - case 4535: - goto tr2985 - case 4536: - goto tr2985 - case 4537: - goto tr2985 - case 4538: - goto tr2985 - case 4539: - goto tr2985 - case 4540: - goto tr2985 - case 4541: - goto tr2985 - case 4542: - goto tr2985 - case 4543: - goto tr2985 - case 4544: - goto tr2985 - case 4545: - goto tr2985 - case 4546: - goto tr2985 - case 4547: - goto tr2985 - case 4548: - goto tr2985 - case 4549: - goto tr2985 - case 4550: - goto tr2985 - case 4551: - goto tr2985 - case 4552: - goto tr2985 - case 4553: - goto tr2985 - case 4554: - goto tr2985 - case 4555: - goto tr2985 - case 4556: - goto tr2985 - case 4557: - goto tr2985 - case 4558: - goto tr2985 - case 4559: - goto tr2985 - case 4560: - goto tr2985 - case 4561: - goto tr2985 - case 4562: - goto tr2985 - case 4563: - goto tr2985 - case 4564: - goto tr2985 - case 4565: - goto tr2985 - case 4566: - goto tr2985 - case 4567: - goto tr2985 - case 4568: - goto tr2985 - case 4569: - goto tr2985 - case 4570: - goto tr2985 - case 4571: - goto tr2985 - case 4572: - goto tr2985 - case 4573: - goto tr2985 - case 4574: - goto tr2985 - case 4575: - goto tr2985 - case 4576: - goto tr2985 - case 4577: - goto tr2985 - case 4578: - goto tr2985 - case 4579: - goto tr2985 - case 4580: - goto tr2985 - case 4581: - goto tr2985 - case 4582: - goto tr2985 - case 4583: - goto tr2985 - case 4584: - goto tr2985 - case 4585: - goto tr2985 - case 4586: - goto tr2985 - case 4587: - goto tr2985 - case 4588: - goto tr2985 - case 4589: - goto tr2985 - case 4590: - goto tr2985 - case 4591: - goto tr2985 - case 4592: - goto tr2985 - case 4593: - goto tr2985 - case 4594: - goto tr2985 - case 4595: - goto tr2985 - case 4596: - goto tr2985 - case 4597: - goto tr2985 - case 4598: - goto tr2985 - case 4599: - goto tr2985 - case 4600: - goto tr2985 - case 4601: - goto tr2985 - case 4602: - goto tr2985 - case 4603: - goto tr2985 - case 4604: - goto tr2985 - case 4605: - goto tr2985 - case 4606: - goto tr2985 - case 4607: - goto tr2985 - case 4608: - goto tr2985 - case 4609: - goto tr2985 - case 4610: - goto tr2985 - case 4611: - goto tr2985 - case 4612: - goto tr2985 - case 4613: - goto tr2985 - case 4614: - goto tr2985 - case 4615: - goto tr2985 - case 4616: - goto tr2985 - case 4617: - goto tr2985 - case 4618: - goto tr2985 - case 4619: - goto tr2985 - case 4620: - goto tr2985 - case 4621: - goto tr2985 - case 4622: - goto tr2985 - case 4623: - goto tr2985 - case 4624: - goto tr2985 - case 4625: - goto tr2985 - case 4626: - goto tr2985 - case 4627: - goto tr2985 - case 4628: - goto tr2985 - case 4629: - goto tr2985 - case 4630: - goto tr2985 - case 4631: - goto tr2985 - case 4632: - goto tr2985 - case 4633: - goto tr2985 - case 4634: - goto tr2985 - case 4635: - goto tr2985 - case 4636: - goto tr2985 - case 4637: - goto tr2985 - case 4638: - goto tr2985 - case 4639: - goto tr2985 - case 4640: - goto tr2985 - case 4641: - goto tr2985 - case 4642: - goto tr2985 - case 4643: - goto tr0 - case 4644: - goto tr0 - case 4645: - goto tr0 - case 4646: - goto tr0 - case 4647: - goto tr0 - case 4648: - goto tr0 - case 4649: - goto tr0 - case 4650: - goto tr0 - case 4651: - goto tr0 - case 4652: - goto tr0 - case 4653: - goto tr0 - case 4654: - goto tr0 - case 4655: - goto tr0 - case 5212: - goto tr5002 - case 5213: - goto tr5002 - case 5214: - goto tr5002 - case 5215: - goto tr4499 - case 5216: - goto tr4499 - case 5217: - goto tr5002 - case 5218: - goto tr5002 - case 5219: - goto tr4499 - case 5220: - goto tr4499 - case 5221: - goto tr4499 - case 5222: - goto tr4499 - case 5223: - goto tr4499 - case 5224: - goto tr4499 - case 5225: - goto tr4499 - case 5226: - goto tr4499 - case 5227: - goto tr5002 - case 5228: - goto tr5002 - case 5229: - goto tr5002 - case 5230: - goto tr5002 - case 5231: - goto tr5002 - case 5232: - goto tr5002 - case 5233: - goto tr5002 - case 5234: - goto tr5002 - case 5235: - goto tr4499 - case 5236: - goto tr4499 - case 5237: - goto tr4499 - case 5238: - goto tr4499 - case 5239: - goto tr4499 - case 5240: - goto tr4499 - case 5241: - goto tr4499 - case 5242: - goto tr4499 - case 4656: - goto tr0 - case 5243: - goto tr5002 - case 5244: - goto tr5002 - case 5245: - goto tr5002 - case 5246: - goto tr5002 - case 5247: - goto tr5002 - case 5248: - goto tr5002 - case 5249: - goto tr5002 - case 5250: - goto tr4499 - case 4657: - goto tr0 - case 5251: - goto tr5002 - case 5252: - goto tr5002 - case 5253: - goto tr5002 - case 5254: - goto tr5002 - case 5255: - goto tr5002 - case 5256: - goto tr5002 - case 4658: - goto tr0 - case 5257: - goto tr5002 - case 5258: - goto tr5002 - case 4659: - goto tr0 - case 5259: - goto tr5002 - case 5260: - goto tr5002 - case 5261: - goto tr5002 - case 5262: - goto tr5002 - case 5263: - goto tr5002 - case 5264: - goto tr4499 - case 5265: - goto tr4499 - case 5266: - goto tr4499 - case 5267: - goto tr4499 - case 5268: - goto tr5002 - case 5269: - goto tr5002 - case 5270: - goto tr5002 - case 5271: - goto tr5002 - case 5272: - goto tr5002 - case 5273: - goto tr5002 - case 5274: - goto tr5002 - case 5275: - goto tr5002 - case 5276: - goto tr5002 - case 5277: - goto tr5002 - case 4660: - goto tr0 - case 5278: - goto tr5002 - case 5279: - goto tr5002 - case 5280: - goto tr5002 - case 4661: - goto tr0 - case 5281: - goto tr5002 - case 5282: - goto tr5002 - case 5283: - goto tr5002 - case 5284: - goto tr5002 - case 5285: - goto tr5002 - case 5286: - goto tr5002 - case 4662: - goto tr0 - case 5287: - goto tr5002 - case 5288: - goto tr5002 - case 5289: - goto tr5002 - case 5290: - goto tr5002 - case 5291: - goto tr5002 - case 5292: - goto tr5002 - case 5293: - goto tr5002 - case 5294: - goto tr5002 - case 5295: - goto tr5002 - case 5296: - goto tr5002 - case 5297: - goto tr5002 - case 5298: - goto tr5002 - case 5299: - goto tr5002 - case 5300: - goto tr5002 - case 5301: - goto tr5002 - case 5302: - goto tr5002 - case 5303: - goto tr5002 - case 5304: - goto tr5002 - case 5305: - goto tr5002 - case 5306: - goto tr5002 - case 5307: - goto tr5002 - case 5308: - goto tr5002 - case 5309: - goto tr5002 - case 5310: - goto tr5002 - case 5311: - goto tr5002 - case 5312: - goto tr5002 - case 5313: - goto tr5002 - case 5314: - goto tr5002 - case 5315: - goto tr5002 - case 5316: - goto tr5002 - case 5317: - goto tr5002 - case 5318: - goto tr5002 - case 5319: - goto tr5002 - case 5320: - goto tr5002 - case 5321: - goto tr5002 - case 5322: - goto tr5002 - case 5323: - goto tr5002 - case 5324: - goto tr5002 - case 5325: - goto tr5002 - case 5326: - goto tr5002 - case 5327: - goto tr5002 - case 5328: - goto tr5002 - case 5329: - goto tr5002 - case 5330: - goto tr5002 - case 5331: - goto tr5002 - case 5332: - goto tr5002 - case 5333: - goto tr5002 - case 5334: - goto tr5002 - case 5335: - goto tr5002 - case 5336: - goto tr5002 - case 5337: - goto tr5002 - case 5338: - goto tr4499 - case 4663: - goto tr0 - case 4664: - goto tr0 - case 4665: - goto tr0 - case 4666: - goto tr0 - case 4667: - goto tr0 - case 4668: - goto tr0 - case 4669: - goto tr0 - case 4670: - goto tr0 - case 5339: - goto tr4499 - case 4671: - goto tr0 - case 4672: - goto tr0 - case 4673: - goto tr0 - case 4674: - goto tr0 - case 4675: - goto tr0 - case 4676: - goto tr0 - case 4677: - goto tr0 - case 4678: - goto tr0 - case 4679: - goto tr0 - case 4680: - goto tr0 - case 4681: - goto tr0 - case 4682: - goto tr0 - case 4683: - goto tr0 - case 4684: - goto tr0 - case 4685: - goto tr0 - case 4686: - goto tr0 - case 4687: - goto tr0 - case 4688: - goto tr0 - case 4689: - goto tr0 - case 4690: - goto tr0 - case 4691: - goto tr0 - case 4692: - goto tr0 - case 4693: - goto tr0 - case 4694: - goto tr0 - case 4695: - goto tr0 - case 4696: - goto tr0 - case 4697: - goto tr0 - case 4698: - goto tr0 - case 4699: - goto tr0 - case 4700: - goto tr0 - case 4701: - goto tr0 - case 4702: - goto tr0 - case 4703: - goto tr0 - case 4704: - goto tr0 - case 4705: - goto tr0 - case 4706: - goto tr0 - case 4707: - goto tr2 - case 5340: - goto tr5359 - case 4708: - goto tr4328 - case 4709: - goto tr4328 - case 4710: - goto tr4328 - case 4711: - goto tr4328 - case 4712: - goto tr4328 - case 4713: - goto tr4328 - case 4714: - goto tr4328 - case 4715: - goto tr4328 - case 4716: - goto tr4328 - case 4717: - goto tr4328 - case 4718: - goto tr4328 - case 4719: - goto tr4328 - case 4720: - goto tr4328 - case 4721: - goto tr4328 - case 4722: - goto tr4328 - case 4723: - goto tr4328 - case 4724: - goto tr4328 - case 4725: - goto tr4328 - case 4726: - goto tr4328 - case 4727: - goto tr4328 - case 4728: - goto tr4328 - case 4729: - goto tr4328 - case 4730: - goto tr4328 - case 4731: - goto tr4328 - case 4732: - goto tr4328 - case 4733: - goto tr4328 - case 4734: - goto tr4328 - case 4735: - goto tr4328 - case 4736: - goto tr4328 - case 4737: - goto tr4328 - case 4738: - goto tr4328 - case 4739: - goto tr4328 - case 4740: - goto tr4328 - case 4741: - goto tr4328 - case 4742: - goto tr4328 - case 4743: - goto tr4328 - case 4744: - goto tr4328 - case 4745: - goto tr4328 - case 4746: - goto tr4328 - case 4747: - goto tr4328 - case 4748: - goto tr4328 - case 4749: - goto tr4328 - case 4750: - goto tr4328 - case 4751: - goto tr4328 - case 4752: - goto tr4328 - case 4753: - goto tr4328 - case 4754: - goto tr4328 - case 4755: - goto tr4328 - case 4756: - goto tr4328 - case 4757: - goto tr4328 - case 4758: - goto tr4328 - case 4759: - goto tr4328 - case 4760: - goto tr4328 - case 4761: - goto tr4328 - case 4762: - goto tr4328 - case 4763: - goto tr4328 - case 4764: - goto tr4328 - case 4765: - goto tr4328 - case 4766: - goto tr4328 - case 4767: - goto tr4328 - case 4768: - goto tr4328 - case 4769: - goto tr4328 - case 4770: - goto tr4328 - case 4771: - goto tr4328 - case 4772: - goto tr4328 - case 4773: - goto tr4328 - case 4774: - goto tr4328 - case 4775: - goto tr4328 - case 4776: - goto tr4328 - case 4777: - goto tr4328 - case 4778: - goto tr4328 - case 4779: - goto tr4328 - case 4780: - goto tr4328 - case 4781: - goto tr4328 - case 4782: - goto tr4328 - case 4783: - goto tr4328 - case 4784: - goto tr4328 - case 4785: - goto tr4328 - case 4786: - goto tr4328 - case 4787: - goto tr4328 - case 4788: - goto tr4328 - case 4789: - goto tr4328 - case 4790: - goto tr4328 - case 4791: - goto tr4328 - case 4792: - goto tr4328 - case 4793: - goto tr4328 - case 4794: - goto tr4328 - case 4795: - goto tr4328 - case 4796: - goto tr4328 - case 4797: - goto tr4328 - case 4798: - goto tr4328 - case 4799: - goto tr4328 - case 4800: - goto tr4328 - case 4801: - goto tr4328 - case 4802: - goto tr4328 - case 4803: - goto tr4328 - case 4804: - goto tr4328 - case 4805: - goto tr4328 - case 4806: - goto tr4328 - case 4807: - goto tr4328 - case 4808: - goto tr4328 - case 4809: - goto tr4328 - case 4810: - goto tr4328 - case 4811: - goto tr4328 - case 4812: - goto tr4328 - case 4813: - goto tr4328 - case 4814: - goto tr4328 - case 4815: - goto tr4328 - case 4816: - goto tr4328 - case 4817: - goto tr4328 - case 4818: - goto tr4328 - case 4819: - goto tr4328 - case 4820: - goto tr4328 - case 4821: - goto tr4328 - case 4822: - goto tr4328 - case 4823: - goto tr4328 - case 4824: - goto tr4328 - case 4825: - goto tr4328 - case 4826: - goto tr4328 - case 4827: - goto tr4328 - case 4828: - goto tr4328 - case 4829: - goto tr4328 - case 4830: - goto tr4328 - case 4831: - goto tr4328 - case 4832: - goto tr4328 - case 4833: - goto tr4328 - case 4834: - goto tr4328 - case 4835: - goto tr4328 - case 4836: - goto tr4328 - case 4837: - goto tr4328 - case 4838: - goto tr4328 - case 4839: - goto tr4328 - case 4840: - goto tr4328 - case 4841: - goto tr4328 - case 4842: - goto tr4328 - case 4843: - goto tr4328 - case 4844: - goto tr4328 - case 4845: - goto tr4328 - case 4846: - goto tr4328 - case 4847: - goto tr4328 - case 4848: - goto tr4328 - case 4849: - goto tr4328 - case 4850: - goto tr0 - case 4851: - goto tr0 - case 4852: - goto tr0 - case 4853: - goto tr0 - case 4854: - goto tr0 - case 4855: - goto tr0 - case 4856: - goto tr0 - case 4857: - goto tr0 - case 4858: - goto tr0 - case 4859: - goto tr0 - case 4860: - goto tr0 - case 4861: - goto tr0 - case 4862: -//line segment_words.rl:68 - - startPos = p - -//line segment_words_prod.go:173630 + _test_eof: + { + } + if p == eof { + switch cs { + case 4863: + goto tr4499 + case 0: + goto tr0 + case 1: + goto tr2 + case 2: + goto tr2 + case 3: + goto tr0 + case 4: + goto tr0 + case 5: + goto tr0 + case 6: + goto tr0 + case 7: + goto tr0 + case 8: + goto tr0 + case 9: + goto tr0 + case 10: + goto tr0 + case 11: + goto tr0 + case 12: + goto tr0 + case 13: + goto tr0 + case 14: + goto tr2 + case 15: + goto tr2 + case 16: + goto tr2 + case 17: + goto tr2 + case 18: + goto tr2 + case 19: + goto tr2 + case 20: + goto tr2 + case 21: + goto tr2 + case 22: + goto tr2 + case 23: + goto tr2 + case 24: + goto tr2 + case 25: + goto tr2 + case 26: + goto tr2 + case 27: + goto tr2 + case 28: + goto tr2 + case 29: + goto tr2 + case 30: + goto tr2 + case 31: + goto tr2 + case 32: + goto tr2 + case 33: + goto tr2 + case 34: + goto tr2 + case 35: + goto tr2 + case 36: + goto tr2 + case 37: + goto tr2 + case 38: + goto tr2 + case 39: + goto tr2 + case 40: + goto tr2 + case 41: + goto tr2 + case 42: + goto tr0 + case 43: + goto tr2 + case 44: + goto tr2 + case 45: + goto tr2 + case 46: + goto tr2 + case 47: + goto tr2 + case 48: + goto tr2 + case 49: + goto tr2 + case 50: + goto tr2 + case 51: + goto tr2 + case 52: + goto tr2 + case 53: + goto tr2 + case 54: + goto tr2 + case 55: + goto tr2 + case 56: + goto tr2 + case 57: + goto tr2 + case 58: + goto tr2 + case 59: + goto tr2 + case 60: + goto tr2 + case 61: + goto tr2 + case 62: + goto tr2 + case 63: + goto tr2 + case 64: + goto tr0 + case 65: + goto tr2 + case 66: + goto tr2 + case 67: + goto tr2 + case 68: + goto tr2 + case 69: + goto tr2 + case 70: + goto tr2 + case 71: + goto tr0 + case 72: + goto tr2 + case 73: + goto tr2 + case 74: + goto tr0 + case 75: + goto tr2 + case 76: + goto tr2 + case 77: + goto tr2 + case 78: + goto tr2 + case 79: + goto tr2 + case 80: + goto tr2 + case 81: + goto tr2 + case 82: + goto tr2 + case 83: + goto tr2 + case 84: + goto tr2 + case 85: + goto tr2 + case 86: + goto tr2 + case 87: + goto tr2 + case 88: + goto tr2 + case 89: + goto tr2 + case 90: + goto tr0 + case 91: + goto tr2 + case 92: + goto tr2 + case 93: + goto tr2 + case 94: + goto tr0 + case 95: + goto tr2 + case 96: + goto tr2 + case 97: + goto tr2 + case 98: + goto tr2 + case 99: + goto tr2 + case 100: + goto tr2 + case 101: + goto tr2 + case 102: + goto tr2 + case 103: + goto tr2 + case 104: + goto tr2 + case 105: + goto tr2 + case 106: + goto tr2 + case 107: + goto tr2 + case 108: + goto tr2 + case 109: + goto tr2 + case 110: + goto tr2 + case 111: + goto tr2 + case 112: + goto tr2 + case 113: + goto tr2 + case 114: + goto tr2 + case 115: + goto tr2 + case 116: + goto tr2 + case 117: + goto tr2 + case 118: + goto tr2 + case 119: + goto tr2 + case 120: + goto tr2 + case 121: + goto tr2 + case 122: + goto tr2 + case 123: + goto tr2 + case 124: + goto tr2 + case 125: + goto tr2 + case 126: + goto tr2 + case 127: + goto tr2 + case 128: + goto tr2 + case 129: + goto tr2 + case 130: + goto tr2 + case 131: + goto tr2 + case 132: + goto tr2 + case 133: + goto tr2 + case 134: + goto tr2 + case 135: + goto tr2 + case 136: + goto tr0 + case 137: + goto tr2 + case 138: + goto tr2 + case 139: + goto tr2 + case 140: + goto tr2 + case 4864: + goto tr4519 + case 4865: + goto tr4521 + case 141: + goto tr125 + case 4866: + goto tr4521 + case 4867: + goto tr4562 + case 142: + goto tr2 + case 143: + goto tr2 + case 144: + goto tr2 + case 145: + goto tr2 + case 146: + goto tr2 + case 147: + goto tr2 + case 148: + goto tr2 + case 149: + goto tr2 + case 150: + goto tr2 + case 151: + goto tr2 + case 152: + goto tr2 + case 153: + goto tr2 + case 154: + goto tr2 + case 155: + goto tr2 + case 156: + goto tr2 + case 157: + goto tr2 + case 158: + goto tr2 + case 159: + goto tr2 + case 160: + goto tr2 + case 161: + goto tr2 + case 162: + goto tr2 + case 163: + goto tr2 + case 164: + goto tr2 + case 165: + goto tr2 + case 166: + goto tr2 + case 167: + goto tr2 + case 168: + goto tr2 + case 169: + goto tr2 + case 170: + goto tr2 + case 171: + goto tr2 + case 172: + goto tr2 + case 173: + goto tr2 + case 174: + goto tr2 + case 175: + goto tr2 + case 176: + goto tr2 + case 177: + goto tr2 + case 178: + goto tr2 + case 179: + goto tr2 + case 180: + goto tr2 + case 181: + goto tr2 + case 182: + goto tr2 + case 183: + goto tr2 + case 184: + goto tr2 + case 185: + goto tr2 + case 186: + goto tr2 + case 187: + goto tr2 + case 188: + goto tr2 + case 189: + goto tr2 + case 190: + goto tr2 + case 191: + goto tr2 + case 192: + goto tr2 + case 193: + goto tr2 + case 194: + goto tr2 + case 195: + goto tr2 + case 196: + goto tr2 + case 197: + goto tr2 + case 198: + goto tr2 + case 199: + goto tr2 + case 200: + goto tr2 + case 201: + goto tr2 + case 202: + goto tr2 + case 203: + goto tr2 + case 204: + goto tr2 + case 205: + goto tr2 + case 206: + goto tr2 + case 207: + goto tr2 + case 208: + goto tr2 + case 209: + goto tr2 + case 210: + goto tr2 + case 211: + goto tr2 + case 212: + goto tr2 + case 213: + goto tr2 + case 214: + goto tr2 + case 215: + goto tr2 + case 216: + goto tr2 + case 217: + goto tr2 + case 218: + goto tr2 + case 219: + goto tr2 + case 220: + goto tr2 + case 221: + goto tr2 + case 222: + goto tr2 + case 223: + goto tr2 + case 224: + goto tr2 + case 225: + goto tr2 + case 226: + goto tr2 + case 227: + goto tr2 + case 228: + goto tr2 + case 229: + goto tr2 + case 230: + goto tr2 + case 231: + goto tr2 + case 232: + goto tr2 + case 233: + goto tr2 + case 234: + goto tr2 + case 235: + goto tr2 + case 236: + goto tr2 + case 237: + goto tr2 + case 238: + goto tr2 + case 239: + goto tr2 + case 240: + goto tr2 + case 241: + goto tr2 + case 242: + goto tr2 + case 243: + goto tr2 + case 244: + goto tr2 + case 245: + goto tr2 + case 246: + goto tr2 + case 247: + goto tr2 + case 248: + goto tr2 + case 249: + goto tr2 + case 250: + goto tr2 + case 251: + goto tr2 + case 252: + goto tr2 + case 253: + goto tr2 + case 254: + goto tr2 + case 255: + goto tr2 + case 256: + goto tr2 + case 257: + goto tr2 + case 258: + goto tr2 + case 259: + goto tr2 + case 260: + goto tr2 + case 261: + goto tr2 + case 262: + goto tr2 + case 263: + goto tr2 + case 264: + goto tr2 + case 265: + goto tr2 + case 266: + goto tr2 + case 267: + goto tr2 + case 268: + goto tr2 + case 269: + goto tr2 + case 270: + goto tr2 + case 271: + goto tr2 + case 272: + goto tr2 + case 273: + goto tr2 + case 274: + goto tr2 + case 275: + goto tr2 + case 276: + goto tr2 + case 277: + goto tr2 + case 278: + goto tr2 + case 279: + goto tr2 + case 280: + goto tr2 + case 281: + goto tr2 + case 282: + goto tr2 + case 283: + goto tr2 + case 284: + goto tr2 + case 285: + goto tr2 + case 286: + goto tr2 + case 287: + goto tr2 + case 288: + goto tr2 + case 289: + goto tr2 + case 290: + goto tr2 + case 291: + goto tr2 + case 292: + goto tr2 + case 293: + goto tr2 + case 294: + goto tr2 + case 295: + goto tr2 + case 296: + goto tr2 + case 297: + goto tr2 + case 298: + goto tr2 + case 299: + goto tr2 + case 300: + goto tr2 + case 301: + goto tr2 + case 302: + goto tr2 + case 303: + goto tr2 + case 304: + goto tr2 + case 305: + goto tr2 + case 306: + goto tr2 + case 307: + goto tr2 + case 308: + goto tr2 + case 309: + goto tr2 + case 310: + goto tr2 + case 311: + goto tr2 + case 312: + goto tr2 + case 313: + goto tr2 + case 314: + goto tr2 + case 315: + goto tr2 + case 316: + goto tr2 + case 317: + goto tr2 + case 318: + goto tr2 + case 319: + goto tr2 + case 320: + goto tr2 + case 321: + goto tr2 + case 322: + goto tr2 + case 323: + goto tr2 + case 324: + goto tr2 + case 325: + goto tr2 + case 326: + goto tr2 + case 327: + goto tr2 + case 328: + goto tr2 + case 329: + goto tr2 + case 330: + goto tr2 + case 331: + goto tr2 + case 332: + goto tr2 + case 333: + goto tr2 + case 334: + goto tr2 + case 335: + goto tr2 + case 336: + goto tr2 + case 337: + goto tr2 + case 338: + goto tr2 + case 339: + goto tr2 + case 340: + goto tr2 + case 341: + goto tr2 + case 342: + goto tr2 + case 343: + goto tr2 + case 344: + goto tr2 + case 345: + goto tr2 + case 346: + goto tr2 + case 347: + goto tr2 + case 348: + goto tr2 + case 349: + goto tr2 + case 350: + goto tr2 + case 351: + goto tr2 + case 352: + goto tr2 + case 353: + goto tr2 + case 354: + goto tr2 + case 355: + goto tr2 + case 356: + goto tr2 + case 357: + goto tr2 + case 358: + goto tr2 + case 359: + goto tr2 + case 360: + goto tr2 + case 361: + goto tr2 + case 362: + goto tr2 + case 363: + goto tr2 + case 364: + goto tr2 + case 365: + goto tr2 + case 366: + goto tr2 + case 367: + goto tr2 + case 368: + goto tr2 + case 369: + goto tr2 + case 370: + goto tr2 + case 371: + goto tr2 + case 372: + goto tr2 + case 373: + goto tr2 + case 374: + goto tr2 + case 375: + goto tr2 + case 376: + goto tr2 + case 377: + goto tr2 + case 378: + goto tr2 + case 379: + goto tr2 + case 380: + goto tr2 + case 381: + goto tr2 + case 382: + goto tr2 + case 383: + goto tr2 + case 384: + goto tr2 + case 385: + goto tr2 + case 386: + goto tr2 + case 387: + goto tr2 + case 388: + goto tr2 + case 389: + goto tr2 + case 390: + goto tr2 + case 391: + goto tr2 + case 392: + goto tr2 + case 393: + goto tr2 + case 394: + goto tr2 + case 395: + goto tr2 + case 396: + goto tr2 + case 397: + goto tr2 + case 398: + goto tr2 + case 399: + goto tr2 + case 400: + goto tr2 + case 401: + goto tr2 + case 402: + goto tr2 + case 403: + goto tr2 + case 404: + goto tr2 + case 405: + goto tr2 + case 406: + goto tr2 + case 407: + goto tr2 + case 408: + goto tr2 + case 409: + goto tr2 + case 410: + goto tr2 + case 411: + goto tr2 + case 412: + goto tr2 + case 4868: + goto tr4562 + case 413: + goto tr420 + case 414: + goto tr420 + case 415: + goto tr420 + case 416: + goto tr420 + case 417: + goto tr420 + case 418: + goto tr420 + case 419: + goto tr420 + case 420: + goto tr420 + case 421: + goto tr420 + case 422: + goto tr420 + case 423: + goto tr420 + case 424: + goto tr420 + case 425: + goto tr420 + case 426: + goto tr420 + case 427: + goto tr420 + case 428: + goto tr420 + case 429: + goto tr420 + case 430: + goto tr420 + case 431: + goto tr420 + case 432: + goto tr420 + case 433: + goto tr420 + case 434: + goto tr420 + case 435: + goto tr420 + case 436: + goto tr420 + case 437: + goto tr420 + case 438: + goto tr420 + case 439: + goto tr420 + case 440: + goto tr420 + case 441: + goto tr420 + case 442: + goto tr420 + case 443: + goto tr420 + case 444: + goto tr420 + case 445: + goto tr420 + case 446: + goto tr420 + case 447: + goto tr420 + case 448: + goto tr420 + case 449: + goto tr420 + case 450: + goto tr420 + case 451: + goto tr420 + case 452: + goto tr420 + case 453: + goto tr420 + case 454: + goto tr420 + case 455: + goto tr420 + case 456: + goto tr420 + case 457: + goto tr420 + case 458: + goto tr420 + case 459: + goto tr420 + case 460: + goto tr420 + case 461: + goto tr420 + case 462: + goto tr420 + case 463: + goto tr420 + case 464: + goto tr420 + case 465: + goto tr420 + case 466: + goto tr420 + case 467: + goto tr420 + case 468: + goto tr2 + case 469: + goto tr2 + case 470: + goto tr420 + case 471: + goto tr420 + case 472: + goto tr420 + case 473: + goto tr420 + case 474: + goto tr420 + case 475: + goto tr420 + case 476: + goto tr420 + case 477: + goto tr420 + case 478: + goto tr420 + case 479: + goto tr420 + case 480: + goto tr420 + case 481: + goto tr420 + case 482: + goto tr420 + case 483: + goto tr420 + case 484: + goto tr420 + case 485: + goto tr420 + case 486: + goto tr420 + case 487: + goto tr420 + case 488: + goto tr420 + case 489: + goto tr420 + case 490: + goto tr420 + case 491: + goto tr420 + case 492: + goto tr420 + case 493: + goto tr420 + case 494: + goto tr420 + case 495: + goto tr420 + case 496: + goto tr420 + case 497: + goto tr420 + case 498: + goto tr420 + case 499: + goto tr420 + case 500: + goto tr420 + case 501: + goto tr420 + case 502: + goto tr420 + case 503: + goto tr420 + case 504: + goto tr420 + case 505: + goto tr420 + case 506: + goto tr420 + case 507: + goto tr420 + case 508: + goto tr420 + case 509: + goto tr420 + case 510: + goto tr420 + case 511: + goto tr420 + case 512: + goto tr420 + case 513: + goto tr420 + case 514: + goto tr420 + case 515: + goto tr420 + case 516: + goto tr420 + case 517: + goto tr420 + case 518: + goto tr420 + case 519: + goto tr420 + case 520: + goto tr420 + case 521: + goto tr420 + case 522: + goto tr420 + case 523: + goto tr420 + case 524: + goto tr420 + case 525: + goto tr420 + case 526: + goto tr420 + case 527: + goto tr420 + case 528: + goto tr420 + case 529: + goto tr420 + case 530: + goto tr420 + case 531: + goto tr420 + case 532: + goto tr420 + case 533: + goto tr420 + case 534: + goto tr420 + case 535: + goto tr420 + case 536: + goto tr420 + case 537: + goto tr420 + case 538: + goto tr2 + case 539: + goto tr420 + case 540: + goto tr420 + case 541: + goto tr420 + case 542: + goto tr420 + case 543: + goto tr420 + case 544: + goto tr420 + case 545: + goto tr420 + case 546: + goto tr420 + case 547: + goto tr420 + case 548: + goto tr420 + case 549: + goto tr420 + case 550: + goto tr420 + case 551: + goto tr420 + case 552: + goto tr420 + case 553: + goto tr420 + case 554: + goto tr420 + case 555: + goto tr420 + case 556: + goto tr420 + case 557: + goto tr420 + case 558: + goto tr420 + case 559: + goto tr420 + case 560: + goto tr420 + case 561: + goto tr420 + case 4869: + goto tr4562 + case 562: + goto tr420 + case 563: + goto tr420 + case 564: + goto tr420 + case 565: + goto tr420 + case 566: + goto tr420 + case 567: + goto tr420 + case 4870: + goto tr4562 + case 568: + goto tr420 + case 569: + goto tr420 + case 570: + goto tr420 + case 571: + goto tr420 + case 572: + goto tr420 + case 573: + goto tr420 + case 574: + goto tr420 + case 4871: + goto tr4562 + case 575: + goto tr420 + case 576: + goto tr420 + case 577: + goto tr420 + case 578: + goto tr420 + case 579: + goto tr420 + case 580: + goto tr420 + case 581: + goto tr420 + case 582: + goto tr420 + case 583: + goto tr420 + case 584: + goto tr420 + case 585: + goto tr420 + case 586: + goto tr420 + case 587: + goto tr420 + case 588: + goto tr420 + case 589: + goto tr420 + case 590: + goto tr420 + case 591: + goto tr420 + case 592: + goto tr420 + case 593: + goto tr420 + case 594: + goto tr420 + case 595: + goto tr420 + case 596: + goto tr420 + case 597: + goto tr420 + case 598: + goto tr420 + case 599: + goto tr420 + case 600: + goto tr420 + case 601: + goto tr420 + case 602: + goto tr420 + case 603: + goto tr420 + case 604: + goto tr420 + case 605: + goto tr420 + case 606: + goto tr420 + case 607: + goto tr420 + case 608: + goto tr420 + case 609: + goto tr420 + case 610: + goto tr420 + case 611: + goto tr420 + case 612: + goto tr420 + case 613: + goto tr420 + case 614: + goto tr420 + case 615: + goto tr420 + case 616: + goto tr420 + case 617: + goto tr420 + case 618: + goto tr420 + case 619: + goto tr420 + case 620: + goto tr420 + case 621: + goto tr420 + case 622: + goto tr420 + case 623: + goto tr420 + case 624: + goto tr420 + case 625: + goto tr420 + case 626: + goto tr420 + case 627: + goto tr420 + case 628: + goto tr420 + case 629: + goto tr420 + case 630: + goto tr420 + case 631: + goto tr420 + case 632: + goto tr420 + case 633: + goto tr420 + case 634: + goto tr420 + case 635: + goto tr420 + case 636: + goto tr420 + case 637: + goto tr420 + case 638: + goto tr420 + case 639: + goto tr420 + case 640: + goto tr2 + case 641: + goto tr420 + case 642: + goto tr420 + case 643: + goto tr420 + case 644: + goto tr420 + case 645: + goto tr420 + case 646: + goto tr420 + case 647: + goto tr420 + case 648: + goto tr420 + case 649: + goto tr420 + case 650: + goto tr420 + case 651: + goto tr420 + case 652: + goto tr420 + case 653: + goto tr420 + case 654: + goto tr2 + case 655: + goto tr420 + case 656: + goto tr420 + case 657: + goto tr420 + case 658: + goto tr420 + case 659: + goto tr420 + case 660: + goto tr420 + case 661: + goto tr420 + case 662: + goto tr420 + case 663: + goto tr420 + case 664: + goto tr420 + case 665: + goto tr420 + case 666: + goto tr420 + case 667: + goto tr420 + case 668: + goto tr420 + case 669: + goto tr420 + case 670: + goto tr420 + case 671: + goto tr420 + case 672: + goto tr2 + case 673: + goto tr420 + case 674: + goto tr420 + case 675: + goto tr420 + case 676: + goto tr420 + case 677: + goto tr420 + case 678: + goto tr420 + case 679: + goto tr420 + case 680: + goto tr420 + case 681: + goto tr420 + case 682: + goto tr420 + case 683: + goto tr420 + case 684: + goto tr2 + case 685: + goto tr420 + case 686: + goto tr420 + case 687: + goto tr420 + case 688: + goto tr420 + case 689: + goto tr420 + case 690: + goto tr420 + case 691: + goto tr2 + case 692: + goto tr420 + case 693: + goto tr420 + case 694: + goto tr420 + case 695: + goto tr420 + case 696: + goto tr420 + case 697: + goto tr420 + case 698: + goto tr420 + case 699: + goto tr420 + case 700: + goto tr420 + case 701: + goto tr420 + case 702: + goto tr420 + case 703: + goto tr420 + case 704: + goto tr420 + case 705: + goto tr420 + case 706: + goto tr420 + case 707: + goto tr2 + case 708: + goto tr420 + case 709: + goto tr2 + case 710: + goto tr420 + case 711: + goto tr420 + case 712: + goto tr2 + case 713: + goto tr420 + case 714: + goto tr420 + case 715: + goto tr420 + case 716: + goto tr420 + case 717: + goto tr420 + case 718: + goto tr420 + case 719: + goto tr420 + case 720: + goto tr420 + case 721: + goto tr2 + case 722: + goto tr420 + case 723: + goto tr420 + case 724: + goto tr420 + case 725: + goto tr420 + case 726: + goto tr420 + case 727: + goto tr420 + case 728: + goto tr420 + case 729: + goto tr420 + case 730: + goto tr420 + case 731: + goto tr420 + case 732: + goto tr420 + case 733: + goto tr420 + case 734: + goto tr420 + case 735: + goto tr420 + case 736: + goto tr420 + case 737: + goto tr420 + case 738: + goto tr420 + case 739: + goto tr420 + case 740: + goto tr420 + case 741: + goto tr420 + case 742: + goto tr420 + case 743: + goto tr420 + case 744: + goto tr420 + case 745: + goto tr420 + case 746: + goto tr420 + case 747: + goto tr420 + case 748: + goto tr420 + case 749: + goto tr420 + case 750: + goto tr420 + case 751: + goto tr420 + case 752: + goto tr420 + case 753: + goto tr420 + case 754: + goto tr420 + case 755: + goto tr420 + case 756: + goto tr420 + case 757: + goto tr420 + case 758: + goto tr420 + case 759: + goto tr420 + case 760: + goto tr420 + case 761: + goto tr420 + case 762: + goto tr420 + case 763: + goto tr420 + case 764: + goto tr420 + case 765: + goto tr420 + case 766: + goto tr420 + case 767: + goto tr420 + case 768: + goto tr420 + case 769: + goto tr420 + case 770: + goto tr420 + case 771: + goto tr420 + case 772: + goto tr420 + case 773: + goto tr420 + case 774: + goto tr420 + case 775: + goto tr420 + case 776: + goto tr420 + case 777: + goto tr420 + case 778: + goto tr420 + case 779: + goto tr420 + case 780: + goto tr420 + case 781: + goto tr420 + case 782: + goto tr420 + case 783: + goto tr420 + case 784: + goto tr420 + case 785: + goto tr420 + case 786: + goto tr420 + case 787: + goto tr420 + case 788: + goto tr420 + case 789: + goto tr420 + case 790: + goto tr420 + case 791: + goto tr420 + case 792: + goto tr420 + case 793: + goto tr420 + case 794: + goto tr420 + case 795: + goto tr420 + case 796: + goto tr420 + case 797: + goto tr420 + case 798: + goto tr420 + case 799: + goto tr420 + case 800: + goto tr420 + case 801: + goto tr420 + case 802: + goto tr420 + case 803: + goto tr420 + case 804: + goto tr420 + case 805: + goto tr420 + case 806: + goto tr420 + case 807: + goto tr420 + case 808: + goto tr420 + case 809: + goto tr420 + case 810: + goto tr420 + case 811: + goto tr420 + case 812: + goto tr420 + case 813: + goto tr420 + case 814: + goto tr420 + case 815: + goto tr420 + case 816: + goto tr420 + case 817: + goto tr420 + case 818: + goto tr420 + case 819: + goto tr420 + case 820: + goto tr420 + case 821: + goto tr420 + case 822: + goto tr420 + case 823: + goto tr420 + case 824: + goto tr420 + case 825: + goto tr420 + case 826: + goto tr420 + case 827: + goto tr420 + case 828: + goto tr420 + case 829: + goto tr420 + case 830: + goto tr420 + case 831: + goto tr420 + case 832: + goto tr420 + case 833: + goto tr420 + case 834: + goto tr420 + case 835: + goto tr420 + case 836: + goto tr420 + case 837: + goto tr420 + case 838: + goto tr420 + case 839: + goto tr420 + case 840: + goto tr420 + case 841: + goto tr420 + case 842: + goto tr420 + case 843: + goto tr420 + case 844: + goto tr420 + case 845: + goto tr420 + case 846: + goto tr420 + case 847: + goto tr420 + case 848: + goto tr420 + case 849: + goto tr420 + case 850: + goto tr420 + case 851: + goto tr420 + case 852: + goto tr420 + case 853: + goto tr420 + case 854: + goto tr420 + case 855: + goto tr420 + case 856: + goto tr420 + case 857: + goto tr420 + case 858: + goto tr420 + case 859: + goto tr420 + case 860: + goto tr420 + case 861: + goto tr420 + case 862: + goto tr420 + case 863: + goto tr420 + case 864: + goto tr420 + case 865: + goto tr420 + case 866: + goto tr420 + case 867: + goto tr420 + case 868: + goto tr420 + case 869: + goto tr420 + case 870: + goto tr2 + case 871: + goto tr420 + case 872: + goto tr420 + case 873: + goto tr2 + case 874: + goto tr420 + case 875: + goto tr420 + case 876: + goto tr420 + case 877: + goto tr420 + case 878: + goto tr420 + case 879: + goto tr420 + case 880: + goto tr420 + case 881: + goto tr420 + case 882: + goto tr420 + case 883: + goto tr420 + case 884: + goto tr420 + case 885: + goto tr420 + case 886: + goto tr420 + case 887: + goto tr420 + case 888: + goto tr420 + case 889: + goto tr420 + case 890: + goto tr420 + case 891: + goto tr420 + case 892: + goto tr420 + case 893: + goto tr420 + case 894: + goto tr420 + case 895: + goto tr420 + case 896: + goto tr420 + case 897: + goto tr420 + case 898: + goto tr420 + case 899: + goto tr420 + case 900: + goto tr420 + case 901: + goto tr420 + case 902: + goto tr420 + case 903: + goto tr420 + case 904: + goto tr420 + case 905: + goto tr420 + case 906: + goto tr420 + case 907: + goto tr420 + case 908: + goto tr420 + case 909: + goto tr420 + case 910: + goto tr420 + case 911: + goto tr420 + case 912: + goto tr420 + case 913: + goto tr420 + case 914: + goto tr420 + case 915: + goto tr420 + case 916: + goto tr420 + case 917: + goto tr420 + case 918: + goto tr420 + case 919: + goto tr420 + case 920: + goto tr420 + case 921: + goto tr420 + case 922: + goto tr420 + case 923: + goto tr420 + case 924: + goto tr420 + case 925: + goto tr420 + case 926: + goto tr420 + case 927: + goto tr420 + case 928: + goto tr420 + case 929: + goto tr420 + case 930: + goto tr420 + case 931: + goto tr420 + case 932: + goto tr420 + case 933: + goto tr420 + case 934: + goto tr420 + case 935: + goto tr420 + case 936: + goto tr420 + case 937: + goto tr420 + case 938: + goto tr420 + case 939: + goto tr420 + case 940: + goto tr420 + case 941: + goto tr420 + case 942: + goto tr420 + case 943: + goto tr420 + case 944: + goto tr420 + case 945: + goto tr420 + case 946: + goto tr420 + case 947: + goto tr420 + case 948: + goto tr420 + case 949: + goto tr420 + case 950: + goto tr420 + case 951: + goto tr420 + case 952: + goto tr420 + case 953: + goto tr420 + case 954: + goto tr420 + case 955: + goto tr420 + case 956: + goto tr420 + case 957: + goto tr420 + case 958: + goto tr420 + case 959: + goto tr420 + case 960: + goto tr420 + case 961: + goto tr420 + case 962: + goto tr420 + case 963: + goto tr420 + case 964: + goto tr420 + case 965: + goto tr420 + case 966: + goto tr420 + case 967: + goto tr2 + case 968: + goto tr420 + case 969: + goto tr2 + case 970: + goto tr420 + case 971: + goto tr420 + case 972: + goto tr420 + case 973: + goto tr420 + case 974: + goto tr420 + case 975: + goto tr420 + case 976: + goto tr420 + case 977: + goto tr420 + case 978: + goto tr420 + case 979: + goto tr420 + case 980: + goto tr420 + case 981: + goto tr420 + case 982: + goto tr420 + case 983: + goto tr420 + case 984: + goto tr420 + case 985: + goto tr420 + case 986: + goto tr420 + case 987: + goto tr420 + case 988: + goto tr420 + case 989: + goto tr420 + case 990: + goto tr420 + case 991: + goto tr420 + case 992: + goto tr420 + case 993: + goto tr420 + case 994: + goto tr420 + case 995: + goto tr420 + case 996: + goto tr420 + case 997: + goto tr420 + case 998: + goto tr420 + case 999: + goto tr420 + case 1000: + goto tr420 + case 1001: + goto tr420 + case 1002: + goto tr420 + case 1003: + goto tr420 + case 1004: + goto tr420 + case 1005: + goto tr420 + case 1006: + goto tr420 + case 1007: + goto tr420 + case 1008: + goto tr420 + case 1009: + goto tr420 + case 1010: + goto tr420 + case 1011: + goto tr420 + case 1012: + goto tr420 + case 1013: + goto tr420 + case 1014: + goto tr420 + case 1015: + goto tr420 + case 1016: + goto tr420 + case 1017: + goto tr420 + case 1018: + goto tr420 + case 1019: + goto tr420 + case 1020: + goto tr420 + case 1021: + goto tr420 + case 1022: + goto tr420 + case 1023: + goto tr420 + case 1024: + goto tr420 + case 1025: + goto tr420 + case 1026: + goto tr420 + case 1027: + goto tr420 + case 1028: + goto tr420 + case 1029: + goto tr420 + case 1030: + goto tr420 + case 1031: + goto tr420 + case 1032: + goto tr420 + case 1033: + goto tr420 + case 1034: + goto tr420 + case 1035: + goto tr420 + case 1036: + goto tr420 + case 1037: + goto tr420 + case 1038: + goto tr420 + case 1039: + goto tr420 + case 1040: + goto tr420 + case 1041: + goto tr420 + case 1042: + goto tr420 + case 1043: + goto tr420 + case 1044: + goto tr420 + case 1045: + goto tr420 + case 1046: + goto tr420 + case 1047: + goto tr420 + case 1048: + goto tr420 + case 1049: + goto tr420 + case 1050: + goto tr420 + case 1051: + goto tr420 + case 1052: + goto tr420 + case 1053: + goto tr420 + case 1054: + goto tr420 + case 1055: + goto tr420 + case 1056: + goto tr420 + case 1057: + goto tr420 + case 1058: + goto tr420 + case 1059: + goto tr420 + case 1060: + goto tr420 + case 1061: + goto tr420 + case 1062: + goto tr420 + case 1063: + goto tr420 + case 1064: + goto tr420 + case 1065: + goto tr420 + case 1066: + goto tr420 + case 1067: + goto tr420 + case 1068: + goto tr420 + case 1069: + goto tr420 + case 1070: + goto tr420 + case 1071: + goto tr420 + case 1072: + goto tr420 + case 1073: + goto tr420 + case 1074: + goto tr420 + case 1075: + goto tr420 + case 1076: + goto tr420 + case 1077: + goto tr420 + case 1078: + goto tr420 + case 1079: + goto tr420 + case 1080: + goto tr420 + case 1081: + goto tr420 + case 1082: + goto tr420 + case 1083: + goto tr420 + case 1084: + goto tr420 + case 1085: + goto tr420 + case 1086: + goto tr420 + case 1087: + goto tr420 + case 1088: + goto tr420 + case 1089: + goto tr420 + case 4872: + goto tr4562 + case 1090: + goto tr420 + case 1091: + goto tr2 + case 1092: + goto tr420 + case 1093: + goto tr420 + case 1094: + goto tr420 + case 1095: + goto tr420 + case 1096: + goto tr420 + case 1097: + goto tr420 + case 1098: + goto tr420 + case 1099: + goto tr420 + case 1100: + goto tr420 + case 1101: + goto tr420 + case 1102: + goto tr420 + case 1103: + goto tr420 + case 1104: + goto tr420 + case 1105: + goto tr420 + case 1106: + goto tr420 + case 1107: + goto tr420 + case 1108: + goto tr420 + case 1109: + goto tr420 + case 1110: + goto tr420 + case 1111: + goto tr420 + case 1112: + goto tr420 + case 1113: + goto tr420 + case 1114: + goto tr420 + case 1115: + goto tr420 + case 1116: + goto tr420 + case 1117: + goto tr420 + case 1118: + goto tr420 + case 1119: + goto tr420 + case 1120: + goto tr420 + case 1121: + goto tr420 + case 1122: + goto tr420 + case 1123: + goto tr420 + case 1124: + goto tr420 + case 1125: + goto tr420 + case 1126: + goto tr420 + case 1127: + goto tr420 + case 1128: + goto tr420 + case 1129: + goto tr420 + case 1130: + goto tr420 + case 1131: + goto tr420 + case 1132: + goto tr420 + case 1133: + goto tr420 + case 1134: + goto tr420 + case 1135: + goto tr420 + case 1136: + goto tr420 + case 1137: + goto tr420 + case 1138: + goto tr420 + case 1139: + goto tr420 + case 1140: + goto tr420 + case 1141: + goto tr420 + case 1142: + goto tr420 + case 1143: + goto tr420 + case 1144: + goto tr420 + case 1145: + goto tr420 + case 1146: + goto tr420 + case 1147: + goto tr420 + case 1148: + goto tr420 + case 1149: + goto tr420 + case 1150: + goto tr420 + case 1151: + goto tr420 + case 1152: + goto tr420 + case 1153: + goto tr420 + case 1154: + goto tr420 + case 1155: + goto tr420 + case 1156: + goto tr420 + case 1157: + goto tr420 + case 1158: + goto tr420 + case 1159: + goto tr420 + case 1160: + goto tr420 + case 1161: + goto tr420 + case 1162: + goto tr420 + case 1163: + goto tr420 + case 1164: + goto tr2 + case 1165: + goto tr2 + case 1166: + goto tr2 + case 1167: + goto tr2 + case 1168: + goto tr420 + case 1169: + goto tr420 + case 1170: + goto tr420 + case 1171: + goto tr420 + case 1172: + goto tr420 + case 1173: + goto tr420 + case 1174: + goto tr420 + case 1175: + goto tr420 + case 1176: + goto tr420 + case 1177: + goto tr420 + case 1178: + goto tr420 + case 1179: + goto tr420 + case 1180: + goto tr420 + case 1181: + goto tr420 + case 1182: + goto tr420 + case 1183: + goto tr420 + case 1184: + goto tr420 + case 1185: + goto tr420 + case 1186: + goto tr420 + case 1187: + goto tr2 + case 1188: + goto tr2 + case 1189: + goto tr420 + case 1190: + goto tr420 + case 1191: + goto tr420 + case 1192: + goto tr420 + case 1193: + goto tr420 + case 1194: + goto tr420 + case 1195: + goto tr420 + case 1196: + goto tr420 + case 1197: + goto tr420 + case 1198: + goto tr420 + case 1199: + goto tr420 + case 1200: + goto tr420 + case 1201: + goto tr420 + case 1202: + goto tr420 + case 1203: + goto tr420 + case 1204: + goto tr420 + case 1205: + goto tr420 + case 1206: + goto tr420 + case 1207: + goto tr420 + case 1208: + goto tr420 + case 1209: + goto tr420 + case 1210: + goto tr420 + case 1211: + goto tr420 + case 1212: + goto tr420 + case 1213: + goto tr420 + case 1214: + goto tr420 + case 1215: + goto tr420 + case 1216: + goto tr420 + case 1217: + goto tr420 + case 1218: + goto tr420 + case 1219: + goto tr420 + case 1220: + goto tr420 + case 1221: + goto tr420 + case 1222: + goto tr420 + case 1223: + goto tr420 + case 1224: + goto tr2 + case 1225: + goto tr420 + case 1226: + goto tr420 + case 1227: + goto tr420 + case 1228: + goto tr420 + case 1229: + goto tr420 + case 1230: + goto tr420 + case 1231: + goto tr420 + case 1232: + goto tr420 + case 1233: + goto tr420 + case 1234: + goto tr420 + case 1235: + goto tr420 + case 1236: + goto tr420 + case 1237: + goto tr420 + case 1238: + goto tr420 + case 1239: + goto tr420 + case 1240: + goto tr420 + case 1241: + goto tr420 + case 1242: + goto tr420 + case 1243: + goto tr420 + case 1244: + goto tr420 + case 1245: + goto tr420 + case 1246: + goto tr420 + case 1247: + goto tr420 + case 1248: + goto tr420 + case 1249: + goto tr420 + case 1250: + goto tr420 + case 1251: + goto tr420 + case 1252: + goto tr420 + case 1253: + goto tr420 + case 1254: + goto tr420 + case 1255: + goto tr420 + case 1256: + goto tr420 + case 1257: + goto tr420 + case 1258: + goto tr420 + case 1259: + goto tr420 + case 1260: + goto tr420 + case 1261: + goto tr2 + case 1262: + goto tr420 + case 1263: + goto tr420 + case 1264: + goto tr420 + case 1265: + goto tr420 + case 1266: + goto tr420 + case 1267: + goto tr420 + case 1268: + goto tr420 + case 1269: + goto tr420 + case 1270: + goto tr420 + case 1271: + goto tr420 + case 1272: + goto tr420 + case 1273: + goto tr420 + case 1274: + goto tr420 + case 1275: + goto tr420 + case 1276: + goto tr420 + case 1277: + goto tr420 + case 1278: + goto tr420 + case 1279: + goto tr420 + case 1280: + goto tr420 + case 1281: + goto tr420 + case 1282: + goto tr420 + case 1283: + goto tr420 + case 1284: + goto tr420 + case 1285: + goto tr420 + case 1286: + goto tr420 + case 1287: + goto tr420 + case 1288: + goto tr420 + case 1289: + goto tr420 + case 1290: + goto tr420 + case 1291: + goto tr420 + case 1292: + goto tr420 + case 1293: + goto tr420 + case 1294: + goto tr420 + case 1295: + goto tr420 + case 1296: + goto tr420 + case 1297: + goto tr420 + case 1298: + goto tr420 + case 1299: + goto tr420 + case 1300: + goto tr420 + case 1301: + goto tr420 + case 1302: + goto tr420 + case 1303: + goto tr420 + case 1304: + goto tr420 + case 1305: + goto tr420 + case 1306: + goto tr420 + case 1307: + goto tr420 + case 1308: + goto tr420 + case 1309: + goto tr420 + case 1310: + goto tr420 + case 1311: + goto tr420 + case 1312: + goto tr420 + case 1313: + goto tr420 + case 1314: + goto tr420 + case 1315: + goto tr420 + case 1316: + goto tr420 + case 1317: + goto tr420 + case 1318: + goto tr420 + case 1319: + goto tr420 + case 1320: + goto tr420 + case 1321: + goto tr420 + case 1322: + goto tr420 + case 1323: + goto tr420 + case 1324: + goto tr420 + case 1325: + goto tr420 + case 1326: + goto tr420 + case 1327: + goto tr420 + case 1328: + goto tr420 + case 1329: + goto tr420 + case 1330: + goto tr420 + case 1331: + goto tr420 + case 1332: + goto tr420 + case 1333: + goto tr420 + case 1334: + goto tr420 + case 1335: + goto tr420 + case 1336: + goto tr420 + case 1337: + goto tr420 + case 1338: + goto tr420 + case 1339: + goto tr420 + case 1340: + goto tr420 + case 1341: + goto tr420 + case 1342: + goto tr420 + case 1343: + goto tr420 + case 1344: + goto tr420 + case 1345: + goto tr420 + case 1346: + goto tr420 + case 1347: + goto tr420 + case 1348: + goto tr420 + case 1349: + goto tr420 + case 1350: + goto tr420 + case 1351: + goto tr420 + case 1352: + goto tr420 + case 1353: + goto tr420 + case 1354: + goto tr420 + case 1355: + goto tr420 + case 1356: + goto tr420 + case 1357: + goto tr420 + case 1358: + goto tr420 + case 1359: + goto tr420 + case 1360: + goto tr420 + case 1361: + goto tr420 + case 1362: + goto tr420 + case 1363: + goto tr420 + case 1364: + goto tr420 + case 1365: + goto tr420 + case 1366: + goto tr420 + case 1367: + goto tr420 + case 1368: + goto tr420 + case 1369: + goto tr420 + case 1370: + goto tr420 + case 1371: + goto tr420 + case 1372: + goto tr420 + case 1373: + goto tr420 + case 1374: + goto tr420 + case 1375: + goto tr420 + case 1376: + goto tr420 + case 1377: + goto tr420 + case 1378: + goto tr420 + case 1379: + goto tr420 + case 1380: + goto tr420 + case 1381: + goto tr420 + case 1382: + goto tr420 + case 1383: + goto tr420 + case 1384: + goto tr420 + case 1385: + goto tr420 + case 1386: + goto tr420 + case 1387: + goto tr420 + case 1388: + goto tr420 + case 1389: + goto tr420 + case 1390: + goto tr420 + case 1391: + goto tr420 + case 1392: + goto tr420 + case 1393: + goto tr420 + case 1394: + goto tr420 + case 1395: + goto tr420 + case 1396: + goto tr420 + case 1397: + goto tr420 + case 1398: + goto tr420 + case 1399: + goto tr420 + case 1400: + goto tr420 + case 1401: + goto tr420 + case 1402: + goto tr420 + case 1403: + goto tr420 + case 1404: + goto tr420 + case 1405: + goto tr420 + case 1406: + goto tr420 + case 1407: + goto tr420 + case 1408: + goto tr420 + case 1409: + goto tr420 + case 1410: + goto tr420 + case 1411: + goto tr420 + case 1412: + goto tr420 + case 1413: + goto tr420 + case 1414: + goto tr420 + case 1415: + goto tr420 + case 1416: + goto tr420 + case 1417: + goto tr420 + case 1418: + goto tr420 + case 1419: + goto tr420 + case 1420: + goto tr420 + case 1421: + goto tr420 + case 1422: + goto tr420 + case 1423: + goto tr420 + case 1424: + goto tr420 + case 1425: + goto tr420 + case 1426: + goto tr420 + case 1427: + goto tr420 + case 1428: + goto tr420 + case 1429: + goto tr420 + case 1430: + goto tr420 + case 1431: + goto tr420 + case 1432: + goto tr420 + case 1433: + goto tr420 + case 1434: + goto tr420 + case 1435: + goto tr420 + case 1436: + goto tr420 + case 1437: + goto tr420 + case 1438: + goto tr420 + case 1439: + goto tr420 + case 1440: + goto tr420 + case 1441: + goto tr420 + case 1442: + goto tr420 + case 1443: + goto tr420 + case 1444: + goto tr420 + case 1445: + goto tr420 + case 1446: + goto tr420 + case 1447: + goto tr420 + case 1448: + goto tr420 + case 1449: + goto tr420 + case 1450: + goto tr420 + case 1451: + goto tr420 + case 1452: + goto tr420 + case 1453: + goto tr420 + case 1454: + goto tr420 + case 1455: + goto tr420 + case 1456: + goto tr420 + case 1457: + goto tr420 + case 1458: + goto tr420 + case 1459: + goto tr420 + case 1460: + goto tr420 + case 1461: + goto tr420 + case 1462: + goto tr420 + case 1463: + goto tr420 + case 1464: + goto tr420 + case 1465: + goto tr420 + case 1466: + goto tr420 + case 1467: + goto tr420 + case 1468: + goto tr420 + case 1469: + goto tr420 + case 1470: + goto tr420 + case 1471: + goto tr420 + case 1472: + goto tr420 + case 1473: + goto tr2 + case 1474: + goto tr2 + case 1475: + goto tr2 + case 1476: + goto tr2 + case 1477: + goto tr2 + case 1478: + goto tr2 + case 1479: + goto tr2 + case 1480: + goto tr2 + case 1481: + goto tr2 + case 1482: + goto tr2 + case 1483: + goto tr2 + case 1484: + goto tr2 + case 1485: + goto tr2 + case 1486: + goto tr2 + case 1487: + goto tr2 + case 1488: + goto tr2 + case 1489: + goto tr2 + case 1490: + goto tr2 + case 1491: + goto tr2 + case 1492: + goto tr2 + case 1493: + goto tr2 + case 1494: + goto tr2 + case 1495: + goto tr2 + case 1496: + goto tr2 + case 1497: + goto tr2 + case 1498: + goto tr2 + case 1499: + goto tr2 + case 1500: + goto tr2 + case 1501: + goto tr2 + case 1502: + goto tr2 + case 1503: + goto tr420 + case 1504: + goto tr2 + case 1505: + goto tr2 + case 1506: + goto tr2 + case 1507: + goto tr2 + case 1508: + goto tr2 + case 1509: + goto tr2 + case 1510: + goto tr2 + case 1511: + goto tr2 + case 1512: + goto tr2 + case 1513: + goto tr2 + case 1514: + goto tr2 + case 1515: + goto tr2 + case 1516: + goto tr2 + case 1517: + goto tr2 + case 1518: + goto tr2 + case 1519: + goto tr2 + case 1520: + goto tr2 + case 1521: + goto tr2 + case 1522: + goto tr2 + case 1523: + goto tr420 + case 1524: + goto tr2 + case 1525: + goto tr2 + case 1526: + goto tr2 + case 1527: + goto tr2 + case 1528: + goto tr2 + case 1529: + goto tr2 + case 1530: + goto tr420 + case 1531: + goto tr2 + case 1532: + goto tr2 + case 1533: + goto tr420 + case 1534: + goto tr2 + case 1535: + goto tr2 + case 1536: + goto tr2 + case 1537: + goto tr2 + case 1538: + goto tr2 + case 1539: + goto tr2 + case 1540: + goto tr2 + case 1541: + goto tr2 + case 1542: + goto tr2 + case 1543: + goto tr2 + case 1544: + goto tr2 + case 1545: + goto tr420 + case 1546: + goto tr2 + case 1547: + goto tr2 + case 1548: + goto tr2 + case 1549: + goto tr2 + case 1550: + goto tr2 + case 1551: + goto tr420 + case 1552: + goto tr2 + case 1553: + goto tr2 + case 1554: + goto tr2 + case 1555: + goto tr2 + case 1556: + goto tr2 + case 1557: + goto tr2 + case 1558: + goto tr2 + case 1559: + goto tr2 + case 1560: + goto tr2 + case 1561: + goto tr2 + case 1562: + goto tr2 + case 1563: + goto tr2 + case 1564: + goto tr2 + case 1565: + goto tr2 + case 1566: + goto tr2 + case 1567: + goto tr2 + case 1568: + goto tr2 + case 1569: + goto tr2 + case 1570: + goto tr2 + case 1571: + goto tr2 + case 1572: + goto tr2 + case 1573: + goto tr2 + case 1574: + goto tr2 + case 1575: + goto tr2 + case 1576: + goto tr2 + case 1577: + goto tr2 + case 1578: + goto tr2 + case 1579: + goto tr2 + case 1580: + goto tr2 + case 1581: + goto tr2 + case 1582: + goto tr2 + case 1583: + goto tr2 + case 1584: + goto tr2 + case 1585: + goto tr2 + case 1586: + goto tr2 + case 1587: + goto tr2 + case 1588: + goto tr420 + case 1589: + goto tr2 + case 1590: + goto tr2 + case 1591: + goto tr2 + case 4873: + goto tr4521 + case 1592: + goto tr125 + case 1593: + goto tr125 + case 1594: + goto tr125 + case 1595: + goto tr125 + case 1596: + goto tr125 + case 1597: + goto tr125 + case 1598: + goto tr125 + case 1599: + goto tr125 + case 1600: + goto tr125 + case 1601: + goto tr125 + case 1602: + goto tr125 + case 1603: + goto tr125 + case 1604: + goto tr125 + case 1605: + goto tr125 + case 1606: + goto tr125 + case 1607: + goto tr125 + case 1608: + goto tr125 + case 1609: + goto tr125 + case 1610: + goto tr125 + case 1611: + goto tr125 + case 1612: + goto tr125 + case 1613: + goto tr125 + case 1614: + goto tr125 + case 1615: + goto tr125 + case 1616: + goto tr125 + case 1617: + goto tr125 + case 1618: + goto tr125 + case 1619: + goto tr125 + case 1620: + goto tr125 + case 1621: + goto tr125 + case 1622: + goto tr125 + case 1623: + goto tr125 + case 1624: + goto tr125 + case 1625: + goto tr125 + case 1626: + goto tr125 + case 1627: + goto tr125 + case 1628: + goto tr125 + case 1629: + goto tr125 + case 1630: + goto tr125 + case 1631: + goto tr125 + case 1632: + goto tr125 + case 1633: + goto tr125 + case 1634: + goto tr125 + case 1635: + goto tr125 + case 1636: + goto tr125 + case 1637: + goto tr125 + case 1638: + goto tr125 + case 1639: + goto tr125 + case 1640: + goto tr125 + case 1641: + goto tr125 + case 1642: + goto tr125 + case 1643: + goto tr125 + case 1644: + goto tr125 + case 1645: + goto tr125 + case 1646: + goto tr125 + case 1647: + goto tr125 + case 1648: + goto tr125 + case 1649: + goto tr2 + case 1650: + goto tr2 + case 1651: + goto tr125 + case 1652: + goto tr125 + case 1653: + goto tr125 + case 1654: + goto tr125 + case 1655: + goto tr125 + case 1656: + goto tr125 + case 1657: + goto tr125 + case 1658: + goto tr125 + case 1659: + goto tr2 + case 1660: + goto tr125 + case 1661: + goto tr125 + case 1662: + goto tr125 + case 1663: + goto tr125 + case 1664: + goto tr125 + case 1665: + goto tr125 + case 1666: + goto tr125 + case 1667: + goto tr125 + case 1668: + goto tr125 + case 1669: + goto tr125 + case 1670: + goto tr125 + case 1671: + goto tr125 + case 1672: + goto tr125 + case 1673: + goto tr2 + case 1674: + goto tr125 + case 1675: + goto tr125 + case 1676: + goto tr125 + case 1677: + goto tr125 + case 1678: + goto tr125 + case 1679: + goto tr125 + case 1680: + goto tr125 + case 1681: + goto tr125 + case 1682: + goto tr125 + case 1683: + goto tr125 + case 1684: + goto tr125 + case 1685: + goto tr125 + case 1686: + goto tr125 + case 1687: + goto tr125 + case 1688: + goto tr125 + case 1689: + goto tr125 + case 1690: + goto tr125 + case 1691: + goto tr125 + case 1692: + goto tr125 + case 1693: + goto tr125 + case 1694: + goto tr125 + case 1695: + goto tr125 + case 1696: + goto tr125 + case 1697: + goto tr125 + case 1698: + goto tr125 + case 1699: + goto tr125 + case 1700: + goto tr125 + case 1701: + goto tr125 + case 1702: + goto tr2 + case 1703: + goto tr125 + case 1704: + goto tr125 + case 1705: + goto tr125 + case 1706: + goto tr125 + case 1707: + goto tr125 + case 1708: + goto tr125 + case 1709: + goto tr2 + case 1710: + goto tr125 + case 1711: + goto tr125 + case 1712: + goto tr125 + case 1713: + goto tr125 + case 1714: + goto tr125 + case 1715: + goto tr125 + case 1716: + goto tr125 + case 1717: + goto tr125 + case 1718: + goto tr125 + case 1719: + goto tr125 + case 1720: + goto tr125 + case 1721: + goto tr125 + case 1722: + goto tr125 + case 1723: + goto tr125 + case 1724: + goto tr2 + case 1725: + goto tr125 + case 1726: + goto tr2 + case 1727: + goto tr125 + case 1728: + goto tr2 + case 1729: + goto tr125 + case 1730: + goto tr125 + case 1731: + goto tr2 + case 1732: + goto tr125 + case 1733: + goto tr125 + case 1734: + goto tr125 + case 1735: + goto tr125 + case 1736: + goto tr125 + case 1737: + goto tr125 + case 1738: + goto tr125 + case 1739: + goto tr125 + case 1740: + goto tr2 + case 1741: + goto tr125 + case 1742: + goto tr125 + case 1743: + goto tr125 + case 1744: + goto tr125 + case 1745: + goto tr125 + case 1746: + goto tr125 + case 1747: + goto tr125 + case 1748: + goto tr125 + case 1749: + goto tr125 + case 1750: + goto tr125 + case 1751: + goto tr125 + case 1752: + goto tr125 + case 1753: + goto tr125 + case 1754: + goto tr125 + case 1755: + goto tr125 + case 1756: + goto tr125 + case 1757: + goto tr125 + case 1758: + goto tr125 + case 1759: + goto tr125 + case 1760: + goto tr125 + case 1761: + goto tr125 + case 1762: + goto tr125 + case 1763: + goto tr125 + case 1764: + goto tr125 + case 1765: + goto tr125 + case 1766: + goto tr125 + case 1767: + goto tr125 + case 1768: + goto tr125 + case 1769: + goto tr125 + case 1770: + goto tr125 + case 1771: + goto tr125 + case 1772: + goto tr125 + case 1773: + goto tr125 + case 1774: + goto tr125 + case 1775: + goto tr125 + case 1776: + goto tr125 + case 1777: + goto tr125 + case 1778: + goto tr125 + case 1779: + goto tr125 + case 1780: + goto tr125 + case 1781: + goto tr125 + case 1782: + goto tr125 + case 1783: + goto tr125 + case 1784: + goto tr125 + case 1785: + goto tr125 + case 1786: + goto tr125 + case 1787: + goto tr125 + case 1788: + goto tr125 + case 1789: + goto tr125 + case 1790: + goto tr125 + case 1791: + goto tr125 + case 1792: + goto tr125 + case 1793: + goto tr125 + case 1794: + goto tr125 + case 1795: + goto tr125 + case 1796: + goto tr125 + case 1797: + goto tr125 + case 1798: + goto tr125 + case 1799: + goto tr125 + case 1800: + goto tr125 + case 1801: + goto tr125 + case 1802: + goto tr125 + case 1803: + goto tr125 + case 1804: + goto tr125 + case 1805: + goto tr125 + case 1806: + goto tr125 + case 1807: + goto tr125 + case 1808: + goto tr125 + case 1809: + goto tr125 + case 1810: + goto tr125 + case 1811: + goto tr125 + case 1812: + goto tr125 + case 1813: + goto tr125 + case 1814: + goto tr125 + case 1815: + goto tr125 + case 1816: + goto tr125 + case 1817: + goto tr125 + case 1818: + goto tr125 + case 1819: + goto tr125 + case 1820: + goto tr125 + case 1821: + goto tr125 + case 1822: + goto tr125 + case 1823: + goto tr125 + case 1824: + goto tr125 + case 1825: + goto tr125 + case 1826: + goto tr125 + case 1827: + goto tr125 + case 1828: + goto tr125 + case 1829: + goto tr125 + case 1830: + goto tr125 + case 1831: + goto tr125 + case 1832: + goto tr125 + case 1833: + goto tr125 + case 1834: + goto tr125 + case 1835: + goto tr125 + case 1836: + goto tr125 + case 1837: + goto tr125 + case 1838: + goto tr125 + case 1839: + goto tr125 + case 1840: + goto tr125 + case 1841: + goto tr125 + case 1842: + goto tr125 + case 1843: + goto tr125 + case 1844: + goto tr125 + case 1845: + goto tr125 + case 1846: + goto tr125 + case 1847: + goto tr125 + case 1848: + goto tr125 + case 1849: + goto tr125 + case 1850: + goto tr125 + case 1851: + goto tr125 + case 1852: + goto tr125 + case 1853: + goto tr125 + case 1854: + goto tr125 + case 1855: + goto tr125 + case 1856: + goto tr125 + case 1857: + goto tr125 + case 1858: + goto tr125 + case 1859: + goto tr125 + case 1860: + goto tr125 + case 1861: + goto tr125 + case 1862: + goto tr125 + case 1863: + goto tr125 + case 1864: + goto tr125 + case 1865: + goto tr125 + case 1866: + goto tr125 + case 1867: + goto tr125 + case 1868: + goto tr125 + case 1869: + goto tr125 + case 1870: + goto tr125 + case 1871: + goto tr125 + case 1872: + goto tr125 + case 1873: + goto tr125 + case 1874: + goto tr125 + case 1875: + goto tr125 + case 1876: + goto tr125 + case 1877: + goto tr125 + case 1878: + goto tr125 + case 1879: + goto tr125 + case 1880: + goto tr125 + case 1881: + goto tr125 + case 1882: + goto tr125 + case 1883: + goto tr125 + case 1884: + goto tr125 + case 1885: + goto tr125 + case 1886: + goto tr125 + case 1887: + goto tr125 + case 1888: + goto tr125 + case 1889: + goto tr125 + case 1890: + goto tr125 + case 1891: + goto tr125 + case 1892: + goto tr125 + case 1893: + goto tr125 + case 1894: + goto tr125 + case 1895: + goto tr125 + case 1896: + goto tr125 + case 1897: + goto tr125 + case 1898: + goto tr125 + case 1899: + goto tr125 + case 1900: + goto tr125 + case 1901: + goto tr125 + case 1902: + goto tr125 + case 1903: + goto tr125 + case 1904: + goto tr125 + case 1905: + goto tr125 + case 1906: + goto tr125 + case 1907: + goto tr125 + case 1908: + goto tr125 + case 1909: + goto tr125 + case 1910: + goto tr125 + case 1911: + goto tr125 + case 1912: + goto tr125 + case 1913: + goto tr125 + case 1914: + goto tr125 + case 1915: + goto tr125 + case 1916: + goto tr125 + case 1917: + goto tr125 + case 1918: + goto tr125 + case 1919: + goto tr125 + case 1920: + goto tr125 + case 1921: + goto tr125 + case 1922: + goto tr125 + case 1923: + goto tr125 + case 1924: + goto tr125 + case 1925: + goto tr125 + case 1926: + goto tr125 + case 1927: + goto tr125 + case 1928: + goto tr125 + case 1929: + goto tr125 + case 1930: + goto tr125 + case 1931: + goto tr125 + case 1932: + goto tr125 + case 1933: + goto tr125 + case 1934: + goto tr125 + case 1935: + goto tr125 + case 1936: + goto tr125 + case 1937: + goto tr125 + case 1938: + goto tr125 + case 1939: + goto tr125 + case 1940: + goto tr125 + case 1941: + goto tr125 + case 1942: + goto tr125 + case 1943: + goto tr125 + case 1944: + goto tr125 + case 1945: + goto tr125 + case 1946: + goto tr125 + case 1947: + goto tr125 + case 1948: + goto tr125 + case 1949: + goto tr125 + case 1950: + goto tr125 + case 1951: + goto tr125 + case 1952: + goto tr125 + case 1953: + goto tr125 + case 1954: + goto tr125 + case 1955: + goto tr125 + case 1956: + goto tr125 + case 1957: + goto tr125 + case 1958: + goto tr125 + case 1959: + goto tr125 + case 1960: + goto tr125 + case 1961: + goto tr125 + case 1962: + goto tr125 + case 1963: + goto tr125 + case 1964: + goto tr125 + case 1965: + goto tr125 + case 1966: + goto tr125 + case 1967: + goto tr125 + case 1968: + goto tr125 + case 1969: + goto tr125 + case 1970: + goto tr125 + case 1971: + goto tr125 + case 1972: + goto tr125 + case 1973: + goto tr125 + case 1974: + goto tr125 + case 1975: + goto tr125 + case 1976: + goto tr125 + case 1977: + goto tr125 + case 1978: + goto tr125 + case 1979: + goto tr125 + case 1980: + goto tr125 + case 1981: + goto tr125 + case 1982: + goto tr125 + case 1983: + goto tr125 + case 1984: + goto tr125 + case 1985: + goto tr125 + case 1986: + goto tr125 + case 1987: + goto tr125 + case 1988: + goto tr125 + case 1989: + goto tr125 + case 1990: + goto tr125 + case 1991: + goto tr125 + case 1992: + goto tr125 + case 1993: + goto tr125 + case 1994: + goto tr125 + case 1995: + goto tr125 + case 1996: + goto tr125 + case 1997: + goto tr125 + case 1998: + goto tr125 + case 1999: + goto tr125 + case 2000: + goto tr125 + case 2001: + goto tr125 + case 2002: + goto tr125 + case 2003: + goto tr125 + case 2004: + goto tr125 + case 2005: + goto tr125 + case 2006: + goto tr125 + case 2007: + goto tr125 + case 2008: + goto tr125 + case 2009: + goto tr125 + case 2010: + goto tr125 + case 2011: + goto tr125 + case 2012: + goto tr125 + case 2013: + goto tr125 + case 2014: + goto tr125 + case 2015: + goto tr125 + case 2016: + goto tr125 + case 2017: + goto tr125 + case 2018: + goto tr125 + case 2019: + goto tr125 + case 2020: + goto tr125 + case 2021: + goto tr125 + case 2022: + goto tr125 + case 2023: + goto tr125 + case 2024: + goto tr125 + case 2025: + goto tr125 + case 2026: + goto tr125 + case 2027: + goto tr125 + case 2028: + goto tr125 + case 2029: + goto tr125 + case 2030: + goto tr125 + case 2031: + goto tr125 + case 2032: + goto tr125 + case 2033: + goto tr125 + case 2034: + goto tr125 + case 2035: + goto tr125 + case 2036: + goto tr125 + case 2037: + goto tr125 + case 2038: + goto tr125 + case 2039: + goto tr125 + case 2040: + goto tr125 + case 2041: + goto tr125 + case 2042: + goto tr125 + case 2043: + goto tr125 + case 2044: + goto tr125 + case 2045: + goto tr125 + case 2046: + goto tr125 + case 2047: + goto tr125 + case 2048: + goto tr125 + case 2049: + goto tr125 + case 2050: + goto tr125 + case 2051: + goto tr125 + case 2052: + goto tr125 + case 2053: + goto tr125 + case 2054: + goto tr125 + case 2055: + goto tr125 + case 2056: + goto tr125 + case 2057: + goto tr125 + case 2058: + goto tr125 + case 2059: + goto tr125 + case 2060: + goto tr125 + case 2061: + goto tr125 + case 2062: + goto tr125 + case 2063: + goto tr125 + case 2064: + goto tr125 + case 2065: + goto tr125 + case 2066: + goto tr125 + case 2067: + goto tr125 + case 2068: + goto tr125 + case 2069: + goto tr125 + case 2070: + goto tr125 + case 2071: + goto tr125 + case 2072: + goto tr125 + case 2073: + goto tr125 + case 2074: + goto tr125 + case 2075: + goto tr125 + case 2076: + goto tr125 + case 2077: + goto tr125 + case 2078: + goto tr125 + case 2079: + goto tr125 + case 2080: + goto tr125 + case 2081: + goto tr125 + case 2082: + goto tr125 + case 2083: + goto tr125 + case 2084: + goto tr125 + case 2085: + goto tr125 + case 2086: + goto tr125 + case 2087: + goto tr125 + case 2088: + goto tr125 + case 2089: + goto tr125 + case 2090: + goto tr125 + case 2091: + goto tr125 + case 2092: + goto tr125 + case 2093: + goto tr125 + case 2094: + goto tr125 + case 2095: + goto tr125 + case 2096: + goto tr125 + case 2097: + goto tr125 + case 2098: + goto tr125 + case 2099: + goto tr125 + case 2100: + goto tr125 + case 2101: + goto tr125 + case 2102: + goto tr125 + case 2103: + goto tr125 + case 2104: + goto tr125 + case 2105: + goto tr125 + case 2106: + goto tr125 + case 2107: + goto tr125 + case 2108: + goto tr125 + case 2109: + goto tr125 + case 2110: + goto tr125 + case 2111: + goto tr125 + case 2112: + goto tr125 + case 2113: + goto tr125 + case 2114: + goto tr125 + case 2115: + goto tr125 + case 2116: + goto tr125 + case 2117: + goto tr125 + case 2118: + goto tr125 + case 2119: + goto tr125 + case 2120: + goto tr125 + case 2121: + goto tr125 + case 2122: + goto tr125 + case 2123: + goto tr125 + case 2124: + goto tr125 + case 2125: + goto tr125 + case 2126: + goto tr125 + case 2127: + goto tr125 + case 2128: + goto tr125 + case 2129: + goto tr125 + case 2130: + goto tr125 + case 2131: + goto tr125 + case 2132: + goto tr125 + case 2133: + goto tr125 + case 2134: + goto tr125 + case 2135: + goto tr125 + case 2136: + goto tr125 + case 2137: + goto tr125 + case 2138: + goto tr125 + case 2139: + goto tr125 + case 2140: + goto tr125 + case 2141: + goto tr125 + case 2142: + goto tr125 + case 2143: + goto tr125 + case 2144: + goto tr125 + case 2145: + goto tr125 + case 2146: + goto tr125 + case 2147: + goto tr125 + case 2148: + goto tr125 + case 2149: + goto tr125 + case 2150: + goto tr125 + case 2151: + goto tr125 + case 2152: + goto tr125 + case 2153: + goto tr125 + case 2154: + goto tr125 + case 2155: + goto tr125 + case 2156: + goto tr125 + case 2157: + goto tr125 + case 2158: + goto tr125 + case 2159: + goto tr125 + case 2160: + goto tr125 + case 2161: + goto tr125 + case 2162: + goto tr125 + case 2163: + goto tr125 + case 2164: + goto tr125 + case 2165: + goto tr125 + case 2166: + goto tr125 + case 2167: + goto tr125 + case 2168: + goto tr125 + case 2169: + goto tr125 + case 2170: + goto tr125 + case 2171: + goto tr125 + case 2172: + goto tr125 + case 2173: + goto tr125 + case 2174: + goto tr125 + case 2175: + goto tr125 + case 2176: + goto tr125 + case 2177: + goto tr125 + case 2178: + goto tr125 + case 2179: + goto tr125 + case 2180: + goto tr125 + case 2181: + goto tr125 + case 2182: + goto tr125 + case 2183: + goto tr125 + case 2184: + goto tr125 + case 2185: + goto tr125 + case 2186: + goto tr125 + case 2187: + goto tr125 + case 2188: + goto tr125 + case 2189: + goto tr125 + case 2190: + goto tr125 + case 2191: + goto tr125 + case 2192: + goto tr125 + case 4874: + goto tr4562 + case 2193: + goto tr420 + case 2194: + goto tr420 + case 2195: + goto tr420 + case 2196: + goto tr420 + case 2197: + goto tr420 + case 2198: + goto tr420 + case 2199: + goto tr420 + case 2200: + goto tr420 + case 2201: + goto tr420 + case 2202: + goto tr420 + case 2203: + goto tr420 + case 2204: + goto tr420 + case 2205: + goto tr420 + case 2206: + goto tr420 + case 2207: + goto tr420 + case 2208: + goto tr420 + case 2209: + goto tr420 + case 2210: + goto tr420 + case 2211: + goto tr420 + case 2212: + goto tr420 + case 2213: + goto tr420 + case 2214: + goto tr420 + case 2215: + goto tr420 + case 2216: + goto tr420 + case 2217: + goto tr420 + case 2218: + goto tr420 + case 2219: + goto tr420 + case 2220: + goto tr420 + case 2221: + goto tr420 + case 2222: + goto tr420 + case 2223: + goto tr420 + case 2224: + goto tr420 + case 2225: + goto tr420 + case 2226: + goto tr420 + case 2227: + goto tr420 + case 2228: + goto tr420 + case 2229: + goto tr420 + case 2230: + goto tr420 + case 2231: + goto tr420 + case 2232: + goto tr420 + case 2233: + goto tr420 + case 2234: + goto tr420 + case 2235: + goto tr420 + case 2236: + goto tr420 + case 2237: + goto tr420 + case 2238: + goto tr420 + case 2239: + goto tr420 + case 2240: + goto tr420 + case 2241: + goto tr420 + case 2242: + goto tr420 + case 2243: + goto tr420 + case 2244: + goto tr420 + case 2245: + goto tr420 + case 2246: + goto tr420 + case 2247: + goto tr420 + case 2248: + goto tr420 + case 2249: + goto tr420 + case 2250: + goto tr420 + case 2251: + goto tr420 + case 2252: + goto tr420 + case 2253: + goto tr420 + case 2254: + goto tr420 + case 2255: + goto tr420 + case 2256: + goto tr420 + case 2257: + goto tr420 + case 2258: + goto tr420 + case 2259: + goto tr420 + case 2260: + goto tr420 + case 2261: + goto tr420 + case 2262: + goto tr420 + case 2263: + goto tr420 + case 2264: + goto tr420 + case 2265: + goto tr420 + case 2266: + goto tr420 + case 2267: + goto tr420 + case 2268: + goto tr420 + case 2269: + goto tr420 + case 2270: + goto tr420 + case 2271: + goto tr420 + case 2272: + goto tr420 + case 2273: + goto tr420 + case 2274: + goto tr420 + case 2275: + goto tr420 + case 2276: + goto tr420 + case 2277: + goto tr420 + case 2278: + goto tr420 + case 2279: + goto tr420 + case 2280: + goto tr420 + case 2281: + goto tr420 + case 2282: + goto tr420 + case 2283: + goto tr420 + case 2284: + goto tr420 + case 2285: + goto tr420 + case 2286: + goto tr420 + case 2287: + goto tr420 + case 2288: + goto tr420 + case 2289: + goto tr420 + case 2290: + goto tr420 + case 2291: + goto tr420 + case 2292: + goto tr420 + case 2293: + goto tr420 + case 2294: + goto tr420 + case 2295: + goto tr420 + case 2296: + goto tr420 + case 2297: + goto tr420 + case 2298: + goto tr420 + case 2299: + goto tr420 + case 2300: + goto tr420 + case 2301: + goto tr420 + case 2302: + goto tr420 + case 2303: + goto tr420 + case 2304: + goto tr420 + case 2305: + goto tr420 + case 2306: + goto tr420 + case 2307: + goto tr420 + case 2308: + goto tr420 + case 2309: + goto tr420 + case 2310: + goto tr420 + case 2311: + goto tr420 + case 2312: + goto tr420 + case 2313: + goto tr420 + case 2314: + goto tr420 + case 2315: + goto tr420 + case 2316: + goto tr420 + case 2317: + goto tr420 + case 2318: + goto tr420 + case 2319: + goto tr420 + case 2320: + goto tr420 + case 2321: + goto tr420 + case 2322: + goto tr420 + case 2323: + goto tr420 + case 2324: + goto tr420 + case 2325: + goto tr420 + case 2326: + goto tr420 + case 2327: + goto tr420 + case 2328: + goto tr420 + case 2329: + goto tr420 + case 2330: + goto tr420 + case 2331: + goto tr420 + case 2332: + goto tr420 + case 2333: + goto tr420 + case 2334: + goto tr420 + case 2335: + goto tr420 + case 2336: + goto tr420 + case 2337: + goto tr420 + case 2338: + goto tr420 + case 2339: + goto tr420 + case 4875: + goto tr4562 + case 4876: + goto tr4562 + case 2340: + goto tr420 + case 2341: + goto tr420 + case 2342: + goto tr420 + case 2343: + goto tr420 + case 2344: + goto tr420 + case 2345: + goto tr420 + case 2346: + goto tr420 + case 2347: + goto tr420 + case 2348: + goto tr420 + case 2349: + goto tr420 + case 2350: + goto tr420 + case 2351: + goto tr420 + case 2352: + goto tr420 + case 2353: + goto tr420 + case 2354: + goto tr420 + case 2355: + goto tr420 + case 2356: + goto tr420 + case 2357: + goto tr420 + case 2358: + goto tr420 + case 2359: + goto tr420 + case 2360: + goto tr420 + case 2361: + goto tr420 + case 2362: + goto tr420 + case 2363: + goto tr420 + case 2364: + goto tr420 + case 2365: + goto tr420 + case 2366: + goto tr420 + case 2367: + goto tr420 + case 2368: + goto tr420 + case 2369: + goto tr420 + case 2370: + goto tr420 + case 2371: + goto tr420 + case 2372: + goto tr420 + case 2373: + goto tr420 + case 2374: + goto tr420 + case 2375: + goto tr420 + case 2376: + goto tr420 + case 2377: + goto tr420 + case 2378: + goto tr420 + case 2379: + goto tr420 + case 2380: + goto tr420 + case 2381: + goto tr420 + case 2382: + goto tr420 + case 2383: + goto tr420 + case 2384: + goto tr420 + case 2385: + goto tr420 + case 2386: + goto tr420 + case 2387: + goto tr420 + case 2388: + goto tr420 + case 2389: + goto tr420 + case 2390: + goto tr420 + case 2391: + goto tr420 + case 2392: + goto tr420 + case 2393: + goto tr420 + case 2394: + goto tr420 + case 2395: + goto tr420 + case 2396: + goto tr420 + case 2397: + goto tr420 + case 2398: + goto tr420 + case 2399: + goto tr420 + case 2400: + goto tr420 + case 2401: + goto tr420 + case 2402: + goto tr420 + case 2403: + goto tr420 + case 2404: + goto tr420 + case 2405: + goto tr420 + case 2406: + goto tr420 + case 2407: + goto tr420 + case 2408: + goto tr420 + case 2409: + goto tr420 + case 2410: + goto tr420 + case 2411: + goto tr420 + case 2412: + goto tr420 + case 2413: + goto tr420 + case 2414: + goto tr420 + case 2415: + goto tr420 + case 2416: + goto tr420 + case 2417: + goto tr420 + case 2418: + goto tr420 + case 2419: + goto tr420 + case 2420: + goto tr420 + case 2421: + goto tr420 + case 2422: + goto tr420 + case 2423: + goto tr420 + case 2424: + goto tr420 + case 2425: + goto tr420 + case 2426: + goto tr420 + case 2427: + goto tr420 + case 2428: + goto tr420 + case 2429: + goto tr420 + case 2430: + goto tr420 + case 2431: + goto tr420 + case 2432: + goto tr420 + case 2433: + goto tr420 + case 2434: + goto tr420 + case 2435: + goto tr420 + case 2436: + goto tr2 + case 2437: + goto tr420 + case 2438: + goto tr2 + case 2439: + goto tr420 + case 2440: + goto tr420 + case 2441: + goto tr420 + case 2442: + goto tr420 + case 2443: + goto tr420 + case 2444: + goto tr420 + case 2445: + goto tr420 + case 2446: + goto tr420 + case 2447: + goto tr420 + case 2448: + goto tr420 + case 2449: + goto tr420 + case 2450: + goto tr420 + case 2451: + goto tr420 + case 2452: + goto tr420 + case 2453: + goto tr420 + case 2454: + goto tr420 + case 2455: + goto tr420 + case 2456: + goto tr420 + case 2457: + goto tr420 + case 2458: + goto tr420 + case 2459: + goto tr420 + case 2460: + goto tr420 + case 2461: + goto tr420 + case 2462: + goto tr420 + case 2463: + goto tr420 + case 2464: + goto tr420 + case 2465: + goto tr420 + case 2466: + goto tr420 + case 2467: + goto tr420 + case 2468: + goto tr420 + case 2469: + goto tr420 + case 2470: + goto tr420 + case 2471: + goto tr420 + case 2472: + goto tr420 + case 2473: + goto tr420 + case 2474: + goto tr420 + case 2475: + goto tr420 + case 2476: + goto tr420 + case 2477: + goto tr420 + case 2478: + goto tr420 + case 2479: + goto tr420 + case 2480: + goto tr420 + case 2481: + goto tr420 + case 2482: + goto tr420 + case 2483: + goto tr420 + case 2484: + goto tr420 + case 2485: + goto tr420 + case 2486: + goto tr420 + case 2487: + goto tr420 + case 2488: + goto tr420 + case 2489: + goto tr420 + case 2490: + goto tr420 + case 2491: + goto tr420 + case 2492: + goto tr420 + case 2493: + goto tr420 + case 2494: + goto tr420 + case 2495: + goto tr420 + case 2496: + goto tr420 + case 2497: + goto tr420 + case 2498: + goto tr420 + case 2499: + goto tr420 + case 2500: + goto tr420 + case 2501: + goto tr420 + case 2502: + goto tr420 + case 2503: + goto tr420 + case 2504: + goto tr420 + case 2505: + goto tr420 + case 2506: + goto tr420 + case 2507: + goto tr420 + case 2508: + goto tr420 + case 2509: + goto tr420 + case 2510: + goto tr420 + case 2511: + goto tr420 + case 2512: + goto tr420 + case 2513: + goto tr420 + case 2514: + goto tr420 + case 2515: + goto tr420 + case 2516: + goto tr420 + case 2517: + goto tr420 + case 2518: + goto tr420 + case 2519: + goto tr420 + case 2520: + goto tr420 + case 2521: + goto tr420 + case 2522: + goto tr420 + case 2523: + goto tr420 + case 2524: + goto tr420 + case 2525: + goto tr420 + case 2526: + goto tr420 + case 2527: + goto tr420 + case 2528: + goto tr420 + case 2529: + goto tr420 + case 2530: + goto tr420 + case 2531: + goto tr420 + case 2532: + goto tr420 + case 2533: + goto tr420 + case 2534: + goto tr420 + case 2535: + goto tr420 + case 2536: + goto tr420 + case 2537: + goto tr420 + case 2538: + goto tr420 + case 2539: + goto tr420 + case 2540: + goto tr420 + case 2541: + goto tr420 + case 2542: + goto tr420 + case 2543: + goto tr420 + case 2544: + goto tr420 + case 2545: + goto tr420 + case 2546: + goto tr420 + case 2547: + goto tr420 + case 2548: + goto tr420 + case 2549: + goto tr420 + case 2550: + goto tr420 + case 2551: + goto tr420 + case 2552: + goto tr420 + case 2553: + goto tr420 + case 2554: + goto tr420 + case 2555: + goto tr420 + case 2556: + goto tr420 + case 2557: + goto tr420 + case 2558: + goto tr420 + case 2559: + goto tr420 + case 2560: + goto tr420 + case 2561: + goto tr420 + case 2562: + goto tr420 + case 2563: + goto tr420 + case 2564: + goto tr420 + case 2565: + goto tr420 + case 2566: + goto tr420 + case 2567: + goto tr420 + case 2568: + goto tr420 + case 2569: + goto tr420 + case 2570: + goto tr420 + case 2571: + goto tr420 + case 2572: + goto tr420 + case 2573: + goto tr420 + case 2574: + goto tr420 + case 2575: + goto tr420 + case 2576: + goto tr420 + case 2577: + goto tr420 + case 2578: + goto tr420 + case 2579: + goto tr420 + case 2580: + goto tr420 + case 2581: + goto tr420 + case 2582: + goto tr420 + case 2583: + goto tr420 + case 2584: + goto tr420 + case 2585: + goto tr420 + case 2586: + goto tr420 + case 2587: + goto tr420 + case 2588: + goto tr420 + case 2589: + goto tr420 + case 2590: + goto tr420 + case 2591: + goto tr420 + case 2592: + goto tr420 + case 2593: + goto tr420 + case 2594: + goto tr420 + case 2595: + goto tr420 + case 2596: + goto tr420 + case 2597: + goto tr420 + case 2598: + goto tr420 + case 2599: + goto tr420 + case 2600: + goto tr420 + case 2601: + goto tr420 + case 2602: + goto tr420 + case 2603: + goto tr420 + case 2604: + goto tr420 + case 2605: + goto tr420 + case 2606: + goto tr420 + case 2607: + goto tr420 + case 2608: + goto tr420 + case 2609: + goto tr420 + case 2610: + goto tr420 + case 2611: + goto tr420 + case 2612: + goto tr420 + case 2613: + goto tr420 + case 2614: + goto tr420 + case 2615: + goto tr420 + case 2616: + goto tr420 + case 2617: + goto tr420 + case 2618: + goto tr420 + case 2619: + goto tr420 + case 2620: + goto tr420 + case 2621: + goto tr420 + case 2622: + goto tr420 + case 2623: + goto tr420 + case 2624: + goto tr420 + case 2625: + goto tr420 + case 2626: + goto tr420 + case 2627: + goto tr420 + case 2628: + goto tr420 + case 2629: + goto tr420 + case 2630: + goto tr420 + case 2631: + goto tr420 + case 2632: + goto tr420 + case 2633: + goto tr420 + case 2634: + goto tr420 + case 2635: + goto tr420 + case 4877: + goto tr4499 + case 4878: + goto tr4763 + case 2636: + goto tr2394 + case 2637: + goto tr2 + case 2638: + goto tr2 + case 2639: + goto tr2394 + case 2640: + goto tr2394 + case 2641: + goto tr2394 + case 2642: + goto tr2394 + case 2643: + goto tr2394 + case 2644: + goto tr2394 + case 2645: + goto tr2394 + case 2646: + goto tr2394 + case 2647: + goto tr2394 + case 2648: + goto tr2394 + case 2649: + goto tr2394 + case 2650: + goto tr2 + case 2651: + goto tr2 + case 2652: + goto tr2 + case 2653: + goto tr2 + case 2654: + goto tr2 + case 2655: + goto tr2 + case 2656: + goto tr2 + case 2657: + goto tr2 + case 2658: + goto tr2 + case 2659: + goto tr2 + case 2660: + goto tr2 + case 2661: + goto tr2 + case 2662: + goto tr2 + case 2663: + goto tr2 + case 2664: + goto tr2 + case 2665: + goto tr2 + case 2666: + goto tr2 + case 2667: + goto tr2 + case 2668: + goto tr2 + case 2669: + goto tr2 + case 2670: + goto tr2 + case 2671: + goto tr2 + case 2672: + goto tr2 + case 2673: + goto tr2 + case 2674: + goto tr2 + case 2675: + goto tr2 + case 2676: + goto tr2 + case 2677: + goto tr2 + case 2678: + goto tr2394 + case 2679: + goto tr2 + case 2680: + goto tr2 + case 2681: + goto tr2 + case 2682: + goto tr2 + case 2683: + goto tr2 + case 2684: + goto tr2 + case 2685: + goto tr2 + case 2686: + goto tr2 + case 2687: + goto tr2 + case 2688: + goto tr2 + case 2689: + goto tr2 + case 2690: + goto tr2 + case 2691: + goto tr2 + case 2692: + goto tr2 + case 2693: + goto tr2 + case 2694: + goto tr2 + case 2695: + goto tr2 + case 2696: + goto tr2 + case 2697: + goto tr2 + case 2698: + goto tr2 + case 2699: + goto tr2 + case 2700: + goto tr2394 + case 2701: + goto tr2 + case 2702: + goto tr2 + case 2703: + goto tr2 + case 2704: + goto tr2 + case 2705: + goto tr2 + case 2706: + goto tr2 + case 2707: + goto tr2394 + case 2708: + goto tr2 + case 2709: + goto tr2 + case 2710: + goto tr2394 + case 2711: + goto tr2 + case 2712: + goto tr2 + case 2713: + goto tr2 + case 2714: + goto tr2 + case 2715: + goto tr2 + case 2716: + goto tr2 + case 2717: + goto tr2 + case 2718: + goto tr2 + case 2719: + goto tr2 + case 2720: + goto tr2 + case 2721: + goto tr2 + case 2722: + goto tr2 + case 2723: + goto tr2 + case 2724: + goto tr2 + case 2725: + goto tr2 + case 2726: + goto tr2394 + case 2727: + goto tr2 + case 2728: + goto tr2 + case 2729: + goto tr2 + case 2730: + goto tr2394 + case 2731: + goto tr2 + case 2732: + goto tr2 + case 2733: + goto tr2 + case 2734: + goto tr2 + case 2735: + goto tr2 + case 2736: + goto tr2 + case 2737: + goto tr2 + case 2738: + goto tr2 + case 2739: + goto tr2 + case 2740: + goto tr2 + case 2741: + goto tr2 + case 2742: + goto tr2 + case 2743: + goto tr2 + case 2744: + goto tr2 + case 2745: + goto tr2 + case 2746: + goto tr2 + case 2747: + goto tr2 + case 2748: + goto tr2 + case 2749: + goto tr2 + case 2750: + goto tr2 + case 2751: + goto tr2 + case 2752: + goto tr2 + case 2753: + goto tr2 + case 2754: + goto tr2 + case 2755: + goto tr2 + case 2756: + goto tr2 + case 2757: + goto tr2 + case 2758: + goto tr2 + case 2759: + goto tr2 + case 2760: + goto tr2 + case 2761: + goto tr2 + case 2762: + goto tr2 + case 2763: + goto tr2 + case 2764: + goto tr2 + case 2765: + goto tr2 + case 2766: + goto tr2 + case 2767: + goto tr2 + case 2768: + goto tr2 + case 2769: + goto tr2 + case 2770: + goto tr2 + case 2771: + goto tr2 + case 2772: + goto tr2394 + case 2773: + goto tr2 + case 2774: + goto tr2 + case 2775: + goto tr2 + case 2776: + goto tr2 + case 4879: + goto tr4499 + case 4880: + goto tr4562 + case 4881: + goto tr4562 + case 4882: + goto tr4499 + case 4883: + goto tr4499 + case 4884: + goto tr4562 + case 4885: + goto tr4499 + case 2777: + goto tr0 + case 2778: + goto tr0 + case 2779: + goto tr0 + case 2780: + goto tr0 + case 2781: + goto tr0 + case 2782: + goto tr0 + case 2783: + goto tr0 + case 2784: + goto tr0 + case 2785: + goto tr0 + case 2786: + goto tr0 + case 2787: + goto tr0 + case 2788: + goto tr0 + case 2789: + goto tr0 + case 2790: + goto tr0 + case 2791: + goto tr0 + case 2792: + goto tr0 + case 2793: + goto tr0 + case 2794: + goto tr0 + case 2795: + goto tr0 + case 2796: + goto tr0 + case 2797: + goto tr0 + case 2798: + goto tr0 + case 2799: + goto tr0 + case 2800: + goto tr0 + case 2801: + goto tr0 + case 2802: + goto tr0 + case 2803: + goto tr0 + case 2804: + goto tr0 + case 2805: + goto tr0 + case 2806: + goto tr0 + case 2807: + goto tr0 + case 2808: + goto tr0 + case 2809: + goto tr0 + case 2810: + goto tr0 + case 2811: + goto tr0 + case 2812: + goto tr0 + case 2813: + goto tr0 + case 2814: + goto tr0 + case 2815: + goto tr0 + case 2816: + goto tr0 + case 2817: + goto tr0 + case 2818: + goto tr0 + case 2819: + goto tr0 + case 2820: + goto tr0 + case 2821: + goto tr0 + case 2822: + goto tr0 + case 2823: + goto tr0 + case 2824: + goto tr0 + case 2825: + goto tr0 + case 2826: + goto tr0 + case 2827: + goto tr0 + case 2828: + goto tr0 + case 2829: + goto tr0 + case 2830: + goto tr0 + case 2831: + goto tr0 + case 2832: + goto tr0 + case 2833: + goto tr0 + case 2834: + goto tr0 + case 2835: + goto tr0 + case 2836: + goto tr0 + case 2837: + goto tr0 + case 2838: + goto tr0 + case 2839: + goto tr0 + case 2840: + goto tr0 + case 2841: + goto tr0 + case 2842: + goto tr0 + case 2843: + goto tr0 + case 2844: + goto tr0 + case 2845: + goto tr0 + case 2846: + goto tr0 + case 2847: + goto tr0 + case 2848: + goto tr0 + case 2849: + goto tr0 + case 2850: + goto tr0 + case 2851: + goto tr0 + case 2852: + goto tr0 + case 2853: + goto tr0 + case 2854: + goto tr0 + case 2855: + goto tr0 + case 2856: + goto tr0 + case 2857: + goto tr0 + case 2858: + goto tr0 + case 2859: + goto tr0 + case 2860: + goto tr0 + case 2861: + goto tr0 + case 2862: + goto tr0 + case 2863: + goto tr0 + case 2864: + goto tr0 + case 2865: + goto tr0 + case 2866: + goto tr0 + case 2867: + goto tr0 + case 2868: + goto tr0 + case 2869: + goto tr0 + case 2870: + goto tr0 + case 2871: + goto tr0 + case 2872: + goto tr0 + case 2873: + goto tr0 + case 2874: + goto tr0 + case 2875: + goto tr0 + case 2876: + goto tr0 + case 2877: + goto tr0 + case 2878: + goto tr0 + case 2879: + goto tr0 + case 2880: + goto tr0 + case 2881: + goto tr0 + case 2882: + goto tr0 + case 2883: + goto tr0 + case 2884: + goto tr0 + case 2885: + goto tr0 + case 2886: + goto tr0 + case 2887: + goto tr0 + case 2888: + goto tr0 + case 2889: + goto tr0 + case 2890: + goto tr0 + case 2891: + goto tr0 + case 2892: + goto tr0 + case 2893: + goto tr0 + case 2894: + goto tr0 + case 2895: + goto tr0 + case 2896: + goto tr0 + case 2897: + goto tr0 + case 2898: + goto tr0 + case 2899: + goto tr0 + case 2900: + goto tr0 + case 2901: + goto tr0 + case 2902: + goto tr0 + case 2903: + goto tr0 + case 2904: + goto tr0 + case 2905: + goto tr0 + case 2906: + goto tr0 + case 2907: + goto tr0 + case 2908: + goto tr0 + case 2909: + goto tr0 + case 2910: + goto tr0 + case 2911: + goto tr0 + case 2912: + goto tr0 + case 2913: + goto tr0 + case 2914: + goto tr0 + case 2915: + goto tr0 + case 2916: + goto tr0 + case 2917: + goto tr0 + case 2918: + goto tr0 + case 2919: + goto tr0 + case 2920: + goto tr0 + case 2921: + goto tr0 + case 2922: + goto tr0 + case 2923: + goto tr0 + case 4886: + goto tr4562 + case 2924: + goto tr420 + case 2925: + goto tr420 + case 2926: + goto tr420 + case 2927: + goto tr420 + case 2928: + goto tr420 + case 2929: + goto tr420 + case 2930: + goto tr420 + case 2931: + goto tr420 + case 2932: + goto tr420 + case 2933: + goto tr420 + case 2934: + goto tr420 + case 2935: + goto tr420 + case 2936: + goto tr420 + case 2937: + goto tr420 + case 2938: + goto tr420 + case 2939: + goto tr420 + case 2940: + goto tr420 + case 2941: + goto tr420 + case 2942: + goto tr420 + case 2943: + goto tr420 + case 2944: + goto tr420 + case 2945: + goto tr420 + case 2946: + goto tr420 + case 2947: + goto tr420 + case 2948: + goto tr420 + case 2949: + goto tr420 + case 2950: + goto tr420 + case 2951: + goto tr420 + case 2952: + goto tr420 + case 2953: + goto tr420 + case 2954: + goto tr420 + case 2955: + goto tr420 + case 2956: + goto tr420 + case 2957: + goto tr420 + case 2958: + goto tr420 + case 2959: + goto tr420 + case 2960: + goto tr420 + case 2961: + goto tr420 + case 2962: + goto tr420 + case 2963: + goto tr420 + case 2964: + goto tr420 + case 2965: + goto tr420 + case 2966: + goto tr420 + case 2967: + goto tr420 + case 2968: + goto tr420 + case 2969: + goto tr420 + case 2970: + goto tr420 + case 2971: + goto tr420 + case 2972: + goto tr420 + case 2973: + goto tr420 + case 2974: + goto tr420 + case 2975: + goto tr420 + case 2976: + goto tr420 + case 2977: + goto tr420 + case 2978: + goto tr420 + case 2979: + goto tr420 + case 2980: + goto tr420 + case 2981: + goto tr420 + case 2982: + goto tr420 + case 2983: + goto tr420 + case 2984: + goto tr420 + case 2985: + goto tr420 + case 2986: + goto tr420 + case 2987: + goto tr420 + case 2988: + goto tr420 + case 2989: + goto tr420 + case 2990: + goto tr420 + case 2991: + goto tr420 + case 2992: + goto tr420 + case 2993: + goto tr420 + case 2994: + goto tr420 + case 2995: + goto tr420 + case 2996: + goto tr420 + case 2997: + goto tr420 + case 2998: + goto tr420 + case 2999: + goto tr420 + case 3000: + goto tr420 + case 3001: + goto tr420 + case 3002: + goto tr420 + case 3003: + goto tr420 + case 3004: + goto tr420 + case 3005: + goto tr420 + case 3006: + goto tr420 + case 3007: + goto tr420 + case 3008: + goto tr420 + case 3009: + goto tr420 + case 3010: + goto tr420 + case 3011: + goto tr420 + case 3012: + goto tr420 + case 3013: + goto tr420 + case 3014: + goto tr420 + case 3015: + goto tr420 + case 3016: + goto tr420 + case 3017: + goto tr420 + case 3018: + goto tr420 + case 3019: + goto tr420 + case 3020: + goto tr420 + case 3021: + goto tr420 + case 3022: + goto tr420 + case 3023: + goto tr420 + case 3024: + goto tr420 + case 3025: + goto tr420 + case 3026: + goto tr420 + case 3027: + goto tr420 + case 3028: + goto tr420 + case 3029: + goto tr420 + case 3030: + goto tr420 + case 3031: + goto tr420 + case 3032: + goto tr420 + case 3033: + goto tr420 + case 3034: + goto tr420 + case 3035: + goto tr420 + case 3036: + goto tr420 + case 3037: + goto tr420 + case 3038: + goto tr420 + case 3039: + goto tr420 + case 3040: + goto tr420 + case 3041: + goto tr420 + case 3042: + goto tr420 + case 3043: + goto tr420 + case 3044: + goto tr420 + case 3045: + goto tr420 + case 3046: + goto tr420 + case 3047: + goto tr420 + case 3048: + goto tr420 + case 3049: + goto tr420 + case 3050: + goto tr420 + case 3051: + goto tr420 + case 3052: + goto tr420 + case 3053: + goto tr420 + case 3054: + goto tr420 + case 3055: + goto tr420 + case 3056: + goto tr420 + case 3057: + goto tr420 + case 3058: + goto tr420 + case 3059: + goto tr420 + case 3060: + goto tr420 + case 3061: + goto tr420 + case 3062: + goto tr420 + case 3063: + goto tr420 + case 3064: + goto tr420 + case 3065: + goto tr420 + case 3066: + goto tr420 + case 3067: + goto tr420 + case 3068: + goto tr420 + case 3069: + goto tr420 + case 3070: + goto tr420 + case 4887: + goto tr4562 + case 3071: + goto tr420 + case 3072: + goto tr420 + case 3073: + goto tr420 + case 3074: + goto tr420 + case 3075: + goto tr420 + case 3076: + goto tr420 + case 3077: + goto tr420 + case 3078: + goto tr420 + case 3079: + goto tr420 + case 3080: + goto tr420 + case 3081: + goto tr420 + case 3082: + goto tr420 + case 3083: + goto tr420 + case 3084: + goto tr420 + case 3085: + goto tr420 + case 3086: + goto tr420 + case 3087: + goto tr420 + case 3088: + goto tr420 + case 3089: + goto tr420 + case 3090: + goto tr420 + case 3091: + goto tr420 + case 3092: + goto tr420 + case 3093: + goto tr420 + case 3094: + goto tr420 + case 3095: + goto tr420 + case 3096: + goto tr420 + case 3097: + goto tr420 + case 3098: + goto tr420 + case 3099: + goto tr420 + case 3100: + goto tr420 + case 3101: + goto tr420 + case 3102: + goto tr420 + case 3103: + goto tr420 + case 3104: + goto tr420 + case 3105: + goto tr420 + case 3106: + goto tr420 + case 3107: + goto tr420 + case 3108: + goto tr420 + case 3109: + goto tr420 + case 3110: + goto tr420 + case 3111: + goto tr420 + case 3112: + goto tr420 + case 3113: + goto tr420 + case 3114: + goto tr420 + case 3115: + goto tr420 + case 3116: + goto tr420 + case 3117: + goto tr420 + case 3118: + goto tr420 + case 3119: + goto tr420 + case 3120: + goto tr420 + case 3121: + goto tr420 + case 3122: + goto tr420 + case 3123: + goto tr420 + case 3124: + goto tr420 + case 3125: + goto tr420 + case 3126: + goto tr420 + case 3127: + goto tr420 + case 3128: + goto tr420 + case 3129: + goto tr420 + case 3130: + goto tr420 + case 3131: + goto tr420 + case 3132: + goto tr420 + case 3133: + goto tr420 + case 3134: + goto tr420 + case 3135: + goto tr420 + case 3136: + goto tr420 + case 3137: + goto tr420 + case 3138: + goto tr420 + case 3139: + goto tr420 + case 3140: + goto tr420 + case 3141: + goto tr420 + case 3142: + goto tr420 + case 3143: + goto tr420 + case 3144: + goto tr420 + case 3145: + goto tr420 + case 3146: + goto tr420 + case 3147: + goto tr420 + case 3148: + goto tr420 + case 3149: + goto tr420 + case 3150: + goto tr420 + case 3151: + goto tr420 + case 3152: + goto tr420 + case 3153: + goto tr420 + case 3154: + goto tr420 + case 3155: + goto tr420 + case 3156: + goto tr420 + case 3157: + goto tr420 + case 3158: + goto tr420 + case 3159: + goto tr420 + case 3160: + goto tr420 + case 3161: + goto tr420 + case 3162: + goto tr420 + case 3163: + goto tr420 + case 3164: + goto tr420 + case 3165: + goto tr420 + case 3166: + goto tr420 + case 3167: + goto tr420 + case 3168: + goto tr420 + case 3169: + goto tr420 + case 3170: + goto tr420 + case 3171: + goto tr420 + case 3172: + goto tr420 + case 3173: + goto tr420 + case 3174: + goto tr420 + case 3175: + goto tr420 + case 3176: + goto tr420 + case 3177: + goto tr420 + case 3178: + goto tr420 + case 3179: + goto tr420 + case 3180: + goto tr420 + case 3181: + goto tr420 + case 3182: + goto tr420 + case 3183: + goto tr420 + case 3184: + goto tr420 + case 3185: + goto tr420 + case 3186: + goto tr420 + case 3187: + goto tr420 + case 3188: + goto tr420 + case 3189: + goto tr420 + case 3190: + goto tr420 + case 3191: + goto tr420 + case 3192: + goto tr420 + case 3193: + goto tr420 + case 3194: + goto tr420 + case 3195: + goto tr420 + case 3196: + goto tr420 + case 3197: + goto tr420 + case 3198: + goto tr420 + case 3199: + goto tr420 + case 3200: + goto tr420 + case 3201: + goto tr420 + case 3202: + goto tr420 + case 3203: + goto tr420 + case 3204: + goto tr420 + case 3205: + goto tr420 + case 3206: + goto tr420 + case 3207: + goto tr420 + case 3208: + goto tr420 + case 3209: + goto tr420 + case 3210: + goto tr420 + case 3211: + goto tr420 + case 3212: + goto tr420 + case 3213: + goto tr420 + case 3214: + goto tr420 + case 3215: + goto tr420 + case 3216: + goto tr420 + case 3217: + goto tr420 + case 4888: + goto tr4562 + case 4889: + goto tr4562 + case 4890: + goto tr4562 + case 4891: + goto tr4562 + case 4892: + goto tr4562 + case 4893: + goto tr4562 + case 4894: + goto tr4562 + case 4895: + goto tr4499 + case 4896: + goto tr4499 + case 4897: + goto tr4562 + case 4898: + goto tr4562 + case 4899: + goto tr4562 + case 4900: + goto tr4562 + case 4901: + goto tr4562 + case 4902: + goto tr4562 + case 4903: + goto tr4562 + case 4904: + goto tr4562 + case 4905: + goto tr4562 + case 4906: + goto tr4562 + case 4907: + goto tr4562 + case 4908: + goto tr4499 + case 4909: + goto tr4499 + case 4910: + goto tr4499 + case 4911: + goto tr4499 + case 4912: + goto tr4499 + case 4913: + goto tr4499 + case 4914: + goto tr4499 + case 4915: + goto tr4499 + case 4916: + goto tr4499 + case 4917: + goto tr4499 + case 4918: + goto tr4499 + case 4919: + goto tr4499 + case 4920: + goto tr4499 + case 4921: + goto tr4499 + case 4922: + goto tr4499 + case 4923: + goto tr4499 + case 4924: + goto tr4499 + case 4925: + goto tr4499 + case 4926: + goto tr4499 + case 4927: + goto tr4499 + case 4928: + goto tr4499 + case 3218: + goto tr0 + case 3219: + goto tr0 + case 3220: + goto tr0 + case 3221: + goto tr0 + case 3222: + goto tr0 + case 3223: + goto tr0 + case 3224: + goto tr0 + case 3225: + goto tr0 + case 3226: + goto tr0 + case 3227: + goto tr0 + case 3228: + goto tr0 + case 3229: + goto tr0 + case 3230: + goto tr0 + case 3231: + goto tr0 + case 4929: + goto tr4562 + case 4930: + goto tr4562 + case 4931: + goto tr4562 + case 4932: + goto tr4499 + case 3232: + goto tr0 + case 4933: + goto tr4562 + case 4934: + goto tr4562 + case 4935: + goto tr4562 + case 4936: + goto tr4562 + case 4937: + goto tr4562 + case 4938: + goto tr4562 + case 4939: + goto tr4562 + case 4940: + goto tr4499 + case 4941: + goto tr4499 + case 4942: + goto tr4499 + case 4943: + goto tr4499 + case 4944: + goto tr4562 + case 4945: + goto tr4562 + case 4946: + goto tr4562 + case 4947: + goto tr4562 + case 4948: + goto tr4562 + case 4949: + goto tr4562 + case 4950: + goto tr4562 + case 4951: + goto tr4562 + case 4952: + goto tr4562 + case 4953: + goto tr4562 + case 4954: + goto tr4562 + case 4955: + goto tr4562 + case 4956: + goto tr4562 + case 4957: + goto tr4562 + case 3233: + goto tr0 + case 4958: + goto tr4562 + case 4959: + goto tr4562 + case 4960: + goto tr4562 + case 4961: + goto tr4562 + case 4962: + goto tr4562 + case 4963: + goto tr4562 + case 3234: + goto tr0 + case 4964: + goto tr4562 + case 4965: + goto tr4562 + case 3235: + goto tr0 + case 4966: + goto tr4562 + case 4967: + goto tr4562 + case 4968: + goto tr4562 + case 4969: + goto tr4562 + case 4970: + goto tr4562 + case 4971: + goto tr4562 + case 4972: + goto tr4562 + case 4973: + goto tr4562 + case 4974: + goto tr4562 + case 4975: + goto tr4562 + case 4976: + goto tr4562 + case 4977: + goto tr4562 + case 4978: + goto tr4562 + case 4979: + goto tr4562 + case 4980: + goto tr4562 + case 3236: + goto tr0 + case 4981: + goto tr4562 + case 4982: + goto tr4562 + case 4983: + goto tr4562 + case 3237: + goto tr0 + case 4984: + goto tr4562 + case 4985: + goto tr4562 + case 4986: + goto tr4562 + case 4987: + goto tr4562 + case 4988: + goto tr4562 + case 4989: + goto tr4562 + case 3238: + goto tr0 + case 4990: + goto tr4562 + case 4991: + goto tr4562 + case 4992: + goto tr4562 + case 4993: + goto tr4562 + case 4994: + goto tr4562 + case 4995: + goto tr4562 + case 4996: + goto tr4562 + case 4997: + goto tr4562 + case 4998: + goto tr4562 + case 4999: + goto tr4562 + case 5000: + goto tr4562 + case 5001: + goto tr4562 + case 5002: + goto tr4562 + case 5003: + goto tr4562 + case 5004: + goto tr4562 + case 5005: + goto tr4562 + case 5006: + goto tr4562 + case 5007: + goto tr4562 + case 5008: + goto tr4562 + case 5009: + goto tr4562 + case 5010: + goto tr4562 + case 5011: + goto tr4562 + case 5012: + goto tr4562 + case 5013: + goto tr4562 + case 5014: + goto tr4562 + case 5015: + goto tr4562 + case 5016: + goto tr4499 + case 5017: + goto tr4499 + case 5018: + goto tr4763 + case 5019: + goto tr4763 + case 5020: + goto tr4499 + case 5021: + goto tr4499 + case 5022: + goto tr4499 + case 5023: + goto tr4499 + case 5024: + goto tr4499 + case 5025: + goto tr4499 + case 5026: + goto tr4499 + case 5027: + goto tr4499 + case 5028: + goto tr4499 + case 5029: + goto tr4763 + case 5030: + goto tr4763 + case 5031: + goto tr4763 + case 5032: + goto tr4763 + case 5033: + goto tr4763 + case 5034: + goto tr4763 + case 5035: + goto tr4763 + case 5036: + goto tr4763 + case 5037: + goto tr4499 + case 5038: + goto tr4499 + case 5039: + goto tr4499 + case 5040: + goto tr4499 + case 5041: + goto tr4499 + case 5042: + goto tr4499 + case 5043: + goto tr4499 + case 5044: + goto tr4499 + case 5045: + goto tr4499 + case 5046: + goto tr4499 + case 5047: + goto tr4499 + case 5048: + goto tr4763 + case 5049: + goto tr4763 + case 5050: + goto tr4763 + case 5051: + goto tr4763 + case 5052: + goto tr4763 + case 5053: + goto tr4763 + case 5054: + goto tr4763 + case 5055: + goto tr4763 + case 5056: + goto tr4763 + case 5057: + goto tr4763 + case 5058: + goto tr4763 + case 5059: + goto tr4499 + case 5060: + goto tr4499 + case 5061: + goto tr4499 + case 5062: + goto tr4499 + case 5063: + goto tr4499 + case 5064: + goto tr4499 + case 5065: + goto tr4499 + case 5066: + goto tr4499 + case 5067: + goto tr4499 + case 5068: + goto tr4499 + case 5069: + goto tr4499 + case 5070: + goto tr4499 + case 5071: + goto tr4499 + case 3239: + goto tr0 + case 3240: + goto tr0 + case 3241: + goto tr0 + case 3242: + goto tr0 + case 3243: + goto tr0 + case 3244: + goto tr0 + case 3245: + goto tr0 + case 3246: + goto tr0 + case 3247: + goto tr0 + case 3248: + goto tr0 + case 3249: + goto tr0 + case 3250: + goto tr0 + case 3251: + goto tr0 + case 3252: + goto tr0 + case 3253: + goto tr0 + case 3254: + goto tr0 + case 3255: + goto tr0 + case 3256: + goto tr0 + case 3257: + goto tr0 + case 3258: + goto tr0 + case 3259: + goto tr0 + case 3260: + goto tr0 + case 3261: + goto tr0 + case 3262: + goto tr0 + case 3263: + goto tr0 + case 3264: + goto tr0 + case 3265: + goto tr0 + case 5072: + goto tr4499 + case 3266: + goto tr0 + case 3267: + goto tr0 + case 3268: + goto tr2 + case 5073: + goto tr5002 + case 3269: + goto tr2985 + case 3270: + goto tr2 + case 3271: + goto tr2985 + case 3272: + goto tr2985 + case 3273: + goto tr2985 + case 3274: + goto tr2985 + case 3275: + goto tr2985 + case 3276: + goto tr2985 + case 3277: + goto tr2985 + case 3278: + goto tr2985 + case 3279: + goto tr2985 + case 3280: + goto tr2985 + case 3281: + goto tr2985 + case 3282: + goto tr2985 + case 3283: + goto tr2 + case 3284: + goto tr2 + case 3285: + goto tr2 + case 3286: + goto tr2 + case 3287: + goto tr2 + case 3288: + goto tr2 + case 3289: + goto tr2 + case 3290: + goto tr2 + case 3291: + goto tr2 + case 3292: + goto tr2 + case 3293: + goto tr2 + case 3294: + goto tr2 + case 3295: + goto tr2 + case 3296: + goto tr2 + case 3297: + goto tr2 + case 3298: + goto tr2 + case 3299: + goto tr2 + case 3300: + goto tr2 + case 3301: + goto tr2 + case 3302: + goto tr2 + case 3303: + goto tr2 + case 3304: + goto tr2 + case 3305: + goto tr2 + case 3306: + goto tr2 + case 3307: + goto tr2 + case 3308: + goto tr2 + case 3309: + goto tr2 + case 3310: + goto tr2 + case 3311: + goto tr2 + case 3312: + goto tr2 + case 3313: + goto tr2 + case 3314: + goto tr2985 + case 3315: + goto tr2 + case 3316: + goto tr2 + case 3317: + goto tr2 + case 3318: + goto tr2 + case 3319: + goto tr2 + case 3320: + goto tr2 + case 3321: + goto tr2 + case 3322: + goto tr2 + case 3323: + goto tr2 + case 3324: + goto tr2 + case 3325: + goto tr2 + case 3326: + goto tr2 + case 3327: + goto tr2 + case 3328: + goto tr2 + case 3329: + goto tr2 + case 3330: + goto tr2 + case 3331: + goto tr2 + case 3332: + goto tr2 + case 3333: + goto tr2 + case 3334: + goto tr2 + case 3335: + goto tr2 + case 3336: + goto tr2 + case 3337: + goto tr2 + case 3338: + goto tr2985 + case 3339: + goto tr2 + case 3340: + goto tr2 + case 3341: + goto tr2 + case 3342: + goto tr2 + case 3343: + goto tr2 + case 3344: + goto tr2 + case 3345: + goto tr2985 + case 3346: + goto tr2 + case 3347: + goto tr2 + case 3348: + goto tr2 + case 3349: + goto tr2 + case 3350: + goto tr2 + case 5074: + goto tr5002 + case 3351: + goto tr2985 + case 3352: + goto tr2985 + case 3353: + goto tr2985 + case 3354: + goto tr2985 + case 3355: + goto tr2985 + case 3356: + goto tr2985 + case 3357: + goto tr2985 + case 3358: + goto tr2985 + case 3359: + goto tr2985 + case 3360: + goto tr2985 + case 3361: + goto tr2985 + case 3362: + goto tr2985 + case 3363: + goto tr2985 + case 3364: + goto tr2985 + case 3365: + goto tr2985 + case 3366: + goto tr2985 + case 3367: + goto tr2985 + case 3368: + goto tr2985 + case 3369: + goto tr2985 + case 3370: + goto tr2985 + case 3371: + goto tr2985 + case 3372: + goto tr2985 + case 3373: + goto tr2985 + case 3374: + goto tr2985 + case 3375: + goto tr2985 + case 3376: + goto tr2985 + case 3377: + goto tr2985 + case 3378: + goto tr2985 + case 3379: + goto tr2985 + case 3380: + goto tr2985 + case 3381: + goto tr2985 + case 3382: + goto tr2985 + case 3383: + goto tr2985 + case 3384: + goto tr2985 + case 3385: + goto tr2985 + case 3386: + goto tr2985 + case 3387: + goto tr2985 + case 3388: + goto tr2985 + case 3389: + goto tr2985 + case 3390: + goto tr2985 + case 3391: + goto tr2985 + case 3392: + goto tr2985 + case 3393: + goto tr2985 + case 3394: + goto tr2985 + case 3395: + goto tr2985 + case 3396: + goto tr2985 + case 3397: + goto tr2985 + case 3398: + goto tr2985 + case 3399: + goto tr2985 + case 3400: + goto tr2985 + case 3401: + goto tr2985 + case 3402: + goto tr2985 + case 3403: + goto tr2985 + case 3404: + goto tr2985 + case 3405: + goto tr2985 + case 3406: + goto tr2985 + case 3407: + goto tr2985 + case 3408: + goto tr2985 + case 3409: + goto tr2985 + case 3410: + goto tr2985 + case 3411: + goto tr2985 + case 3412: + goto tr2985 + case 3413: + goto tr2985 + case 3414: + goto tr2985 + case 3415: + goto tr2985 + case 3416: + goto tr2985 + case 3417: + goto tr2985 + case 3418: + goto tr2985 + case 3419: + goto tr2985 + case 3420: + goto tr2985 + case 3421: + goto tr2985 + case 3422: + goto tr2985 + case 3423: + goto tr2985 + case 3424: + goto tr2985 + case 3425: + goto tr2985 + case 3426: + goto tr2985 + case 3427: + goto tr2985 + case 3428: + goto tr2985 + case 3429: + goto tr2 + case 3430: + goto tr2985 + case 3431: + goto tr2985 + case 3432: + goto tr2985 + case 3433: + goto tr2985 + case 3434: + goto tr2985 + case 3435: + goto tr2985 + case 3436: + goto tr2985 + case 3437: + goto tr2985 + case 3438: + goto tr2985 + case 3439: + goto tr2985 + case 3440: + goto tr2985 + case 3441: + goto tr2985 + case 3442: + goto tr2985 + case 3443: + goto tr2985 + case 3444: + goto tr2985 + case 3445: + goto tr2985 + case 3446: + goto tr2985 + case 3447: + goto tr2985 + case 3448: + goto tr2985 + case 3449: + goto tr2985 + case 3450: + goto tr2985 + case 3451: + goto tr2985 + case 3452: + goto tr2985 + case 3453: + goto tr2985 + case 3454: + goto tr2985 + case 3455: + goto tr2985 + case 3456: + goto tr2985 + case 3457: + goto tr2985 + case 3458: + goto tr2985 + case 3459: + goto tr2985 + case 3460: + goto tr2985 + case 3461: + goto tr2985 + case 3462: + goto tr2985 + case 3463: + goto tr2985 + case 3464: + goto tr2985 + case 3465: + goto tr2985 + case 3466: + goto tr2985 + case 3467: + goto tr2985 + case 3468: + goto tr2985 + case 3469: + goto tr2985 + case 3470: + goto tr2985 + case 3471: + goto tr2985 + case 3472: + goto tr2985 + case 3473: + goto tr2985 + case 3474: + goto tr2985 + case 3475: + goto tr2985 + case 3476: + goto tr2985 + case 3477: + goto tr2985 + case 3478: + goto tr2985 + case 3479: + goto tr2985 + case 3480: + goto tr2985 + case 3481: + goto tr2985 + case 3482: + goto tr2985 + case 3483: + goto tr2985 + case 3484: + goto tr2985 + case 3485: + goto tr2985 + case 3486: + goto tr2985 + case 3487: + goto tr2985 + case 3488: + goto tr2985 + case 3489: + goto tr2985 + case 3490: + goto tr2985 + case 3491: + goto tr2985 + case 3492: + goto tr2985 + case 3493: + goto tr2985 + case 3494: + goto tr2985 + case 3495: + goto tr2985 + case 3496: + goto tr2985 + case 3497: + goto tr2985 + case 3498: + goto tr2985 + case 3499: + goto tr2985 + case 3500: + goto tr2985 + case 3501: + goto tr2 + case 3502: + goto tr2 + case 3503: + goto tr2 + case 3504: + goto tr2 + case 3505: + goto tr2 + case 3506: + goto tr2 + case 3507: + goto tr2 + case 3508: + goto tr2 + case 3509: + goto tr2 + case 3510: + goto tr2 + case 3511: + goto tr2 + case 3512: + goto tr2 + case 3513: + goto tr2 + case 3514: + goto tr2 + case 3515: + goto tr2 + case 3516: + goto tr2985 + case 3517: + goto tr2985 + case 3518: + goto tr2 + case 3519: + goto tr2 + case 3520: + goto tr2985 + case 3521: + goto tr2 + case 3522: + goto tr2 + case 3523: + goto tr2 + case 3524: + goto tr2 + case 3525: + goto tr2 + case 3526: + goto tr2985 + case 3527: + goto tr2 + case 3528: + goto tr2 + case 3529: + goto tr2 + case 3530: + goto tr2 + case 3531: + goto tr2 + case 3532: + goto tr2 + case 3533: + goto tr2 + case 3534: + goto tr2 + case 3535: + goto tr2 + case 3536: + goto tr2 + case 3537: + goto tr2 + case 3538: + goto tr2 + case 3539: + goto tr2 + case 3540: + goto tr2 + case 3541: + goto tr2 + case 3542: + goto tr2 + case 3543: + goto tr2 + case 3544: + goto tr2 + case 3545: + goto tr2 + case 3546: + goto tr2 + case 3547: + goto tr2 + case 3548: + goto tr2 + case 3549: + goto tr2 + case 3550: + goto tr2 + case 3551: + goto tr2 + case 3552: + goto tr2 + case 3553: + goto tr2 + case 3554: + goto tr2 + case 3555: + goto tr2 + case 3556: + goto tr2 + case 3557: + goto tr2 + case 3558: + goto tr2 + case 3559: + goto tr2 + case 3560: + goto tr2 + case 3561: + goto tr2 + case 3562: + goto tr2 + case 3563: + goto tr2 + case 3564: + goto tr2 + case 3565: + goto tr2 + case 3566: + goto tr2 + case 3567: + goto tr2 + case 3568: + goto tr2985 + case 3569: + goto tr2 + case 3570: + goto tr2 + case 3571: + goto tr2 + case 3572: + goto tr2 + case 3573: + goto tr0 + case 3574: + goto tr0 + case 3575: + goto tr0 + case 3576: + goto tr0 + case 3577: + goto tr0 + case 3578: + goto tr0 + case 3579: + goto tr0 + case 3580: + goto tr0 + case 3581: + goto tr0 + case 3582: + goto tr0 + case 3583: + goto tr0 + case 3584: + goto tr0 + case 3585: + goto tr0 + case 3586: + goto tr0 + case 3587: + goto tr0 + case 5075: + goto tr4499 + case 3588: + goto tr0 + case 3589: + goto tr0 + case 3590: + goto tr0 + case 3591: + goto tr0 + case 3592: + goto tr0 + case 3593: + goto tr0 + case 5076: + goto tr5054 + case 3594: + goto tr3251 + case 3595: + goto tr2 + case 3596: + goto tr2 + case 3597: + goto tr3251 + case 3598: + goto tr3251 + case 3599: + goto tr3251 + case 3600: + goto tr3251 + case 3601: + goto tr3251 + case 3602: + goto tr3251 + case 3603: + goto tr3251 + case 3604: + goto tr3251 + case 3605: + goto tr3251 + case 3606: + goto tr3251 + case 3607: + goto tr3251 + case 3608: + goto tr2 + case 3609: + goto tr2 + case 3610: + goto tr2 + case 3611: + goto tr2 + case 3612: + goto tr2 + case 3613: + goto tr2 + case 3614: + goto tr2 + case 3615: + goto tr2 + case 3616: + goto tr2 + case 3617: + goto tr2 + case 3618: + goto tr2 + case 3619: + goto tr2 + case 3620: + goto tr2 + case 3621: + goto tr2 + case 3622: + goto tr2 + case 3623: + goto tr2 + case 3624: + goto tr2 + case 3625: + goto tr2 + case 3626: + goto tr2 + case 3627: + goto tr2 + case 3628: + goto tr2 + case 3629: + goto tr2 + case 3630: + goto tr2 + case 3631: + goto tr2 + case 3632: + goto tr2 + case 3633: + goto tr2 + case 3634: + goto tr2 + case 3635: + goto tr2 + case 3636: + goto tr3251 + case 3637: + goto tr2 + case 3638: + goto tr2 + case 3639: + goto tr2 + case 3640: + goto tr2 + case 3641: + goto tr2 + case 3642: + goto tr2 + case 3643: + goto tr2 + case 3644: + goto tr2 + case 3645: + goto tr2 + case 3646: + goto tr2 + case 3647: + goto tr2 + case 3648: + goto tr2 + case 3649: + goto tr2 + case 3650: + goto tr2 + case 3651: + goto tr2 + case 3652: + goto tr2 + case 3653: + goto tr2 + case 3654: + goto tr2 + case 3655: + goto tr2 + case 3656: + goto tr2 + case 3657: + goto tr2 + case 3658: + goto tr3251 + case 3659: + goto tr2 + case 3660: + goto tr2 + case 3661: + goto tr2 + case 3662: + goto tr2 + case 3663: + goto tr2 + case 3664: + goto tr2 + case 3665: + goto tr3251 + case 3666: + goto tr2 + case 3667: + goto tr2 + case 3668: + goto tr3251 + case 3669: + goto tr2 + case 3670: + goto tr2 + case 3671: + goto tr2 + case 3672: + goto tr2 + case 3673: + goto tr2 + case 3674: + goto tr2 + case 3675: + goto tr2 + case 3676: + goto tr2 + case 3677: + goto tr2 + case 3678: + goto tr2 + case 3679: + goto tr2 + case 3680: + goto tr2 + case 3681: + goto tr2 + case 3682: + goto tr2 + case 3683: + goto tr2 + case 3684: + goto tr3251 + case 3685: + goto tr2 + case 3686: + goto tr2 + case 3687: + goto tr2 + case 3688: + goto tr3251 + case 3689: + goto tr2 + case 3690: + goto tr2 + case 3691: + goto tr2 + case 3692: + goto tr2 + case 3693: + goto tr2 + case 3694: + goto tr2 + case 3695: + goto tr2 + case 3696: + goto tr2 + case 3697: + goto tr2 + case 3698: + goto tr2 + case 3699: + goto tr2 + case 3700: + goto tr2 + case 3701: + goto tr2 + case 3702: + goto tr2 + case 3703: + goto tr2 + case 3704: + goto tr2 + case 3705: + goto tr2 + case 3706: + goto tr2 + case 3707: + goto tr2 + case 3708: + goto tr2 + case 3709: + goto tr2 + case 3710: + goto tr2 + case 3711: + goto tr2 + case 3712: + goto tr2 + case 3713: + goto tr2 + case 3714: + goto tr2 + case 3715: + goto tr2 + case 3716: + goto tr2 + case 3717: + goto tr2 + case 3718: + goto tr2 + case 3719: + goto tr2 + case 3720: + goto tr2 + case 3721: + goto tr2 + case 3722: + goto tr2 + case 3723: + goto tr2 + case 3724: + goto tr2 + case 3725: + goto tr2 + case 3726: + goto tr2 + case 3727: + goto tr2 + case 3728: + goto tr2 + case 3729: + goto tr2 + case 3730: + goto tr3251 + case 3731: + goto tr2 + case 3732: + goto tr2 + case 3733: + goto tr2 + case 3734: + goto tr2 + case 3735: + goto tr0 + case 3736: + goto tr0 + case 5077: + goto tr4499 + case 3737: + goto tr0 + case 5078: + goto tr4562 + case 3738: + goto tr420 + case 3739: + goto tr420 + case 3740: + goto tr420 + case 3741: + goto tr420 + case 3742: + goto tr420 + case 3743: + goto tr420 + case 3744: + goto tr420 + case 3745: + goto tr420 + case 3746: + goto tr420 + case 3747: + goto tr420 + case 3748: + goto tr420 + case 3749: + goto tr420 + case 3750: + goto tr420 + case 3751: + goto tr420 + case 3752: + goto tr420 + case 3753: + goto tr420 + case 3754: + goto tr420 + case 3755: + goto tr420 + case 3756: + goto tr420 + case 3757: + goto tr420 + case 3758: + goto tr420 + case 3759: + goto tr420 + case 3760: + goto tr420 + case 3761: + goto tr420 + case 3762: + goto tr420 + case 3763: + goto tr420 + case 3764: + goto tr420 + case 3765: + goto tr420 + case 3766: + goto tr420 + case 3767: + goto tr420 + case 3768: + goto tr420 + case 3769: + goto tr420 + case 3770: + goto tr420 + case 3771: + goto tr420 + case 3772: + goto tr420 + case 3773: + goto tr420 + case 3774: + goto tr420 + case 3775: + goto tr420 + case 3776: + goto tr420 + case 3777: + goto tr420 + case 3778: + goto tr420 + case 3779: + goto tr420 + case 3780: + goto tr420 + case 3781: + goto tr420 + case 3782: + goto tr420 + case 3783: + goto tr420 + case 3784: + goto tr420 + case 3785: + goto tr420 + case 3786: + goto tr420 + case 3787: + goto tr420 + case 3788: + goto tr420 + case 3789: + goto tr420 + case 3790: + goto tr420 + case 3791: + goto tr420 + case 3792: + goto tr420 + case 3793: + goto tr420 + case 3794: + goto tr420 + case 3795: + goto tr420 + case 3796: + goto tr420 + case 3797: + goto tr420 + case 3798: + goto tr420 + case 3799: + goto tr420 + case 3800: + goto tr420 + case 3801: + goto tr420 + case 3802: + goto tr420 + case 3803: + goto tr420 + case 3804: + goto tr420 + case 3805: + goto tr420 + case 3806: + goto tr420 + case 3807: + goto tr420 + case 3808: + goto tr420 + case 3809: + goto tr420 + case 3810: + goto tr420 + case 3811: + goto tr420 + case 3812: + goto tr420 + case 3813: + goto tr420 + case 3814: + goto tr420 + case 3815: + goto tr420 + case 3816: + goto tr420 + case 3817: + goto tr420 + case 3818: + goto tr420 + case 3819: + goto tr420 + case 3820: + goto tr420 + case 3821: + goto tr420 + case 3822: + goto tr420 + case 3823: + goto tr420 + case 3824: + goto tr420 + case 3825: + goto tr420 + case 3826: + goto tr420 + case 3827: + goto tr420 + case 3828: + goto tr420 + case 3829: + goto tr420 + case 3830: + goto tr420 + case 3831: + goto tr420 + case 3832: + goto tr420 + case 3833: + goto tr420 + case 3834: + goto tr420 + case 3835: + goto tr420 + case 3836: + goto tr420 + case 3837: + goto tr420 + case 3838: + goto tr420 + case 3839: + goto tr420 + case 3840: + goto tr420 + case 3841: + goto tr420 + case 3842: + goto tr420 + case 3843: + goto tr420 + case 3844: + goto tr420 + case 3845: + goto tr420 + case 3846: + goto tr420 + case 3847: + goto tr420 + case 3848: + goto tr420 + case 3849: + goto tr420 + case 3850: + goto tr420 + case 3851: + goto tr420 + case 3852: + goto tr420 + case 3853: + goto tr420 + case 3854: + goto tr420 + case 3855: + goto tr420 + case 3856: + goto tr420 + case 3857: + goto tr420 + case 3858: + goto tr420 + case 3859: + goto tr420 + case 3860: + goto tr420 + case 3861: + goto tr420 + case 3862: + goto tr420 + case 3863: + goto tr420 + case 3864: + goto tr420 + case 3865: + goto tr420 + case 3866: + goto tr420 + case 3867: + goto tr420 + case 3868: + goto tr420 + case 3869: + goto tr420 + case 3870: + goto tr420 + case 3871: + goto tr420 + case 3872: + goto tr420 + case 3873: + goto tr420 + case 3874: + goto tr420 + case 3875: + goto tr420 + case 3876: + goto tr420 + case 3877: + goto tr420 + case 3878: + goto tr420 + case 3879: + goto tr420 + case 3880: + goto tr420 + case 3881: + goto tr420 + case 3882: + goto tr420 + case 3883: + goto tr420 + case 3884: + goto tr420 + case 5079: + goto tr5002 + case 3885: + goto tr2985 + case 3886: + goto tr2985 + case 3887: + goto tr2985 + case 3888: + goto tr2985 + case 3889: + goto tr2985 + case 3890: + goto tr2985 + case 3891: + goto tr2985 + case 3892: + goto tr2985 + case 3893: + goto tr2985 + case 3894: + goto tr2985 + case 3895: + goto tr2985 + case 3896: + goto tr2985 + case 3897: + goto tr2985 + case 3898: + goto tr2985 + case 3899: + goto tr2985 + case 3900: + goto tr2985 + case 3901: + goto tr2985 + case 3902: + goto tr2985 + case 3903: + goto tr2985 + case 3904: + goto tr2985 + case 3905: + goto tr2985 + case 3906: + goto tr2985 + case 3907: + goto tr2985 + case 3908: + goto tr2985 + case 3909: + goto tr2985 + case 3910: + goto tr2985 + case 3911: + goto tr2985 + case 3912: + goto tr2985 + case 3913: + goto tr2985 + case 3914: + goto tr2985 + case 3915: + goto tr2985 + case 3916: + goto tr2985 + case 3917: + goto tr2985 + case 3918: + goto tr2985 + case 3919: + goto tr2985 + case 3920: + goto tr2985 + case 3921: + goto tr2985 + case 3922: + goto tr2985 + case 3923: + goto tr2985 + case 3924: + goto tr2985 + case 3925: + goto tr2985 + case 3926: + goto tr2985 + case 3927: + goto tr2985 + case 3928: + goto tr2985 + case 3929: + goto tr2985 + case 3930: + goto tr2985 + case 3931: + goto tr2985 + case 3932: + goto tr2985 + case 3933: + goto tr2985 + case 3934: + goto tr2985 + case 3935: + goto tr2985 + case 3936: + goto tr2985 + case 3937: + goto tr2985 + case 3938: + goto tr2985 + case 3939: + goto tr2985 + case 3940: + goto tr2985 + case 3941: + goto tr2985 + case 3942: + goto tr2985 + case 3943: + goto tr2985 + case 3944: + goto tr2985 + case 3945: + goto tr2985 + case 3946: + goto tr2985 + case 3947: + goto tr2985 + case 3948: + goto tr2985 + case 3949: + goto tr2985 + case 3950: + goto tr2985 + case 3951: + goto tr2985 + case 3952: + goto tr2985 + case 3953: + goto tr2985 + case 3954: + goto tr2985 + case 3955: + goto tr2985 + case 3956: + goto tr2985 + case 3957: + goto tr2985 + case 3958: + goto tr2985 + case 3959: + goto tr2985 + case 3960: + goto tr2985 + case 3961: + goto tr2985 + case 3962: + goto tr2985 + case 3963: + goto tr2985 + case 3964: + goto tr2985 + case 3965: + goto tr2985 + case 3966: + goto tr2985 + case 3967: + goto tr2985 + case 3968: + goto tr2985 + case 3969: + goto tr2985 + case 3970: + goto tr2985 + case 3971: + goto tr2985 + case 3972: + goto tr2985 + case 3973: + goto tr2985 + case 3974: + goto tr2985 + case 3975: + goto tr2985 + case 3976: + goto tr2985 + case 3977: + goto tr2985 + case 3978: + goto tr2985 + case 3979: + goto tr2985 + case 3980: + goto tr2985 + case 3981: + goto tr2985 + case 3982: + goto tr2985 + case 3983: + goto tr2985 + case 3984: + goto tr2985 + case 3985: + goto tr2985 + case 3986: + goto tr2985 + case 3987: + goto tr2985 + case 3988: + goto tr2985 + case 3989: + goto tr2985 + case 3990: + goto tr2985 + case 3991: + goto tr2985 + case 3992: + goto tr2985 + case 3993: + goto tr2985 + case 3994: + goto tr2985 + case 3995: + goto tr2985 + case 3996: + goto tr2985 + case 3997: + goto tr2985 + case 3998: + goto tr2985 + case 3999: + goto tr2985 + case 4000: + goto tr2985 + case 4001: + goto tr2985 + case 4002: + goto tr2985 + case 4003: + goto tr2985 + case 4004: + goto tr2985 + case 4005: + goto tr2985 + case 4006: + goto tr2985 + case 4007: + goto tr2985 + case 4008: + goto tr2985 + case 4009: + goto tr2985 + case 4010: + goto tr2985 + case 4011: + goto tr2985 + case 4012: + goto tr2985 + case 4013: + goto tr2985 + case 4014: + goto tr2985 + case 4015: + goto tr2985 + case 4016: + goto tr2985 + case 4017: + goto tr2985 + case 4018: + goto tr2985 + case 4019: + goto tr2985 + case 4020: + goto tr2985 + case 4021: + goto tr2985 + case 4022: + goto tr2985 + case 4023: + goto tr2985 + case 4024: + goto tr2985 + case 4025: + goto tr2985 + case 4026: + goto tr2985 + case 5080: + goto tr5137 + case 4027: + goto tr3627 + case 4028: + goto tr2 + case 4029: + goto tr3627 + case 4030: + goto tr3627 + case 4031: + goto tr3627 + case 4032: + goto tr3627 + case 4033: + goto tr3627 + case 4034: + goto tr3627 + case 4035: + goto tr3627 + case 4036: + goto tr3627 + case 4037: + goto tr3627 + case 4038: + goto tr3627 + case 4039: + goto tr3627 + case 4040: + goto tr3627 + case 4041: + goto tr3627 + case 4042: + goto tr3627 + case 4043: + goto tr3627 + case 4044: + goto tr3627 + case 4045: + goto tr3627 + case 4046: + goto tr3627 + case 4047: + goto tr3627 + case 4048: + goto tr3627 + case 4049: + goto tr3627 + case 4050: + goto tr3627 + case 4051: + goto tr3627 + case 4052: + goto tr3627 + case 4053: + goto tr3627 + case 4054: + goto tr3627 + case 4055: + goto tr3627 + case 4056: + goto tr3627 + case 4057: + goto tr3627 + case 4058: + goto tr3627 + case 4059: + goto tr3627 + case 4060: + goto tr3627 + case 4061: + goto tr3627 + case 4062: + goto tr3627 + case 4063: + goto tr3627 + case 4064: + goto tr3627 + case 4065: + goto tr3627 + case 4066: + goto tr3627 + case 4067: + goto tr3627 + case 4068: + goto tr3627 + case 4069: + goto tr3627 + case 4070: + goto tr3627 + case 4071: + goto tr3627 + case 4072: + goto tr3627 + case 4073: + goto tr3627 + case 4074: + goto tr3627 + case 4075: + goto tr3627 + case 4076: + goto tr3627 + case 4077: + goto tr3627 + case 4078: + goto tr3627 + case 4079: + goto tr3627 + case 4080: + goto tr3627 + case 4081: + goto tr3627 + case 4082: + goto tr3627 + case 4083: + goto tr3627 + case 4084: + goto tr3627 + case 4085: + goto tr3627 + case 4086: + goto tr3627 + case 4087: + goto tr3627 + case 4088: + goto tr3627 + case 4089: + goto tr3627 + case 4090: + goto tr3627 + case 4091: + goto tr3627 + case 4092: + goto tr3627 + case 4093: + goto tr3627 + case 4094: + goto tr3627 + case 4095: + goto tr3627 + case 4096: + goto tr3627 + case 4097: + goto tr3627 + case 4098: + goto tr3627 + case 4099: + goto tr3627 + case 4100: + goto tr3627 + case 4101: + goto tr2 + case 4102: + goto tr2 + case 4103: + goto tr2 + case 4104: + goto tr2 + case 4105: + goto tr3627 + case 4106: + goto tr3627 + case 4107: + goto tr3627 + case 4108: + goto tr3627 + case 4109: + goto tr3627 + case 4110: + goto tr3627 + case 4111: + goto tr3627 + case 4112: + goto tr3627 + case 4113: + goto tr3627 + case 4114: + goto tr3627 + case 4115: + goto tr3627 + case 4116: + goto tr3627 + case 4117: + goto tr3627 + case 4118: + goto tr3627 + case 4119: + goto tr3627 + case 4120: + goto tr3627 + case 4121: + goto tr3627 + case 4122: + goto tr3627 + case 4123: + goto tr3627 + case 4124: + goto tr3627 + case 4125: + goto tr3627 + case 4126: + goto tr3627 + case 4127: + goto tr3627 + case 4128: + goto tr3627 + case 4129: + goto tr3627 + case 4130: + goto tr3627 + case 4131: + goto tr3627 + case 4132: + goto tr3627 + case 4133: + goto tr3627 + case 4134: + goto tr3627 + case 4135: + goto tr3627 + case 4136: + goto tr3627 + case 4137: + goto tr3627 + case 4138: + goto tr3627 + case 4139: + goto tr3627 + case 4140: + goto tr3627 + case 4141: + goto tr3627 + case 4142: + goto tr3627 + case 4143: + goto tr3627 + case 4144: + goto tr3627 + case 4145: + goto tr3627 + case 4146: + goto tr3627 + case 4147: + goto tr3627 + case 4148: + goto tr3627 + case 4149: + goto tr3627 + case 4150: + goto tr3627 + case 4151: + goto tr3627 + case 4152: + goto tr3627 + case 4153: + goto tr3627 + case 4154: + goto tr3627 + case 4155: + goto tr3627 + case 4156: + goto tr3627 + case 4157: + goto tr3627 + case 4158: + goto tr3627 + case 4159: + goto tr3627 + case 4160: + goto tr3627 + case 4161: + goto tr3627 + case 4162: + goto tr3627 + case 4163: + goto tr3627 + case 4164: + goto tr3627 + case 4165: + goto tr3627 + case 4166: + goto tr3627 + case 4167: + goto tr3627 + case 4168: + goto tr3627 + case 4169: + goto tr3627 + case 4170: + goto tr3627 + case 4171: + goto tr3627 + case 4172: + goto tr3627 + case 4173: + goto tr3627 + case 4174: + goto tr3627 + case 4175: + goto tr0 + case 5081: + goto tr5157 + case 4176: + goto tr3758 + case 4177: + goto tr3758 + case 4178: + goto tr3758 + case 4179: + goto tr3758 + case 4180: + goto tr3758 + case 4181: + goto tr3758 + case 4182: + goto tr3758 + case 4183: + goto tr3758 + case 4184: + goto tr3758 + case 4185: + goto tr3758 + case 4186: + goto tr3758 + case 4187: + goto tr3758 + case 4188: + goto tr3758 + case 4189: + goto tr3758 + case 4190: + goto tr3758 + case 4191: + goto tr3758 + case 4192: + goto tr3758 + case 4193: + goto tr3758 + case 4194: + goto tr3758 + case 4195: + goto tr3758 + case 4196: + goto tr3758 + case 4197: + goto tr3758 + case 4198: + goto tr3758 + case 4199: + goto tr3758 + case 4200: + goto tr3758 + case 4201: + goto tr3758 + case 4202: + goto tr3758 + case 4203: + goto tr3758 + case 4204: + goto tr3758 + case 4205: + goto tr3758 + case 4206: + goto tr3758 + case 4207: + goto tr3758 + case 4208: + goto tr3758 + case 4209: + goto tr3758 + case 4210: + goto tr3758 + case 4211: + goto tr3758 + case 4212: + goto tr3758 + case 4213: + goto tr3758 + case 4214: + goto tr3758 + case 4215: + goto tr3758 + case 4216: + goto tr3758 + case 4217: + goto tr3758 + case 4218: + goto tr3758 + case 4219: + goto tr3758 + case 4220: + goto tr3758 + case 4221: + goto tr3758 + case 4222: + goto tr3758 + case 4223: + goto tr3758 + case 4224: + goto tr3758 + case 4225: + goto tr3758 + case 4226: + goto tr3758 + case 4227: + goto tr3758 + case 4228: + goto tr3758 + case 4229: + goto tr3758 + case 4230: + goto tr3758 + case 4231: + goto tr3758 + case 4232: + goto tr3758 + case 4233: + goto tr3758 + case 4234: + goto tr3758 + case 4235: + goto tr3758 + case 4236: + goto tr3758 + case 4237: + goto tr3758 + case 4238: + goto tr3758 + case 4239: + goto tr3758 + case 4240: + goto tr3758 + case 4241: + goto tr3758 + case 4242: + goto tr3758 + case 4243: + goto tr3758 + case 4244: + goto tr3758 + case 4245: + goto tr3758 + case 4246: + goto tr3758 + case 4247: + goto tr3758 + case 4248: + goto tr3758 + case 4249: + goto tr3758 + case 4250: + goto tr3758 + case 4251: + goto tr3758 + case 4252: + goto tr3758 + case 4253: + goto tr3758 + case 4254: + goto tr3758 + case 4255: + goto tr3758 + case 4256: + goto tr3758 + case 4257: + goto tr3758 + case 4258: + goto tr3758 + case 4259: + goto tr3758 + case 4260: + goto tr3758 + case 4261: + goto tr3758 + case 4262: + goto tr3758 + case 4263: + goto tr3758 + case 4264: + goto tr3758 + case 4265: + goto tr3758 + case 4266: + goto tr3758 + case 4267: + goto tr3758 + case 4268: + goto tr3758 + case 4269: + goto tr3758 + case 4270: + goto tr3758 + case 4271: + goto tr3758 + case 4272: + goto tr3758 + case 4273: + goto tr3758 + case 4274: + goto tr3758 + case 4275: + goto tr3758 + case 4276: + goto tr3758 + case 4277: + goto tr3758 + case 4278: + goto tr3758 + case 4279: + goto tr3758 + case 4280: + goto tr3758 + case 4281: + goto tr3758 + case 4282: + goto tr3758 + case 4283: + goto tr3758 + case 4284: + goto tr3758 + case 4285: + goto tr3758 + case 4286: + goto tr3758 + case 4287: + goto tr3758 + case 4288: + goto tr3758 + case 4289: + goto tr3758 + case 4290: + goto tr3758 + case 4291: + goto tr3758 + case 4292: + goto tr3758 + case 4293: + goto tr3758 + case 4294: + goto tr3758 + case 4295: + goto tr3758 + case 4296: + goto tr3758 + case 4297: + goto tr3758 + case 4298: + goto tr3758 + case 4299: + goto tr3758 + case 4300: + goto tr3758 + case 4301: + goto tr3758 + case 4302: + goto tr3758 + case 4303: + goto tr3758 + case 4304: + goto tr3758 + case 4305: + goto tr3758 + case 4306: + goto tr3758 + case 4307: + goto tr3758 + case 4308: + goto tr3758 + case 4309: + goto tr3758 + case 4310: + goto tr3758 + case 4311: + goto tr3758 + case 4312: + goto tr3758 + case 4313: + goto tr3758 + case 4314: + goto tr3758 + case 4315: + goto tr3758 + case 4316: + goto tr3758 + case 4317: + goto tr0 + case 4318: + goto tr0 + case 5082: + goto tr5054 + case 4319: + goto tr3251 + case 4320: + goto tr3251 + case 4321: + goto tr3251 + case 4322: + goto tr3251 + case 4323: + goto tr3251 + case 4324: + goto tr3251 + case 4325: + goto tr3251 + case 4326: + goto tr3251 + case 4327: + goto tr3251 + case 4328: + goto tr3251 + case 4329: + goto tr3251 + case 4330: + goto tr3251 + case 4331: + goto tr3251 + case 4332: + goto tr3251 + case 4333: + goto tr3251 + case 4334: + goto tr3251 + case 4335: + goto tr3251 + case 4336: + goto tr3251 + case 4337: + goto tr3251 + case 4338: + goto tr3251 + case 4339: + goto tr3251 + case 4340: + goto tr3251 + case 4341: + goto tr3251 + case 4342: + goto tr3251 + case 4343: + goto tr3251 + case 4344: + goto tr3251 + case 4345: + goto tr3251 + case 4346: + goto tr3251 + case 4347: + goto tr3251 + case 4348: + goto tr3251 + case 4349: + goto tr3251 + case 4350: + goto tr3251 + case 4351: + goto tr3251 + case 4352: + goto tr3251 + case 4353: + goto tr3251 + case 4354: + goto tr3251 + case 4355: + goto tr3251 + case 4356: + goto tr3251 + case 4357: + goto tr3251 + case 4358: + goto tr3251 + case 4359: + goto tr3251 + case 4360: + goto tr3251 + case 4361: + goto tr3251 + case 4362: + goto tr3251 + case 4363: + goto tr3251 + case 4364: + goto tr3251 + case 4365: + goto tr3251 + case 4366: + goto tr3251 + case 4367: + goto tr3251 + case 4368: + goto tr3251 + case 4369: + goto tr3251 + case 4370: + goto tr3251 + case 4371: + goto tr3251 + case 4372: + goto tr3251 + case 4373: + goto tr3251 + case 4374: + goto tr3251 + case 4375: + goto tr3251 + case 4376: + goto tr3251 + case 4377: + goto tr3251 + case 4378: + goto tr3251 + case 4379: + goto tr3251 + case 4380: + goto tr3251 + case 4381: + goto tr3251 + case 4382: + goto tr3251 + case 4383: + goto tr3251 + case 4384: + goto tr3251 + case 4385: + goto tr3251 + case 4386: + goto tr3251 + case 4387: + goto tr3251 + case 4388: + goto tr3251 + case 4389: + goto tr3251 + case 4390: + goto tr3251 + case 4391: + goto tr3251 + case 4392: + goto tr3251 + case 4393: + goto tr3251 + case 4394: + goto tr3251 + case 4395: + goto tr3251 + case 4396: + goto tr3251 + case 4397: + goto tr3251 + case 4398: + goto tr3251 + case 4399: + goto tr3251 + case 4400: + goto tr3251 + case 4401: + goto tr3251 + case 4402: + goto tr3251 + case 4403: + goto tr3251 + case 4404: + goto tr3251 + case 4405: + goto tr3251 + case 4406: + goto tr3251 + case 4407: + goto tr3251 + case 4408: + goto tr3251 + case 4409: + goto tr3251 + case 4410: + goto tr3251 + case 4411: + goto tr3251 + case 4412: + goto tr3251 + case 4413: + goto tr3251 + case 4414: + goto tr3251 + case 4415: + goto tr3251 + case 4416: + goto tr3251 + case 4417: + goto tr3251 + case 4418: + goto tr3251 + case 4419: + goto tr3251 + case 4420: + goto tr3251 + case 4421: + goto tr3251 + case 4422: + goto tr3251 + case 4423: + goto tr3251 + case 4424: + goto tr3251 + case 4425: + goto tr3251 + case 4426: + goto tr3251 + case 4427: + goto tr3251 + case 4428: + goto tr3251 + case 4429: + goto tr3251 + case 4430: + goto tr3251 + case 4431: + goto tr3251 + case 4432: + goto tr3251 + case 4433: + goto tr3251 + case 4434: + goto tr3251 + case 4435: + goto tr3251 + case 4436: + goto tr3251 + case 4437: + goto tr3251 + case 4438: + goto tr3251 + case 4439: + goto tr3251 + case 4440: + goto tr3251 + case 4441: + goto tr3251 + case 4442: + goto tr3251 + case 4443: + goto tr3251 + case 4444: + goto tr3251 + case 4445: + goto tr3251 + case 4446: + goto tr3251 + case 4447: + goto tr3251 + case 4448: + goto tr3251 + case 4449: + goto tr3251 + case 4450: + goto tr3251 + case 4451: + goto tr3251 + case 4452: + goto tr3251 + case 4453: + goto tr3251 + case 4454: + goto tr3251 + case 4455: + goto tr3251 + case 4456: + goto tr3251 + case 4457: + goto tr3251 + case 4458: + goto tr3251 + case 4459: + goto tr3251 + case 4460: + goto tr0 + case 4461: + goto tr0 + case 4462: + goto tr0 + case 4463: + goto tr0 + case 4464: + goto tr0 + case 4465: + goto tr0 + case 4466: + goto tr0 + case 4467: + goto tr0 + case 4468: + goto tr0 + case 4469: + goto tr0 + case 4470: + goto tr0 + case 4471: + goto tr0 + case 4472: + goto tr0 + case 5083: + goto tr5054 + case 5084: + goto tr5054 + case 5085: + goto tr5054 + case 5086: + goto tr4499 + case 5087: + goto tr4499 + case 5088: + goto tr5054 + case 5089: + goto tr5054 + case 5090: + goto tr4499 + case 5091: + goto tr4499 + case 5092: + goto tr4499 + case 5093: + goto tr4499 + case 5094: + goto tr4499 + case 5095: + goto tr4499 + case 5096: + goto tr4499 + case 5097: + goto tr4499 + case 5098: + goto tr5054 + case 5099: + goto tr5054 + case 5100: + goto tr5054 + case 5101: + goto tr5054 + case 5102: + goto tr5054 + case 5103: + goto tr5054 + case 5104: + goto tr5054 + case 5105: + goto tr5054 + case 5106: + goto tr4499 + case 5107: + goto tr4499 + case 5108: + goto tr4499 + case 5109: + goto tr4499 + case 5110: + goto tr4499 + case 5111: + goto tr4499 + case 5112: + goto tr4499 + case 5113: + goto tr4499 + case 5114: + goto tr4499 + case 5115: + goto tr4499 + case 5116: + goto tr4499 + case 5117: + goto tr5054 + case 5118: + goto tr5054 + case 5119: + goto tr5054 + case 5120: + goto tr5054 + case 5121: + goto tr5054 + case 5122: + goto tr5054 + case 5123: + goto tr5054 + case 5124: + goto tr5054 + case 5125: + goto tr5054 + case 5126: + goto tr5054 + case 5127: + goto tr5054 + case 5128: + goto tr5054 + case 5129: + goto tr5054 + case 5130: + goto tr5054 + case 5131: + goto tr5054 + case 5132: + goto tr5054 + case 5133: + goto tr5054 + case 5134: + goto tr5054 + case 5135: + goto tr5054 + case 5136: + goto tr5054 + case 5137: + goto tr5054 + case 5138: + goto tr5054 + case 5139: + goto tr5054 + case 5140: + goto tr5054 + case 5141: + goto tr5054 + case 5142: + goto tr5054 + case 5143: + goto tr5054 + case 5144: + goto tr5054 + case 5145: + goto tr5054 + case 5146: + goto tr5054 + case 5147: + goto tr5054 + case 5148: + goto tr5054 + case 5149: + goto tr5054 + case 5150: + goto tr5054 + case 5151: + goto tr5054 + case 5152: + goto tr5054 + case 4473: + goto tr0 + case 5153: + goto tr5054 + case 5154: + goto tr5054 + case 5155: + goto tr5054 + case 5156: + goto tr5054 + case 5157: + goto tr5054 + case 5158: + goto tr5054 + case 5159: + goto tr5054 + case 5160: + goto tr5054 + case 5161: + goto tr5054 + case 5162: + goto tr5054 + case 5163: + goto tr5054 + case 5164: + goto tr5054 + case 5165: + goto tr5054 + case 5166: + goto tr5054 + case 5167: + goto tr5054 + case 5168: + goto tr5054 + case 5169: + goto tr5054 + case 5170: + goto tr5054 + case 5171: + goto tr5054 + case 5172: + goto tr5054 + case 5173: + goto tr5054 + case 4474: + goto tr0 + case 5174: + goto tr5054 + case 5175: + goto tr5054 + case 5176: + goto tr5054 + case 5177: + goto tr5054 + case 5178: + goto tr5054 + case 5179: + goto tr5054 + case 4475: + goto tr0 + case 5180: + goto tr5054 + case 5181: + goto tr5054 + case 4476: + goto tr0 + case 5182: + goto tr5054 + case 5183: + goto tr5054 + case 5184: + goto tr5054 + case 5185: + goto tr5054 + case 5186: + goto tr5054 + case 5187: + goto tr5054 + case 5188: + goto tr5054 + case 5189: + goto tr5054 + case 5190: + goto tr5054 + case 5191: + goto tr5054 + case 5192: + goto tr5054 + case 5193: + goto tr5054 + case 5194: + goto tr5054 + case 5195: + goto tr5054 + case 5196: + goto tr5054 + case 4477: + goto tr0 + case 5197: + goto tr5054 + case 5198: + goto tr5054 + case 5199: + goto tr5054 + case 4478: + goto tr0 + case 5200: + goto tr5054 + case 5201: + goto tr5054 + case 5202: + goto tr5054 + case 5203: + goto tr5054 + case 5204: + goto tr5054 + case 5205: + goto tr5054 + case 4479: + goto tr0 + case 5206: + goto tr5054 + case 5207: + goto tr4499 + case 4480: + goto tr0 + case 5208: + goto tr4499 + case 5209: + goto tr4499 + case 5210: + goto tr4499 + case 4481: + goto tr0 + case 4482: + goto tr0 + case 4483: + goto tr0 + case 4484: + goto tr0 + case 4485: + goto tr0 + case 4486: + goto tr0 + case 4487: + goto tr0 + case 4488: + goto tr0 + case 4489: + goto tr0 + case 4490: + goto tr0 + case 4491: + goto tr0 + case 4492: + goto tr0 + case 4493: + goto tr0 + case 4494: + goto tr0 + case 4495: + goto tr0 + case 5211: + goto tr5002 + case 4496: + goto tr2985 + case 4497: + goto tr2985 + case 4498: + goto tr2985 + case 4499: + goto tr2985 + case 4500: + goto tr2985 + case 4501: + goto tr2985 + case 4502: + goto tr2985 + case 4503: + goto tr2985 + case 4504: + goto tr2985 + case 4505: + goto tr2985 + case 4506: + goto tr2985 + case 4507: + goto tr2985 + case 4508: + goto tr2985 + case 4509: + goto tr2985 + case 4510: + goto tr2985 + case 4511: + goto tr2985 + case 4512: + goto tr2985 + case 4513: + goto tr2985 + case 4514: + goto tr2985 + case 4515: + goto tr2985 + case 4516: + goto tr2985 + case 4517: + goto tr2985 + case 4518: + goto tr2985 + case 4519: + goto tr2985 + case 4520: + goto tr2985 + case 4521: + goto tr2985 + case 4522: + goto tr2985 + case 4523: + goto tr2985 + case 4524: + goto tr2985 + case 4525: + goto tr2985 + case 4526: + goto tr2985 + case 4527: + goto tr2985 + case 4528: + goto tr2985 + case 4529: + goto tr2985 + case 4530: + goto tr2985 + case 4531: + goto tr2985 + case 4532: + goto tr2985 + case 4533: + goto tr2985 + case 4534: + goto tr2985 + case 4535: + goto tr2985 + case 4536: + goto tr2985 + case 4537: + goto tr2985 + case 4538: + goto tr2985 + case 4539: + goto tr2985 + case 4540: + goto tr2985 + case 4541: + goto tr2985 + case 4542: + goto tr2985 + case 4543: + goto tr2985 + case 4544: + goto tr2985 + case 4545: + goto tr2985 + case 4546: + goto tr2985 + case 4547: + goto tr2985 + case 4548: + goto tr2985 + case 4549: + goto tr2985 + case 4550: + goto tr2985 + case 4551: + goto tr2985 + case 4552: + goto tr2985 + case 4553: + goto tr2985 + case 4554: + goto tr2985 + case 4555: + goto tr2985 + case 4556: + goto tr2985 + case 4557: + goto tr2985 + case 4558: + goto tr2985 + case 4559: + goto tr2985 + case 4560: + goto tr2985 + case 4561: + goto tr2985 + case 4562: + goto tr2985 + case 4563: + goto tr2985 + case 4564: + goto tr2985 + case 4565: + goto tr2985 + case 4566: + goto tr2985 + case 4567: + goto tr2985 + case 4568: + goto tr2985 + case 4569: + goto tr2985 + case 4570: + goto tr2985 + case 4571: + goto tr2985 + case 4572: + goto tr2985 + case 4573: + goto tr2985 + case 4574: + goto tr2985 + case 4575: + goto tr2985 + case 4576: + goto tr2985 + case 4577: + goto tr2985 + case 4578: + goto tr2985 + case 4579: + goto tr2985 + case 4580: + goto tr2985 + case 4581: + goto tr2985 + case 4582: + goto tr2985 + case 4583: + goto tr2985 + case 4584: + goto tr2985 + case 4585: + goto tr2985 + case 4586: + goto tr2985 + case 4587: + goto tr2985 + case 4588: + goto tr2985 + case 4589: + goto tr2985 + case 4590: + goto tr2985 + case 4591: + goto tr2985 + case 4592: + goto tr2985 + case 4593: + goto tr2985 + case 4594: + goto tr2985 + case 4595: + goto tr2985 + case 4596: + goto tr2985 + case 4597: + goto tr2985 + case 4598: + goto tr2985 + case 4599: + goto tr2985 + case 4600: + goto tr2985 + case 4601: + goto tr2985 + case 4602: + goto tr2985 + case 4603: + goto tr2985 + case 4604: + goto tr2985 + case 4605: + goto tr2985 + case 4606: + goto tr2985 + case 4607: + goto tr2985 + case 4608: + goto tr2985 + case 4609: + goto tr2985 + case 4610: + goto tr2985 + case 4611: + goto tr2985 + case 4612: + goto tr2985 + case 4613: + goto tr2985 + case 4614: + goto tr2985 + case 4615: + goto tr2985 + case 4616: + goto tr2985 + case 4617: + goto tr2985 + case 4618: + goto tr2985 + case 4619: + goto tr2985 + case 4620: + goto tr2985 + case 4621: + goto tr2985 + case 4622: + goto tr2985 + case 4623: + goto tr2985 + case 4624: + goto tr2985 + case 4625: + goto tr2985 + case 4626: + goto tr2985 + case 4627: + goto tr2985 + case 4628: + goto tr2985 + case 4629: + goto tr2985 + case 4630: + goto tr2985 + case 4631: + goto tr2985 + case 4632: + goto tr2985 + case 4633: + goto tr2985 + case 4634: + goto tr2985 + case 4635: + goto tr2985 + case 4636: + goto tr2985 + case 4637: + goto tr2985 + case 4638: + goto tr2985 + case 4639: + goto tr2985 + case 4640: + goto tr2985 + case 4641: + goto tr2985 + case 4642: + goto tr2985 + case 4643: + goto tr0 + case 4644: + goto tr0 + case 4645: + goto tr0 + case 4646: + goto tr0 + case 4647: + goto tr0 + case 4648: + goto tr0 + case 4649: + goto tr0 + case 4650: + goto tr0 + case 4651: + goto tr0 + case 4652: + goto tr0 + case 4653: + goto tr0 + case 4654: + goto tr0 + case 4655: + goto tr0 + case 5212: + goto tr5002 + case 5213: + goto tr5002 + case 5214: + goto tr5002 + case 5215: + goto tr4499 + case 5216: + goto tr4499 + case 5217: + goto tr5002 + case 5218: + goto tr5002 + case 5219: + goto tr4499 + case 5220: + goto tr4499 + case 5221: + goto tr4499 + case 5222: + goto tr4499 + case 5223: + goto tr4499 + case 5224: + goto tr4499 + case 5225: + goto tr4499 + case 5226: + goto tr4499 + case 5227: + goto tr5002 + case 5228: + goto tr5002 + case 5229: + goto tr5002 + case 5230: + goto tr5002 + case 5231: + goto tr5002 + case 5232: + goto tr5002 + case 5233: + goto tr5002 + case 5234: + goto tr5002 + case 5235: + goto tr4499 + case 5236: + goto tr4499 + case 5237: + goto tr4499 + case 5238: + goto tr4499 + case 5239: + goto tr4499 + case 5240: + goto tr4499 + case 5241: + goto tr4499 + case 5242: + goto tr4499 + case 4656: + goto tr0 + case 5243: + goto tr5002 + case 5244: + goto tr5002 + case 5245: + goto tr5002 + case 5246: + goto tr5002 + case 5247: + goto tr5002 + case 5248: + goto tr5002 + case 5249: + goto tr5002 + case 5250: + goto tr4499 + case 4657: + goto tr0 + case 5251: + goto tr5002 + case 5252: + goto tr5002 + case 5253: + goto tr5002 + case 5254: + goto tr5002 + case 5255: + goto tr5002 + case 5256: + goto tr5002 + case 4658: + goto tr0 + case 5257: + goto tr5002 + case 5258: + goto tr5002 + case 4659: + goto tr0 + case 5259: + goto tr5002 + case 5260: + goto tr5002 + case 5261: + goto tr5002 + case 5262: + goto tr5002 + case 5263: + goto tr5002 + case 5264: + goto tr4499 + case 5265: + goto tr4499 + case 5266: + goto tr4499 + case 5267: + goto tr4499 + case 5268: + goto tr5002 + case 5269: + goto tr5002 + case 5270: + goto tr5002 + case 5271: + goto tr5002 + case 5272: + goto tr5002 + case 5273: + goto tr5002 + case 5274: + goto tr5002 + case 5275: + goto tr5002 + case 5276: + goto tr5002 + case 5277: + goto tr5002 + case 4660: + goto tr0 + case 5278: + goto tr5002 + case 5279: + goto tr5002 + case 5280: + goto tr5002 + case 4661: + goto tr0 + case 5281: + goto tr5002 + case 5282: + goto tr5002 + case 5283: + goto tr5002 + case 5284: + goto tr5002 + case 5285: + goto tr5002 + case 5286: + goto tr5002 + case 4662: + goto tr0 + case 5287: + goto tr5002 + case 5288: + goto tr5002 + case 5289: + goto tr5002 + case 5290: + goto tr5002 + case 5291: + goto tr5002 + case 5292: + goto tr5002 + case 5293: + goto tr5002 + case 5294: + goto tr5002 + case 5295: + goto tr5002 + case 5296: + goto tr5002 + case 5297: + goto tr5002 + case 5298: + goto tr5002 + case 5299: + goto tr5002 + case 5300: + goto tr5002 + case 5301: + goto tr5002 + case 5302: + goto tr5002 + case 5303: + goto tr5002 + case 5304: + goto tr5002 + case 5305: + goto tr5002 + case 5306: + goto tr5002 + case 5307: + goto tr5002 + case 5308: + goto tr5002 + case 5309: + goto tr5002 + case 5310: + goto tr5002 + case 5311: + goto tr5002 + case 5312: + goto tr5002 + case 5313: + goto tr5002 + case 5314: + goto tr5002 + case 5315: + goto tr5002 + case 5316: + goto tr5002 + case 5317: + goto tr5002 + case 5318: + goto tr5002 + case 5319: + goto tr5002 + case 5320: + goto tr5002 + case 5321: + goto tr5002 + case 5322: + goto tr5002 + case 5323: + goto tr5002 + case 5324: + goto tr5002 + case 5325: + goto tr5002 + case 5326: + goto tr5002 + case 5327: + goto tr5002 + case 5328: + goto tr5002 + case 5329: + goto tr5002 + case 5330: + goto tr5002 + case 5331: + goto tr5002 + case 5332: + goto tr5002 + case 5333: + goto tr5002 + case 5334: + goto tr5002 + case 5335: + goto tr5002 + case 5336: + goto tr5002 + case 5337: + goto tr5002 + case 5338: + goto tr4499 + case 4663: + goto tr0 + case 4664: + goto tr0 + case 4665: + goto tr0 + case 4666: + goto tr0 + case 4667: + goto tr0 + case 4668: + goto tr0 + case 4669: + goto tr0 + case 4670: + goto tr0 + case 5339: + goto tr4499 + case 4671: + goto tr0 + case 4672: + goto tr0 + case 4673: + goto tr0 + case 4674: + goto tr0 + case 4675: + goto tr0 + case 4676: + goto tr0 + case 4677: + goto tr0 + case 4678: + goto tr0 + case 4679: + goto tr0 + case 4680: + goto tr0 + case 4681: + goto tr0 + case 4682: + goto tr0 + case 4683: + goto tr0 + case 4684: + goto tr0 + case 4685: + goto tr0 + case 4686: + goto tr0 + case 4687: + goto tr0 + case 4688: + goto tr0 + case 4689: + goto tr0 + case 4690: + goto tr0 + case 4691: + goto tr0 + case 4692: + goto tr0 + case 4693: + goto tr0 + case 4694: + goto tr0 + case 4695: + goto tr0 + case 4696: + goto tr0 + case 4697: + goto tr0 + case 4698: + goto tr0 + case 4699: + goto tr0 + case 4700: + goto tr0 + case 4701: + goto tr0 + case 4702: + goto tr0 + case 4703: + goto tr0 + case 4704: + goto tr0 + case 4705: + goto tr0 + case 4706: + goto tr0 + case 4707: + goto tr2 + case 5340: + goto tr5359 + case 4708: + goto tr4328 + case 4709: + goto tr4328 + case 4710: + goto tr4328 + case 4711: + goto tr4328 + case 4712: + goto tr4328 + case 4713: + goto tr4328 + case 4714: + goto tr4328 + case 4715: + goto tr4328 + case 4716: + goto tr4328 + case 4717: + goto tr4328 + case 4718: + goto tr4328 + case 4719: + goto tr4328 + case 4720: + goto tr4328 + case 4721: + goto tr4328 + case 4722: + goto tr4328 + case 4723: + goto tr4328 + case 4724: + goto tr4328 + case 4725: + goto tr4328 + case 4726: + goto tr4328 + case 4727: + goto tr4328 + case 4728: + goto tr4328 + case 4729: + goto tr4328 + case 4730: + goto tr4328 + case 4731: + goto tr4328 + case 4732: + goto tr4328 + case 4733: + goto tr4328 + case 4734: + goto tr4328 + case 4735: + goto tr4328 + case 4736: + goto tr4328 + case 4737: + goto tr4328 + case 4738: + goto tr4328 + case 4739: + goto tr4328 + case 4740: + goto tr4328 + case 4741: + goto tr4328 + case 4742: + goto tr4328 + case 4743: + goto tr4328 + case 4744: + goto tr4328 + case 4745: + goto tr4328 + case 4746: + goto tr4328 + case 4747: + goto tr4328 + case 4748: + goto tr4328 + case 4749: + goto tr4328 + case 4750: + goto tr4328 + case 4751: + goto tr4328 + case 4752: + goto tr4328 + case 4753: + goto tr4328 + case 4754: + goto tr4328 + case 4755: + goto tr4328 + case 4756: + goto tr4328 + case 4757: + goto tr4328 + case 4758: + goto tr4328 + case 4759: + goto tr4328 + case 4760: + goto tr4328 + case 4761: + goto tr4328 + case 4762: + goto tr4328 + case 4763: + goto tr4328 + case 4764: + goto tr4328 + case 4765: + goto tr4328 + case 4766: + goto tr4328 + case 4767: + goto tr4328 + case 4768: + goto tr4328 + case 4769: + goto tr4328 + case 4770: + goto tr4328 + case 4771: + goto tr4328 + case 4772: + goto tr4328 + case 4773: + goto tr4328 + case 4774: + goto tr4328 + case 4775: + goto tr4328 + case 4776: + goto tr4328 + case 4777: + goto tr4328 + case 4778: + goto tr4328 + case 4779: + goto tr4328 + case 4780: + goto tr4328 + case 4781: + goto tr4328 + case 4782: + goto tr4328 + case 4783: + goto tr4328 + case 4784: + goto tr4328 + case 4785: + goto tr4328 + case 4786: + goto tr4328 + case 4787: + goto tr4328 + case 4788: + goto tr4328 + case 4789: + goto tr4328 + case 4790: + goto tr4328 + case 4791: + goto tr4328 + case 4792: + goto tr4328 + case 4793: + goto tr4328 + case 4794: + goto tr4328 + case 4795: + goto tr4328 + case 4796: + goto tr4328 + case 4797: + goto tr4328 + case 4798: + goto tr4328 + case 4799: + goto tr4328 + case 4800: + goto tr4328 + case 4801: + goto tr4328 + case 4802: + goto tr4328 + case 4803: + goto tr4328 + case 4804: + goto tr4328 + case 4805: + goto tr4328 + case 4806: + goto tr4328 + case 4807: + goto tr4328 + case 4808: + goto tr4328 + case 4809: + goto tr4328 + case 4810: + goto tr4328 + case 4811: + goto tr4328 + case 4812: + goto tr4328 + case 4813: + goto tr4328 + case 4814: + goto tr4328 + case 4815: + goto tr4328 + case 4816: + goto tr4328 + case 4817: + goto tr4328 + case 4818: + goto tr4328 + case 4819: + goto tr4328 + case 4820: + goto tr4328 + case 4821: + goto tr4328 + case 4822: + goto tr4328 + case 4823: + goto tr4328 + case 4824: + goto tr4328 + case 4825: + goto tr4328 + case 4826: + goto tr4328 + case 4827: + goto tr4328 + case 4828: + goto tr4328 + case 4829: + goto tr4328 + case 4830: + goto tr4328 + case 4831: + goto tr4328 + case 4832: + goto tr4328 + case 4833: + goto tr4328 + case 4834: + goto tr4328 + case 4835: + goto tr4328 + case 4836: + goto tr4328 + case 4837: + goto tr4328 + case 4838: + goto tr4328 + case 4839: + goto tr4328 + case 4840: + goto tr4328 + case 4841: + goto tr4328 + case 4842: + goto tr4328 + case 4843: + goto tr4328 + case 4844: + goto tr4328 + case 4845: + goto tr4328 + case 4846: + goto tr4328 + case 4847: + goto tr4328 + case 4848: + goto tr4328 + case 4849: + goto tr4328 + case 4850: + goto tr0 + case 4851: + goto tr0 + case 4852: + goto tr0 + case 4853: + goto tr0 + case 4854: + goto tr0 + case 4855: + goto tr0 + case 4856: + goto tr0 + case 4857: + goto tr0 + case 4858: + goto tr0 + case 4859: + goto tr0 + case 4860: + goto tr0 + case 4861: + goto tr0 + case 4862: +//line segment_words.rl:68 + startPos = p + +//line segment_words_prod.go:173630 + } } - } } //line segment_words.rl:278 + if cs < s_first_final { + return val, types, totalConsumed, ParseError + } - - if cs < s_first_final { - return val, types, totalConsumed, ParseError - } - - return val, types, totalConsumed, nil + return val, types, totalConsumed, nil } diff --git a/vendor/github.com/blevesearch/snowballstem/COPYING b/vendor/github.com/blevesearch/snowballstem/COPYING deleted file mode 100644 index f36607f..0000000 --- a/vendor/github.com/blevesearch/snowballstem/COPYING +++ /dev/null @@ -1,29 +0,0 @@ -Copyright (c) 2001, Dr Martin Porter -Copyright (c) 2004,2005, Richard Boulton -Copyright (c) 2013, Yoshiki Shibukawa -Copyright (c) 2006,2007,2009,2010,2011,2014-2019, Olly Betts -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the Snowball project nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/blevesearch/snowballstem/README.md b/vendor/github.com/blevesearch/snowballstem/README.md deleted file mode 100644 index bb4ff8a..0000000 --- a/vendor/github.com/blevesearch/snowballstem/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# snowballstem - -This repository contains the Go stemmers generated by the [Snowball](https://github.com/snowballstem/snowball) project. They are maintained outside of the core bleve package so that they may be more easily be reused in other contexts. - -## Usage - -All these stemmers export a single `Stem()` method which operates on a snowball `Env` structure. The `Env` structure maintains all state for the stemmer. A new `Env` is created to point at an initial string. After stemming, the results of the `Stem()` operation can be retrieved using the `Current()` method. The `Env` structure can be reused for subsequent calls by using the `SetCurrent()` method. - -## Example - -``` -package main - -import ( - "fmt" - - "github.com/blevesearch/snowballstem" - "github.com/blevesearch/snowballstem/english" -) - -func main() { - - // words to stem - words := []string{ - "running", - "jumping", - } - - // build new environment - env := snowballstem.NewEnv("") - - for _, word := range words { - // set up environment for word - env.SetCurrent(word) - // invoke stemmer - english.Stem(env) - // print results - fmt.Printf("%s stemmed to %s\n", word, env.Current()) - } -} -``` -Produces Output: -``` -$ ./snowtest -running stemmed to run -jumping stemmed to jump -``` - -## Testing - -The test harness for these stemmers is hosted in the main [Snowball](https://github.com/snowballstem/snowball) repository. There are functional tests built around the separate [snowballstem-data](https://github.com/snowballstem/snowball-data) repository, and there is support for fuzz-testing the stemmers there as well. - -## Generating the Stemmers - -``` -$ export SNOWBALL=/path/to/github.com/snowballstem/snowball/after/snowball/built -$ go generate -``` - -## Updated the Go Generate Commands - -A simple tool is provided to automate these from the snowball algorithms directory: - -``` -$ go run gengen.go /path/to/github.com/snowballstem/snowball/algorithms -``` diff --git a/vendor/github.com/blevesearch/snowballstem/among.go b/vendor/github.com/blevesearch/snowballstem/among.go deleted file mode 100644 index 1a0c702..0000000 --- a/vendor/github.com/blevesearch/snowballstem/among.go +++ /dev/null @@ -1,16 +0,0 @@ -package snowballstem - -import "fmt" - -type AmongF func(env *Env, ctx interface{}) bool - -type Among struct { - Str string - A int32 - B int32 - F AmongF -} - -func (a *Among) String() string { - return fmt.Sprintf("str: `%s`, a: %d, b: %d, f: %p", a.Str, a.A, a.B, a.F) -} diff --git a/vendor/github.com/blevesearch/snowballstem/english/english_stemmer.go b/vendor/github.com/blevesearch/snowballstem/english/english_stemmer.go deleted file mode 100644 index 87e1d48..0000000 --- a/vendor/github.com/blevesearch/snowballstem/english/english_stemmer.go +++ /dev/null @@ -1,1341 +0,0 @@ -//! This file was generated automatically by the Snowball to Go compiler -//! http://snowballstem.org/ - -package english - -import ( - snowballRuntime "github.com/blevesearch/snowballstem" -) - -var A_0 = []*snowballRuntime.Among{ - {Str: "arsen", A: -1, B: -1, F: nil}, - {Str: "commun", A: -1, B: -1, F: nil}, - {Str: "gener", A: -1, B: -1, F: nil}, -} - -var A_1 = []*snowballRuntime.Among{ - {Str: "'", A: -1, B: 1, F: nil}, - {Str: "'s'", A: 0, B: 1, F: nil}, - {Str: "'s", A: -1, B: 1, F: nil}, -} - -var A_2 = []*snowballRuntime.Among{ - {Str: "ied", A: -1, B: 2, F: nil}, - {Str: "s", A: -1, B: 3, F: nil}, - {Str: "ies", A: 1, B: 2, F: nil}, - {Str: "sses", A: 1, B: 1, F: nil}, - {Str: "ss", A: 1, B: -1, F: nil}, - {Str: "us", A: 1, B: -1, F: nil}, -} - -var A_3 = []*snowballRuntime.Among{ - {Str: "", A: -1, B: 3, F: nil}, - {Str: "bb", A: 0, B: 2, F: nil}, - {Str: "dd", A: 0, B: 2, F: nil}, - {Str: "ff", A: 0, B: 2, F: nil}, - {Str: "gg", A: 0, B: 2, F: nil}, - {Str: "bl", A: 0, B: 1, F: nil}, - {Str: "mm", A: 0, B: 2, F: nil}, - {Str: "nn", A: 0, B: 2, F: nil}, - {Str: "pp", A: 0, B: 2, F: nil}, - {Str: "rr", A: 0, B: 2, F: nil}, - {Str: "at", A: 0, B: 1, F: nil}, - {Str: "tt", A: 0, B: 2, F: nil}, - {Str: "iz", A: 0, B: 1, F: nil}, -} - -var A_4 = []*snowballRuntime.Among{ - {Str: "ed", A: -1, B: 2, F: nil}, - {Str: "eed", A: 0, B: 1, F: nil}, - {Str: "ing", A: -1, B: 2, F: nil}, - {Str: "edly", A: -1, B: 2, F: nil}, - {Str: "eedly", A: 3, B: 1, F: nil}, - {Str: "ingly", A: -1, B: 2, F: nil}, -} - -var A_5 = []*snowballRuntime.Among{ - {Str: "anci", A: -1, B: 3, F: nil}, - {Str: "enci", A: -1, B: 2, F: nil}, - {Str: "ogi", A: -1, B: 13, F: nil}, - {Str: "li", A: -1, B: 16, F: nil}, - {Str: "bli", A: 3, B: 12, F: nil}, - {Str: "abli", A: 4, B: 4, F: nil}, - {Str: "alli", A: 3, B: 8, F: nil}, - {Str: "fulli", A: 3, B: 14, F: nil}, - {Str: "lessli", A: 3, B: 15, F: nil}, - {Str: "ousli", A: 3, B: 10, F: nil}, - {Str: "entli", A: 3, B: 5, F: nil}, - {Str: "aliti", A: -1, B: 8, F: nil}, - {Str: "biliti", A: -1, B: 12, F: nil}, - {Str: "iviti", A: -1, B: 11, F: nil}, - {Str: "tional", A: -1, B: 1, F: nil}, - {Str: "ational", A: 14, B: 7, F: nil}, - {Str: "alism", A: -1, B: 8, F: nil}, - {Str: "ation", A: -1, B: 7, F: nil}, - {Str: "ization", A: 17, B: 6, F: nil}, - {Str: "izer", A: -1, B: 6, F: nil}, - {Str: "ator", A: -1, B: 7, F: nil}, - {Str: "iveness", A: -1, B: 11, F: nil}, - {Str: "fulness", A: -1, B: 9, F: nil}, - {Str: "ousness", A: -1, B: 10, F: nil}, -} - -var A_6 = []*snowballRuntime.Among{ - {Str: "icate", A: -1, B: 4, F: nil}, - {Str: "ative", A: -1, B: 6, F: nil}, - {Str: "alize", A: -1, B: 3, F: nil}, - {Str: "iciti", A: -1, B: 4, F: nil}, - {Str: "ical", A: -1, B: 4, F: nil}, - {Str: "tional", A: -1, B: 1, F: nil}, - {Str: "ational", A: 5, B: 2, F: nil}, - {Str: "ful", A: -1, B: 5, F: nil}, - {Str: "ness", A: -1, B: 5, F: nil}, -} - -var A_7 = []*snowballRuntime.Among{ - {Str: "ic", A: -1, B: 1, F: nil}, - {Str: "ance", A: -1, B: 1, F: nil}, - {Str: "ence", A: -1, B: 1, F: nil}, - {Str: "able", A: -1, B: 1, F: nil}, - {Str: "ible", A: -1, B: 1, F: nil}, - {Str: "ate", A: -1, B: 1, F: nil}, - {Str: "ive", A: -1, B: 1, F: nil}, - {Str: "ize", A: -1, B: 1, F: nil}, - {Str: "iti", A: -1, B: 1, F: nil}, - {Str: "al", A: -1, B: 1, F: nil}, - {Str: "ism", A: -1, B: 1, F: nil}, - {Str: "ion", A: -1, B: 2, F: nil}, - {Str: "er", A: -1, B: 1, F: nil}, - {Str: "ous", A: -1, B: 1, F: nil}, - {Str: "ant", A: -1, B: 1, F: nil}, - {Str: "ent", A: -1, B: 1, F: nil}, - {Str: "ment", A: 15, B: 1, F: nil}, - {Str: "ement", A: 16, B: 1, F: nil}, -} - -var A_8 = []*snowballRuntime.Among{ - {Str: "e", A: -1, B: 1, F: nil}, - {Str: "l", A: -1, B: 2, F: nil}, -} - -var A_9 = []*snowballRuntime.Among{ - {Str: "succeed", A: -1, B: -1, F: nil}, - {Str: "proceed", A: -1, B: -1, F: nil}, - {Str: "exceed", A: -1, B: -1, F: nil}, - {Str: "canning", A: -1, B: -1, F: nil}, - {Str: "inning", A: -1, B: -1, F: nil}, - {Str: "earring", A: -1, B: -1, F: nil}, - {Str: "herring", A: -1, B: -1, F: nil}, - {Str: "outing", A: -1, B: -1, F: nil}, -} - -var A_10 = []*snowballRuntime.Among{ - {Str: "andes", A: -1, B: -1, F: nil}, - {Str: "atlas", A: -1, B: -1, F: nil}, - {Str: "bias", A: -1, B: -1, F: nil}, - {Str: "cosmos", A: -1, B: -1, F: nil}, - {Str: "dying", A: -1, B: 3, F: nil}, - {Str: "early", A: -1, B: 9, F: nil}, - {Str: "gently", A: -1, B: 7, F: nil}, - {Str: "howe", A: -1, B: -1, F: nil}, - {Str: "idly", A: -1, B: 6, F: nil}, - {Str: "lying", A: -1, B: 4, F: nil}, - {Str: "news", A: -1, B: -1, F: nil}, - {Str: "only", A: -1, B: 10, F: nil}, - {Str: "singly", A: -1, B: 11, F: nil}, - {Str: "skies", A: -1, B: 2, F: nil}, - {Str: "skis", A: -1, B: 1, F: nil}, - {Str: "sky", A: -1, B: -1, F: nil}, - {Str: "tying", A: -1, B: 5, F: nil}, - {Str: "ugly", A: -1, B: 8, F: nil}, -} - -var G_v = []byte{17, 65, 16, 1} - -var G_v_WXY = []byte{1, 17, 65, 208, 1} - -var G_valid_LI = []byte{55, 141, 2} - -type Context struct { - b_Y_found bool - i_p2 int - i_p1 int -} - -func r_prelude(env *snowballRuntime.Env, ctx interface{}) bool { - context := ctx.(*Context) - _ = context - // (, line 25 - // unset Y_found, line 26 - context.b_Y_found = false - // do, line 27 - var v_1 = env.Cursor -lab0: - for { - // (, line 27 - // [, line 27 - env.Bra = env.Cursor - // literal, line 27 - if !env.EqS("'") { - break lab0 - } - // ], line 27 - env.Ket = env.Cursor - // delete, line 27 - if !env.SliceDel() { - return false - } - break lab0 - } - env.Cursor = v_1 - // do, line 28 - var v_2 = env.Cursor -lab1: - for { - // (, line 28 - // [, line 28 - env.Bra = env.Cursor - // literal, line 28 - if !env.EqS("y") { - break lab1 - } - // ], line 28 - env.Ket = env.Cursor - // <-, line 28 - if !env.SliceFrom("Y") { - return false - } - // set Y_found, line 28 - context.b_Y_found = true - break lab1 - } - env.Cursor = v_2 - // do, line 29 - var v_3 = env.Cursor -lab2: - for { - // repeat, line 29 - replab3: - for { - var v_4 = env.Cursor - lab4: - for range [2]struct{}{} { - // (, line 29 - // goto, line 29 - golab5: - for { - var v_5 = env.Cursor - lab6: - for { - // (, line 29 - if !env.InGrouping(G_v, 97, 121) { - break lab6 - } - // [, line 29 - env.Bra = env.Cursor - // literal, line 29 - if !env.EqS("y") { - break lab6 - } - // ], line 29 - env.Ket = env.Cursor - env.Cursor = v_5 - break golab5 - } - env.Cursor = v_5 - if env.Cursor >= env.Limit { - break lab4 - } - env.NextChar() - } - // <-, line 29 - if !env.SliceFrom("Y") { - return false - } - // set Y_found, line 29 - context.b_Y_found = true - continue replab3 - } - env.Cursor = v_4 - break replab3 - } - break lab2 - } - env.Cursor = v_3 - return true -} - -func r_mark_regions(env *snowballRuntime.Env, ctx interface{}) bool { - context := ctx.(*Context) - _ = context - // (, line 32 - context.i_p1 = env.Limit - context.i_p2 = env.Limit - // do, line 35 - var v_1 = env.Cursor -lab0: - for { - // (, line 35 - // or, line 41 - lab1: - for { - var v_2 = env.Cursor - lab2: - for { - // among, line 36 - if env.FindAmong(A_0, context) == 0 { - break lab2 - } - break lab1 - } - env.Cursor = v_2 - // (, line 41 - // gopast, line 41 - golab3: - for { - lab4: - for { - if !env.InGrouping(G_v, 97, 121) { - break lab4 - } - break golab3 - } - if env.Cursor >= env.Limit { - break lab0 - } - env.NextChar() - } - // gopast, line 41 - golab5: - for { - lab6: - for { - if !env.OutGrouping(G_v, 97, 121) { - break lab6 - } - break golab5 - } - if env.Cursor >= env.Limit { - break lab0 - } - env.NextChar() - } - break lab1 - } - // setmark p1, line 42 - context.i_p1 = env.Cursor - // gopast, line 43 - golab7: - for { - lab8: - for { - if !env.InGrouping(G_v, 97, 121) { - break lab8 - } - break golab7 - } - if env.Cursor >= env.Limit { - break lab0 - } - env.NextChar() - } - // gopast, line 43 - golab9: - for { - lab10: - for { - if !env.OutGrouping(G_v, 97, 121) { - break lab10 - } - break golab9 - } - if env.Cursor >= env.Limit { - break lab0 - } - env.NextChar() - } - // setmark p2, line 43 - context.i_p2 = env.Cursor - break lab0 - } - env.Cursor = v_1 - return true -} - -func r_shortv(env *snowballRuntime.Env, ctx interface{}) bool { - context := ctx.(*Context) - _ = context - // (, line 49 - // or, line 51 -lab0: - for { - var v_1 = env.Limit - env.Cursor - lab1: - for { - // (, line 50 - if !env.OutGroupingB(G_v_WXY, 89, 121) { - break lab1 - } - if !env.InGroupingB(G_v, 97, 121) { - break lab1 - } - if !env.OutGroupingB(G_v, 97, 121) { - break lab1 - } - break lab0 - } - env.Cursor = env.Limit - v_1 - // (, line 52 - if !env.OutGroupingB(G_v, 97, 121) { - return false - } - if !env.InGroupingB(G_v, 97, 121) { - return false - } - // atlimit, line 52 - if env.Cursor > env.LimitBackward { - return false - } - break lab0 - } - return true -} - -func r_R1(env *snowballRuntime.Env, ctx interface{}) bool { - context := ctx.(*Context) - _ = context - if !(context.i_p1 <= env.Cursor) { - return false - } - return true -} - -func r_R2(env *snowballRuntime.Env, ctx interface{}) bool { - context := ctx.(*Context) - _ = context - if !(context.i_p2 <= env.Cursor) { - return false - } - return true -} - -func r_Step_1a(env *snowballRuntime.Env, ctx interface{}) bool { - context := ctx.(*Context) - _ = context - var among_var int32 - // (, line 58 - // try, line 59 - var v_1 = env.Limit - env.Cursor -lab0: - for { - // (, line 59 - // [, line 60 - env.Ket = env.Cursor - // substring, line 60 - among_var = env.FindAmongB(A_1, context) - if among_var == 0 { - env.Cursor = env.Limit - v_1 - break lab0 - } - // ], line 60 - env.Bra = env.Cursor - if among_var == 0 { - env.Cursor = env.Limit - v_1 - break lab0 - } else if among_var == 1 { - // (, line 62 - // delete, line 62 - if !env.SliceDel() { - return false - } - } - break lab0 - } - // [, line 65 - env.Ket = env.Cursor - // substring, line 65 - among_var = env.FindAmongB(A_2, context) - if among_var == 0 { - return false - } - // ], line 65 - env.Bra = env.Cursor - if among_var == 0 { - return false - } else if among_var == 1 { - // (, line 66 - // <-, line 66 - if !env.SliceFrom("ss") { - return false - } - } else if among_var == 2 { - // (, line 68 - // or, line 68 - lab1: - for { - var v_2 = env.Limit - env.Cursor - lab2: - for { - // (, line 68 - { - // hop, line 68 - var c = env.ByteIndexForHop(-(2)) - if int32(env.LimitBackward) > c || c > int32(env.Limit) { - break lab2 - } - env.Cursor = int(c) - } - // <-, line 68 - if !env.SliceFrom("i") { - return false - } - break lab1 - } - env.Cursor = env.Limit - v_2 - // <-, line 68 - if !env.SliceFrom("ie") { - return false - } - break lab1 - } - } else if among_var == 3 { - // (, line 69 - // next, line 69 - if env.Cursor <= env.LimitBackward { - return false - } - env.PrevChar() - // gopast, line 69 - golab3: - for { - lab4: - for { - if !env.InGroupingB(G_v, 97, 121) { - break lab4 - } - break golab3 - } - if env.Cursor <= env.LimitBackward { - return false - } - env.PrevChar() - } - // delete, line 69 - if !env.SliceDel() { - return false - } - } - return true -} - -func r_Step_1b(env *snowballRuntime.Env, ctx interface{}) bool { - context := ctx.(*Context) - _ = context - var among_var int32 - // (, line 74 - // [, line 75 - env.Ket = env.Cursor - // substring, line 75 - among_var = env.FindAmongB(A_4, context) - if among_var == 0 { - return false - } - // ], line 75 - env.Bra = env.Cursor - if among_var == 0 { - return false - } else if among_var == 1 { - // (, line 77 - // call R1, line 77 - if !r_R1(env, context) { - return false - } - // <-, line 77 - if !env.SliceFrom("ee") { - return false - } - } else if among_var == 2 { - // (, line 79 - // test, line 80 - var v_1 = env.Limit - env.Cursor - // gopast, line 80 - golab0: - for { - lab1: - for { - if !env.InGroupingB(G_v, 97, 121) { - break lab1 - } - break golab0 - } - if env.Cursor <= env.LimitBackward { - return false - } - env.PrevChar() - } - env.Cursor = env.Limit - v_1 - // delete, line 80 - if !env.SliceDel() { - return false - } - // test, line 81 - var v_3 = env.Limit - env.Cursor - // substring, line 81 - among_var = env.FindAmongB(A_3, context) - if among_var == 0 { - return false - } - env.Cursor = env.Limit - v_3 - if among_var == 0 { - return false - } else if among_var == 1 { - // (, line 83 - { - // <+, line 83 - var c = env.Cursor - bra, ket := env.Cursor, env.Cursor - env.Insert(bra, ket, "e") - env.Cursor = c - } - } else if among_var == 2 { - // (, line 86 - // [, line 86 - env.Ket = env.Cursor - // next, line 86 - if env.Cursor <= env.LimitBackward { - return false - } - env.PrevChar() - // ], line 86 - env.Bra = env.Cursor - // delete, line 86 - if !env.SliceDel() { - return false - } - } else if among_var == 3 { - // (, line 87 - // atmark, line 87 - if env.Cursor != context.i_p1 { - return false - } - // test, line 87 - var v_4 = env.Limit - env.Cursor - // call shortv, line 87 - if !r_shortv(env, context) { - return false - } - env.Cursor = env.Limit - v_4 - { - // <+, line 87 - var c = env.Cursor - bra, ket := env.Cursor, env.Cursor - env.Insert(bra, ket, "e") - env.Cursor = c - } - } - } - return true -} - -func r_Step_1c(env *snowballRuntime.Env, ctx interface{}) bool { - context := ctx.(*Context) - _ = context - // (, line 93 - // [, line 94 - env.Ket = env.Cursor - // or, line 94 -lab0: - for { - var v_1 = env.Limit - env.Cursor - lab1: - for { - // literal, line 94 - if !env.EqSB("y") { - break lab1 - } - break lab0 - } - env.Cursor = env.Limit - v_1 - // literal, line 94 - if !env.EqSB("Y") { - return false - } - break lab0 - } - // ], line 94 - env.Bra = env.Cursor - if !env.OutGroupingB(G_v, 97, 121) { - return false - } - // not, line 95 - var v_2 = env.Limit - env.Cursor -lab2: - for { - // atlimit, line 95 - if env.Cursor > env.LimitBackward { - break lab2 - } - return false - } - env.Cursor = env.Limit - v_2 - // <-, line 96 - if !env.SliceFrom("i") { - return false - } - return true -} - -func r_Step_2(env *snowballRuntime.Env, ctx interface{}) bool { - context := ctx.(*Context) - _ = context - var among_var int32 - // (, line 99 - // [, line 100 - env.Ket = env.Cursor - // substring, line 100 - among_var = env.FindAmongB(A_5, context) - if among_var == 0 { - return false - } - // ], line 100 - env.Bra = env.Cursor - // call R1, line 100 - if !r_R1(env, context) { - return false - } - if among_var == 0 { - return false - } else if among_var == 1 { - // (, line 101 - // <-, line 101 - if !env.SliceFrom("tion") { - return false - } - } else if among_var == 2 { - // (, line 102 - // <-, line 102 - if !env.SliceFrom("ence") { - return false - } - } else if among_var == 3 { - // (, line 103 - // <-, line 103 - if !env.SliceFrom("ance") { - return false - } - } else if among_var == 4 { - // (, line 104 - // <-, line 104 - if !env.SliceFrom("able") { - return false - } - } else if among_var == 5 { - // (, line 105 - // <-, line 105 - if !env.SliceFrom("ent") { - return false - } - } else if among_var == 6 { - // (, line 107 - // <-, line 107 - if !env.SliceFrom("ize") { - return false - } - } else if among_var == 7 { - // (, line 109 - // <-, line 109 - if !env.SliceFrom("ate") { - return false - } - } else if among_var == 8 { - // (, line 111 - // <-, line 111 - if !env.SliceFrom("al") { - return false - } - } else if among_var == 9 { - // (, line 112 - // <-, line 112 - if !env.SliceFrom("ful") { - return false - } - } else if among_var == 10 { - // (, line 114 - // <-, line 114 - if !env.SliceFrom("ous") { - return false - } - } else if among_var == 11 { - // (, line 116 - // <-, line 116 - if !env.SliceFrom("ive") { - return false - } - } else if among_var == 12 { - // (, line 118 - // <-, line 118 - if !env.SliceFrom("ble") { - return false - } - } else if among_var == 13 { - // (, line 119 - // literal, line 119 - if !env.EqSB("l") { - return false - } - // <-, line 119 - if !env.SliceFrom("og") { - return false - } - } else if among_var == 14 { - // (, line 120 - // <-, line 120 - if !env.SliceFrom("ful") { - return false - } - } else if among_var == 15 { - // (, line 121 - // <-, line 121 - if !env.SliceFrom("less") { - return false - } - } else if among_var == 16 { - // (, line 122 - if !env.InGroupingB(G_valid_LI, 99, 116) { - return false - } - // delete, line 122 - if !env.SliceDel() { - return false - } - } - return true -} - -func r_Step_3(env *snowballRuntime.Env, ctx interface{}) bool { - context := ctx.(*Context) - _ = context - var among_var int32 - // (, line 126 - // [, line 127 - env.Ket = env.Cursor - // substring, line 127 - among_var = env.FindAmongB(A_6, context) - if among_var == 0 { - return false - } - // ], line 127 - env.Bra = env.Cursor - // call R1, line 127 - if !r_R1(env, context) { - return false - } - if among_var == 0 { - return false - } else if among_var == 1 { - // (, line 128 - // <-, line 128 - if !env.SliceFrom("tion") { - return false - } - } else if among_var == 2 { - // (, line 129 - // <-, line 129 - if !env.SliceFrom("ate") { - return false - } - } else if among_var == 3 { - // (, line 130 - // <-, line 130 - if !env.SliceFrom("al") { - return false - } - } else if among_var == 4 { - // (, line 132 - // <-, line 132 - if !env.SliceFrom("ic") { - return false - } - } else if among_var == 5 { - // (, line 134 - // delete, line 134 - if !env.SliceDel() { - return false - } - } else if among_var == 6 { - // (, line 136 - // call R2, line 136 - if !r_R2(env, context) { - return false - } - // delete, line 136 - if !env.SliceDel() { - return false - } - } - return true -} - -func r_Step_4(env *snowballRuntime.Env, ctx interface{}) bool { - context := ctx.(*Context) - _ = context - var among_var int32 - // (, line 140 - // [, line 141 - env.Ket = env.Cursor - // substring, line 141 - among_var = env.FindAmongB(A_7, context) - if among_var == 0 { - return false - } - // ], line 141 - env.Bra = env.Cursor - // call R2, line 141 - if !r_R2(env, context) { - return false - } - if among_var == 0 { - return false - } else if among_var == 1 { - // (, line 144 - // delete, line 144 - if !env.SliceDel() { - return false - } - } else if among_var == 2 { - // (, line 145 - // or, line 145 - lab0: - for { - var v_1 = env.Limit - env.Cursor - lab1: - for { - // literal, line 145 - if !env.EqSB("s") { - break lab1 - } - break lab0 - } - env.Cursor = env.Limit - v_1 - // literal, line 145 - if !env.EqSB("t") { - return false - } - break lab0 - } - // delete, line 145 - if !env.SliceDel() { - return false - } - } - return true -} - -func r_Step_5(env *snowballRuntime.Env, ctx interface{}) bool { - context := ctx.(*Context) - _ = context - var among_var int32 - // (, line 149 - // [, line 150 - env.Ket = env.Cursor - // substring, line 150 - among_var = env.FindAmongB(A_8, context) - if among_var == 0 { - return false - } - // ], line 150 - env.Bra = env.Cursor - if among_var == 0 { - return false - } else if among_var == 1 { - // (, line 151 - // or, line 151 - lab0: - for { - var v_1 = env.Limit - env.Cursor - lab1: - for { - // call R2, line 151 - if !r_R2(env, context) { - break lab1 - } - break lab0 - } - env.Cursor = env.Limit - v_1 - // (, line 151 - // call R1, line 151 - if !r_R1(env, context) { - return false - } - // not, line 151 - var v_2 = env.Limit - env.Cursor - lab2: - for { - // call shortv, line 151 - if !r_shortv(env, context) { - break lab2 - } - return false - } - env.Cursor = env.Limit - v_2 - break lab0 - } - // delete, line 151 - if !env.SliceDel() { - return false - } - } else if among_var == 2 { - // (, line 152 - // call R2, line 152 - if !r_R2(env, context) { - return false - } - // literal, line 152 - if !env.EqSB("l") { - return false - } - // delete, line 152 - if !env.SliceDel() { - return false - } - } - return true -} - -func r_exception2(env *snowballRuntime.Env, ctx interface{}) bool { - context := ctx.(*Context) - _ = context - // (, line 156 - // [, line 158 - env.Ket = env.Cursor - // substring, line 158 - if env.FindAmongB(A_9, context) == 0 { - return false - } - // ], line 158 - env.Bra = env.Cursor - // atlimit, line 158 - if env.Cursor > env.LimitBackward { - return false - } - return true -} - -func r_exception1(env *snowballRuntime.Env, ctx interface{}) bool { - context := ctx.(*Context) - _ = context - var among_var int32 - // (, line 168 - // [, line 170 - env.Bra = env.Cursor - // substring, line 170 - among_var = env.FindAmong(A_10, context) - if among_var == 0 { - return false - } - // ], line 170 - env.Ket = env.Cursor - // atlimit, line 170 - if env.Cursor < env.Limit { - return false - } - if among_var == 0 { - return false - } else if among_var == 1 { - // (, line 174 - // <-, line 174 - if !env.SliceFrom("ski") { - return false - } - } else if among_var == 2 { - // (, line 175 - // <-, line 175 - if !env.SliceFrom("sky") { - return false - } - } else if among_var == 3 { - // (, line 176 - // <-, line 176 - if !env.SliceFrom("die") { - return false - } - } else if among_var == 4 { - // (, line 177 - // <-, line 177 - if !env.SliceFrom("lie") { - return false - } - } else if among_var == 5 { - // (, line 178 - // <-, line 178 - if !env.SliceFrom("tie") { - return false - } - } else if among_var == 6 { - // (, line 182 - // <-, line 182 - if !env.SliceFrom("idl") { - return false - } - } else if among_var == 7 { - // (, line 183 - // <-, line 183 - if !env.SliceFrom("gentl") { - return false - } - } else if among_var == 8 { - // (, line 184 - // <-, line 184 - if !env.SliceFrom("ugli") { - return false - } - } else if among_var == 9 { - // (, line 185 - // <-, line 185 - if !env.SliceFrom("earli") { - return false - } - } else if among_var == 10 { - // (, line 186 - // <-, line 186 - if !env.SliceFrom("onli") { - return false - } - } else if among_var == 11 { - // (, line 187 - // <-, line 187 - if !env.SliceFrom("singl") { - return false - } - } - return true -} - -func r_postlude(env *snowballRuntime.Env, ctx interface{}) bool { - context := ctx.(*Context) - _ = context - // (, line 203 - // Boolean test Y_found, line 203 - if !context.b_Y_found { - return false - } - // repeat, line 203 -replab0: - for { - var v_1 = env.Cursor - lab1: - for range [2]struct{}{} { - // (, line 203 - // goto, line 203 - golab2: - for { - var v_2 = env.Cursor - lab3: - for { - // (, line 203 - // [, line 203 - env.Bra = env.Cursor - // literal, line 203 - if !env.EqS("Y") { - break lab3 - } - // ], line 203 - env.Ket = env.Cursor - env.Cursor = v_2 - break golab2 - } - env.Cursor = v_2 - if env.Cursor >= env.Limit { - break lab1 - } - env.NextChar() - } - // <-, line 203 - if !env.SliceFrom("y") { - return false - } - continue replab0 - } - env.Cursor = v_1 - break replab0 - } - return true -} - -func Stem(env *snowballRuntime.Env) bool { - var context = &Context{ - b_Y_found: false, - i_p2: 0, - i_p1: 0, - } - _ = context - // (, line 205 - // or, line 207 -lab0: - for { - var v_1 = env.Cursor - lab1: - for { - // call exception1, line 207 - if !r_exception1(env, context) { - break lab1 - } - break lab0 - } - env.Cursor = v_1 - lab2: - for { - // not, line 208 - var v_2 = env.Cursor - lab3: - for { - { - // hop, line 208 - var c = env.ByteIndexForHop((3)) - if int32(0) > c || c > int32(env.Limit) { - break lab3 - } - env.Cursor = int(c) - } - break lab2 - } - env.Cursor = v_2 - break lab0 - } - env.Cursor = v_1 - // (, line 208 - // do, line 209 - var v_3 = env.Cursor - lab4: - for { - // call prelude, line 209 - if !r_prelude(env, context) { - break lab4 - } - break lab4 - } - env.Cursor = v_3 - // do, line 210 - var v_4 = env.Cursor - lab5: - for { - // call mark_regions, line 210 - if !r_mark_regions(env, context) { - break lab5 - } - break lab5 - } - env.Cursor = v_4 - // backwards, line 211 - env.LimitBackward = env.Cursor - env.Cursor = env.Limit - // (, line 211 - // do, line 213 - var v_5 = env.Limit - env.Cursor - lab6: - for { - // call Step_1a, line 213 - if !r_Step_1a(env, context) { - break lab6 - } - break lab6 - } - env.Cursor = env.Limit - v_5 - // or, line 215 - lab7: - for { - var v_6 = env.Limit - env.Cursor - lab8: - for { - // call exception2, line 215 - if !r_exception2(env, context) { - break lab8 - } - break lab7 - } - env.Cursor = env.Limit - v_6 - // (, line 215 - // do, line 217 - var v_7 = env.Limit - env.Cursor - lab9: - for { - // call Step_1b, line 217 - if !r_Step_1b(env, context) { - break lab9 - } - break lab9 - } - env.Cursor = env.Limit - v_7 - // do, line 218 - var v_8 = env.Limit - env.Cursor - lab10: - for { - // call Step_1c, line 218 - if !r_Step_1c(env, context) { - break lab10 - } - break lab10 - } - env.Cursor = env.Limit - v_8 - // do, line 220 - var v_9 = env.Limit - env.Cursor - lab11: - for { - // call Step_2, line 220 - if !r_Step_2(env, context) { - break lab11 - } - break lab11 - } - env.Cursor = env.Limit - v_9 - // do, line 221 - var v_10 = env.Limit - env.Cursor - lab12: - for { - // call Step_3, line 221 - if !r_Step_3(env, context) { - break lab12 - } - break lab12 - } - env.Cursor = env.Limit - v_10 - // do, line 222 - var v_11 = env.Limit - env.Cursor - lab13: - for { - // call Step_4, line 222 - if !r_Step_4(env, context) { - break lab13 - } - break lab13 - } - env.Cursor = env.Limit - v_11 - // do, line 224 - var v_12 = env.Limit - env.Cursor - lab14: - for { - // call Step_5, line 224 - if !r_Step_5(env, context) { - break lab14 - } - break lab14 - } - env.Cursor = env.Limit - v_12 - break lab7 - } - env.Cursor = env.LimitBackward - // do, line 227 - var v_13 = env.Cursor - lab15: - for { - // call postlude, line 227 - if !r_postlude(env, context) { - break lab15 - } - break lab15 - } - env.Cursor = v_13 - break lab0 - } - return true -} diff --git a/vendor/github.com/blevesearch/snowballstem/env.go b/vendor/github.com/blevesearch/snowballstem/env.go deleted file mode 100644 index 6636994..0000000 --- a/vendor/github.com/blevesearch/snowballstem/env.go +++ /dev/null @@ -1,389 +0,0 @@ -package snowballstem - -import ( - "log" - "strings" - "unicode/utf8" -) - -// Env represents the Snowball execution environment -type Env struct { - current string - Cursor int - Limit int - LimitBackward int - Bra int - Ket int -} - -// NewEnv creates a new Snowball execution environment on the provided string -func NewEnv(val string) *Env { - return &Env{ - current: val, - Cursor: 0, - Limit: len(val), - LimitBackward: 0, - Bra: 0, - Ket: len(val), - } -} - -func (env *Env) Current() string { - return env.current -} - -func (env *Env) SetCurrent(s string) { - env.current = s - env.Cursor = 0 - env.Limit = len(s) - env.LimitBackward = 0 - env.Bra = 0 - env.Ket = len(s) -} - -func (env *Env) ReplaceS(bra, ket int, s string) int32 { - adjustment := int32(len(s)) - (int32(ket) - int32(bra)) - result, _ := splitAt(env.current, bra) - rsplit := ket - if ket < bra { - rsplit = bra - } - _, rhs := splitAt(env.current, rsplit) - result += s - result += rhs - - newLim := int32(env.Limit) + adjustment - env.Limit = int(newLim) - - if env.Cursor >= ket { - newCur := int32(env.Cursor) + adjustment - env.Cursor = int(newCur) - } else if env.Cursor > bra { - env.Cursor = bra - } - - env.current = result - return adjustment -} - -func (env *Env) EqS(s string) bool { - if env.Cursor >= env.Limit { - return false - } - - if strings.HasPrefix(env.current[env.Cursor:], s) { - env.Cursor += len(s) - for !onCharBoundary(env.current, env.Cursor) { - env.Cursor++ - } - return true - } - return false -} - -func (env *Env) EqSB(s string) bool { - if int32(env.Cursor)-int32(env.LimitBackward) < int32(len(s)) { - return false - } else if !onCharBoundary(env.current, env.Cursor-len(s)) || - !strings.HasPrefix(env.current[env.Cursor-len(s):], s) { - return false - } else { - env.Cursor -= len(s) - return true - } -} - -func (env *Env) SliceFrom(s string) bool { - bra, ket := env.Bra, env.Ket - env.ReplaceS(bra, ket, s) - return true -} - -func (env *Env) NextChar() { - env.Cursor++ - for !onCharBoundary(env.current, env.Cursor) { - env.Cursor++ - } -} - -func (env *Env) PrevChar() { - env.Cursor-- - for !onCharBoundary(env.current, env.Cursor) { - env.Cursor-- - } -} - -func (env *Env) ByteIndexForHop(delta int32) int32 { - if delta > 0 { - res := env.Cursor - for delta > 0 { - res++ - delta-- - for res <= len(env.current) && !onCharBoundary(env.current, res) { - res++ - } - } - return int32(res) - } else if delta < 0 { - res := env.Cursor - for delta < 0 { - res-- - delta++ - for res >= 0 && !onCharBoundary(env.current, res) { - res-- - } - } - return int32(res) - } else { - return int32(env.Cursor) - } -} - -func (env *Env) InGrouping(chars []byte, min, max int32) bool { - if env.Cursor >= env.Limit { - return false - } - - r, _ := utf8.DecodeRuneInString(env.current[env.Cursor:]) - if r != utf8.RuneError { - if r > max || r < min { - return false - } - r -= min - if (chars[uint(r>>3)] & (0x1 << uint(r&0x7))) == 0 { - return false - } - env.NextChar() - return true - } - return false -} - -func (env *Env) InGroupingB(chars []byte, min, max int32) bool { - if env.Cursor <= env.LimitBackward { - return false - } - env.PrevChar() - r, _ := utf8.DecodeRuneInString(env.current[env.Cursor:]) - if r != utf8.RuneError { - env.NextChar() - if r > max || r < min { - return false - } - r -= min - if (chars[uint(r>>3)] & (0x1 << uint(r&0x7))) == 0 { - return false - } - env.PrevChar() - return true - } - return false -} - -func (env *Env) OutGrouping(chars []byte, min, max int32) bool { - if env.Cursor >= env.Limit { - return false - } - r, _ := utf8.DecodeRuneInString(env.current[env.Cursor:]) - if r != utf8.RuneError { - if r > max || r < min { - env.NextChar() - return true - } - r -= min - if (chars[uint(r>>3)] & (0x1 << uint(r&0x7))) == 0 { - env.NextChar() - return true - } - } - return false -} - -func (env *Env) OutGroupingB(chars []byte, min, max int32) bool { - if env.Cursor <= env.LimitBackward { - return false - } - env.PrevChar() - r, _ := utf8.DecodeRuneInString(env.current[env.Cursor:]) - if r != utf8.RuneError { - env.NextChar() - if r > max || r < min { - env.PrevChar() - return true - } - r -= min - if (chars[uint(r>>3)] & (0x1 << uint(r&0x7))) == 0 { - env.PrevChar() - return true - } - } - return false -} - -func (env *Env) SliceDel() bool { - return env.SliceFrom("") -} - -func (env *Env) Insert(bra, ket int, s string) { - adjustment := env.ReplaceS(bra, ket, s) - if bra <= env.Bra { - env.Bra = int(int32(env.Bra) + adjustment) - } - if bra <= env.Ket { - env.Ket = int(int32(env.Ket) + adjustment) - } -} - -func (env *Env) SliceTo() string { - return env.current[env.Bra:env.Ket] -} - -func (env *Env) FindAmong(amongs []*Among, ctx interface{}) int32 { - var i int32 - j := int32(len(amongs)) - - c := env.Cursor - l := env.Limit - - var commonI, commonJ int - - firstKeyInspected := false - for { - k := i + ((j - i) >> 1) - var diff int32 - common := min(commonI, commonJ) - w := amongs[k] - for lvar := common; lvar < len(w.Str); lvar++ { - if c+common == l { - diff-- - break - } - diff = int32(env.current[c+common]) - int32(w.Str[lvar]) - if diff != 0 { - break - } - common++ - } - if diff < 0 { - j = k - commonJ = common - } else { - i = k - commonI = common - } - if j-i <= 1 { - if i > 0 { - break - } - if j == i { - break - } - if firstKeyInspected { - break - } - firstKeyInspected = true - } - } - - for { - w := amongs[i] - if commonI >= len(w.Str) { - env.Cursor = c + len(w.Str) - if w.F != nil { - res := w.F(env, ctx) - env.Cursor = c + len(w.Str) - if res { - return w.B - } - } else { - return w.B - } - } - i = w.A - if i < 0 { - return 0 - } - } -} - -func (env *Env) FindAmongB(amongs []*Among, ctx interface{}) int32 { - var i int32 - j := int32(len(amongs)) - - c := env.Cursor - lb := env.LimitBackward - - var commonI, commonJ int - - firstKeyInspected := false - - for { - k := i + ((j - i) >> 1) - diff := int32(0) - common := min(commonI, commonJ) - w := amongs[k] - for lvar := len(w.Str) - int(common) - 1; lvar >= 0; lvar-- { - if c-common == lb { - diff-- - break - } - diff = int32(env.current[c-common-1]) - int32(w.Str[lvar]) - if diff != 0 { - break - } - // Count up commons. But not one character but the byte width of that char - common++ - } - if diff < 0 { - j = k - commonJ = common - } else { - i = k - commonI = common - } - if j-i <= 1 { - if i > 0 { - break - } - if j == i { - break - } - if firstKeyInspected { - break - } - firstKeyInspected = true - } - } - for { - w := amongs[i] - if commonI >= len(w.Str) { - env.Cursor = c - len(w.Str) - if w.F != nil { - res := w.F(env, ctx) - env.Cursor = c - len(w.Str) - if res { - return w.B - } - } else { - return w.B - } - } - i = w.A - if i < 0 { - return 0 - } - } -} - -func (env *Env) Debug(count, lineNumber int) { - log.Printf("snowball debug, count: %d, line: %d", count, lineNumber) -} - -func (env *Env) Clone() *Env { - clone := *env - return &clone -} - -func (env *Env) AssignTo() string { - return env.Current() -} diff --git a/vendor/github.com/blevesearch/snowballstem/gen.go b/vendor/github.com/blevesearch/snowballstem/gen.go deleted file mode 100644 index 92548b0..0000000 --- a/vendor/github.com/blevesearch/snowballstem/gen.go +++ /dev/null @@ -1,61 +0,0 @@ -package snowballstem - -// to regenerate these commands, run -// go run gengen.go /path/to/snowball/algorithms/directory - -//go:generate $SNOWBALL/snowball $SNOWBALL/algorithms/arabic/stem_Unicode.sbl -go -o arabic/arabic_stemmer -gop arabic -gor github.com/blevesearch/snowballstem -//go:generate gofmt -s -w arabic/arabic_stemmer.go - -//go:generate $SNOWBALL/snowball $SNOWBALL/algorithms/danish/stem_ISO_8859_1.sbl -go -o danish/danish_stemmer -gop danish -gor github.com/blevesearch/snowballstem -//go:generate gofmt -s -w danish/danish_stemmer.go - -//go:generate $SNOWBALL/snowball $SNOWBALL/algorithms/dutch/stem_ISO_8859_1.sbl -go -o dutch/dutch_stemmer -gop dutch -gor github.com/blevesearch/snowballstem -//go:generate gofmt -s -w dutch/dutch_stemmer.go - -//go:generate $SNOWBALL/snowball $SNOWBALL/algorithms/english/stem_ISO_8859_1.sbl -go -o english/english_stemmer -gop english -gor github.com/blevesearch/snowballstem -//go:generate gofmt -s -w english/english_stemmer.go - -//go:generate $SNOWBALL/snowball $SNOWBALL/algorithms/finnish/stem_ISO_8859_1.sbl -go -o finnish/finnish_stemmer -gop finnish -gor github.com/blevesearch/snowballstem -//go:generate gofmt -s -w finnish/finnish_stemmer.go - -//go:generate $SNOWBALL/snowball $SNOWBALL/algorithms/french/stem_ISO_8859_1.sbl -go -o french/french_stemmer -gop french -gor github.com/blevesearch/snowballstem -//go:generate gofmt -s -w french/french_stemmer.go - -//go:generate $SNOWBALL/snowball $SNOWBALL/algorithms/german/stem_ISO_8859_1.sbl -go -o german/german_stemmer -gop german -gor github.com/blevesearch/snowballstem -//go:generate gofmt -s -w german/german_stemmer.go - -//go:generate $SNOWBALL/snowball $SNOWBALL/algorithms/hungarian/stem_Unicode.sbl -go -o hungarian/hungarian_stemmer -gop hungarian -gor github.com/blevesearch/snowballstem -//go:generate gofmt -s -w hungarian/hungarian_stemmer.go - -//go:generate $SNOWBALL/snowball $SNOWBALL/algorithms/irish/stem_ISO_8859_1.sbl -go -o irish/irish_stemmer -gop irish -gor github.com/blevesearch/snowballstem -//go:generate gofmt -s -w irish/irish_stemmer.go - -//go:generate $SNOWBALL/snowball $SNOWBALL/algorithms/italian/stem_ISO_8859_1.sbl -go -o italian/italian_stemmer -gop italian -gor github.com/blevesearch/snowballstem -//go:generate gofmt -s -w italian/italian_stemmer.go - -//go:generate $SNOWBALL/snowball $SNOWBALL/algorithms/norwegian/stem_ISO_8859_1.sbl -go -o norwegian/norwegian_stemmer -gop norwegian -gor github.com/blevesearch/snowballstem -//go:generate gofmt -s -w norwegian/norwegian_stemmer.go - -//go:generate $SNOWBALL/snowball $SNOWBALL/algorithms/porter/stem_ISO_8859_1.sbl -go -o porter/porter_stemmer -gop porter -gor github.com/blevesearch/snowballstem -//go:generate gofmt -s -w porter/porter_stemmer.go - -//go:generate $SNOWBALL/snowball $SNOWBALL/algorithms/portuguese/stem_ISO_8859_1.sbl -go -o portuguese/portuguese_stemmer -gop portuguese -gor github.com/blevesearch/snowballstem -//go:generate gofmt -s -w portuguese/portuguese_stemmer.go - -//go:generate $SNOWBALL/snowball $SNOWBALL/algorithms/romanian/stem_Unicode.sbl -go -o romanian/romanian_stemmer -gop romanian -gor github.com/blevesearch/snowballstem -//go:generate gofmt -s -w romanian/romanian_stemmer.go - -//go:generate $SNOWBALL/snowball $SNOWBALL/algorithms/russian/stem_Unicode.sbl -go -o russian/russian_stemmer -gop russian -gor github.com/blevesearch/snowballstem -//go:generate gofmt -s -w russian/russian_stemmer.go - -//go:generate $SNOWBALL/snowball $SNOWBALL/algorithms/spanish/stem_ISO_8859_1.sbl -go -o spanish/spanish_stemmer -gop spanish -gor github.com/blevesearch/snowballstem -//go:generate gofmt -s -w spanish/spanish_stemmer.go - -//go:generate $SNOWBALL/snowball $SNOWBALL/algorithms/swedish/stem_ISO_8859_1.sbl -go -o swedish/swedish_stemmer -gop swedish -gor github.com/blevesearch/snowballstem -//go:generate gofmt -s -w swedish/swedish_stemmer.go - -//go:generate $SNOWBALL/snowball $SNOWBALL/algorithms/tamil/stem_Unicode.sbl -go -o tamil/tamil_stemmer -gop tamil -gor github.com/blevesearch/snowballstem -//go:generate gofmt -s -w tamil/tamil_stemmer.go - -//go:generate $SNOWBALL/snowball $SNOWBALL/algorithms/turkish/stem_Unicode.sbl -go -o turkish/turkish_stemmer -gop turkish -gor github.com/blevesearch/snowballstem -//go:generate gofmt -s -w turkish/turkish_stemmer.go diff --git a/vendor/github.com/blevesearch/snowballstem/util.go b/vendor/github.com/blevesearch/snowballstem/util.go deleted file mode 100644 index 7c68f6e..0000000 --- a/vendor/github.com/blevesearch/snowballstem/util.go +++ /dev/null @@ -1,34 +0,0 @@ -package snowballstem - -import ( - "math" - "unicode/utf8" -) - -const MaxInt = math.MaxInt32 -const MinInt = math.MinInt32 - -func splitAt(str string, mid int) (string, string) { - return str[:mid], str[mid:] -} - -func min(a, b int) int { - if a < b { - return a - } - return b -} - -func onCharBoundary(s string, pos int) bool { - if pos <= 0 || pos >= len(s) { - return true - } - return utf8.RuneStart(s[pos]) -} - -// RuneCountInString is a wrapper around utf8.RuneCountInString -// this allows us to not have to conditionally include -// the utf8 package into some stemmers and not others -func RuneCountInString(str string) int { - return utf8.RuneCountInString(str) -} diff --git a/vendor/github.com/blevesearch/zap/v11/.gitignore b/vendor/github.com/blevesearch/zap/v11/.gitignore deleted file mode 100644 index 46d1cfa..0000000 --- a/vendor/github.com/blevesearch/zap/v11/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -#* -*.sublime-* -*~ -.#* -.project -.settings -**/.idea/ -**/*.iml -.DS_Store -/cmd/zap/zap -*.test -tags diff --git a/vendor/github.com/blevesearch/zap/v11/LICENSE b/vendor/github.com/blevesearch/zap/v11/LICENSE deleted file mode 100644 index 7a4a3ea..0000000 --- a/vendor/github.com/blevesearch/zap/v11/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/vendor/github.com/blevesearch/zap/v11/README.md b/vendor/github.com/blevesearch/zap/v11/README.md deleted file mode 100644 index 0facb66..0000000 --- a/vendor/github.com/blevesearch/zap/v11/README.md +++ /dev/null @@ -1,158 +0,0 @@ -# zap file format - -Advanced ZAP File Format Documentation is [here](zap.md). - -The file is written in the reverse order that we typically access data. This helps us write in one pass since later sections of the file require file offsets of things we've already written. - -Current usage: - -- mmap the entire file -- crc-32 bytes and version are in fixed position at end of the file -- reading remainder of footer could be version specific -- remainder of footer gives us: - - 3 important offsets (docValue , fields index and stored data index) - - 2 important values (number of docs and chunk factor) -- field data is processed once and memoized onto the heap so that we never have to go back to disk for it -- access to stored data by doc number means first navigating to the stored data index, then accessing a fixed position offset into that slice, which gives us the actual address of the data. the first bytes of that section tell us the size of data so that we know where it ends. -- access to all other indexed data follows the following pattern: - - first know the field name -> convert to id - - next navigate to term dictionary for that field - - some operations stop here and do dictionary ops - - next use dictionary to navigate to posting list for a specific term - - walk posting list - - if necessary, walk posting details as we go - - if location info is desired, consult location bitmap to see if it is there - -## stored fields section - -- for each document - - preparation phase: - - produce a slice of metadata bytes and data bytes - - produce these slices in field id order - - field value is appended to the data slice - - metadata slice is varint encoded with the following values for each field value - - field id (uint16) - - field type (byte) - - field value start offset in uncompressed data slice (uint64) - - field value length (uint64) - - field number of array positions (uint64) - - one additional value for each array position (uint64) - - compress the data slice using snappy - - file writing phase: - - remember the start offset for this document - - write out meta data length (varint uint64) - - write out compressed data length (varint uint64) - - write out the metadata bytes - - write out the compressed data bytes - -## stored fields idx - -- for each document - - write start offset (remembered from previous section) of stored data (big endian uint64) - -With this index and a known document number, we have direct access to all the stored field data. - -## posting details (freq/norm) section - -- for each posting list - - produce a slice containing multiple consecutive chunks (each chunk is varint stream) - - produce a slice remembering offsets of where each chunk starts - - preparation phase: - - for each hit in the posting list - - if this hit is in next chunk close out encoding of last chunk and record offset start of next - - encode term frequency (uint64) - - encode norm factor (float32) - - file writing phase: - - remember start position for this posting list details - - write out number of chunks that follow (varint uint64) - - write out length of each chunk (each a varint uint64) - - write out the byte slice containing all the chunk data - -If you know the doc number you're interested in, this format lets you jump to the correct chunk (docNum/chunkFactor) directly and then seek within that chunk until you find it. - -## posting details (location) section - -- for each posting list - - produce a slice containing multiple consecutive chunks (each chunk is varint stream) - - produce a slice remembering offsets of where each chunk starts - - preparation phase: - - for each hit in the posting list - - if this hit is in next chunk close out encoding of last chunk and record offset start of next - - encode field (uint16) - - encode field pos (uint64) - - encode field start (uint64) - - encode field end (uint64) - - encode number of array positions to follow (uint64) - - encode each array position (each uint64) - - file writing phase: - - remember start position for this posting list details - - write out number of chunks that follow (varint uint64) - - write out length of each chunk (each a varint uint64) - - write out the byte slice containing all the chunk data - -If you know the doc number you're interested in, this format lets you jump to the correct chunk (docNum/chunkFactor) directly and then seek within that chunk until you find it. - -## postings list section - -- for each posting list - - preparation phase: - - encode roaring bitmap posting list to bytes (so we know the length) - - file writing phase: - - remember the start position for this posting list - - write freq/norm details offset (remembered from previous, as varint uint64) - - write location details offset (remembered from previous, as varint uint64) - - write length of encoded roaring bitmap - - write the serialized roaring bitmap data - -## dictionary - -- for each field - - preparation phase: - - encode vellum FST with dictionary data pointing to file offset of posting list (remembered from previous) - - file writing phase: - - remember the start position of this persistDictionary - - write length of vellum data (varint uint64) - - write out vellum data - -## fields section - -- for each field - - file writing phase: - - remember start offset for each field - - write dictionary address (remembered from previous) (varint uint64) - - write length of field name (varint uint64) - - write field name bytes - -## fields idx - -- for each field - - file writing phase: - - write big endian uint64 of start offset for each field - -NOTE: currently we don't know or record the length of this fields index. Instead we rely on the fact that we know it immediately precedes a footer of known size. - -## fields DocValue - -- for each field - - preparation phase: - - produce a slice containing multiple consecutive chunks, where each chunk is composed of a meta section followed by compressed columnar field data - - produce a slice remembering the length of each chunk - - file writing phase: - - remember the start position of this first field DocValue offset in the footer - - write out number of chunks that follow (varint uint64) - - write out length of each chunk (each a varint uint64) - - write out the byte slice containing all the chunk data - -NOTE: currently the meta header inside each chunk gives clue to the location offsets and size of the data pertaining to a given docID and any -read operation leverage that meta information to extract the document specific data from the file. - -## footer - -- file writing phase - - write number of docs (big endian uint64) - - write stored field index location (big endian uint64) - - write field index location (big endian uint64) - - write field docValue location (big endian uint64) - - write out chunk factor (big endian uint32) - - write out version (big endian uint32) - - write out file CRC of everything preceding this (big endian uint32) diff --git a/vendor/github.com/blevesearch/zap/v11/build.go b/vendor/github.com/blevesearch/zap/v11/build.go deleted file mode 100644 index bac1edb..0000000 --- a/vendor/github.com/blevesearch/zap/v11/build.go +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bufio" - "math" - "os" - - "github.com/couchbase/vellum" -) - -const Version uint32 = 11 - -const Type string = "zap" - -const fieldNotUninverted = math.MaxUint64 - -func (sb *SegmentBase) Persist(path string) error { - return PersistSegmentBase(sb, path) -} - -// PersistSegmentBase persists SegmentBase in the zap file format. -func PersistSegmentBase(sb *SegmentBase, path string) error { - flag := os.O_RDWR | os.O_CREATE - - f, err := os.OpenFile(path, flag, 0600) - if err != nil { - return err - } - - cleanup := func() { - _ = f.Close() - _ = os.Remove(path) - } - - br := bufio.NewWriter(f) - - _, err = br.Write(sb.mem) - if err != nil { - cleanup() - return err - } - - err = persistFooter(sb.numDocs, sb.storedIndexOffset, sb.fieldsIndexOffset, sb.docValueOffset, - sb.chunkFactor, sb.memCRC, br) - if err != nil { - cleanup() - return err - } - - err = br.Flush() - if err != nil { - cleanup() - return err - } - - err = f.Sync() - if err != nil { - cleanup() - return err - } - - err = f.Close() - if err != nil { - cleanup() - return err - } - - return nil -} - -func persistStoredFieldValues(fieldID int, - storedFieldValues [][]byte, stf []byte, spf [][]uint64, - curr int, metaEncode varintEncoder, data []byte) ( - int, []byte, error) { - for i := 0; i < len(storedFieldValues); i++ { - // encode field - _, err := metaEncode(uint64(fieldID)) - if err != nil { - return 0, nil, err - } - // encode type - _, err = metaEncode(uint64(stf[i])) - if err != nil { - return 0, nil, err - } - // encode start offset - _, err = metaEncode(uint64(curr)) - if err != nil { - return 0, nil, err - } - // end len - _, err = metaEncode(uint64(len(storedFieldValues[i]))) - if err != nil { - return 0, nil, err - } - // encode number of array pos - _, err = metaEncode(uint64(len(spf[i]))) - if err != nil { - return 0, nil, err - } - // encode all array positions - for _, pos := range spf[i] { - _, err = metaEncode(pos) - if err != nil { - return 0, nil, err - } - } - - data = append(data, storedFieldValues[i]...) - curr += len(storedFieldValues[i]) - } - - return curr, data, nil -} - -func InitSegmentBase(mem []byte, memCRC uint32, chunkFactor uint32, - fieldsMap map[string]uint16, fieldsInv []string, numDocs uint64, - storedIndexOffset uint64, fieldsIndexOffset uint64, docValueOffset uint64, - dictLocs []uint64) (*SegmentBase, error) { - sb := &SegmentBase{ - mem: mem, - memCRC: memCRC, - chunkFactor: chunkFactor, - fieldsMap: fieldsMap, - fieldsInv: fieldsInv, - numDocs: numDocs, - storedIndexOffset: storedIndexOffset, - fieldsIndexOffset: fieldsIndexOffset, - docValueOffset: docValueOffset, - dictLocs: dictLocs, - fieldDvReaders: make(map[uint16]*docValueReader), - fieldFSTs: make(map[uint16]*vellum.FST), - } - sb.updateSize() - - err := sb.loadDvReaders() - if err != nil { - return nil, err - } - - return sb, nil -} diff --git a/vendor/github.com/blevesearch/zap/v11/contentcoder.go b/vendor/github.com/blevesearch/zap/v11/contentcoder.go deleted file mode 100644 index b9ff817..0000000 --- a/vendor/github.com/blevesearch/zap/v11/contentcoder.go +++ /dev/null @@ -1,230 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "encoding/binary" - "io" - "reflect" - - "github.com/golang/snappy" -) - -var reflectStaticSizeMetaData int - -func init() { - var md MetaData - reflectStaticSizeMetaData = int(reflect.TypeOf(md).Size()) -} - -var termSeparator byte = 0xff -var termSeparatorSplitSlice = []byte{termSeparator} - -type chunkedContentCoder struct { - final []byte - chunkSize uint64 - currChunk uint64 - chunkLens []uint64 - - w io.Writer - progressiveWrite bool - - chunkMetaBuf bytes.Buffer - chunkBuf bytes.Buffer - - chunkMeta []MetaData - - compressed []byte // temp buf for snappy compression -} - -// MetaData represents the data information inside a -// chunk. -type MetaData struct { - DocNum uint64 // docNum of the data inside the chunk - DocDvOffset uint64 // offset of data inside the chunk for the given docid -} - -// newChunkedContentCoder returns a new chunk content coder which -// packs data into chunks based on the provided chunkSize -func newChunkedContentCoder(chunkSize uint64, maxDocNum uint64, - w io.Writer, progressiveWrite bool) *chunkedContentCoder { - total := maxDocNum/chunkSize + 1 - rv := &chunkedContentCoder{ - chunkSize: chunkSize, - chunkLens: make([]uint64, total), - chunkMeta: make([]MetaData, 0, total), - w: w, - progressiveWrite: progressiveWrite, - } - - return rv -} - -// Reset lets you reuse this chunked content coder. Buffers are reset -// and re used. You cannot change the chunk size. -func (c *chunkedContentCoder) Reset() { - c.currChunk = 0 - c.final = c.final[:0] - c.chunkBuf.Reset() - c.chunkMetaBuf.Reset() - for i := range c.chunkLens { - c.chunkLens[i] = 0 - } - c.chunkMeta = c.chunkMeta[:0] -} - -// Close indicates you are done calling Add() this allows -// the final chunk to be encoded. -func (c *chunkedContentCoder) Close() error { - return c.flushContents() -} - -func (c *chunkedContentCoder) flushContents() error { - // flush the contents, with meta information at first - buf := make([]byte, binary.MaxVarintLen64) - n := binary.PutUvarint(buf, uint64(len(c.chunkMeta))) - _, err := c.chunkMetaBuf.Write(buf[:n]) - if err != nil { - return err - } - - // write out the metaData slice - for _, meta := range c.chunkMeta { - _, err := writeUvarints(&c.chunkMetaBuf, meta.DocNum, meta.DocDvOffset) - if err != nil { - return err - } - } - - // write the metadata to final data - metaData := c.chunkMetaBuf.Bytes() - c.final = append(c.final, c.chunkMetaBuf.Bytes()...) - // write the compressed data to the final data - c.compressed = snappy.Encode(c.compressed[:cap(c.compressed)], c.chunkBuf.Bytes()) - c.final = append(c.final, c.compressed...) - - c.chunkLens[c.currChunk] = uint64(len(c.compressed) + len(metaData)) - - if c.progressiveWrite { - _, err := c.w.Write(c.final) - if err != nil { - return err - } - c.final = c.final[:0] - } - - return nil -} - -// Add encodes the provided byte slice into the correct chunk for the provided -// doc num. You MUST call Add() with increasing docNums. -func (c *chunkedContentCoder) Add(docNum uint64, vals []byte) error { - chunk := docNum / c.chunkSize - if chunk != c.currChunk { - // flush out the previous chunk details - err := c.flushContents() - if err != nil { - return err - } - // clearing the chunk specific meta for next chunk - c.chunkBuf.Reset() - c.chunkMetaBuf.Reset() - c.chunkMeta = c.chunkMeta[:0] - c.currChunk = chunk - } - - // get the starting offset for this doc - dvOffset := c.chunkBuf.Len() - dvSize, err := c.chunkBuf.Write(vals) - if err != nil { - return err - } - - c.chunkMeta = append(c.chunkMeta, MetaData{ - DocNum: docNum, - DocDvOffset: uint64(dvOffset + dvSize), - }) - return nil -} - -// Write commits all the encoded chunked contents to the provided writer. -// -// | ..... data ..... | chunk offsets (varints) -// | position of chunk offsets (uint64) | number of offsets (uint64) | -// -func (c *chunkedContentCoder) Write() (int, error) { - var tw int - - if c.final != nil { - // write out the data section first - nw, err := c.w.Write(c.final) - tw += nw - if err != nil { - return tw, err - } - } - - chunkOffsetsStart := uint64(tw) - - if cap(c.final) < binary.MaxVarintLen64 { - c.final = make([]byte, binary.MaxVarintLen64) - } else { - c.final = c.final[0:binary.MaxVarintLen64] - } - chunkOffsets := modifyLengthsToEndOffsets(c.chunkLens) - // write out the chunk offsets - for _, chunkOffset := range chunkOffsets { - n := binary.PutUvarint(c.final, chunkOffset) - nw, err := c.w.Write(c.final[:n]) - tw += nw - if err != nil { - return tw, err - } - } - - chunkOffsetsLen := uint64(tw) - chunkOffsetsStart - - c.final = c.final[0:8] - // write out the length of chunk offsets - binary.BigEndian.PutUint64(c.final, chunkOffsetsLen) - nw, err := c.w.Write(c.final) - tw += nw - if err != nil { - return tw, err - } - - // write out the number of chunks - binary.BigEndian.PutUint64(c.final, uint64(len(c.chunkLens))) - nw, err = c.w.Write(c.final) - tw += nw - if err != nil { - return tw, err - } - - c.final = c.final[:0] - - return tw, nil -} - -// ReadDocValueBoundary elicits the start, end offsets from a -// metaData header slice -func ReadDocValueBoundary(chunk int, metaHeaders []MetaData) (uint64, uint64) { - var start uint64 - if chunk > 0 { - start = metaHeaders[chunk-1].DocDvOffset - } - return start, metaHeaders[chunk].DocDvOffset -} diff --git a/vendor/github.com/blevesearch/zap/v11/count.go b/vendor/github.com/blevesearch/zap/v11/count.go deleted file mode 100644 index 50290f8..0000000 --- a/vendor/github.com/blevesearch/zap/v11/count.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "hash/crc32" - "io" - - "github.com/blevesearch/bleve/index/scorch/segment" -) - -// CountHashWriter is a wrapper around a Writer which counts the number of -// bytes which have been written and computes a crc32 hash -type CountHashWriter struct { - w io.Writer - crc uint32 - n int - s segment.StatsReporter -} - -// NewCountHashWriter returns a CountHashWriter which wraps the provided Writer -func NewCountHashWriter(w io.Writer) *CountHashWriter { - return &CountHashWriter{w: w} -} - -func NewCountHashWriterWithStatsReporter(w io.Writer, s segment.StatsReporter) *CountHashWriter { - return &CountHashWriter{w: w, s: s} -} - -// Write writes the provided bytes to the wrapped writer and counts the bytes -func (c *CountHashWriter) Write(b []byte) (int, error) { - n, err := c.w.Write(b) - c.crc = crc32.Update(c.crc, crc32.IEEETable, b[:n]) - c.n += n - if c.s != nil { - c.s.ReportBytesWritten(uint64(n)) - } - return n, err -} - -// Count returns the number of bytes written -func (c *CountHashWriter) Count() int { - return c.n -} - -// Sum32 returns the CRC-32 hash of the content written to this writer -func (c *CountHashWriter) Sum32() uint32 { - return c.crc -} diff --git a/vendor/github.com/blevesearch/zap/v11/dict.go b/vendor/github.com/blevesearch/zap/v11/dict.go deleted file mode 100644 index ad4a8f8..0000000 --- a/vendor/github.com/blevesearch/zap/v11/dict.go +++ /dev/null @@ -1,263 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "fmt" - - "github.com/RoaringBitmap/roaring" - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/couchbase/vellum" -) - -// Dictionary is the zap representation of the term dictionary -type Dictionary struct { - sb *SegmentBase - field string - fieldID uint16 - fst *vellum.FST - fstReader *vellum.Reader -} - -// PostingsList returns the postings list for the specified term -func (d *Dictionary) PostingsList(term []byte, except *roaring.Bitmap, - prealloc segment.PostingsList) (segment.PostingsList, error) { - var preallocPL *PostingsList - pl, ok := prealloc.(*PostingsList) - if ok && pl != nil { - preallocPL = pl - } - return d.postingsList(term, except, preallocPL) -} - -func (d *Dictionary) postingsList(term []byte, except *roaring.Bitmap, rv *PostingsList) (*PostingsList, error) { - if d.fstReader == nil { - if rv == nil || rv == emptyPostingsList { - return emptyPostingsList, nil - } - return d.postingsListInit(rv, except), nil - } - - postingsOffset, exists, err := d.fstReader.Get(term) - if err != nil { - return nil, fmt.Errorf("vellum err: %v", err) - } - if !exists { - if rv == nil || rv == emptyPostingsList { - return emptyPostingsList, nil - } - return d.postingsListInit(rv, except), nil - } - - return d.postingsListFromOffset(postingsOffset, except, rv) -} - -func (d *Dictionary) postingsListFromOffset(postingsOffset uint64, except *roaring.Bitmap, rv *PostingsList) (*PostingsList, error) { - rv = d.postingsListInit(rv, except) - - err := rv.read(postingsOffset, d) - if err != nil { - return nil, err - } - - return rv, nil -} - -func (d *Dictionary) postingsListInit(rv *PostingsList, except *roaring.Bitmap) *PostingsList { - if rv == nil || rv == emptyPostingsList { - rv = &PostingsList{} - } else { - postings := rv.postings - if postings != nil { - postings.Clear() - } - - *rv = PostingsList{} // clear the struct - - rv.postings = postings - } - rv.sb = d.sb - rv.except = except - return rv -} - -func (d *Dictionary) Contains(key []byte) (bool, error) { - return d.fst.Contains(key) -} - -// Iterator returns an iterator for this dictionary -func (d *Dictionary) Iterator() segment.DictionaryIterator { - rv := &DictionaryIterator{ - d: d, - } - - if d.fst != nil { - itr, err := d.fst.Iterator(nil, nil) - if err == nil { - rv.itr = itr - } else if err != vellum.ErrIteratorDone { - rv.err = err - } - } - - return rv -} - -// PrefixIterator returns an iterator which only visits terms having the -// the specified prefix -func (d *Dictionary) PrefixIterator(prefix string) segment.DictionaryIterator { - rv := &DictionaryIterator{ - d: d, - } - - kBeg := []byte(prefix) - kEnd := segment.IncrementBytes(kBeg) - - if d.fst != nil { - itr, err := d.fst.Iterator(kBeg, kEnd) - if err == nil { - rv.itr = itr - } else if err != vellum.ErrIteratorDone { - rv.err = err - } - } - - return rv -} - -// RangeIterator returns an iterator which only visits terms between the -// start and end terms. NOTE: bleve.index API specifies the end is inclusive. -func (d *Dictionary) RangeIterator(start, end string) segment.DictionaryIterator { - rv := &DictionaryIterator{ - d: d, - } - - // need to increment the end position to be inclusive - var endBytes []byte - if len(end) > 0 { - endBytes = []byte(end) - if endBytes[len(endBytes)-1] < 0xff { - endBytes[len(endBytes)-1]++ - } else { - endBytes = append(endBytes, 0xff) - } - } - - if d.fst != nil { - itr, err := d.fst.Iterator([]byte(start), endBytes) - if err == nil { - rv.itr = itr - } else if err != vellum.ErrIteratorDone { - rv.err = err - } - } - - return rv -} - -// AutomatonIterator returns an iterator which only visits terms -// having the the vellum automaton and start/end key range -func (d *Dictionary) AutomatonIterator(a vellum.Automaton, - startKeyInclusive, endKeyExclusive []byte) segment.DictionaryIterator { - rv := &DictionaryIterator{ - d: d, - } - - if d.fst != nil { - itr, err := d.fst.Search(a, startKeyInclusive, endKeyExclusive) - if err == nil { - rv.itr = itr - } else if err != vellum.ErrIteratorDone { - rv.err = err - } - } - - return rv -} - -func (d *Dictionary) OnlyIterator(onlyTerms [][]byte, - includeCount bool) segment.DictionaryIterator { - - rv := &DictionaryIterator{ - d: d, - omitCount: !includeCount, - } - - var buf bytes.Buffer - builder, err := vellum.New(&buf, nil) - if err != nil { - rv.err = err - return rv - } - for _, term := range onlyTerms { - err = builder.Insert(term, 0) - if err != nil { - rv.err = err - return rv - } - } - err = builder.Close() - if err != nil { - rv.err = err - return rv - } - - onlyFST, err := vellum.Load(buf.Bytes()) - if err != nil { - rv.err = err - return rv - } - - itr, err := d.fst.Search(onlyFST, nil, nil) - if err == nil { - rv.itr = itr - } else if err != vellum.ErrIteratorDone { - rv.err = err - } - - return rv -} - -// DictionaryIterator is an iterator for term dictionary -type DictionaryIterator struct { - d *Dictionary - itr vellum.Iterator - err error - tmp PostingsList - entry index.DictEntry - omitCount bool -} - -// Next returns the next entry in the dictionary -func (i *DictionaryIterator) Next() (*index.DictEntry, error) { - if i.err != nil && i.err != vellum.ErrIteratorDone { - return nil, i.err - } else if i.itr == nil || i.err == vellum.ErrIteratorDone { - return nil, nil - } - term, postingsOffset := i.itr.Current() - i.entry.Term = string(term) - if !i.omitCount { - i.err = i.tmp.read(postingsOffset, i.d) - if i.err != nil { - return nil, i.err - } - i.entry.Count = i.tmp.Count() - } - i.err = i.itr.Next() - return &i.entry, nil -} diff --git a/vendor/github.com/blevesearch/zap/v11/docvalues.go b/vendor/github.com/blevesearch/zap/v11/docvalues.go deleted file mode 100644 index 2566dc6..0000000 --- a/vendor/github.com/blevesearch/zap/v11/docvalues.go +++ /dev/null @@ -1,307 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "encoding/binary" - "fmt" - "math" - "reflect" - "sort" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/blevesearch/bleve/size" - "github.com/golang/snappy" -) - -var reflectStaticSizedocValueReader int - -func init() { - var dvi docValueReader - reflectStaticSizedocValueReader = int(reflect.TypeOf(dvi).Size()) -} - -type docNumTermsVisitor func(docNum uint64, terms []byte) error - -type docVisitState struct { - dvrs map[uint16]*docValueReader - segment *SegmentBase -} - -type docValueReader struct { - field string - curChunkNum uint64 - chunkOffsets []uint64 - dvDataLoc uint64 - curChunkHeader []MetaData - curChunkData []byte // compressed data cache - uncompressed []byte // temp buf for snappy decompression -} - -func (di *docValueReader) size() int { - return reflectStaticSizedocValueReader + size.SizeOfPtr + - len(di.field) + - len(di.chunkOffsets)*size.SizeOfUint64 + - len(di.curChunkHeader)*reflectStaticSizeMetaData + - len(di.curChunkData) -} - -func (di *docValueReader) cloneInto(rv *docValueReader) *docValueReader { - if rv == nil { - rv = &docValueReader{} - } - - rv.field = di.field - rv.curChunkNum = math.MaxUint64 - rv.chunkOffsets = di.chunkOffsets // immutable, so it's sharable - rv.dvDataLoc = di.dvDataLoc - rv.curChunkHeader = rv.curChunkHeader[:0] - rv.curChunkData = nil - rv.uncompressed = rv.uncompressed[:0] - - return rv -} - -func (di *docValueReader) curChunkNumber() uint64 { - return di.curChunkNum -} - -func (s *SegmentBase) loadFieldDocValueReader(field string, - fieldDvLocStart, fieldDvLocEnd uint64) (*docValueReader, error) { - // get the docValue offset for the given fields - if fieldDvLocStart == fieldNotUninverted { - // no docValues found, nothing to do - return nil, nil - } - - // read the number of chunks, and chunk offsets position - var numChunks, chunkOffsetsPosition uint64 - - if fieldDvLocEnd-fieldDvLocStart > 16 { - numChunks = binary.BigEndian.Uint64(s.mem[fieldDvLocEnd-8 : fieldDvLocEnd]) - // read the length of chunk offsets - chunkOffsetsLen := binary.BigEndian.Uint64(s.mem[fieldDvLocEnd-16 : fieldDvLocEnd-8]) - // acquire position of chunk offsets - chunkOffsetsPosition = (fieldDvLocEnd - 16) - chunkOffsetsLen - } else { - return nil, fmt.Errorf("loadFieldDocValueReader: fieldDvLoc too small: %d-%d", fieldDvLocEnd, fieldDvLocStart) - } - - fdvIter := &docValueReader{ - curChunkNum: math.MaxUint64, - field: field, - chunkOffsets: make([]uint64, int(numChunks)), - } - - // read the chunk offsets - var offset uint64 - for i := 0; i < int(numChunks); i++ { - loc, read := binary.Uvarint(s.mem[chunkOffsetsPosition+offset : chunkOffsetsPosition+offset+binary.MaxVarintLen64]) - if read <= 0 { - return nil, fmt.Errorf("corrupted chunk offset during segment load") - } - fdvIter.chunkOffsets[i] = loc - offset += uint64(read) - } - - // set the data offset - fdvIter.dvDataLoc = fieldDvLocStart - - return fdvIter, nil -} - -func (di *docValueReader) loadDvChunk(chunkNumber uint64, s *SegmentBase) error { - // advance to the chunk where the docValues - // reside for the given docNum - destChunkDataLoc, curChunkEnd := di.dvDataLoc, di.dvDataLoc - start, end := readChunkBoundary(int(chunkNumber), di.chunkOffsets) - if start >= end { - di.curChunkHeader = di.curChunkHeader[:0] - di.curChunkData = nil - di.curChunkNum = chunkNumber - di.uncompressed = di.uncompressed[:0] - return nil - } - - destChunkDataLoc += start - curChunkEnd += end - - // read the number of docs reside in the chunk - numDocs, read := binary.Uvarint(s.mem[destChunkDataLoc : destChunkDataLoc+binary.MaxVarintLen64]) - if read <= 0 { - return fmt.Errorf("failed to read the chunk") - } - chunkMetaLoc := destChunkDataLoc + uint64(read) - - offset := uint64(0) - if cap(di.curChunkHeader) < int(numDocs) { - di.curChunkHeader = make([]MetaData, int(numDocs)) - } else { - di.curChunkHeader = di.curChunkHeader[:int(numDocs)] - } - for i := 0; i < int(numDocs); i++ { - di.curChunkHeader[i].DocNum, read = binary.Uvarint(s.mem[chunkMetaLoc+offset : chunkMetaLoc+offset+binary.MaxVarintLen64]) - offset += uint64(read) - di.curChunkHeader[i].DocDvOffset, read = binary.Uvarint(s.mem[chunkMetaLoc+offset : chunkMetaLoc+offset+binary.MaxVarintLen64]) - offset += uint64(read) - } - - compressedDataLoc := chunkMetaLoc + offset - dataLength := curChunkEnd - compressedDataLoc - di.curChunkData = s.mem[compressedDataLoc : compressedDataLoc+dataLength] - di.curChunkNum = chunkNumber - di.uncompressed = di.uncompressed[:0] - return nil -} - -func (di *docValueReader) iterateAllDocValues(s *SegmentBase, visitor docNumTermsVisitor) error { - for i := 0; i < len(di.chunkOffsets); i++ { - err := di.loadDvChunk(uint64(i), s) - if err != nil { - return err - } - if di.curChunkData == nil || len(di.curChunkHeader) == 0 { - continue - } - - // uncompress the already loaded data - uncompressed, err := snappy.Decode(di.uncompressed[:cap(di.uncompressed)], di.curChunkData) - if err != nil { - return err - } - di.uncompressed = uncompressed - - start := uint64(0) - for _, entry := range di.curChunkHeader { - err = visitor(entry.DocNum, uncompressed[start:entry.DocDvOffset]) - if err != nil { - return err - } - - start = entry.DocDvOffset - } - } - - return nil -} - -func (di *docValueReader) visitDocValues(docNum uint64, - visitor index.DocumentFieldTermVisitor) error { - // binary search the term locations for the docNum - start, end := di.getDocValueLocs(docNum) - if start == math.MaxUint64 || end == math.MaxUint64 || start == end { - return nil - } - - var uncompressed []byte - var err error - // use the uncompressed copy if available - if len(di.uncompressed) > 0 { - uncompressed = di.uncompressed - } else { - // uncompress the already loaded data - uncompressed, err = snappy.Decode(di.uncompressed[:cap(di.uncompressed)], di.curChunkData) - if err != nil { - return err - } - di.uncompressed = uncompressed - } - - // pick the terms for the given docNum - uncompressed = uncompressed[start:end] - for { - i := bytes.Index(uncompressed, termSeparatorSplitSlice) - if i < 0 { - break - } - - visitor(di.field, uncompressed[0:i]) - uncompressed = uncompressed[i+1:] - } - - return nil -} - -func (di *docValueReader) getDocValueLocs(docNum uint64) (uint64, uint64) { - i := sort.Search(len(di.curChunkHeader), func(i int) bool { - return di.curChunkHeader[i].DocNum >= docNum - }) - if i < len(di.curChunkHeader) && di.curChunkHeader[i].DocNum == docNum { - return ReadDocValueBoundary(i, di.curChunkHeader) - } - return math.MaxUint64, math.MaxUint64 -} - -// VisitDocumentFieldTerms is an implementation of the -// DocumentFieldTermVisitable interface -func (s *SegmentBase) VisitDocumentFieldTerms(localDocNum uint64, fields []string, - visitor index.DocumentFieldTermVisitor, dvsIn segment.DocVisitState) ( - segment.DocVisitState, error) { - dvs, ok := dvsIn.(*docVisitState) - if !ok || dvs == nil { - dvs = &docVisitState{} - } else { - if dvs.segment != s { - dvs.segment = s - dvs.dvrs = nil - } - } - - var fieldIDPlus1 uint16 - if dvs.dvrs == nil { - dvs.dvrs = make(map[uint16]*docValueReader, len(fields)) - for _, field := range fields { - if fieldIDPlus1, ok = s.fieldsMap[field]; !ok { - continue - } - fieldID := fieldIDPlus1 - 1 - if dvIter, exists := s.fieldDvReaders[fieldID]; exists && - dvIter != nil { - dvs.dvrs[fieldID] = dvIter.cloneInto(dvs.dvrs[fieldID]) - } - } - } - - // find the chunkNumber where the docValues are stored - docInChunk := localDocNum / uint64(s.chunkFactor) - var dvr *docValueReader - for _, field := range fields { - if fieldIDPlus1, ok = s.fieldsMap[field]; !ok { - continue - } - fieldID := fieldIDPlus1 - 1 - if dvr, ok = dvs.dvrs[fieldID]; ok && dvr != nil { - // check if the chunk is already loaded - if docInChunk != dvr.curChunkNumber() { - err := dvr.loadDvChunk(docInChunk, s) - if err != nil { - return dvs, err - } - } - - _ = dvr.visitDocValues(localDocNum, visitor) - } - } - return dvs, nil -} - -// VisitableDocValueFields returns the list of fields with -// persisted doc value terms ready to be visitable using the -// VisitDocumentFieldTerms method. -func (s *SegmentBase) VisitableDocValueFields() ([]string, error) { - return s.fieldDvNames, nil -} diff --git a/vendor/github.com/blevesearch/zap/v11/enumerator.go b/vendor/github.com/blevesearch/zap/v11/enumerator.go deleted file mode 100644 index cd6ff73..0000000 --- a/vendor/github.com/blevesearch/zap/v11/enumerator.go +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright (c) 2018 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - - "github.com/couchbase/vellum" -) - -// enumerator provides an ordered traversal of multiple vellum -// iterators. Like JOIN of iterators, the enumerator produces a -// sequence of (key, iteratorIndex, value) tuples, sorted by key ASC, -// then iteratorIndex ASC, where the same key might be seen or -// repeated across multiple child iterators. -type enumerator struct { - itrs []vellum.Iterator - currKs [][]byte - currVs []uint64 - - lowK []byte - lowIdxs []int - lowCurr int -} - -// newEnumerator returns a new enumerator over the vellum Iterators -func newEnumerator(itrs []vellum.Iterator) (*enumerator, error) { - rv := &enumerator{ - itrs: itrs, - currKs: make([][]byte, len(itrs)), - currVs: make([]uint64, len(itrs)), - lowIdxs: make([]int, 0, len(itrs)), - } - for i, itr := range rv.itrs { - rv.currKs[i], rv.currVs[i] = itr.Current() - } - rv.updateMatches(false) - if rv.lowK == nil && len(rv.lowIdxs) == 0 { - return rv, vellum.ErrIteratorDone - } - return rv, nil -} - -// updateMatches maintains the low key matches based on the currKs -func (m *enumerator) updateMatches(skipEmptyKey bool) { - m.lowK = nil - m.lowIdxs = m.lowIdxs[:0] - m.lowCurr = 0 - - for i, key := range m.currKs { - if (key == nil && m.currVs[i] == 0) || // in case of empty iterator - (len(key) == 0 && skipEmptyKey) { // skip empty keys - continue - } - - cmp := bytes.Compare(key, m.lowK) - if cmp < 0 || len(m.lowIdxs) == 0 { - // reached a new low - m.lowK = key - m.lowIdxs = m.lowIdxs[:0] - m.lowIdxs = append(m.lowIdxs, i) - } else if cmp == 0 { - m.lowIdxs = append(m.lowIdxs, i) - } - } -} - -// Current returns the enumerator's current key, iterator-index, and -// value. If the enumerator is not pointing at a valid value (because -// Next returned an error previously), Current will return nil,0,0. -func (m *enumerator) Current() ([]byte, int, uint64) { - var i int - var v uint64 - if m.lowCurr < len(m.lowIdxs) { - i = m.lowIdxs[m.lowCurr] - v = m.currVs[i] - } - return m.lowK, i, v -} - -// Next advances the enumerator to the next key/iterator/value result, -// else vellum.ErrIteratorDone is returned. -func (m *enumerator) Next() error { - m.lowCurr += 1 - if m.lowCurr >= len(m.lowIdxs) { - // move all the current low iterators forwards - for _, vi := range m.lowIdxs { - err := m.itrs[vi].Next() - if err != nil && err != vellum.ErrIteratorDone { - return err - } - m.currKs[vi], m.currVs[vi] = m.itrs[vi].Current() - } - // can skip any empty keys encountered at this point - m.updateMatches(true) - } - if m.lowK == nil && len(m.lowIdxs) == 0 { - return vellum.ErrIteratorDone - } - return nil -} - -// Close all the underlying Iterators. The first error, if any, will -// be returned. -func (m *enumerator) Close() error { - var rv error - for _, itr := range m.itrs { - err := itr.Close() - if rv == nil { - rv = err - } - } - return rv -} diff --git a/vendor/github.com/blevesearch/zap/v11/intcoder.go b/vendor/github.com/blevesearch/zap/v11/intcoder.go deleted file mode 100644 index 571d06e..0000000 --- a/vendor/github.com/blevesearch/zap/v11/intcoder.go +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "encoding/binary" - "io" -) - -type chunkedIntCoder struct { - final []byte - chunkSize uint64 - chunkBuf bytes.Buffer - chunkLens []uint64 - currChunk uint64 - - buf []byte -} - -// newChunkedIntCoder returns a new chunk int coder which packs data into -// chunks based on the provided chunkSize and supports up to the specified -// maxDocNum -func newChunkedIntCoder(chunkSize uint64, maxDocNum uint64) *chunkedIntCoder { - total := maxDocNum/chunkSize + 1 - rv := &chunkedIntCoder{ - chunkSize: chunkSize, - chunkLens: make([]uint64, total), - final: make([]byte, 0, 64), - } - - return rv -} - -// Reset lets you reuse this chunked int coder. buffers are reset and reused -// from previous use. you cannot change the chunk size or max doc num. -func (c *chunkedIntCoder) Reset() { - c.final = c.final[:0] - c.chunkBuf.Reset() - c.currChunk = 0 - for i := range c.chunkLens { - c.chunkLens[i] = 0 - } -} - -// Add encodes the provided integers into the correct chunk for the provided -// doc num. You MUST call Add() with increasing docNums. -func (c *chunkedIntCoder) Add(docNum uint64, vals ...uint64) error { - chunk := docNum / c.chunkSize - if chunk != c.currChunk { - // starting a new chunk - c.Close() - c.chunkBuf.Reset() - c.currChunk = chunk - } - - if len(c.buf) < binary.MaxVarintLen64 { - c.buf = make([]byte, binary.MaxVarintLen64) - } - - for _, val := range vals { - wb := binary.PutUvarint(c.buf, val) - _, err := c.chunkBuf.Write(c.buf[:wb]) - if err != nil { - return err - } - } - - return nil -} - -func (c *chunkedIntCoder) AddBytes(docNum uint64, buf []byte) error { - chunk := docNum / c.chunkSize - if chunk != c.currChunk { - // starting a new chunk - c.Close() - c.chunkBuf.Reset() - c.currChunk = chunk - } - - _, err := c.chunkBuf.Write(buf) - return err -} - -// Close indicates you are done calling Add() this allows the final chunk -// to be encoded. -func (c *chunkedIntCoder) Close() { - encodingBytes := c.chunkBuf.Bytes() - c.chunkLens[c.currChunk] = uint64(len(encodingBytes)) - c.final = append(c.final, encodingBytes...) - c.currChunk = uint64(cap(c.chunkLens)) // sentinel to detect double close -} - -// Write commits all the encoded chunked integers to the provided writer. -func (c *chunkedIntCoder) Write(w io.Writer) (int, error) { - bufNeeded := binary.MaxVarintLen64 * (1 + len(c.chunkLens)) - if len(c.buf) < bufNeeded { - c.buf = make([]byte, bufNeeded) - } - buf := c.buf - - // convert the chunk lengths into chunk offsets - chunkOffsets := modifyLengthsToEndOffsets(c.chunkLens) - - // write out the number of chunks & each chunk offsets - n := binary.PutUvarint(buf, uint64(len(chunkOffsets))) - for _, chunkOffset := range chunkOffsets { - n += binary.PutUvarint(buf[n:], chunkOffset) - } - - tw, err := w.Write(buf[:n]) - if err != nil { - return tw, err - } - - // write out the data - nw, err := w.Write(c.final) - tw += nw - if err != nil { - return tw, err - } - return tw, nil -} - -func (c *chunkedIntCoder) FinalSize() int { - return len(c.final) -} - -// modifyLengthsToEndOffsets converts the chunk length array -// to a chunk offset array. The readChunkBoundary -// will figure out the start and end of every chunk from -// these offsets. Starting offset of i'th index is stored -// in i-1'th position except for 0'th index and ending offset -// is stored at i'th index position. -// For 0'th element, starting position is always zero. -// eg: -// Lens -> 5 5 5 5 => 5 10 15 20 -// Lens -> 0 5 0 5 => 0 5 5 10 -// Lens -> 0 0 0 5 => 0 0 0 5 -// Lens -> 5 0 0 0 => 5 5 5 5 -// Lens -> 0 5 0 0 => 0 5 5 5 -// Lens -> 0 0 5 0 => 0 0 5 5 -func modifyLengthsToEndOffsets(lengths []uint64) []uint64 { - var runningOffset uint64 - var index, i int - for i = 1; i <= len(lengths); i++ { - runningOffset += lengths[i-1] - lengths[index] = runningOffset - index++ - } - return lengths -} - -func readChunkBoundary(chunk int, offsets []uint64) (uint64, uint64) { - var start uint64 - if chunk > 0 { - start = offsets[chunk-1] - } - return start, offsets[chunk] -} diff --git a/vendor/github.com/blevesearch/zap/v11/merge.go b/vendor/github.com/blevesearch/zap/v11/merge.go deleted file mode 100644 index 0d3f545..0000000 --- a/vendor/github.com/blevesearch/zap/v11/merge.go +++ /dev/null @@ -1,860 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bufio" - "bytes" - "encoding/binary" - "fmt" - "math" - "os" - "sort" - - "github.com/RoaringBitmap/roaring" - seg "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/couchbase/vellum" - "github.com/golang/snappy" -) - -var DefaultFileMergerBufferSize = 1024 * 1024 - -const docDropped = math.MaxUint64 // sentinel docNum to represent a deleted doc - -// Merge takes a slice of segments and bit masks describing which -// documents may be dropped, and creates a new segment containing the -// remaining data. This new segment is built at the specified path. -func (*ZapPlugin) Merge(segments []seg.Segment, drops []*roaring.Bitmap, path string, - closeCh chan struct{}, s seg.StatsReporter) ( - [][]uint64, uint64, error) { - - segmentBases := make([]*SegmentBase, len(segments)) - for segmenti, segment := range segments { - switch segmentx := segment.(type) { - case *Segment: - segmentBases[segmenti] = &segmentx.SegmentBase - case *SegmentBase: - segmentBases[segmenti] = segmentx - default: - panic(fmt.Sprintf("oops, unexpected segment type: %T", segment)) - } - } - return mergeSegmentBases(segmentBases, drops, path, defaultChunkFactor, closeCh, s) -} - -func mergeSegmentBases(segmentBases []*SegmentBase, drops []*roaring.Bitmap, path string, - chunkFactor uint32, closeCh chan struct{}, s seg.StatsReporter) ( - [][]uint64, uint64, error) { - flag := os.O_RDWR | os.O_CREATE - - f, err := os.OpenFile(path, flag, 0600) - if err != nil { - return nil, 0, err - } - - cleanup := func() { - _ = f.Close() - _ = os.Remove(path) - } - - // buffer the output - br := bufio.NewWriterSize(f, DefaultFileMergerBufferSize) - - // wrap it for counting (tracking offsets) - cr := NewCountHashWriterWithStatsReporter(br, s) - - newDocNums, numDocs, storedIndexOffset, fieldsIndexOffset, docValueOffset, _, _, _, err := - MergeToWriter(segmentBases, drops, chunkFactor, cr, closeCh) - if err != nil { - cleanup() - return nil, 0, err - } - - err = persistFooter(numDocs, storedIndexOffset, fieldsIndexOffset, - docValueOffset, chunkFactor, cr.Sum32(), cr) - if err != nil { - cleanup() - return nil, 0, err - } - - err = br.Flush() - if err != nil { - cleanup() - return nil, 0, err - } - - err = f.Sync() - if err != nil { - cleanup() - return nil, 0, err - } - - err = f.Close() - if err != nil { - cleanup() - return nil, 0, err - } - - return newDocNums, uint64(cr.Count()), nil -} - -func MergeToWriter(segments []*SegmentBase, drops []*roaring.Bitmap, - chunkFactor uint32, cr *CountHashWriter, closeCh chan struct{}) ( - newDocNums [][]uint64, - numDocs, storedIndexOffset, fieldsIndexOffset, docValueOffset uint64, - dictLocs []uint64, fieldsInv []string, fieldsMap map[string]uint16, - err error) { - docValueOffset = uint64(fieldNotUninverted) - - var fieldsSame bool - fieldsSame, fieldsInv = mergeFields(segments) - fieldsMap = mapFields(fieldsInv) - - numDocs = computeNewDocCount(segments, drops) - - if isClosed(closeCh) { - return nil, 0, 0, 0, 0, nil, nil, nil, seg.ErrClosed - } - - if numDocs > 0 { - storedIndexOffset, newDocNums, err = mergeStoredAndRemap(segments, drops, - fieldsMap, fieldsInv, fieldsSame, numDocs, cr, closeCh) - if err != nil { - return nil, 0, 0, 0, 0, nil, nil, nil, err - } - - dictLocs, docValueOffset, err = persistMergedRest(segments, drops, - fieldsInv, fieldsMap, fieldsSame, - newDocNums, numDocs, chunkFactor, cr, closeCh) - if err != nil { - return nil, 0, 0, 0, 0, nil, nil, nil, err - } - } else { - dictLocs = make([]uint64, len(fieldsInv)) - } - - fieldsIndexOffset, err = persistFields(fieldsInv, cr, dictLocs) - if err != nil { - return nil, 0, 0, 0, 0, nil, nil, nil, err - } - - return newDocNums, numDocs, storedIndexOffset, fieldsIndexOffset, docValueOffset, dictLocs, fieldsInv, fieldsMap, nil -} - -// mapFields takes the fieldsInv list and returns a map of fieldName -// to fieldID+1 -func mapFields(fields []string) map[string]uint16 { - rv := make(map[string]uint16, len(fields)) - for i, fieldName := range fields { - rv[fieldName] = uint16(i) + 1 - } - return rv -} - -// computeNewDocCount determines how many documents will be in the newly -// merged segment when obsoleted docs are dropped -func computeNewDocCount(segments []*SegmentBase, drops []*roaring.Bitmap) uint64 { - var newDocCount uint64 - for segI, segment := range segments { - newDocCount += segment.numDocs - if drops[segI] != nil { - newDocCount -= drops[segI].GetCardinality() - } - } - return newDocCount -} - -func persistMergedRest(segments []*SegmentBase, dropsIn []*roaring.Bitmap, - fieldsInv []string, fieldsMap map[string]uint16, fieldsSame bool, - newDocNumsIn [][]uint64, newSegDocCount uint64, chunkFactor uint32, - w *CountHashWriter, closeCh chan struct{}) ([]uint64, uint64, error) { - - var bufMaxVarintLen64 []byte = make([]byte, binary.MaxVarintLen64) - var bufLoc []uint64 - - var postings *PostingsList - var postItr *PostingsIterator - - rv := make([]uint64, len(fieldsInv)) - fieldDvLocsStart := make([]uint64, len(fieldsInv)) - fieldDvLocsEnd := make([]uint64, len(fieldsInv)) - - tfEncoder := newChunkedIntCoder(uint64(chunkFactor), newSegDocCount-1) - locEncoder := newChunkedIntCoder(uint64(chunkFactor), newSegDocCount-1) - - var vellumBuf bytes.Buffer - newVellum, err := vellum.New(&vellumBuf, nil) - if err != nil { - return nil, 0, err - } - - newRoaring := roaring.NewBitmap() - - // for each field - for fieldID, fieldName := range fieldsInv { - - // collect FST iterators from all active segments for this field - var newDocNums [][]uint64 - var drops []*roaring.Bitmap - var dicts []*Dictionary - var itrs []vellum.Iterator - - var segmentsInFocus []*SegmentBase - - for segmentI, segment := range segments { - - // check for the closure in meantime - if isClosed(closeCh) { - return nil, 0, seg.ErrClosed - } - - dict, err2 := segment.dictionary(fieldName) - if err2 != nil { - return nil, 0, err2 - } - if dict != nil && dict.fst != nil { - itr, err2 := dict.fst.Iterator(nil, nil) - if err2 != nil && err2 != vellum.ErrIteratorDone { - return nil, 0, err2 - } - if itr != nil { - newDocNums = append(newDocNums, newDocNumsIn[segmentI]) - if dropsIn[segmentI] != nil && !dropsIn[segmentI].IsEmpty() { - drops = append(drops, dropsIn[segmentI]) - } else { - drops = append(drops, nil) - } - dicts = append(dicts, dict) - itrs = append(itrs, itr) - segmentsInFocus = append(segmentsInFocus, segment) - } - } - } - - var prevTerm []byte - - newRoaring.Clear() - - var lastDocNum, lastFreq, lastNorm uint64 - - // determines whether to use "1-hit" encoding optimization - // when a term appears in only 1 doc, with no loc info, - // has freq of 1, and the docNum fits into 31-bits - use1HitEncoding := func(termCardinality uint64) (bool, uint64, uint64) { - if termCardinality == uint64(1) && locEncoder.FinalSize() <= 0 { - docNum := uint64(newRoaring.Minimum()) - if under32Bits(docNum) && docNum == lastDocNum && lastFreq == 1 { - return true, docNum, lastNorm - } - } - return false, 0, 0 - } - - finishTerm := func(term []byte) error { - tfEncoder.Close() - locEncoder.Close() - - postingsOffset, err := writePostings(newRoaring, - tfEncoder, locEncoder, use1HitEncoding, w, bufMaxVarintLen64) - if err != nil { - return err - } - - if postingsOffset > 0 { - err = newVellum.Insert(term, postingsOffset) - if err != nil { - return err - } - } - - newRoaring.Clear() - - tfEncoder.Reset() - locEncoder.Reset() - - lastDocNum = 0 - lastFreq = 0 - lastNorm = 0 - - return nil - } - - enumerator, err := newEnumerator(itrs) - - for err == nil { - term, itrI, postingsOffset := enumerator.Current() - - if !bytes.Equal(prevTerm, term) { - // check for the closure in meantime - if isClosed(closeCh) { - return nil, 0, seg.ErrClosed - } - - // if the term changed, write out the info collected - // for the previous term - err = finishTerm(prevTerm) - if err != nil { - return nil, 0, err - } - } - - postings, err = dicts[itrI].postingsListFromOffset( - postingsOffset, drops[itrI], postings) - if err != nil { - return nil, 0, err - } - - postItr = postings.iterator(true, true, true, postItr) - - if fieldsSame { - // can optimize by copying freq/norm/loc bytes directly - lastDocNum, lastFreq, lastNorm, err = mergeTermFreqNormLocsByCopying( - term, postItr, newDocNums[itrI], newRoaring, - tfEncoder, locEncoder) - } else { - lastDocNum, lastFreq, lastNorm, bufLoc, err = mergeTermFreqNormLocs( - fieldsMap, term, postItr, newDocNums[itrI], newRoaring, - tfEncoder, locEncoder, bufLoc) - } - if err != nil { - return nil, 0, err - } - - prevTerm = prevTerm[:0] // copy to prevTerm in case Next() reuses term mem - prevTerm = append(prevTerm, term...) - - err = enumerator.Next() - } - if err != vellum.ErrIteratorDone { - return nil, 0, err - } - - err = finishTerm(prevTerm) - if err != nil { - return nil, 0, err - } - - dictOffset := uint64(w.Count()) - - err = newVellum.Close() - if err != nil { - return nil, 0, err - } - vellumData := vellumBuf.Bytes() - - // write out the length of the vellum data - n := binary.PutUvarint(bufMaxVarintLen64, uint64(len(vellumData))) - _, err = w.Write(bufMaxVarintLen64[:n]) - if err != nil { - return nil, 0, err - } - - // write this vellum to disk - _, err = w.Write(vellumData) - if err != nil { - return nil, 0, err - } - - rv[fieldID] = dictOffset - - // get the field doc value offset (start) - fieldDvLocsStart[fieldID] = uint64(w.Count()) - - // update the field doc values - fdvEncoder := newChunkedContentCoder(uint64(chunkFactor), newSegDocCount-1, w, true) - - fdvReadersAvailable := false - var dvIterClone *docValueReader - for segmentI, segment := range segmentsInFocus { - // check for the closure in meantime - if isClosed(closeCh) { - return nil, 0, seg.ErrClosed - } - - fieldIDPlus1 := uint16(segment.fieldsMap[fieldName]) - if dvIter, exists := segment.fieldDvReaders[fieldIDPlus1-1]; exists && - dvIter != nil { - fdvReadersAvailable = true - dvIterClone = dvIter.cloneInto(dvIterClone) - err = dvIterClone.iterateAllDocValues(segment, func(docNum uint64, terms []byte) error { - if newDocNums[segmentI][docNum] == docDropped { - return nil - } - err := fdvEncoder.Add(newDocNums[segmentI][docNum], terms) - if err != nil { - return err - } - return nil - }) - if err != nil { - return nil, 0, err - } - } - } - - if fdvReadersAvailable { - err = fdvEncoder.Close() - if err != nil { - return nil, 0, err - } - - // persist the doc value details for this field - _, err = fdvEncoder.Write() - if err != nil { - return nil, 0, err - } - - // get the field doc value offset (end) - fieldDvLocsEnd[fieldID] = uint64(w.Count()) - } else { - fieldDvLocsStart[fieldID] = fieldNotUninverted - fieldDvLocsEnd[fieldID] = fieldNotUninverted - } - - // reset vellum buffer and vellum builder - vellumBuf.Reset() - err = newVellum.Reset(&vellumBuf) - if err != nil { - return nil, 0, err - } - } - - fieldDvLocsOffset := uint64(w.Count()) - - buf := bufMaxVarintLen64 - for i := 0; i < len(fieldDvLocsStart); i++ { - n := binary.PutUvarint(buf, fieldDvLocsStart[i]) - _, err := w.Write(buf[:n]) - if err != nil { - return nil, 0, err - } - n = binary.PutUvarint(buf, fieldDvLocsEnd[i]) - _, err = w.Write(buf[:n]) - if err != nil { - return nil, 0, err - } - } - - return rv, fieldDvLocsOffset, nil -} - -func mergeTermFreqNormLocs(fieldsMap map[string]uint16, term []byte, postItr *PostingsIterator, - newDocNums []uint64, newRoaring *roaring.Bitmap, - tfEncoder *chunkedIntCoder, locEncoder *chunkedIntCoder, bufLoc []uint64) ( - lastDocNum uint64, lastFreq uint64, lastNorm uint64, bufLocOut []uint64, err error) { - next, err := postItr.Next() - for next != nil && err == nil { - hitNewDocNum := newDocNums[next.Number()] - if hitNewDocNum == docDropped { - return 0, 0, 0, nil, fmt.Errorf("see hit with dropped docNum") - } - - newRoaring.Add(uint32(hitNewDocNum)) - - nextFreq := next.Frequency() - nextNorm := uint64(math.Float32bits(float32(next.Norm()))) - - locs := next.Locations() - - err = tfEncoder.Add(hitNewDocNum, - encodeFreqHasLocs(nextFreq, len(locs) > 0), nextNorm) - if err != nil { - return 0, 0, 0, nil, err - } - - if len(locs) > 0 { - numBytesLocs := 0 - for _, loc := range locs { - ap := loc.ArrayPositions() - numBytesLocs += totalUvarintBytes(uint64(fieldsMap[loc.Field()]-1), - loc.Pos(), loc.Start(), loc.End(), uint64(len(ap)), ap) - } - - err = locEncoder.Add(hitNewDocNum, uint64(numBytesLocs)) - if err != nil { - return 0, 0, 0, nil, err - } - - for _, loc := range locs { - ap := loc.ArrayPositions() - if cap(bufLoc) < 5+len(ap) { - bufLoc = make([]uint64, 0, 5+len(ap)) - } - args := bufLoc[0:5] - args[0] = uint64(fieldsMap[loc.Field()] - 1) - args[1] = loc.Pos() - args[2] = loc.Start() - args[3] = loc.End() - args[4] = uint64(len(ap)) - args = append(args, ap...) - err = locEncoder.Add(hitNewDocNum, args...) - if err != nil { - return 0, 0, 0, nil, err - } - } - } - - lastDocNum = hitNewDocNum - lastFreq = nextFreq - lastNorm = nextNorm - - next, err = postItr.Next() - } - - return lastDocNum, lastFreq, lastNorm, bufLoc, err -} - -func mergeTermFreqNormLocsByCopying(term []byte, postItr *PostingsIterator, - newDocNums []uint64, newRoaring *roaring.Bitmap, - tfEncoder *chunkedIntCoder, locEncoder *chunkedIntCoder) ( - lastDocNum uint64, lastFreq uint64, lastNorm uint64, err error) { - nextDocNum, nextFreq, nextNorm, nextFreqNormBytes, nextLocBytes, err := - postItr.nextBytes() - for err == nil && len(nextFreqNormBytes) > 0 { - hitNewDocNum := newDocNums[nextDocNum] - if hitNewDocNum == docDropped { - return 0, 0, 0, fmt.Errorf("see hit with dropped doc num") - } - - newRoaring.Add(uint32(hitNewDocNum)) - err = tfEncoder.AddBytes(hitNewDocNum, nextFreqNormBytes) - if err != nil { - return 0, 0, 0, err - } - - if len(nextLocBytes) > 0 { - err = locEncoder.AddBytes(hitNewDocNum, nextLocBytes) - if err != nil { - return 0, 0, 0, err - } - } - - lastDocNum = hitNewDocNum - lastFreq = nextFreq - lastNorm = nextNorm - - nextDocNum, nextFreq, nextNorm, nextFreqNormBytes, nextLocBytes, err = - postItr.nextBytes() - } - - return lastDocNum, lastFreq, lastNorm, err -} - -func writePostings(postings *roaring.Bitmap, tfEncoder, locEncoder *chunkedIntCoder, - use1HitEncoding func(uint64) (bool, uint64, uint64), - w *CountHashWriter, bufMaxVarintLen64 []byte) ( - offset uint64, err error) { - termCardinality := postings.GetCardinality() - if termCardinality <= 0 { - return 0, nil - } - - if use1HitEncoding != nil { - encodeAs1Hit, docNum1Hit, normBits1Hit := use1HitEncoding(termCardinality) - if encodeAs1Hit { - return FSTValEncode1Hit(docNum1Hit, normBits1Hit), nil - } - } - - tfOffset := uint64(w.Count()) - _, err = tfEncoder.Write(w) - if err != nil { - return 0, err - } - - locOffset := uint64(w.Count()) - _, err = locEncoder.Write(w) - if err != nil { - return 0, err - } - - postingsOffset := uint64(w.Count()) - - n := binary.PutUvarint(bufMaxVarintLen64, tfOffset) - _, err = w.Write(bufMaxVarintLen64[:n]) - if err != nil { - return 0, err - } - - n = binary.PutUvarint(bufMaxVarintLen64, locOffset) - _, err = w.Write(bufMaxVarintLen64[:n]) - if err != nil { - return 0, err - } - - _, err = writeRoaringWithLen(postings, w, bufMaxVarintLen64) - if err != nil { - return 0, err - } - - return postingsOffset, nil -} - -type varintEncoder func(uint64) (int, error) - -func mergeStoredAndRemap(segments []*SegmentBase, drops []*roaring.Bitmap, - fieldsMap map[string]uint16, fieldsInv []string, fieldsSame bool, newSegDocCount uint64, - w *CountHashWriter, closeCh chan struct{}) (uint64, [][]uint64, error) { - var rv [][]uint64 // The remapped or newDocNums for each segment. - - var newDocNum uint64 - - var curr int - var data, compressed []byte - var metaBuf bytes.Buffer - varBuf := make([]byte, binary.MaxVarintLen64) - metaEncode := func(val uint64) (int, error) { - wb := binary.PutUvarint(varBuf, val) - return metaBuf.Write(varBuf[:wb]) - } - - vals := make([][][]byte, len(fieldsInv)) - typs := make([][]byte, len(fieldsInv)) - poss := make([][][]uint64, len(fieldsInv)) - - var posBuf []uint64 - - docNumOffsets := make([]uint64, newSegDocCount) - - vdc := visitDocumentCtxPool.Get().(*visitDocumentCtx) - defer visitDocumentCtxPool.Put(vdc) - - // for each segment - for segI, segment := range segments { - // check for the closure in meantime - if isClosed(closeCh) { - return 0, nil, seg.ErrClosed - } - - segNewDocNums := make([]uint64, segment.numDocs) - - dropsI := drops[segI] - - // optimize when the field mapping is the same across all - // segments and there are no deletions, via byte-copying - // of stored docs bytes directly to the writer - if fieldsSame && (dropsI == nil || dropsI.GetCardinality() == 0) { - err := segment.copyStoredDocs(newDocNum, docNumOffsets, w) - if err != nil { - return 0, nil, err - } - - for i := uint64(0); i < segment.numDocs; i++ { - segNewDocNums[i] = newDocNum - newDocNum++ - } - rv = append(rv, segNewDocNums) - - continue - } - - // for each doc num - for docNum := uint64(0); docNum < segment.numDocs; docNum++ { - // TODO: roaring's API limits docNums to 32-bits? - if dropsI != nil && dropsI.Contains(uint32(docNum)) { - segNewDocNums[docNum] = docDropped - continue - } - - segNewDocNums[docNum] = newDocNum - - curr = 0 - metaBuf.Reset() - data = data[:0] - - posTemp := posBuf - - // collect all the data - for i := 0; i < len(fieldsInv); i++ { - vals[i] = vals[i][:0] - typs[i] = typs[i][:0] - poss[i] = poss[i][:0] - } - err := segment.visitDocument(vdc, docNum, func(field string, typ byte, value []byte, pos []uint64) bool { - fieldID := int(fieldsMap[field]) - 1 - vals[fieldID] = append(vals[fieldID], value) - typs[fieldID] = append(typs[fieldID], typ) - - // copy array positions to preserve them beyond the scope of this callback - var curPos []uint64 - if len(pos) > 0 { - if cap(posTemp) < len(pos) { - posBuf = make([]uint64, len(pos)*len(fieldsInv)) - posTemp = posBuf - } - curPos = posTemp[0:len(pos)] - copy(curPos, pos) - posTemp = posTemp[len(pos):] - } - poss[fieldID] = append(poss[fieldID], curPos) - - return true - }) - if err != nil { - return 0, nil, err - } - - // _id field special case optimizes ExternalID() lookups - idFieldVal := vals[uint16(0)][0] - _, err = metaEncode(uint64(len(idFieldVal))) - if err != nil { - return 0, nil, err - } - - // now walk the non-"_id" fields in order - for fieldID := 1; fieldID < len(fieldsInv); fieldID++ { - storedFieldValues := vals[fieldID] - - stf := typs[fieldID] - spf := poss[fieldID] - - var err2 error - curr, data, err2 = persistStoredFieldValues(fieldID, - storedFieldValues, stf, spf, curr, metaEncode, data) - if err2 != nil { - return 0, nil, err2 - } - } - - metaBytes := metaBuf.Bytes() - - compressed = snappy.Encode(compressed[:cap(compressed)], data) - - // record where we're about to start writing - docNumOffsets[newDocNum] = uint64(w.Count()) - - // write out the meta len and compressed data len - _, err = writeUvarints(w, - uint64(len(metaBytes)), - uint64(len(idFieldVal)+len(compressed))) - if err != nil { - return 0, nil, err - } - // now write the meta - _, err = w.Write(metaBytes) - if err != nil { - return 0, nil, err - } - // now write the _id field val (counted as part of the 'compressed' data) - _, err = w.Write(idFieldVal) - if err != nil { - return 0, nil, err - } - // now write the compressed data - _, err = w.Write(compressed) - if err != nil { - return 0, nil, err - } - - newDocNum++ - } - - rv = append(rv, segNewDocNums) - } - - // return value is the start of the stored index - storedIndexOffset := uint64(w.Count()) - - // now write out the stored doc index - for _, docNumOffset := range docNumOffsets { - err := binary.Write(w, binary.BigEndian, docNumOffset) - if err != nil { - return 0, nil, err - } - } - - return storedIndexOffset, rv, nil -} - -// copyStoredDocs writes out a segment's stored doc info, optimized by -// using a single Write() call for the entire set of bytes. The -// newDocNumOffsets is filled with the new offsets for each doc. -func (s *SegmentBase) copyStoredDocs(newDocNum uint64, newDocNumOffsets []uint64, - w *CountHashWriter) error { - if s.numDocs <= 0 { - return nil - } - - indexOffset0, storedOffset0, _, _, _ := - s.getDocStoredOffsets(0) // the segment's first doc - - indexOffsetN, storedOffsetN, readN, metaLenN, dataLenN := - s.getDocStoredOffsets(s.numDocs - 1) // the segment's last doc - - storedOffset0New := uint64(w.Count()) - - storedBytes := s.mem[storedOffset0 : storedOffsetN+readN+metaLenN+dataLenN] - _, err := w.Write(storedBytes) - if err != nil { - return err - } - - // remap the storedOffset's for the docs into new offsets relative - // to storedOffset0New, filling the given docNumOffsetsOut array - for indexOffset := indexOffset0; indexOffset <= indexOffsetN; indexOffset += 8 { - storedOffset := binary.BigEndian.Uint64(s.mem[indexOffset : indexOffset+8]) - storedOffsetNew := storedOffset - storedOffset0 + storedOffset0New - newDocNumOffsets[newDocNum] = storedOffsetNew - newDocNum += 1 - } - - return nil -} - -// mergeFields builds a unified list of fields used across all the -// input segments, and computes whether the fields are the same across -// segments (which depends on fields to be sorted in the same way -// across segments) -func mergeFields(segments []*SegmentBase) (bool, []string) { - fieldsSame := true - - var segment0Fields []string - if len(segments) > 0 { - segment0Fields = segments[0].Fields() - } - - fieldsExist := map[string]struct{}{} - for _, segment := range segments { - fields := segment.Fields() - for fieldi, field := range fields { - fieldsExist[field] = struct{}{} - if len(segment0Fields) != len(fields) || segment0Fields[fieldi] != field { - fieldsSame = false - } - } - } - - rv := make([]string, 0, len(fieldsExist)) - // ensure _id stays first - rv = append(rv, "_id") - for k := range fieldsExist { - if k != "_id" { - rv = append(rv, k) - } - } - - sort.Strings(rv[1:]) // leave _id as first - - return fieldsSame, rv -} - -func isClosed(closeCh chan struct{}) bool { - select { - case <-closeCh: - return true - default: - return false - } -} diff --git a/vendor/github.com/blevesearch/zap/v11/new.go b/vendor/github.com/blevesearch/zap/v11/new.go deleted file mode 100644 index 6c75f2f..0000000 --- a/vendor/github.com/blevesearch/zap/v11/new.go +++ /dev/null @@ -1,847 +0,0 @@ -// Copyright (c) 2018 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "encoding/binary" - "math" - "sort" - "sync" - - "github.com/RoaringBitmap/roaring" - "github.com/blevesearch/bleve/analysis" - "github.com/blevesearch/bleve/document" - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/couchbase/vellum" - "github.com/golang/snappy" -) - -var NewSegmentBufferNumResultsBump int = 100 -var NewSegmentBufferNumResultsFactor float64 = 1.0 -var NewSegmentBufferAvgBytesPerDocFactor float64 = 1.0 - -// ValidateDocFields can be set by applications to perform additional checks -// on fields in a document being added to a new segment, by default it does -// nothing. -// This API is experimental and may be removed at any time. -var ValidateDocFields = func(field document.Field) error { - return nil -} - -var defaultChunkFactor uint32 = 1024 - -// AnalysisResultsToSegmentBase produces an in-memory zap-encoded -// SegmentBase from analysis results -func (z *ZapPlugin) New(results []*index.AnalysisResult) ( - segment.Segment, uint64, error) { - return z.newWithChunkFactor(results, defaultChunkFactor) -} - -func (*ZapPlugin) newWithChunkFactor(results []*index.AnalysisResult, - chunkFactor uint32) (segment.Segment, uint64, error) { - s := interimPool.Get().(*interim) - - var br bytes.Buffer - if s.lastNumDocs > 0 { - // use previous results to initialize the buf with an estimate - // size, but note that the interim instance comes from a - // global interimPool, so multiple scorch instances indexing - // different docs can lead to low quality estimates - estimateAvgBytesPerDoc := int(float64(s.lastOutSize/s.lastNumDocs) * - NewSegmentBufferNumResultsFactor) - estimateNumResults := int(float64(len(results)+NewSegmentBufferNumResultsBump) * - NewSegmentBufferAvgBytesPerDocFactor) - br.Grow(estimateAvgBytesPerDoc * estimateNumResults) - } - - s.results = results - s.chunkFactor = chunkFactor - s.w = NewCountHashWriter(&br) - - storedIndexOffset, fieldsIndexOffset, fdvIndexOffset, dictOffsets, - err := s.convert() - if err != nil { - return nil, uint64(0), err - } - - sb, err := InitSegmentBase(br.Bytes(), s.w.Sum32(), chunkFactor, - s.FieldsMap, s.FieldsInv, uint64(len(results)), - storedIndexOffset, fieldsIndexOffset, fdvIndexOffset, dictOffsets) - - if err == nil && s.reset() == nil { - s.lastNumDocs = len(results) - s.lastOutSize = len(br.Bytes()) - interimPool.Put(s) - } - - return sb, uint64(len(br.Bytes())), err -} - -var interimPool = sync.Pool{New: func() interface{} { return &interim{} }} - -// interim holds temporary working data used while converting from -// analysis results to a zap-encoded segment -type interim struct { - results []*index.AnalysisResult - - chunkFactor uint32 - - w *CountHashWriter - - // FieldsMap adds 1 to field id to avoid zero value issues - // name -> field id + 1 - FieldsMap map[string]uint16 - - // FieldsInv is the inverse of FieldsMap - // field id -> name - FieldsInv []string - - // Term dictionaries for each field - // field id -> term -> postings list id + 1 - Dicts []map[string]uint64 - - // Terms for each field, where terms are sorted ascending - // field id -> []term - DictKeys [][]string - - // Fields whose IncludeDocValues is true - // field id -> bool - IncludeDocValues []bool - - // postings id -> bitmap of docNums - Postings []*roaring.Bitmap - - // postings id -> freq/norm's, one for each docNum in postings - FreqNorms [][]interimFreqNorm - freqNormsBacking []interimFreqNorm - - // postings id -> locs, one for each freq - Locs [][]interimLoc - locsBacking []interimLoc - - numTermsPerPostingsList []int // key is postings list id - numLocsPerPostingsList []int // key is postings list id - - builder *vellum.Builder - builderBuf bytes.Buffer - - metaBuf bytes.Buffer - - tmp0 []byte - tmp1 []byte - - lastNumDocs int - lastOutSize int -} - -func (s *interim) reset() (err error) { - s.results = nil - s.chunkFactor = 0 - s.w = nil - s.FieldsMap = nil - s.FieldsInv = nil - for i := range s.Dicts { - s.Dicts[i] = nil - } - s.Dicts = s.Dicts[:0] - for i := range s.DictKeys { - s.DictKeys[i] = s.DictKeys[i][:0] - } - s.DictKeys = s.DictKeys[:0] - for i := range s.IncludeDocValues { - s.IncludeDocValues[i] = false - } - s.IncludeDocValues = s.IncludeDocValues[:0] - for _, idn := range s.Postings { - idn.Clear() - } - s.Postings = s.Postings[:0] - s.FreqNorms = s.FreqNorms[:0] - for i := range s.freqNormsBacking { - s.freqNormsBacking[i] = interimFreqNorm{} - } - s.freqNormsBacking = s.freqNormsBacking[:0] - s.Locs = s.Locs[:0] - for i := range s.locsBacking { - s.locsBacking[i] = interimLoc{} - } - s.locsBacking = s.locsBacking[:0] - s.numTermsPerPostingsList = s.numTermsPerPostingsList[:0] - s.numLocsPerPostingsList = s.numLocsPerPostingsList[:0] - s.builderBuf.Reset() - if s.builder != nil { - err = s.builder.Reset(&s.builderBuf) - } - s.metaBuf.Reset() - s.tmp0 = s.tmp0[:0] - s.tmp1 = s.tmp1[:0] - s.lastNumDocs = 0 - s.lastOutSize = 0 - - return err -} - -func (s *interim) grabBuf(size int) []byte { - buf := s.tmp0 - if cap(buf) < size { - buf = make([]byte, size) - s.tmp0 = buf - } - return buf[0:size] -} - -type interimStoredField struct { - vals [][]byte - typs []byte - arrayposs [][]uint64 // array positions -} - -type interimFreqNorm struct { - freq uint64 - norm float32 - numLocs int -} - -type interimLoc struct { - fieldID uint16 - pos uint64 - start uint64 - end uint64 - arrayposs []uint64 -} - -func (s *interim) convert() (uint64, uint64, uint64, []uint64, error) { - s.FieldsMap = map[string]uint16{} - - s.getOrDefineField("_id") // _id field is fieldID 0 - - for _, result := range s.results { - for _, field := range result.Document.CompositeFields { - s.getOrDefineField(field.Name()) - } - for _, field := range result.Document.Fields { - s.getOrDefineField(field.Name()) - } - } - - sort.Strings(s.FieldsInv[1:]) // keep _id as first field - - for fieldID, fieldName := range s.FieldsInv { - s.FieldsMap[fieldName] = uint16(fieldID + 1) - } - - if cap(s.IncludeDocValues) >= len(s.FieldsInv) { - s.IncludeDocValues = s.IncludeDocValues[:len(s.FieldsInv)] - } else { - s.IncludeDocValues = make([]bool, len(s.FieldsInv)) - } - - s.prepareDicts() - - for _, dict := range s.DictKeys { - sort.Strings(dict) - } - - s.processDocuments() - - storedIndexOffset, err := s.writeStoredFields() - if err != nil { - return 0, 0, 0, nil, err - } - - var fdvIndexOffset uint64 - var dictOffsets []uint64 - - if len(s.results) > 0 { - fdvIndexOffset, dictOffsets, err = s.writeDicts() - if err != nil { - return 0, 0, 0, nil, err - } - } else { - dictOffsets = make([]uint64, len(s.FieldsInv)) - } - - fieldsIndexOffset, err := persistFields(s.FieldsInv, s.w, dictOffsets) - if err != nil { - return 0, 0, 0, nil, err - } - - return storedIndexOffset, fieldsIndexOffset, fdvIndexOffset, dictOffsets, nil -} - -func (s *interim) getOrDefineField(fieldName string) int { - fieldIDPlus1, exists := s.FieldsMap[fieldName] - if !exists { - fieldIDPlus1 = uint16(len(s.FieldsInv) + 1) - s.FieldsMap[fieldName] = fieldIDPlus1 - s.FieldsInv = append(s.FieldsInv, fieldName) - - s.Dicts = append(s.Dicts, make(map[string]uint64)) - - n := len(s.DictKeys) - if n < cap(s.DictKeys) { - s.DictKeys = s.DictKeys[:n+1] - s.DictKeys[n] = s.DictKeys[n][:0] - } else { - s.DictKeys = append(s.DictKeys, []string(nil)) - } - } - - return int(fieldIDPlus1 - 1) -} - -// fill Dicts and DictKeys from analysis results -func (s *interim) prepareDicts() { - var pidNext int - - var totTFs int - var totLocs int - - visitField := func(fieldID uint16, tfs analysis.TokenFrequencies) { - dict := s.Dicts[fieldID] - dictKeys := s.DictKeys[fieldID] - - for term, tf := range tfs { - pidPlus1, exists := dict[term] - if !exists { - pidNext++ - pidPlus1 = uint64(pidNext) - - dict[term] = pidPlus1 - dictKeys = append(dictKeys, term) - - s.numTermsPerPostingsList = append(s.numTermsPerPostingsList, 0) - s.numLocsPerPostingsList = append(s.numLocsPerPostingsList, 0) - } - - pid := pidPlus1 - 1 - - s.numTermsPerPostingsList[pid] += 1 - s.numLocsPerPostingsList[pid] += len(tf.Locations) - - totLocs += len(tf.Locations) - } - - totTFs += len(tfs) - - s.DictKeys[fieldID] = dictKeys - } - - for _, result := range s.results { - // walk each composite field - for _, field := range result.Document.CompositeFields { - fieldID := uint16(s.getOrDefineField(field.Name())) - _, tf := field.Analyze() - visitField(fieldID, tf) - } - - // walk each field - for i, field := range result.Document.Fields { - fieldID := uint16(s.getOrDefineField(field.Name())) - tf := result.Analyzed[i] - visitField(fieldID, tf) - } - } - - numPostingsLists := pidNext - - if cap(s.Postings) >= numPostingsLists { - s.Postings = s.Postings[:numPostingsLists] - } else { - postings := make([]*roaring.Bitmap, numPostingsLists) - copy(postings, s.Postings[:cap(s.Postings)]) - for i := 0; i < numPostingsLists; i++ { - if postings[i] == nil { - postings[i] = roaring.New() - } - } - s.Postings = postings - } - - if cap(s.FreqNorms) >= numPostingsLists { - s.FreqNorms = s.FreqNorms[:numPostingsLists] - } else { - s.FreqNorms = make([][]interimFreqNorm, numPostingsLists) - } - - if cap(s.freqNormsBacking) >= totTFs { - s.freqNormsBacking = s.freqNormsBacking[:totTFs] - } else { - s.freqNormsBacking = make([]interimFreqNorm, totTFs) - } - - freqNormsBacking := s.freqNormsBacking - for pid, numTerms := range s.numTermsPerPostingsList { - s.FreqNorms[pid] = freqNormsBacking[0:0] - freqNormsBacking = freqNormsBacking[numTerms:] - } - - if cap(s.Locs) >= numPostingsLists { - s.Locs = s.Locs[:numPostingsLists] - } else { - s.Locs = make([][]interimLoc, numPostingsLists) - } - - if cap(s.locsBacking) >= totLocs { - s.locsBacking = s.locsBacking[:totLocs] - } else { - s.locsBacking = make([]interimLoc, totLocs) - } - - locsBacking := s.locsBacking - for pid, numLocs := range s.numLocsPerPostingsList { - s.Locs[pid] = locsBacking[0:0] - locsBacking = locsBacking[numLocs:] - } -} - -func (s *interim) processDocuments() { - numFields := len(s.FieldsInv) - reuseFieldLens := make([]int, numFields) - reuseFieldTFs := make([]analysis.TokenFrequencies, numFields) - - for docNum, result := range s.results { - for i := 0; i < numFields; i++ { // clear these for reuse - reuseFieldLens[i] = 0 - reuseFieldTFs[i] = nil - } - - s.processDocument(uint64(docNum), result, - reuseFieldLens, reuseFieldTFs) - } -} - -func (s *interim) processDocument(docNum uint64, - result *index.AnalysisResult, - fieldLens []int, fieldTFs []analysis.TokenFrequencies) { - visitField := func(fieldID uint16, fieldName string, - ln int, tf analysis.TokenFrequencies) { - fieldLens[fieldID] += ln - - existingFreqs := fieldTFs[fieldID] - if existingFreqs != nil { - existingFreqs.MergeAll(fieldName, tf) - } else { - fieldTFs[fieldID] = tf - } - } - - // walk each composite field - for _, field := range result.Document.CompositeFields { - fieldID := uint16(s.getOrDefineField(field.Name())) - ln, tf := field.Analyze() - visitField(fieldID, field.Name(), ln, tf) - } - - // walk each field - for i, field := range result.Document.Fields { - fieldID := uint16(s.getOrDefineField(field.Name())) - ln := result.Length[i] - tf := result.Analyzed[i] - visitField(fieldID, field.Name(), ln, tf) - } - - // now that it's been rolled up into fieldTFs, walk that - for fieldID, tfs := range fieldTFs { - dict := s.Dicts[fieldID] - norm := float32(1.0 / math.Sqrt(float64(fieldLens[fieldID]))) - - for term, tf := range tfs { - pid := dict[term] - 1 - bs := s.Postings[pid] - bs.Add(uint32(docNum)) - - s.FreqNorms[pid] = append(s.FreqNorms[pid], - interimFreqNorm{ - freq: uint64(tf.Frequency()), - norm: norm, - numLocs: len(tf.Locations), - }) - - if len(tf.Locations) > 0 { - locs := s.Locs[pid] - - for _, loc := range tf.Locations { - var locf = uint16(fieldID) - if loc.Field != "" { - locf = uint16(s.getOrDefineField(loc.Field)) - } - var arrayposs []uint64 - if len(loc.ArrayPositions) > 0 { - arrayposs = loc.ArrayPositions - } - locs = append(locs, interimLoc{ - fieldID: locf, - pos: uint64(loc.Position), - start: uint64(loc.Start), - end: uint64(loc.End), - arrayposs: arrayposs, - }) - } - - s.Locs[pid] = locs - } - } - } -} - -func (s *interim) writeStoredFields() ( - storedIndexOffset uint64, err error) { - varBuf := make([]byte, binary.MaxVarintLen64) - metaEncode := func(val uint64) (int, error) { - wb := binary.PutUvarint(varBuf, val) - return s.metaBuf.Write(varBuf[:wb]) - } - - data, compressed := s.tmp0[:0], s.tmp1[:0] - defer func() { s.tmp0, s.tmp1 = data, compressed }() - - // keyed by docNum - docStoredOffsets := make([]uint64, len(s.results)) - - // keyed by fieldID, for the current doc in the loop - docStoredFields := map[uint16]interimStoredField{} - - for docNum, result := range s.results { - for fieldID := range docStoredFields { // reset for next doc - delete(docStoredFields, fieldID) - } - - for _, field := range result.Document.Fields { - fieldID := uint16(s.getOrDefineField(field.Name())) - - opts := field.Options() - - if opts.IsStored() { - isf := docStoredFields[fieldID] - isf.vals = append(isf.vals, field.Value()) - isf.typs = append(isf.typs, encodeFieldType(field)) - isf.arrayposs = append(isf.arrayposs, field.ArrayPositions()) - docStoredFields[fieldID] = isf - } - - if opts.IncludeDocValues() { - s.IncludeDocValues[fieldID] = true - } - - err := ValidateDocFields(field) - if err != nil { - return 0, err - } - } - - var curr int - - s.metaBuf.Reset() - data = data[:0] - - // _id field special case optimizes ExternalID() lookups - idFieldVal := docStoredFields[uint16(0)].vals[0] - _, err = metaEncode(uint64(len(idFieldVal))) - if err != nil { - return 0, err - } - - // handle non-"_id" fields - for fieldID := 1; fieldID < len(s.FieldsInv); fieldID++ { - isf, exists := docStoredFields[uint16(fieldID)] - if exists { - curr, data, err = persistStoredFieldValues( - fieldID, isf.vals, isf.typs, isf.arrayposs, - curr, metaEncode, data) - if err != nil { - return 0, err - } - } - } - - metaBytes := s.metaBuf.Bytes() - - compressed = snappy.Encode(compressed[:cap(compressed)], data) - - docStoredOffsets[docNum] = uint64(s.w.Count()) - - _, err := writeUvarints(s.w, - uint64(len(metaBytes)), - uint64(len(idFieldVal)+len(compressed))) - if err != nil { - return 0, err - } - - _, err = s.w.Write(metaBytes) - if err != nil { - return 0, err - } - - _, err = s.w.Write(idFieldVal) - if err != nil { - return 0, err - } - - _, err = s.w.Write(compressed) - if err != nil { - return 0, err - } - } - - storedIndexOffset = uint64(s.w.Count()) - - for _, docStoredOffset := range docStoredOffsets { - err = binary.Write(s.w, binary.BigEndian, docStoredOffset) - if err != nil { - return 0, err - } - } - - return storedIndexOffset, nil -} - -func (s *interim) writeDicts() (fdvIndexOffset uint64, dictOffsets []uint64, err error) { - dictOffsets = make([]uint64, len(s.FieldsInv)) - - fdvOffsetsStart := make([]uint64, len(s.FieldsInv)) - fdvOffsetsEnd := make([]uint64, len(s.FieldsInv)) - - buf := s.grabBuf(binary.MaxVarintLen64) - - tfEncoder := newChunkedIntCoder(uint64(s.chunkFactor), uint64(len(s.results)-1)) - locEncoder := newChunkedIntCoder(uint64(s.chunkFactor), uint64(len(s.results)-1)) - fdvEncoder := newChunkedContentCoder(uint64(s.chunkFactor), uint64(len(s.results)-1), s.w, false) - - var docTermMap [][]byte - - if s.builder == nil { - s.builder, err = vellum.New(&s.builderBuf, nil) - if err != nil { - return 0, nil, err - } - } - - for fieldID, terms := range s.DictKeys { - if cap(docTermMap) < len(s.results) { - docTermMap = make([][]byte, len(s.results)) - } else { - docTermMap = docTermMap[0:len(s.results)] - for docNum := range docTermMap { // reset the docTermMap - docTermMap[docNum] = docTermMap[docNum][:0] - } - } - - dict := s.Dicts[fieldID] - - for _, term := range terms { // terms are already sorted - pid := dict[term] - 1 - - postingsBS := s.Postings[pid] - - freqNorms := s.FreqNorms[pid] - freqNormOffset := 0 - - locs := s.Locs[pid] - locOffset := 0 - - postingsItr := postingsBS.Iterator() - for postingsItr.HasNext() { - docNum := uint64(postingsItr.Next()) - - freqNorm := freqNorms[freqNormOffset] - - err = tfEncoder.Add(docNum, - encodeFreqHasLocs(freqNorm.freq, freqNorm.numLocs > 0), - uint64(math.Float32bits(freqNorm.norm))) - if err != nil { - return 0, nil, err - } - - if freqNorm.numLocs > 0 { - numBytesLocs := 0 - for _, loc := range locs[locOffset : locOffset+freqNorm.numLocs] { - numBytesLocs += totalUvarintBytes( - uint64(loc.fieldID), loc.pos, loc.start, loc.end, - uint64(len(loc.arrayposs)), loc.arrayposs) - } - - err = locEncoder.Add(docNum, uint64(numBytesLocs)) - if err != nil { - return 0, nil, err - } - - for _, loc := range locs[locOffset : locOffset+freqNorm.numLocs] { - err = locEncoder.Add(docNum, - uint64(loc.fieldID), loc.pos, loc.start, loc.end, - uint64(len(loc.arrayposs))) - if err != nil { - return 0, nil, err - } - - err = locEncoder.Add(docNum, loc.arrayposs...) - if err != nil { - return 0, nil, err - } - } - - locOffset += freqNorm.numLocs - } - - freqNormOffset++ - - docTermMap[docNum] = append( - append(docTermMap[docNum], term...), - termSeparator) - } - - tfEncoder.Close() - locEncoder.Close() - - postingsOffset, err := - writePostings(postingsBS, tfEncoder, locEncoder, nil, s.w, buf) - if err != nil { - return 0, nil, err - } - - if postingsOffset > uint64(0) { - err = s.builder.Insert([]byte(term), postingsOffset) - if err != nil { - return 0, nil, err - } - } - - tfEncoder.Reset() - locEncoder.Reset() - } - - err = s.builder.Close() - if err != nil { - return 0, nil, err - } - - // record where this dictionary starts - dictOffsets[fieldID] = uint64(s.w.Count()) - - vellumData := s.builderBuf.Bytes() - - // write out the length of the vellum data - n := binary.PutUvarint(buf, uint64(len(vellumData))) - _, err = s.w.Write(buf[:n]) - if err != nil { - return 0, nil, err - } - - // write this vellum to disk - _, err = s.w.Write(vellumData) - if err != nil { - return 0, nil, err - } - - // reset vellum for reuse - s.builderBuf.Reset() - - err = s.builder.Reset(&s.builderBuf) - if err != nil { - return 0, nil, err - } - - // write the field doc values - if s.IncludeDocValues[fieldID] { - for docNum, docTerms := range docTermMap { - if len(docTerms) > 0 { - err = fdvEncoder.Add(uint64(docNum), docTerms) - if err != nil { - return 0, nil, err - } - } - } - err = fdvEncoder.Close() - if err != nil { - return 0, nil, err - } - - fdvOffsetsStart[fieldID] = uint64(s.w.Count()) - - _, err = fdvEncoder.Write() - if err != nil { - return 0, nil, err - } - - fdvOffsetsEnd[fieldID] = uint64(s.w.Count()) - - fdvEncoder.Reset() - } else { - fdvOffsetsStart[fieldID] = fieldNotUninverted - fdvOffsetsEnd[fieldID] = fieldNotUninverted - } - } - - fdvIndexOffset = uint64(s.w.Count()) - - for i := 0; i < len(fdvOffsetsStart); i++ { - n := binary.PutUvarint(buf, fdvOffsetsStart[i]) - _, err := s.w.Write(buf[:n]) - if err != nil { - return 0, nil, err - } - n = binary.PutUvarint(buf, fdvOffsetsEnd[i]) - _, err = s.w.Write(buf[:n]) - if err != nil { - return 0, nil, err - } - } - - return fdvIndexOffset, dictOffsets, nil -} - -func encodeFieldType(f document.Field) byte { - fieldType := byte('x') - switch f.(type) { - case *document.TextField: - fieldType = 't' - case *document.NumericField: - fieldType = 'n' - case *document.DateTimeField: - fieldType = 'd' - case *document.BooleanField: - fieldType = 'b' - case *document.GeoPointField: - fieldType = 'g' - case *document.CompositeField: - fieldType = 'c' - } - return fieldType -} - -// returns the total # of bytes needed to encode the given uint64's -// into binary.PutUVarint() encoding -func totalUvarintBytes(a, b, c, d, e uint64, more []uint64) (n int) { - n = numUvarintBytes(a) - n += numUvarintBytes(b) - n += numUvarintBytes(c) - n += numUvarintBytes(d) - n += numUvarintBytes(e) - for _, v := range more { - n += numUvarintBytes(v) - } - return n -} - -// returns # of bytes needed to encode x in binary.PutUvarint() encoding -func numUvarintBytes(x uint64) (n int) { - for x >= 0x80 { - x >>= 7 - n++ - } - return n + 1 -} diff --git a/vendor/github.com/blevesearch/zap/v11/plugin.go b/vendor/github.com/blevesearch/zap/v11/plugin.go deleted file mode 100644 index 38a0638..0000000 --- a/vendor/github.com/blevesearch/zap/v11/plugin.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2020 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "github.com/blevesearch/bleve/index/scorch/segment" -) - -// ZapPlugin implements the Plugin interface of -// the blevesearch/bleve/index/scorch/segment pkg -type ZapPlugin struct{} - -func (*ZapPlugin) Type() string { - return Type -} - -func (*ZapPlugin) Version() uint32 { - return Version -} - -// Plugin returns an instance segment.Plugin for use -// by the Scorch indexing scheme -func Plugin() segment.Plugin { - return &ZapPlugin{} -} diff --git a/vendor/github.com/blevesearch/zap/v11/posting.go b/vendor/github.com/blevesearch/zap/v11/posting.go deleted file mode 100644 index 619dc4c..0000000 --- a/vendor/github.com/blevesearch/zap/v11/posting.go +++ /dev/null @@ -1,910 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "encoding/binary" - "fmt" - "math" - "reflect" - - "github.com/RoaringBitmap/roaring" - "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/blevesearch/bleve/size" -) - -var reflectStaticSizePostingsList int -var reflectStaticSizePostingsIterator int -var reflectStaticSizePosting int -var reflectStaticSizeLocation int - -func init() { - var pl PostingsList - reflectStaticSizePostingsList = int(reflect.TypeOf(pl).Size()) - var pi PostingsIterator - reflectStaticSizePostingsIterator = int(reflect.TypeOf(pi).Size()) - var p Posting - reflectStaticSizePosting = int(reflect.TypeOf(p).Size()) - var l Location - reflectStaticSizeLocation = int(reflect.TypeOf(l).Size()) -} - -// FST or vellum value (uint64) encoding is determined by the top two -// highest-order or most significant bits... -// -// encoding : MSB -// name : 63 62 61...to...bit #0 (LSB) -// ----------+---+---+--------------------------------------------------- -// general : 0 | 0 | 62-bits of postingsOffset. -// ~ : 0 | 1 | reserved for future. -// 1-hit : 1 | 0 | 31-bits of positive float31 norm | 31-bits docNum. -// ~ : 1 | 1 | reserved for future. -// -// Encoding "general" is able to handle all cases, where the -// postingsOffset points to more information about the postings for -// the term. -// -// Encoding "1-hit" is used to optimize a commonly seen case when a -// term has only a single hit. For example, a term in the _id field -// will have only 1 hit. The "1-hit" encoding is used for a term -// in a field when... -// -// - term vector info is disabled for that field; -// - and, the term appears in only a single doc for that field; -// - and, the term's freq is exactly 1 in that single doc for that field; -// - and, the docNum must fit into 31-bits; -// -// Otherwise, the "general" encoding is used instead. -// -// In the "1-hit" encoding, the field in that single doc may have -// other terms, which is supported in the "1-hit" encoding by the -// positive float31 norm. - -const FSTValEncodingMask = uint64(0xc000000000000000) -const FSTValEncodingGeneral = uint64(0x0000000000000000) -const FSTValEncoding1Hit = uint64(0x8000000000000000) - -func FSTValEncode1Hit(docNum uint64, normBits uint64) uint64 { - return FSTValEncoding1Hit | ((mask31Bits & normBits) << 31) | (mask31Bits & docNum) -} - -func FSTValDecode1Hit(v uint64) (docNum uint64, normBits uint64) { - return (mask31Bits & v), (mask31Bits & (v >> 31)) -} - -const mask31Bits = uint64(0x000000007fffffff) - -func under32Bits(x uint64) bool { - return x <= mask31Bits -} - -const DocNum1HitFinished = math.MaxUint64 - -var NormBits1Hit = uint64(math.Float32bits(float32(1))) - -// PostingsList is an in-memory representation of a postings list -type PostingsList struct { - sb *SegmentBase - postingsOffset uint64 - freqOffset uint64 - locOffset uint64 - postings *roaring.Bitmap - except *roaring.Bitmap - - // when normBits1Hit != 0, then this postings list came from a - // 1-hit encoding, and only the docNum1Hit & normBits1Hit apply - docNum1Hit uint64 - normBits1Hit uint64 -} - -// represents an immutable, empty postings list -var emptyPostingsList = &PostingsList{} - -func (p *PostingsList) Size() int { - sizeInBytes := reflectStaticSizePostingsList + size.SizeOfPtr - - if p.except != nil { - sizeInBytes += int(p.except.GetSizeInBytes()) - } - - return sizeInBytes -} - -func (p *PostingsList) OrInto(receiver *roaring.Bitmap) { - if p.normBits1Hit != 0 { - receiver.Add(uint32(p.docNum1Hit)) - return - } - - if p.postings != nil { - receiver.Or(p.postings) - } -} - -// Iterator returns an iterator for this postings list -func (p *PostingsList) Iterator(includeFreq, includeNorm, includeLocs bool, - prealloc segment.PostingsIterator) segment.PostingsIterator { - if p.normBits1Hit == 0 && p.postings == nil { - return emptyPostingsIterator - } - - var preallocPI *PostingsIterator - pi, ok := prealloc.(*PostingsIterator) - if ok && pi != nil { - preallocPI = pi - } - if preallocPI == emptyPostingsIterator { - preallocPI = nil - } - - return p.iterator(includeFreq, includeNorm, includeLocs, preallocPI) -} - -func (p *PostingsList) iterator(includeFreq, includeNorm, includeLocs bool, - rv *PostingsIterator) *PostingsIterator { - if rv == nil { - rv = &PostingsIterator{} - } else { - freqNormReader := rv.freqNormReader - if freqNormReader != nil { - freqNormReader.Reset([]byte(nil)) - } - - locReader := rv.locReader - if locReader != nil { - locReader.Reset([]byte(nil)) - } - - freqChunkOffsets := rv.freqChunkOffsets[:0] - locChunkOffsets := rv.locChunkOffsets[:0] - - nextLocs := rv.nextLocs[:0] - nextSegmentLocs := rv.nextSegmentLocs[:0] - - buf := rv.buf - - *rv = PostingsIterator{} // clear the struct - - rv.freqNormReader = freqNormReader - rv.locReader = locReader - - rv.freqChunkOffsets = freqChunkOffsets - rv.locChunkOffsets = locChunkOffsets - - rv.nextLocs = nextLocs - rv.nextSegmentLocs = nextSegmentLocs - - rv.buf = buf - } - - rv.postings = p - rv.includeFreqNorm = includeFreq || includeNorm || includeLocs - rv.includeLocs = includeLocs - - if p.normBits1Hit != 0 { - // "1-hit" encoding - rv.docNum1Hit = p.docNum1Hit - rv.normBits1Hit = p.normBits1Hit - - if p.except != nil && p.except.Contains(uint32(rv.docNum1Hit)) { - rv.docNum1Hit = DocNum1HitFinished - } - - return rv - } - - // "general" encoding, check if empty - if p.postings == nil { - return rv - } - - var n uint64 - var read int - - // prepare the freq chunk details - if rv.includeFreqNorm { - var numFreqChunks uint64 - numFreqChunks, read = binary.Uvarint(p.sb.mem[p.freqOffset+n : p.freqOffset+n+binary.MaxVarintLen64]) - n += uint64(read) - if cap(rv.freqChunkOffsets) >= int(numFreqChunks) { - rv.freqChunkOffsets = rv.freqChunkOffsets[:int(numFreqChunks)] - } else { - rv.freqChunkOffsets = make([]uint64, int(numFreqChunks)) - } - for i := 0; i < int(numFreqChunks); i++ { - rv.freqChunkOffsets[i], read = binary.Uvarint(p.sb.mem[p.freqOffset+n : p.freqOffset+n+binary.MaxVarintLen64]) - n += uint64(read) - } - rv.freqChunkStart = p.freqOffset + n - } - - // prepare the loc chunk details - if rv.includeLocs { - n = 0 - var numLocChunks uint64 - numLocChunks, read = binary.Uvarint(p.sb.mem[p.locOffset+n : p.locOffset+n+binary.MaxVarintLen64]) - n += uint64(read) - if cap(rv.locChunkOffsets) >= int(numLocChunks) { - rv.locChunkOffsets = rv.locChunkOffsets[:int(numLocChunks)] - } else { - rv.locChunkOffsets = make([]uint64, int(numLocChunks)) - } - for i := 0; i < int(numLocChunks); i++ { - rv.locChunkOffsets[i], read = binary.Uvarint(p.sb.mem[p.locOffset+n : p.locOffset+n+binary.MaxVarintLen64]) - n += uint64(read) - } - rv.locChunkStart = p.locOffset + n - } - - rv.all = p.postings.Iterator() - if p.except != nil { - rv.ActualBM = roaring.AndNot(p.postings, p.except) - rv.Actual = rv.ActualBM.Iterator() - } else { - rv.ActualBM = p.postings - rv.Actual = rv.all // Optimize to use same iterator for all & Actual. - } - - return rv -} - -// Count returns the number of items on this postings list -func (p *PostingsList) Count() uint64 { - var n, e uint64 - if p.normBits1Hit != 0 { - n = 1 - if p.except != nil && p.except.Contains(uint32(p.docNum1Hit)) { - e = 1 - } - } else if p.postings != nil { - n = p.postings.GetCardinality() - if p.except != nil { - e = p.postings.AndCardinality(p.except) - } - } - return n - e -} - -func (rv *PostingsList) read(postingsOffset uint64, d *Dictionary) error { - rv.postingsOffset = postingsOffset - - // handle "1-hit" encoding special case - if rv.postingsOffset&FSTValEncodingMask == FSTValEncoding1Hit { - return rv.init1Hit(postingsOffset) - } - - // read the location of the freq/norm details - var n uint64 - var read int - - rv.freqOffset, read = binary.Uvarint(d.sb.mem[postingsOffset+n : postingsOffset+binary.MaxVarintLen64]) - n += uint64(read) - - rv.locOffset, read = binary.Uvarint(d.sb.mem[postingsOffset+n : postingsOffset+n+binary.MaxVarintLen64]) - n += uint64(read) - - var postingsLen uint64 - postingsLen, read = binary.Uvarint(d.sb.mem[postingsOffset+n : postingsOffset+n+binary.MaxVarintLen64]) - n += uint64(read) - - roaringBytes := d.sb.mem[postingsOffset+n : postingsOffset+n+postingsLen] - - if rv.postings == nil { - rv.postings = roaring.NewBitmap() - } - _, err := rv.postings.FromBuffer(roaringBytes) - if err != nil { - return fmt.Errorf("error loading roaring bitmap: %v", err) - } - - return nil -} - -func (rv *PostingsList) init1Hit(fstVal uint64) error { - docNum, normBits := FSTValDecode1Hit(fstVal) - - rv.docNum1Hit = docNum - rv.normBits1Hit = normBits - - return nil -} - -// PostingsIterator provides a way to iterate through the postings list -type PostingsIterator struct { - postings *PostingsList - all roaring.IntPeekable - Actual roaring.IntPeekable - ActualBM *roaring.Bitmap - - currChunk uint32 - currChunkFreqNorm []byte - currChunkLoc []byte - - freqNormReader *segment.MemUvarintReader - locReader *segment.MemUvarintReader - - freqChunkOffsets []uint64 - freqChunkStart uint64 - - locChunkOffsets []uint64 - locChunkStart uint64 - - next Posting // reused across Next() calls - nextLocs []Location // reused across Next() calls - nextSegmentLocs []segment.Location // reused across Next() calls - - docNum1Hit uint64 - normBits1Hit uint64 - - buf []byte - - includeFreqNorm bool - includeLocs bool -} - -var emptyPostingsIterator = &PostingsIterator{} - -func (i *PostingsIterator) Size() int { - sizeInBytes := reflectStaticSizePostingsIterator + size.SizeOfPtr + - len(i.currChunkFreqNorm) + - len(i.currChunkLoc) + - len(i.freqChunkOffsets)*size.SizeOfUint64 + - len(i.locChunkOffsets)*size.SizeOfUint64 + - i.next.Size() - - for _, entry := range i.nextLocs { - sizeInBytes += entry.Size() - } - - return sizeInBytes -} - -func (i *PostingsIterator) loadChunk(chunk int) error { - if i.includeFreqNorm { - if chunk >= len(i.freqChunkOffsets) { - return fmt.Errorf("tried to load freq chunk that doesn't exist %d/(%d)", - chunk, len(i.freqChunkOffsets)) - } - - end, start := i.freqChunkStart, i.freqChunkStart - s, e := readChunkBoundary(chunk, i.freqChunkOffsets) - start += s - end += e - i.currChunkFreqNorm = i.postings.sb.mem[start:end] - if i.freqNormReader == nil { - i.freqNormReader = segment.NewMemUvarintReader(i.currChunkFreqNorm) - } else { - i.freqNormReader.Reset(i.currChunkFreqNorm) - } - } - - if i.includeLocs { - if chunk >= len(i.locChunkOffsets) { - return fmt.Errorf("tried to load loc chunk that doesn't exist %d/(%d)", - chunk, len(i.locChunkOffsets)) - } - - end, start := i.locChunkStart, i.locChunkStart - s, e := readChunkBoundary(chunk, i.locChunkOffsets) - start += s - end += e - i.currChunkLoc = i.postings.sb.mem[start:end] - if i.locReader == nil { - i.locReader = segment.NewMemUvarintReader(i.currChunkLoc) - } else { - i.locReader.Reset(i.currChunkLoc) - } - } - - i.currChunk = uint32(chunk) - return nil -} - -func (i *PostingsIterator) readFreqNormHasLocs() (uint64, uint64, bool, error) { - if i.normBits1Hit != 0 { - return 1, i.normBits1Hit, false, nil - } - - freqHasLocs, err := i.freqNormReader.ReadUvarint() - if err != nil { - return 0, 0, false, fmt.Errorf("error reading frequency: %v", err) - } - - freq, hasLocs := decodeFreqHasLocs(freqHasLocs) - - normBits, err := i.freqNormReader.ReadUvarint() - if err != nil { - return 0, 0, false, fmt.Errorf("error reading norm: %v", err) - } - - return freq, normBits, hasLocs, nil -} - -func (i *PostingsIterator) skipFreqNormReadHasLocs() (bool, error) { - if i.normBits1Hit != 0 { - return false, nil - } - - freqHasLocs, err := i.freqNormReader.ReadUvarint() - if err != nil { - return false, fmt.Errorf("error reading freqHasLocs: %v", err) - } - - i.freqNormReader.SkipUvarint() // Skip normBits. - - return freqHasLocs&0x01 != 0, nil // See decodeFreqHasLocs() / hasLocs. -} - -func encodeFreqHasLocs(freq uint64, hasLocs bool) uint64 { - rv := freq << 1 - if hasLocs { - rv = rv | 0x01 // 0'th LSB encodes whether there are locations - } - return rv -} - -func decodeFreqHasLocs(freqHasLocs uint64) (uint64, bool) { - freq := freqHasLocs >> 1 - hasLocs := freqHasLocs&0x01 != 0 - return freq, hasLocs -} - -// readLocation processes all the integers on the stream representing a single -// location. -func (i *PostingsIterator) readLocation(l *Location) error { - // read off field - fieldID, err := i.locReader.ReadUvarint() - if err != nil { - return fmt.Errorf("error reading location field: %v", err) - } - // read off pos - pos, err := i.locReader.ReadUvarint() - if err != nil { - return fmt.Errorf("error reading location pos: %v", err) - } - // read off start - start, err := i.locReader.ReadUvarint() - if err != nil { - return fmt.Errorf("error reading location start: %v", err) - } - // read off end - end, err := i.locReader.ReadUvarint() - if err != nil { - return fmt.Errorf("error reading location end: %v", err) - } - // read off num array pos - numArrayPos, err := i.locReader.ReadUvarint() - if err != nil { - return fmt.Errorf("error reading location num array pos: %v", err) - } - - l.field = i.postings.sb.fieldsInv[fieldID] - l.pos = pos - l.start = start - l.end = end - - if cap(l.ap) < int(numArrayPos) { - l.ap = make([]uint64, int(numArrayPos)) - } else { - l.ap = l.ap[:int(numArrayPos)] - } - - // read off array positions - for k := 0; k < int(numArrayPos); k++ { - ap, err := i.locReader.ReadUvarint() - if err != nil { - return fmt.Errorf("error reading array position: %v", err) - } - - l.ap[k] = ap - } - - return nil -} - -// Next returns the next posting on the postings list, or nil at the end -func (i *PostingsIterator) Next() (segment.Posting, error) { - return i.nextAtOrAfter(0) -} - -// Advance returns the posting at the specified docNum or it is not present -// the next posting, or if the end is reached, nil -func (i *PostingsIterator) Advance(docNum uint64) (segment.Posting, error) { - return i.nextAtOrAfter(docNum) -} - -// Next returns the next posting on the postings list, or nil at the end -func (i *PostingsIterator) nextAtOrAfter(atOrAfter uint64) (segment.Posting, error) { - docNum, exists, err := i.nextDocNumAtOrAfter(atOrAfter) - if err != nil || !exists { - return nil, err - } - - i.next = Posting{} // clear the struct - rv := &i.next - rv.docNum = docNum - - if !i.includeFreqNorm { - return rv, nil - } - - var normBits uint64 - var hasLocs bool - - rv.freq, normBits, hasLocs, err = i.readFreqNormHasLocs() - if err != nil { - return nil, err - } - - rv.norm = math.Float32frombits(uint32(normBits)) - - if i.includeLocs && hasLocs { - // prepare locations into reused slices, where we assume - // rv.freq >= "number of locs", since in a composite field, - // some component fields might have their IncludeTermVector - // flags disabled while other component fields are enabled - if cap(i.nextLocs) >= int(rv.freq) { - i.nextLocs = i.nextLocs[0:rv.freq] - } else { - i.nextLocs = make([]Location, rv.freq, rv.freq*2) - } - if cap(i.nextSegmentLocs) < int(rv.freq) { - i.nextSegmentLocs = make([]segment.Location, rv.freq, rv.freq*2) - } - rv.locs = i.nextSegmentLocs[:0] - - numLocsBytes, err := i.locReader.ReadUvarint() - if err != nil { - return nil, fmt.Errorf("error reading location numLocsBytes: %v", err) - } - - j := 0 - startBytesRemaining := i.locReader.Len() // # bytes remaining in the locReader - for startBytesRemaining-i.locReader.Len() < int(numLocsBytes) { - err := i.readLocation(&i.nextLocs[j]) - if err != nil { - return nil, err - } - rv.locs = append(rv.locs, &i.nextLocs[j]) - j++ - } - } - - return rv, nil -} - -var freqHasLocs1Hit = encodeFreqHasLocs(1, false) - -// nextBytes returns the docNum and the encoded freq & loc bytes for -// the next posting -func (i *PostingsIterator) nextBytes() ( - docNumOut uint64, freq uint64, normBits uint64, - bytesFreqNorm []byte, bytesLoc []byte, err error) { - docNum, exists, err := i.nextDocNumAtOrAfter(0) - if err != nil || !exists { - return 0, 0, 0, nil, nil, err - } - - if i.normBits1Hit != 0 { - if i.buf == nil { - i.buf = make([]byte, binary.MaxVarintLen64*2) - } - n := binary.PutUvarint(i.buf, freqHasLocs1Hit) - n += binary.PutUvarint(i.buf[n:], i.normBits1Hit) - return docNum, uint64(1), i.normBits1Hit, i.buf[:n], nil, nil - } - - startFreqNorm := len(i.currChunkFreqNorm) - i.freqNormReader.Len() - - var hasLocs bool - - freq, normBits, hasLocs, err = i.readFreqNormHasLocs() - if err != nil { - return 0, 0, 0, nil, nil, err - } - - endFreqNorm := len(i.currChunkFreqNorm) - i.freqNormReader.Len() - bytesFreqNorm = i.currChunkFreqNorm[startFreqNorm:endFreqNorm] - - if hasLocs { - startLoc := len(i.currChunkLoc) - i.locReader.Len() - - numLocsBytes, err := i.locReader.ReadUvarint() - if err != nil { - return 0, 0, 0, nil, nil, - fmt.Errorf("error reading location nextBytes numLocs: %v", err) - } - - // skip over all the location bytes - i.locReader.SkipBytes(int(numLocsBytes)) - - endLoc := len(i.currChunkLoc) - i.locReader.Len() - bytesLoc = i.currChunkLoc[startLoc:endLoc] - } - - return docNum, freq, normBits, bytesFreqNorm, bytesLoc, nil -} - -// nextDocNum returns the next docNum on the postings list, and also -// sets up the currChunk / loc related fields of the iterator. -func (i *PostingsIterator) nextDocNumAtOrAfter(atOrAfter uint64) (uint64, bool, error) { - if i.normBits1Hit != 0 { - if i.docNum1Hit == DocNum1HitFinished { - return 0, false, nil - } - if i.docNum1Hit < atOrAfter { - // advanced past our 1-hit - i.docNum1Hit = DocNum1HitFinished // consume our 1-hit docNum - return 0, false, nil - } - docNum := i.docNum1Hit - i.docNum1Hit = DocNum1HitFinished // consume our 1-hit docNum - return docNum, true, nil - } - - if i.Actual == nil || !i.Actual.HasNext() { - return 0, false, nil - } - - if i.postings == nil || i.postings.postings == i.ActualBM { - return i.nextDocNumAtOrAfterClean(atOrAfter) - } - - i.Actual.AdvanceIfNeeded(uint32(atOrAfter)) - - if !i.Actual.HasNext() { - // couldn't find anything - return 0, false, nil - } - - n := i.Actual.Next() - allN := i.all.Next() - - nChunk := n / i.postings.sb.chunkFactor - - // when allN becomes >= to here, then allN is in the same chunk as nChunk. - allNReachesNChunk := nChunk * i.postings.sb.chunkFactor - - // n is the next actual hit (excluding some postings), and - // allN is the next hit in the full postings, and - // if they don't match, move 'all' forwards until they do - for allN != n { - // we've reached same chunk, so move the freq/norm/loc decoders forward - if i.includeFreqNorm && allN >= allNReachesNChunk { - err := i.currChunkNext(nChunk) - if err != nil { - return 0, false, err - } - } - - allN = i.all.Next() - } - - if i.includeFreqNorm && (i.currChunk != nChunk || i.currChunkFreqNorm == nil) { - err := i.loadChunk(int(nChunk)) - if err != nil { - return 0, false, fmt.Errorf("error loading chunk: %v", err) - } - } - - return uint64(n), true, nil -} - -// optimization when the postings list is "clean" (e.g., no updates & -// no deletions) where the all bitmap is the same as the actual bitmap -func (i *PostingsIterator) nextDocNumAtOrAfterClean( - atOrAfter uint64) (uint64, bool, error) { - - if !i.includeFreqNorm { - i.Actual.AdvanceIfNeeded(uint32(atOrAfter)) - - if !i.Actual.HasNext() { - return 0, false, nil // couldn't find anything - } - - return uint64(i.Actual.Next()), true, nil - } - - // freq-norm's needed, so maintain freq-norm chunk reader - sameChunkNexts := 0 // # of times we called Next() in the same chunk - n := i.Actual.Next() - nChunk := n / i.postings.sb.chunkFactor - - for uint64(n) < atOrAfter && i.Actual.HasNext() { - n = i.Actual.Next() - - nChunkPrev := nChunk - nChunk = n / i.postings.sb.chunkFactor - - if nChunk != nChunkPrev { - sameChunkNexts = 0 - } else { - sameChunkNexts += 1 - } - } - - if uint64(n) < atOrAfter { - // couldn't find anything - return 0, false, nil - } - - for j := 0; j < sameChunkNexts; j++ { - err := i.currChunkNext(nChunk) - if err != nil { - return 0, false, fmt.Errorf("error optimized currChunkNext: %v", err) - } - } - - if i.currChunk != nChunk || i.currChunkFreqNorm == nil { - err := i.loadChunk(int(nChunk)) - if err != nil { - return 0, false, fmt.Errorf("error loading chunk: %v", err) - } - } - - return uint64(n), true, nil -} - -func (i *PostingsIterator) currChunkNext(nChunk uint32) error { - if i.currChunk != nChunk || i.currChunkFreqNorm == nil { - err := i.loadChunk(int(nChunk)) - if err != nil { - return fmt.Errorf("error loading chunk: %v", err) - } - } - - // read off freq/offsets even though we don't care about them - hasLocs, err := i.skipFreqNormReadHasLocs() - if err != nil { - return err - } - - if i.includeLocs && hasLocs { - numLocsBytes, err := i.locReader.ReadUvarint() - if err != nil { - return fmt.Errorf("error reading location numLocsBytes: %v", err) - } - - // skip over all the location bytes - i.locReader.SkipBytes(int(numLocsBytes)) - } - - return nil -} - -// DocNum1Hit returns the docNum and true if this is "1-hit" optimized -// and the docNum is available. -func (p *PostingsIterator) DocNum1Hit() (uint64, bool) { - if p.normBits1Hit != 0 && p.docNum1Hit != DocNum1HitFinished { - return p.docNum1Hit, true - } - return 0, false -} - -// ActualBitmap returns the underlying actual bitmap -// which can be used up the stack for optimizations -func (p *PostingsIterator) ActualBitmap() *roaring.Bitmap { - return p.ActualBM -} - -// ReplaceActual replaces the ActualBM with the provided -// bitmap -func (p *PostingsIterator) ReplaceActual(abm *roaring.Bitmap) { - p.ActualBM = abm - p.Actual = abm.Iterator() -} - -// PostingsIteratorFromBitmap constructs a PostingsIterator given an -// "actual" bitmap. -func PostingsIteratorFromBitmap(bm *roaring.Bitmap, - includeFreqNorm, includeLocs bool) (segment.PostingsIterator, error) { - return &PostingsIterator{ - ActualBM: bm, - Actual: bm.Iterator(), - includeFreqNorm: includeFreqNorm, - includeLocs: includeLocs, - }, nil -} - -// PostingsIteratorFrom1Hit constructs a PostingsIterator given a -// 1-hit docNum. -func PostingsIteratorFrom1Hit(docNum1Hit uint64, - includeFreqNorm, includeLocs bool) (segment.PostingsIterator, error) { - return &PostingsIterator{ - docNum1Hit: docNum1Hit, - normBits1Hit: NormBits1Hit, - includeFreqNorm: includeFreqNorm, - includeLocs: includeLocs, - }, nil -} - -// Posting is a single entry in a postings list -type Posting struct { - docNum uint64 - freq uint64 - norm float32 - locs []segment.Location -} - -func (p *Posting) Size() int { - sizeInBytes := reflectStaticSizePosting - - for _, entry := range p.locs { - sizeInBytes += entry.Size() - } - - return sizeInBytes -} - -// Number returns the document number of this posting in this segment -func (p *Posting) Number() uint64 { - return p.docNum -} - -// Frequency returns the frequencies of occurrence of this term in this doc/field -func (p *Posting) Frequency() uint64 { - return p.freq -} - -// Norm returns the normalization factor for this posting -func (p *Posting) Norm() float64 { - return float64(p.norm) -} - -// Locations returns the location information for each occurrence -func (p *Posting) Locations() []segment.Location { - return p.locs -} - -// Location represents the location of a single occurrence -type Location struct { - field string - pos uint64 - start uint64 - end uint64 - ap []uint64 -} - -func (l *Location) Size() int { - return reflectStaticSizeLocation + - len(l.field) + - len(l.ap)*size.SizeOfUint64 -} - -// Field returns the name of the field (useful in composite fields to know -// which original field the value came from) -func (l *Location) Field() string { - return l.field -} - -// Start returns the start byte offset of this occurrence -func (l *Location) Start() uint64 { - return l.start -} - -// End returns the end byte offset of this occurrence -func (l *Location) End() uint64 { - return l.end -} - -// Pos returns the 1-based phrase position of this occurrence -func (l *Location) Pos() uint64 { - return l.pos -} - -// ArrayPositions returns the array position vector associated with this occurrence -func (l *Location) ArrayPositions() []uint64 { - return l.ap -} diff --git a/vendor/github.com/blevesearch/zap/v11/read.go b/vendor/github.com/blevesearch/zap/v11/read.go deleted file mode 100644 index e47d4c6..0000000 --- a/vendor/github.com/blevesearch/zap/v11/read.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import "encoding/binary" - -func (s *SegmentBase) getDocStoredMetaAndCompressed(docNum uint64) ([]byte, []byte) { - _, storedOffset, n, metaLen, dataLen := s.getDocStoredOffsets(docNum) - - meta := s.mem[storedOffset+n : storedOffset+n+metaLen] - data := s.mem[storedOffset+n+metaLen : storedOffset+n+metaLen+dataLen] - - return meta, data -} - -func (s *SegmentBase) getDocStoredOffsets(docNum uint64) ( - uint64, uint64, uint64, uint64, uint64) { - indexOffset := s.storedIndexOffset + (8 * docNum) - - storedOffset := binary.BigEndian.Uint64(s.mem[indexOffset : indexOffset+8]) - - var n uint64 - - metaLen, read := binary.Uvarint(s.mem[storedOffset : storedOffset+binary.MaxVarintLen64]) - n += uint64(read) - - dataLen, read := binary.Uvarint(s.mem[storedOffset+n : storedOffset+n+binary.MaxVarintLen64]) - n += uint64(read) - - return indexOffset, storedOffset, n, metaLen, dataLen -} diff --git a/vendor/github.com/blevesearch/zap/v11/segment.go b/vendor/github.com/blevesearch/zap/v11/segment.go deleted file mode 100644 index 517b6af..0000000 --- a/vendor/github.com/blevesearch/zap/v11/segment.go +++ /dev/null @@ -1,572 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "encoding/binary" - "fmt" - "io" - "os" - "sync" - "unsafe" - - "github.com/RoaringBitmap/roaring" - "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/blevesearch/bleve/size" - "github.com/couchbase/vellum" - mmap "github.com/blevesearch/mmap-go" - "github.com/golang/snappy" -) - -var reflectStaticSizeSegmentBase int - -func init() { - var sb SegmentBase - reflectStaticSizeSegmentBase = int(unsafe.Sizeof(sb)) -} - -// Open returns a zap impl of a segment -func (*ZapPlugin) Open(path string) (segment.Segment, error) { - f, err := os.Open(path) - if err != nil { - return nil, err - } - mm, err := mmap.Map(f, mmap.RDONLY, 0) - if err != nil { - // mmap failed, try to close the file - _ = f.Close() - return nil, err - } - - rv := &Segment{ - SegmentBase: SegmentBase{ - mem: mm[0 : len(mm)-FooterSize], - fieldsMap: make(map[string]uint16), - fieldDvReaders: make(map[uint16]*docValueReader), - fieldFSTs: make(map[uint16]*vellum.FST), - }, - f: f, - mm: mm, - path: path, - refs: 1, - } - rv.SegmentBase.updateSize() - - err = rv.loadConfig() - if err != nil { - _ = rv.Close() - return nil, err - } - - err = rv.loadFields() - if err != nil { - _ = rv.Close() - return nil, err - } - - err = rv.loadDvReaders() - if err != nil { - _ = rv.Close() - return nil, err - } - - return rv, nil -} - -// SegmentBase is a memory only, read-only implementation of the -// segment.Segment interface, using zap's data representation. -type SegmentBase struct { - mem []byte - memCRC uint32 - chunkFactor uint32 - fieldsMap map[string]uint16 // fieldName -> fieldID+1 - fieldsInv []string // fieldID -> fieldName - numDocs uint64 - storedIndexOffset uint64 - fieldsIndexOffset uint64 - docValueOffset uint64 - dictLocs []uint64 - fieldDvReaders map[uint16]*docValueReader // naive chunk cache per field - fieldDvNames []string // field names cached in fieldDvReaders - size uint64 - - m sync.Mutex - fieldFSTs map[uint16]*vellum.FST -} - -func (sb *SegmentBase) Size() int { - return int(sb.size) -} - -func (sb *SegmentBase) updateSize() { - sizeInBytes := reflectStaticSizeSegmentBase + - cap(sb.mem) - - // fieldsMap - for k := range sb.fieldsMap { - sizeInBytes += (len(k) + size.SizeOfString) + size.SizeOfUint16 - } - - // fieldsInv, dictLocs - for _, entry := range sb.fieldsInv { - sizeInBytes += len(entry) + size.SizeOfString - } - sizeInBytes += len(sb.dictLocs) * size.SizeOfUint64 - - // fieldDvReaders - for _, v := range sb.fieldDvReaders { - sizeInBytes += size.SizeOfUint16 + size.SizeOfPtr - if v != nil { - sizeInBytes += v.size() - } - } - - sb.size = uint64(sizeInBytes) -} - -func (sb *SegmentBase) AddRef() {} -func (sb *SegmentBase) DecRef() (err error) { return nil } -func (sb *SegmentBase) Close() (err error) { return nil } - -// Segment implements a persisted segment.Segment interface, by -// embedding an mmap()'ed SegmentBase. -type Segment struct { - SegmentBase - - f *os.File - mm mmap.MMap - path string - version uint32 - crc uint32 - - m sync.Mutex // Protects the fields that follow. - refs int64 -} - -func (s *Segment) Size() int { - // 8 /* size of file pointer */ - // 4 /* size of version -> uint32 */ - // 4 /* size of crc -> uint32 */ - sizeOfUints := 16 - - sizeInBytes := (len(s.path) + size.SizeOfString) + sizeOfUints - - // mutex, refs -> int64 - sizeInBytes += 16 - - // do not include the mmap'ed part - return sizeInBytes + s.SegmentBase.Size() - cap(s.mem) -} - -func (s *Segment) AddRef() { - s.m.Lock() - s.refs++ - s.m.Unlock() -} - -func (s *Segment) DecRef() (err error) { - s.m.Lock() - s.refs-- - if s.refs == 0 { - err = s.closeActual() - } - s.m.Unlock() - return err -} - -func (s *Segment) loadConfig() error { - crcOffset := len(s.mm) - 4 - s.crc = binary.BigEndian.Uint32(s.mm[crcOffset : crcOffset+4]) - - verOffset := crcOffset - 4 - s.version = binary.BigEndian.Uint32(s.mm[verOffset : verOffset+4]) - if s.version != Version { - return fmt.Errorf("unsupported version %d", s.version) - } - - chunkOffset := verOffset - 4 - s.chunkFactor = binary.BigEndian.Uint32(s.mm[chunkOffset : chunkOffset+4]) - - docValueOffset := chunkOffset - 8 - s.docValueOffset = binary.BigEndian.Uint64(s.mm[docValueOffset : docValueOffset+8]) - - fieldsIndexOffset := docValueOffset - 8 - s.fieldsIndexOffset = binary.BigEndian.Uint64(s.mm[fieldsIndexOffset : fieldsIndexOffset+8]) - - storedIndexOffset := fieldsIndexOffset - 8 - s.storedIndexOffset = binary.BigEndian.Uint64(s.mm[storedIndexOffset : storedIndexOffset+8]) - - numDocsOffset := storedIndexOffset - 8 - s.numDocs = binary.BigEndian.Uint64(s.mm[numDocsOffset : numDocsOffset+8]) - return nil -} - -func (s *SegmentBase) loadFields() error { - // NOTE for now we assume the fields index immediately precedes - // the footer, and if this changes, need to adjust accordingly (or - // store explicit length), where s.mem was sliced from s.mm in Open(). - fieldsIndexEnd := uint64(len(s.mem)) - - // iterate through fields index - var fieldID uint64 - for s.fieldsIndexOffset+(8*fieldID) < fieldsIndexEnd { - addr := binary.BigEndian.Uint64(s.mem[s.fieldsIndexOffset+(8*fieldID) : s.fieldsIndexOffset+(8*fieldID)+8]) - - dictLoc, read := binary.Uvarint(s.mem[addr:fieldsIndexEnd]) - n := uint64(read) - s.dictLocs = append(s.dictLocs, dictLoc) - - var nameLen uint64 - nameLen, read = binary.Uvarint(s.mem[addr+n : fieldsIndexEnd]) - n += uint64(read) - - name := string(s.mem[addr+n : addr+n+nameLen]) - s.fieldsInv = append(s.fieldsInv, name) - s.fieldsMap[name] = uint16(fieldID + 1) - - fieldID++ - } - return nil -} - -// Dictionary returns the term dictionary for the specified field -func (s *SegmentBase) Dictionary(field string) (segment.TermDictionary, error) { - dict, err := s.dictionary(field) - if err == nil && dict == nil { - return &segment.EmptyDictionary{}, nil - } - return dict, err -} - -func (sb *SegmentBase) dictionary(field string) (rv *Dictionary, err error) { - fieldIDPlus1 := sb.fieldsMap[field] - if fieldIDPlus1 > 0 { - rv = &Dictionary{ - sb: sb, - field: field, - fieldID: fieldIDPlus1 - 1, - } - - dictStart := sb.dictLocs[rv.fieldID] - if dictStart > 0 { - var ok bool - sb.m.Lock() - if rv.fst, ok = sb.fieldFSTs[rv.fieldID]; !ok { - // read the length of the vellum data - vellumLen, read := binary.Uvarint(sb.mem[dictStart : dictStart+binary.MaxVarintLen64]) - fstBytes := sb.mem[dictStart+uint64(read) : dictStart+uint64(read)+vellumLen] - rv.fst, err = vellum.Load(fstBytes) - if err != nil { - sb.m.Unlock() - return nil, fmt.Errorf("dictionary field %s vellum err: %v", field, err) - } - - sb.fieldFSTs[rv.fieldID] = rv.fst - } - - sb.m.Unlock() - rv.fstReader, err = rv.fst.Reader() - if err != nil { - return nil, fmt.Errorf("dictionary field %s vellum reader err: %v", field, err) - } - - } - } - - return rv, nil -} - -// visitDocumentCtx holds data structures that are reusable across -// multiple VisitDocument() calls to avoid memory allocations -type visitDocumentCtx struct { - buf []byte - reader bytes.Reader - arrayPos []uint64 -} - -var visitDocumentCtxPool = sync.Pool{ - New: func() interface{} { - reuse := &visitDocumentCtx{} - return reuse - }, -} - -// VisitDocument invokes the DocFieldValueVistor for each stored field -// for the specified doc number -func (s *SegmentBase) VisitDocument(num uint64, visitor segment.DocumentFieldValueVisitor) error { - vdc := visitDocumentCtxPool.Get().(*visitDocumentCtx) - defer visitDocumentCtxPool.Put(vdc) - return s.visitDocument(vdc, num, visitor) -} - -func (s *SegmentBase) visitDocument(vdc *visitDocumentCtx, num uint64, - visitor segment.DocumentFieldValueVisitor) error { - // first make sure this is a valid number in this segment - if num < s.numDocs { - meta, compressed := s.getDocStoredMetaAndCompressed(num) - - vdc.reader.Reset(meta) - - // handle _id field special case - idFieldValLen, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - idFieldVal := compressed[:idFieldValLen] - - keepGoing := visitor("_id", byte('t'), idFieldVal, nil) - if !keepGoing { - visitDocumentCtxPool.Put(vdc) - return nil - } - - // handle non-"_id" fields - compressed = compressed[idFieldValLen:] - - uncompressed, err := snappy.Decode(vdc.buf[:cap(vdc.buf)], compressed) - if err != nil { - return err - } - - for keepGoing { - field, err := binary.ReadUvarint(&vdc.reader) - if err == io.EOF { - break - } - if err != nil { - return err - } - typ, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - offset, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - l, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - numap, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - var arrayPos []uint64 - if numap > 0 { - if cap(vdc.arrayPos) < int(numap) { - vdc.arrayPos = make([]uint64, numap) - } - arrayPos = vdc.arrayPos[:numap] - for i := 0; i < int(numap); i++ { - ap, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - arrayPos[i] = ap - } - } - - value := uncompressed[offset : offset+l] - keepGoing = visitor(s.fieldsInv[field], byte(typ), value, arrayPos) - } - - vdc.buf = uncompressed - } - return nil -} - -// DocID returns the value of the _id field for the given docNum -func (s *SegmentBase) DocID(num uint64) ([]byte, error) { - if num >= s.numDocs { - return nil, nil - } - - vdc := visitDocumentCtxPool.Get().(*visitDocumentCtx) - - meta, compressed := s.getDocStoredMetaAndCompressed(num) - - vdc.reader.Reset(meta) - - // handle _id field special case - idFieldValLen, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return nil, err - } - idFieldVal := compressed[:idFieldValLen] - - visitDocumentCtxPool.Put(vdc) - - return idFieldVal, nil -} - -// Count returns the number of documents in this segment. -func (s *SegmentBase) Count() uint64 { - return s.numDocs -} - -// DocNumbers returns a bitset corresponding to the doc numbers of all the -// provided _id strings -func (s *SegmentBase) DocNumbers(ids []string) (*roaring.Bitmap, error) { - rv := roaring.New() - - if len(s.fieldsMap) > 0 { - idDict, err := s.dictionary("_id") - if err != nil { - return nil, err - } - - postingsList := emptyPostingsList - - sMax, err := idDict.fst.GetMaxKey() - if err != nil { - return nil, err - } - sMaxStr := string(sMax) - filteredIds := make([]string, 0, len(ids)) - for _, id := range ids { - if id <= sMaxStr { - filteredIds = append(filteredIds, id) - } - } - - for _, id := range filteredIds { - postingsList, err = idDict.postingsList([]byte(id), nil, postingsList) - if err != nil { - return nil, err - } - postingsList.OrInto(rv) - } - } - - return rv, nil -} - -// Fields returns the field names used in this segment -func (s *SegmentBase) Fields() []string { - return s.fieldsInv -} - -// Path returns the path of this segment on disk -func (s *Segment) Path() string { - return s.path -} - -// Close releases all resources associated with this segment -func (s *Segment) Close() (err error) { - return s.DecRef() -} - -func (s *Segment) closeActual() (err error) { - if s.mm != nil { - err = s.mm.Unmap() - } - // try to close file even if unmap failed - if s.f != nil { - err2 := s.f.Close() - if err == nil { - // try to return first error - err = err2 - } - } - return -} - -// some helpers i started adding for the command-line utility - -// Data returns the underlying mmaped data slice -func (s *Segment) Data() []byte { - return s.mm -} - -// CRC returns the CRC value stored in the file footer -func (s *Segment) CRC() uint32 { - return s.crc -} - -// Version returns the file version in the file footer -func (s *Segment) Version() uint32 { - return s.version -} - -// ChunkFactor returns the chunk factor in the file footer -func (s *Segment) ChunkFactor() uint32 { - return s.chunkFactor -} - -// FieldsIndexOffset returns the fields index offset in the file footer -func (s *Segment) FieldsIndexOffset() uint64 { - return s.fieldsIndexOffset -} - -// StoredIndexOffset returns the stored value index offset in the file footer -func (s *Segment) StoredIndexOffset() uint64 { - return s.storedIndexOffset -} - -// DocValueOffset returns the docValue offset in the file footer -func (s *Segment) DocValueOffset() uint64 { - return s.docValueOffset -} - -// NumDocs returns the number of documents in the file footer -func (s *Segment) NumDocs() uint64 { - return s.numDocs -} - -// DictAddr is a helper function to compute the file offset where the -// dictionary is stored for the specified field. -func (s *Segment) DictAddr(field string) (uint64, error) { - fieldIDPlus1, ok := s.fieldsMap[field] - if !ok { - return 0, fmt.Errorf("no such field '%s'", field) - } - - return s.dictLocs[fieldIDPlus1-1], nil -} - -func (s *SegmentBase) loadDvReaders() error { - if s.docValueOffset == fieldNotUninverted || s.numDocs == 0 { - return nil - } - - var read uint64 - for fieldID, field := range s.fieldsInv { - var fieldLocStart, fieldLocEnd uint64 - var n int - fieldLocStart, n = binary.Uvarint(s.mem[s.docValueOffset+read : s.docValueOffset+read+binary.MaxVarintLen64]) - if n <= 0 { - return fmt.Errorf("loadDvReaders: failed to read the docvalue offset start for field %d", fieldID) - } - read += uint64(n) - fieldLocEnd, n = binary.Uvarint(s.mem[s.docValueOffset+read : s.docValueOffset+read+binary.MaxVarintLen64]) - if n <= 0 { - return fmt.Errorf("loadDvReaders: failed to read the docvalue offset end for field %d", fieldID) - } - read += uint64(n) - - fieldDvReader, err := s.loadFieldDocValueReader(field, fieldLocStart, fieldLocEnd) - if err != nil { - return err - } - if fieldDvReader != nil { - s.fieldDvReaders[uint16(fieldID)] = fieldDvReader - s.fieldDvNames = append(s.fieldDvNames, field) - } - } - - return nil -} diff --git a/vendor/github.com/blevesearch/zap/v11/write.go b/vendor/github.com/blevesearch/zap/v11/write.go deleted file mode 100644 index cddaedd..0000000 --- a/vendor/github.com/blevesearch/zap/v11/write.go +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "encoding/binary" - "io" - - "github.com/RoaringBitmap/roaring" -) - -// writes out the length of the roaring bitmap in bytes as varint -// then writes out the roaring bitmap itself -func writeRoaringWithLen(r *roaring.Bitmap, w io.Writer, - reuseBufVarint []byte) (int, error) { - buf, err := r.ToBytes() - if err != nil { - return 0, err - } - - var tw int - - // write out the length - n := binary.PutUvarint(reuseBufVarint, uint64(len(buf))) - nw, err := w.Write(reuseBufVarint[:n]) - tw += nw - if err != nil { - return tw, err - } - - // write out the roaring bytes - nw, err = w.Write(buf) - tw += nw - if err != nil { - return tw, err - } - - return tw, nil -} - -func persistFields(fieldsInv []string, w *CountHashWriter, dictLocs []uint64) (uint64, error) { - var rv uint64 - var fieldsOffsets []uint64 - - for fieldID, fieldName := range fieldsInv { - // record start of this field - fieldsOffsets = append(fieldsOffsets, uint64(w.Count())) - - // write out the dict location and field name length - _, err := writeUvarints(w, dictLocs[fieldID], uint64(len(fieldName))) - if err != nil { - return 0, err - } - - // write out the field name - _, err = w.Write([]byte(fieldName)) - if err != nil { - return 0, err - } - } - - // now write out the fields index - rv = uint64(w.Count()) - for fieldID := range fieldsInv { - err := binary.Write(w, binary.BigEndian, fieldsOffsets[fieldID]) - if err != nil { - return 0, err - } - } - - return rv, nil -} - -// FooterSize is the size of the footer record in bytes -// crc + ver + chunk + field offset + stored offset + num docs + docValueOffset -const FooterSize = 4 + 4 + 4 + 8 + 8 + 8 + 8 - -func persistFooter(numDocs, storedIndexOffset, fieldsIndexOffset, docValueOffset uint64, - chunkFactor uint32, crcBeforeFooter uint32, writerIn io.Writer) error { - w := NewCountHashWriter(writerIn) - w.crc = crcBeforeFooter - - // write out the number of docs - err := binary.Write(w, binary.BigEndian, numDocs) - if err != nil { - return err - } - // write out the stored field index location: - err = binary.Write(w, binary.BigEndian, storedIndexOffset) - if err != nil { - return err - } - // write out the field index location - err = binary.Write(w, binary.BigEndian, fieldsIndexOffset) - if err != nil { - return err - } - // write out the fieldDocValue location - err = binary.Write(w, binary.BigEndian, docValueOffset) - if err != nil { - return err - } - // write out 32-bit chunk factor - err = binary.Write(w, binary.BigEndian, chunkFactor) - if err != nil { - return err - } - // write out 32-bit version - err = binary.Write(w, binary.BigEndian, Version) - if err != nil { - return err - } - // write out CRC-32 of everything upto but not including this CRC - err = binary.Write(w, binary.BigEndian, w.crc) - if err != nil { - return err - } - return nil -} - -func writeUvarints(w io.Writer, vals ...uint64) (tw int, err error) { - buf := make([]byte, binary.MaxVarintLen64) - for _, val := range vals { - n := binary.PutUvarint(buf, val) - var nw int - nw, err = w.Write(buf[:n]) - tw += nw - if err != nil { - return tw, err - } - } - return tw, err -} diff --git a/vendor/github.com/blevesearch/zap/v11/zap.md b/vendor/github.com/blevesearch/zap/v11/zap.md deleted file mode 100644 index d74dc54..0000000 --- a/vendor/github.com/blevesearch/zap/v11/zap.md +++ /dev/null @@ -1,177 +0,0 @@ -# ZAP File Format - -## Legend - -### Sections - - |========| - | | section - |========| - -### Fixed-size fields - - |--------| |----| |--| |-| - | | uint64 | | uint32 | | uint16 | | uint8 - |--------| |----| |--| |-| - -### Varints - - |~~~~~~~~| - | | varint(up to uint64) - |~~~~~~~~| - -### Arbitrary-length fields - - |--------...---| - | | arbitrary-length field (string, vellum, roaring bitmap) - |--------...---| - -### Chunked data - - [--------] - [ ] - [--------] - -## Overview - -Footer section describes the configuration of particular ZAP file. The format of footer is version-dependent, so it is necessary to check `V` field before the parsing. - - |==================================================| - | Stored Fields | - |==================================================| - |-----> | Stored Fields Index | - | |==================================================| - | | Dictionaries + Postings + DocValues | - | |==================================================| - | |---> | DocValues Index | - | | |==================================================| - | | | Fields | - | | |==================================================| - | | |-> | Fields Index | - | | | |========|========|========|========|====|====|====| - | | | | D# | SF | F | FDV | CF | V | CC | (Footer) - | | | |========|====|===|====|===|====|===|====|====|====| - | | | | | | - |-+-+-----------------| | | - | |--------------------------| | - |-------------------------------------| - - D#. Number of Docs. - SF. Stored Fields Index Offset. - F. Field Index Offset. - FDV. Field DocValue Offset. - CF. Chunk Factor. - V. Version. - CC. CRC32. - -## Stored Fields - -Stored Fields Index is `D#` consecutive 64-bit unsigned integers - offsets, where relevant Stored Fields Data records are located. - - 0 [SF] [SF + D# * 8] - | Stored Fields | Stored Fields Index | - |================================|==================================| - | | | - | |--------------------| ||--------|--------|. . .|--------|| - | |-> | Stored Fields Data | || 0 | 1 | | D# - 1 || - | | |--------------------| ||--------|----|---|. . .|--------|| - | | | | | - |===|============================|==============|===================| - | | - |-------------------------------------------| - -Stored Fields Data is an arbitrary size record, which consists of metadata and [Snappy](https://github.com/golang/snappy)-compressed data. - - Stored Fields Data - |~~~~~~~~|~~~~~~~~|~~~~~~~~...~~~~~~~~|~~~~~~~~...~~~~~~~~| - | MDS | CDS | MD | CD | - |~~~~~~~~|~~~~~~~~|~~~~~~~~...~~~~~~~~|~~~~~~~~...~~~~~~~~| - - MDS. Metadata size. - CDS. Compressed data size. - MD. Metadata. - CD. Snappy-compressed data. - -## Fields - -Fields Index section located between addresses `F` and `len(file) - len(footer)` and consist of `uint64` values (`F1`, `F2`, ...) which are offsets to records in Fields section. We have `F# = (len(file) - len(footer) - F) / sizeof(uint64)` fields. - - - (...) [F] [F + F#] - | Fields | Fields Index. | - |================================|================================| - | | | - | |~~~~~~~~|~~~~~~~~|---...---|||--------|--------|...|--------|| - ||->| Dict | Length | Name ||| 0 | 1 | | F# - 1 || - || |~~~~~~~~|~~~~~~~~|---...---|||--------|----|---|...|--------|| - || | | | - ||===============================|==============|=================| - | | - |----------------------------------------------| - - -## Dictionaries + Postings - -Each of fields has its own dictionary, encoded in [Vellum](https://github.com/couchbase/vellum) format. Dictionary consists of pairs `(term, offset)`, where `offset` indicates the position of postings (list of documents) for this particular term. - - |================================================================|- Dictionaries + - | | Postings + - | | DocValues - | Freq/Norm (chunked) | - | [~~~~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~] | - | |->[ Freq | Norm (float32 under varint) ] | - | | [~~~~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~] | - | | | - | |------------------------------------------------------------| | - | Location Details (chunked) | | - | [~~~~~~|~~~~~|~~~~~~~|~~~~~|~~~~~~|~~~~~~~~|~~~~~] | | - | |->[ Size | Pos | Start | End | Arr# | ArrPos | ... ] | | - | | [~~~~~~|~~~~~|~~~~~~~|~~~~~|~~~~~~|~~~~~~~~|~~~~~] | | - | | | | - | |----------------------| | | - | Postings List | | | - | |~~~~~~~~|~~~~~|~~|~~~~~~~~|-----------...--| | | - | |->| F/N | LD | Length | ROARING BITMAP | | | - | | |~~~~~|~~|~~~~~~~~|~~~~~~~~|-----------...--| | | - | | |----------------------------------------------| | - | |--------------------------------------| | - | Dictionary | | - | |~~~~~~~~|--------------------------|-...-| | - | |->| Length | VELLUM DATA : (TERM -> OFFSET) | | - | | |~~~~~~~~|----------------------------...-| | - | | | - |======|=========================================================|- DocValues Index - | | | - |======|=========================================================|- Fields - | | | - | |~~~~|~~~|~~~~~~~~|---...---| | - | | Dict | Length | Name | | - | |~~~~~~~~|~~~~~~~~|---...---| | - | | - |================================================================| - -## DocValues - -DocValues Index is `F#` pairs of varints, one pair per field. Each pair of varints indicates start and end point of DocValues slice. - - |================================================================| - | |------...--| | - | |->| DocValues |<-| | - | | |------...--| | | - |==|=================|===========================================|- DocValues Index - ||~|~~~~~~~~~|~~~~~~~|~~| |~~~~~~~~~~~~~~|~~~~~~~~~~~~|| - || DV1 START | DV1 STOP | . . . . . | DV(F#) START | DV(F#) END || - ||~~~~~~~~~~~|~~~~~~~~~~| |~~~~~~~~~~~~~~|~~~~~~~~~~~~|| - |================================================================| - -DocValues is chunked Snappy-compressed values for each document and field. - - [~~~~~~~~~~~~~~~|~~~~~~|~~~~~~~~~|-...-|~~~~~~|~~~~~~~~~|--------------------...-] - [ Doc# in Chunk | Doc1 | Offset1 | ... | DocN | OffsetN | SNAPPY COMPRESSED DATA ] - [~~~~~~~~~~~~~~~|~~~~~~|~~~~~~~~~|-...-|~~~~~~|~~~~~~~~~|--------------------...-] - -Last 16 bytes are description of chunks. - - |~~~~~~~~~~~~...~|----------------|----------------| - | Chunk Sizes | Chunk Size Arr | Chunk# | - |~~~~~~~~~~~~...~|----------------|----------------| diff --git a/vendor/github.com/blevesearch/zap/v12/.gitignore b/vendor/github.com/blevesearch/zap/v12/.gitignore deleted file mode 100644 index 46d1cfa..0000000 --- a/vendor/github.com/blevesearch/zap/v12/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -#* -*.sublime-* -*~ -.#* -.project -.settings -**/.idea/ -**/*.iml -.DS_Store -/cmd/zap/zap -*.test -tags diff --git a/vendor/github.com/blevesearch/zap/v12/LICENSE b/vendor/github.com/blevesearch/zap/v12/LICENSE deleted file mode 100644 index 7a4a3ea..0000000 --- a/vendor/github.com/blevesearch/zap/v12/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/vendor/github.com/blevesearch/zap/v12/README.md b/vendor/github.com/blevesearch/zap/v12/README.md deleted file mode 100644 index 0facb66..0000000 --- a/vendor/github.com/blevesearch/zap/v12/README.md +++ /dev/null @@ -1,158 +0,0 @@ -# zap file format - -Advanced ZAP File Format Documentation is [here](zap.md). - -The file is written in the reverse order that we typically access data. This helps us write in one pass since later sections of the file require file offsets of things we've already written. - -Current usage: - -- mmap the entire file -- crc-32 bytes and version are in fixed position at end of the file -- reading remainder of footer could be version specific -- remainder of footer gives us: - - 3 important offsets (docValue , fields index and stored data index) - - 2 important values (number of docs and chunk factor) -- field data is processed once and memoized onto the heap so that we never have to go back to disk for it -- access to stored data by doc number means first navigating to the stored data index, then accessing a fixed position offset into that slice, which gives us the actual address of the data. the first bytes of that section tell us the size of data so that we know where it ends. -- access to all other indexed data follows the following pattern: - - first know the field name -> convert to id - - next navigate to term dictionary for that field - - some operations stop here and do dictionary ops - - next use dictionary to navigate to posting list for a specific term - - walk posting list - - if necessary, walk posting details as we go - - if location info is desired, consult location bitmap to see if it is there - -## stored fields section - -- for each document - - preparation phase: - - produce a slice of metadata bytes and data bytes - - produce these slices in field id order - - field value is appended to the data slice - - metadata slice is varint encoded with the following values for each field value - - field id (uint16) - - field type (byte) - - field value start offset in uncompressed data slice (uint64) - - field value length (uint64) - - field number of array positions (uint64) - - one additional value for each array position (uint64) - - compress the data slice using snappy - - file writing phase: - - remember the start offset for this document - - write out meta data length (varint uint64) - - write out compressed data length (varint uint64) - - write out the metadata bytes - - write out the compressed data bytes - -## stored fields idx - -- for each document - - write start offset (remembered from previous section) of stored data (big endian uint64) - -With this index and a known document number, we have direct access to all the stored field data. - -## posting details (freq/norm) section - -- for each posting list - - produce a slice containing multiple consecutive chunks (each chunk is varint stream) - - produce a slice remembering offsets of where each chunk starts - - preparation phase: - - for each hit in the posting list - - if this hit is in next chunk close out encoding of last chunk and record offset start of next - - encode term frequency (uint64) - - encode norm factor (float32) - - file writing phase: - - remember start position for this posting list details - - write out number of chunks that follow (varint uint64) - - write out length of each chunk (each a varint uint64) - - write out the byte slice containing all the chunk data - -If you know the doc number you're interested in, this format lets you jump to the correct chunk (docNum/chunkFactor) directly and then seek within that chunk until you find it. - -## posting details (location) section - -- for each posting list - - produce a slice containing multiple consecutive chunks (each chunk is varint stream) - - produce a slice remembering offsets of where each chunk starts - - preparation phase: - - for each hit in the posting list - - if this hit is in next chunk close out encoding of last chunk and record offset start of next - - encode field (uint16) - - encode field pos (uint64) - - encode field start (uint64) - - encode field end (uint64) - - encode number of array positions to follow (uint64) - - encode each array position (each uint64) - - file writing phase: - - remember start position for this posting list details - - write out number of chunks that follow (varint uint64) - - write out length of each chunk (each a varint uint64) - - write out the byte slice containing all the chunk data - -If you know the doc number you're interested in, this format lets you jump to the correct chunk (docNum/chunkFactor) directly and then seek within that chunk until you find it. - -## postings list section - -- for each posting list - - preparation phase: - - encode roaring bitmap posting list to bytes (so we know the length) - - file writing phase: - - remember the start position for this posting list - - write freq/norm details offset (remembered from previous, as varint uint64) - - write location details offset (remembered from previous, as varint uint64) - - write length of encoded roaring bitmap - - write the serialized roaring bitmap data - -## dictionary - -- for each field - - preparation phase: - - encode vellum FST with dictionary data pointing to file offset of posting list (remembered from previous) - - file writing phase: - - remember the start position of this persistDictionary - - write length of vellum data (varint uint64) - - write out vellum data - -## fields section - -- for each field - - file writing phase: - - remember start offset for each field - - write dictionary address (remembered from previous) (varint uint64) - - write length of field name (varint uint64) - - write field name bytes - -## fields idx - -- for each field - - file writing phase: - - write big endian uint64 of start offset for each field - -NOTE: currently we don't know or record the length of this fields index. Instead we rely on the fact that we know it immediately precedes a footer of known size. - -## fields DocValue - -- for each field - - preparation phase: - - produce a slice containing multiple consecutive chunks, where each chunk is composed of a meta section followed by compressed columnar field data - - produce a slice remembering the length of each chunk - - file writing phase: - - remember the start position of this first field DocValue offset in the footer - - write out number of chunks that follow (varint uint64) - - write out length of each chunk (each a varint uint64) - - write out the byte slice containing all the chunk data - -NOTE: currently the meta header inside each chunk gives clue to the location offsets and size of the data pertaining to a given docID and any -read operation leverage that meta information to extract the document specific data from the file. - -## footer - -- file writing phase - - write number of docs (big endian uint64) - - write stored field index location (big endian uint64) - - write field index location (big endian uint64) - - write field docValue location (big endian uint64) - - write out chunk factor (big endian uint32) - - write out version (big endian uint32) - - write out file CRC of everything preceding this (big endian uint32) diff --git a/vendor/github.com/blevesearch/zap/v12/build.go b/vendor/github.com/blevesearch/zap/v12/build.go deleted file mode 100644 index 467e5e0..0000000 --- a/vendor/github.com/blevesearch/zap/v12/build.go +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bufio" - "math" - "os" - - "github.com/couchbase/vellum" -) - -const Version uint32 = 12 - -const Type string = "zap" - -const fieldNotUninverted = math.MaxUint64 - -func (sb *SegmentBase) Persist(path string) error { - return PersistSegmentBase(sb, path) -} - -// PersistSegmentBase persists SegmentBase in the zap file format. -func PersistSegmentBase(sb *SegmentBase, path string) error { - flag := os.O_RDWR | os.O_CREATE - - f, err := os.OpenFile(path, flag, 0600) - if err != nil { - return err - } - - cleanup := func() { - _ = f.Close() - _ = os.Remove(path) - } - - br := bufio.NewWriter(f) - - _, err = br.Write(sb.mem) - if err != nil { - cleanup() - return err - } - - err = persistFooter(sb.numDocs, sb.storedIndexOffset, sb.fieldsIndexOffset, sb.docValueOffset, - sb.chunkMode, sb.memCRC, br) - if err != nil { - cleanup() - return err - } - - err = br.Flush() - if err != nil { - cleanup() - return err - } - - err = f.Sync() - if err != nil { - cleanup() - return err - } - - err = f.Close() - if err != nil { - cleanup() - return err - } - - return nil -} - -func persistStoredFieldValues(fieldID int, - storedFieldValues [][]byte, stf []byte, spf [][]uint64, - curr int, metaEncode varintEncoder, data []byte) ( - int, []byte, error) { - for i := 0; i < len(storedFieldValues); i++ { - // encode field - _, err := metaEncode(uint64(fieldID)) - if err != nil { - return 0, nil, err - } - // encode type - _, err = metaEncode(uint64(stf[i])) - if err != nil { - return 0, nil, err - } - // encode start offset - _, err = metaEncode(uint64(curr)) - if err != nil { - return 0, nil, err - } - // end len - _, err = metaEncode(uint64(len(storedFieldValues[i]))) - if err != nil { - return 0, nil, err - } - // encode number of array pos - _, err = metaEncode(uint64(len(spf[i]))) - if err != nil { - return 0, nil, err - } - // encode all array positions - for _, pos := range spf[i] { - _, err = metaEncode(pos) - if err != nil { - return 0, nil, err - } - } - - data = append(data, storedFieldValues[i]...) - curr += len(storedFieldValues[i]) - } - - return curr, data, nil -} - -func InitSegmentBase(mem []byte, memCRC uint32, chunkMode uint32, - fieldsMap map[string]uint16, fieldsInv []string, numDocs uint64, - storedIndexOffset uint64, fieldsIndexOffset uint64, docValueOffset uint64, - dictLocs []uint64) (*SegmentBase, error) { - sb := &SegmentBase{ - mem: mem, - memCRC: memCRC, - chunkMode: chunkMode, - fieldsMap: fieldsMap, - fieldsInv: fieldsInv, - numDocs: numDocs, - storedIndexOffset: storedIndexOffset, - fieldsIndexOffset: fieldsIndexOffset, - docValueOffset: docValueOffset, - dictLocs: dictLocs, - fieldDvReaders: make(map[uint16]*docValueReader), - fieldFSTs: make(map[uint16]*vellum.FST), - } - sb.updateSize() - - err := sb.loadDvReaders() - if err != nil { - return nil, err - } - - return sb, nil -} diff --git a/vendor/github.com/blevesearch/zap/v12/chunk.go b/vendor/github.com/blevesearch/zap/v12/chunk.go deleted file mode 100644 index fe9f398..0000000 --- a/vendor/github.com/blevesearch/zap/v12/chunk.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (c) 2019 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "fmt" -) - -// LegacyChunkMode was the original chunk mode (always chunk size 1024) -// this mode is still used for chunking doc values. -var LegacyChunkMode uint32 = 1024 - -// DefaultChunkMode is the most recent improvement to chunking and should -// be used by default. -var DefaultChunkMode uint32 = 1025 - -func getChunkSize(chunkMode uint32, cardinality uint64, maxDocs uint64) (uint64, error) { - switch { - // any chunkMode <= 1024 will always chunk with chunkSize=chunkMode - case chunkMode <= 1024: - // legacy chunk size - return uint64(chunkMode), nil - - case chunkMode == 1025: - // attempt at simple improvement - // theory - the point of chunking is to put a bound on the maximum number of - // calls to Next() needed to find a random document. ie, you should be able - // to do one jump to the correct chunk, and then walk through at most - // chunk-size items - // previously 1024 was chosen as the chunk size, but this is particularly - // wasteful for low cardinality terms. the observation is that if there - // are less than 1024 items, why not put them all in one chunk, - // this way you'll still achieve the same goal of visiting at most - // chunk-size items. - // no attempt is made to tweak any other case - if cardinality <= 1024 { - return maxDocs, nil - } - return 1024, nil - } - return 0, fmt.Errorf("unknown chunk mode %d", chunkMode) -} diff --git a/vendor/github.com/blevesearch/zap/v12/contentcoder.go b/vendor/github.com/blevesearch/zap/v12/contentcoder.go deleted file mode 100644 index c145b5a..0000000 --- a/vendor/github.com/blevesearch/zap/v12/contentcoder.go +++ /dev/null @@ -1,243 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "encoding/binary" - "io" - "reflect" - - "github.com/golang/snappy" -) - -var reflectStaticSizeMetaData int - -func init() { - var md MetaData - reflectStaticSizeMetaData = int(reflect.TypeOf(md).Size()) -} - -var termSeparator byte = 0xff -var termSeparatorSplitSlice = []byte{termSeparator} - -type chunkedContentCoder struct { - final []byte - chunkSize uint64 - currChunk uint64 - chunkLens []uint64 - - w io.Writer - progressiveWrite bool - - chunkMetaBuf bytes.Buffer - chunkBuf bytes.Buffer - - chunkMeta []MetaData - - compressed []byte // temp buf for snappy compression -} - -// MetaData represents the data information inside a -// chunk. -type MetaData struct { - DocNum uint64 // docNum of the data inside the chunk - DocDvOffset uint64 // offset of data inside the chunk for the given docid -} - -// newChunkedContentCoder returns a new chunk content coder which -// packs data into chunks based on the provided chunkSize -func newChunkedContentCoder(chunkSize uint64, maxDocNum uint64, - w io.Writer, progressiveWrite bool) *chunkedContentCoder { - total := maxDocNum/chunkSize + 1 - rv := &chunkedContentCoder{ - chunkSize: chunkSize, - chunkLens: make([]uint64, total), - chunkMeta: make([]MetaData, 0, total), - w: w, - progressiveWrite: progressiveWrite, - } - - return rv -} - -// Reset lets you reuse this chunked content coder. Buffers are reset -// and re used. You cannot change the chunk size. -func (c *chunkedContentCoder) Reset() { - c.currChunk = 0 - c.final = c.final[:0] - c.chunkBuf.Reset() - c.chunkMetaBuf.Reset() - for i := range c.chunkLens { - c.chunkLens[i] = 0 - } - c.chunkMeta = c.chunkMeta[:0] -} - -func (c *chunkedContentCoder) SetChunkSize(chunkSize uint64, maxDocNum uint64) { - total := int(maxDocNum/chunkSize + 1) - c.chunkSize = chunkSize - if cap(c.chunkLens) < total { - c.chunkLens = make([]uint64, total) - } else { - c.chunkLens = c.chunkLens[:total] - } - if cap(c.chunkMeta) < total { - c.chunkMeta = make([]MetaData, 0, total) - } -} - -// Close indicates you are done calling Add() this allows -// the final chunk to be encoded. -func (c *chunkedContentCoder) Close() error { - return c.flushContents() -} - -func (c *chunkedContentCoder) flushContents() error { - // flush the contents, with meta information at first - buf := make([]byte, binary.MaxVarintLen64) - n := binary.PutUvarint(buf, uint64(len(c.chunkMeta))) - _, err := c.chunkMetaBuf.Write(buf[:n]) - if err != nil { - return err - } - - // write out the metaData slice - for _, meta := range c.chunkMeta { - _, err := writeUvarints(&c.chunkMetaBuf, meta.DocNum, meta.DocDvOffset) - if err != nil { - return err - } - } - - // write the metadata to final data - metaData := c.chunkMetaBuf.Bytes() - c.final = append(c.final, c.chunkMetaBuf.Bytes()...) - // write the compressed data to the final data - c.compressed = snappy.Encode(c.compressed[:cap(c.compressed)], c.chunkBuf.Bytes()) - c.final = append(c.final, c.compressed...) - - c.chunkLens[c.currChunk] = uint64(len(c.compressed) + len(metaData)) - - if c.progressiveWrite { - _, err := c.w.Write(c.final) - if err != nil { - return err - } - c.final = c.final[:0] - } - - return nil -} - -// Add encodes the provided byte slice into the correct chunk for the provided -// doc num. You MUST call Add() with increasing docNums. -func (c *chunkedContentCoder) Add(docNum uint64, vals []byte) error { - chunk := docNum / c.chunkSize - if chunk != c.currChunk { - // flush out the previous chunk details - err := c.flushContents() - if err != nil { - return err - } - // clearing the chunk specific meta for next chunk - c.chunkBuf.Reset() - c.chunkMetaBuf.Reset() - c.chunkMeta = c.chunkMeta[:0] - c.currChunk = chunk - } - - // get the starting offset for this doc - dvOffset := c.chunkBuf.Len() - dvSize, err := c.chunkBuf.Write(vals) - if err != nil { - return err - } - - c.chunkMeta = append(c.chunkMeta, MetaData{ - DocNum: docNum, - DocDvOffset: uint64(dvOffset + dvSize), - }) - return nil -} - -// Write commits all the encoded chunked contents to the provided writer. -// -// | ..... data ..... | chunk offsets (varints) -// | position of chunk offsets (uint64) | number of offsets (uint64) | -// -func (c *chunkedContentCoder) Write() (int, error) { - var tw int - - if c.final != nil { - // write out the data section first - nw, err := c.w.Write(c.final) - tw += nw - if err != nil { - return tw, err - } - } - - chunkOffsetsStart := uint64(tw) - - if cap(c.final) < binary.MaxVarintLen64 { - c.final = make([]byte, binary.MaxVarintLen64) - } else { - c.final = c.final[0:binary.MaxVarintLen64] - } - chunkOffsets := modifyLengthsToEndOffsets(c.chunkLens) - // write out the chunk offsets - for _, chunkOffset := range chunkOffsets { - n := binary.PutUvarint(c.final, chunkOffset) - nw, err := c.w.Write(c.final[:n]) - tw += nw - if err != nil { - return tw, err - } - } - - chunkOffsetsLen := uint64(tw) - chunkOffsetsStart - - c.final = c.final[0:8] - // write out the length of chunk offsets - binary.BigEndian.PutUint64(c.final, chunkOffsetsLen) - nw, err := c.w.Write(c.final) - tw += nw - if err != nil { - return tw, err - } - - // write out the number of chunks - binary.BigEndian.PutUint64(c.final, uint64(len(c.chunkLens))) - nw, err = c.w.Write(c.final) - tw += nw - if err != nil { - return tw, err - } - - c.final = c.final[:0] - - return tw, nil -} - -// ReadDocValueBoundary elicits the start, end offsets from a -// metaData header slice -func ReadDocValueBoundary(chunk int, metaHeaders []MetaData) (uint64, uint64) { - var start uint64 - if chunk > 0 { - start = metaHeaders[chunk-1].DocDvOffset - } - return start, metaHeaders[chunk].DocDvOffset -} diff --git a/vendor/github.com/blevesearch/zap/v12/count.go b/vendor/github.com/blevesearch/zap/v12/count.go deleted file mode 100644 index 50290f8..0000000 --- a/vendor/github.com/blevesearch/zap/v12/count.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "hash/crc32" - "io" - - "github.com/blevesearch/bleve/index/scorch/segment" -) - -// CountHashWriter is a wrapper around a Writer which counts the number of -// bytes which have been written and computes a crc32 hash -type CountHashWriter struct { - w io.Writer - crc uint32 - n int - s segment.StatsReporter -} - -// NewCountHashWriter returns a CountHashWriter which wraps the provided Writer -func NewCountHashWriter(w io.Writer) *CountHashWriter { - return &CountHashWriter{w: w} -} - -func NewCountHashWriterWithStatsReporter(w io.Writer, s segment.StatsReporter) *CountHashWriter { - return &CountHashWriter{w: w, s: s} -} - -// Write writes the provided bytes to the wrapped writer and counts the bytes -func (c *CountHashWriter) Write(b []byte) (int, error) { - n, err := c.w.Write(b) - c.crc = crc32.Update(c.crc, crc32.IEEETable, b[:n]) - c.n += n - if c.s != nil { - c.s.ReportBytesWritten(uint64(n)) - } - return n, err -} - -// Count returns the number of bytes written -func (c *CountHashWriter) Count() int { - return c.n -} - -// Sum32 returns the CRC-32 hash of the content written to this writer -func (c *CountHashWriter) Sum32() uint32 { - return c.crc -} diff --git a/vendor/github.com/blevesearch/zap/v12/dict.go b/vendor/github.com/blevesearch/zap/v12/dict.go deleted file mode 100644 index ad4a8f8..0000000 --- a/vendor/github.com/blevesearch/zap/v12/dict.go +++ /dev/null @@ -1,263 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "fmt" - - "github.com/RoaringBitmap/roaring" - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/couchbase/vellum" -) - -// Dictionary is the zap representation of the term dictionary -type Dictionary struct { - sb *SegmentBase - field string - fieldID uint16 - fst *vellum.FST - fstReader *vellum.Reader -} - -// PostingsList returns the postings list for the specified term -func (d *Dictionary) PostingsList(term []byte, except *roaring.Bitmap, - prealloc segment.PostingsList) (segment.PostingsList, error) { - var preallocPL *PostingsList - pl, ok := prealloc.(*PostingsList) - if ok && pl != nil { - preallocPL = pl - } - return d.postingsList(term, except, preallocPL) -} - -func (d *Dictionary) postingsList(term []byte, except *roaring.Bitmap, rv *PostingsList) (*PostingsList, error) { - if d.fstReader == nil { - if rv == nil || rv == emptyPostingsList { - return emptyPostingsList, nil - } - return d.postingsListInit(rv, except), nil - } - - postingsOffset, exists, err := d.fstReader.Get(term) - if err != nil { - return nil, fmt.Errorf("vellum err: %v", err) - } - if !exists { - if rv == nil || rv == emptyPostingsList { - return emptyPostingsList, nil - } - return d.postingsListInit(rv, except), nil - } - - return d.postingsListFromOffset(postingsOffset, except, rv) -} - -func (d *Dictionary) postingsListFromOffset(postingsOffset uint64, except *roaring.Bitmap, rv *PostingsList) (*PostingsList, error) { - rv = d.postingsListInit(rv, except) - - err := rv.read(postingsOffset, d) - if err != nil { - return nil, err - } - - return rv, nil -} - -func (d *Dictionary) postingsListInit(rv *PostingsList, except *roaring.Bitmap) *PostingsList { - if rv == nil || rv == emptyPostingsList { - rv = &PostingsList{} - } else { - postings := rv.postings - if postings != nil { - postings.Clear() - } - - *rv = PostingsList{} // clear the struct - - rv.postings = postings - } - rv.sb = d.sb - rv.except = except - return rv -} - -func (d *Dictionary) Contains(key []byte) (bool, error) { - return d.fst.Contains(key) -} - -// Iterator returns an iterator for this dictionary -func (d *Dictionary) Iterator() segment.DictionaryIterator { - rv := &DictionaryIterator{ - d: d, - } - - if d.fst != nil { - itr, err := d.fst.Iterator(nil, nil) - if err == nil { - rv.itr = itr - } else if err != vellum.ErrIteratorDone { - rv.err = err - } - } - - return rv -} - -// PrefixIterator returns an iterator which only visits terms having the -// the specified prefix -func (d *Dictionary) PrefixIterator(prefix string) segment.DictionaryIterator { - rv := &DictionaryIterator{ - d: d, - } - - kBeg := []byte(prefix) - kEnd := segment.IncrementBytes(kBeg) - - if d.fst != nil { - itr, err := d.fst.Iterator(kBeg, kEnd) - if err == nil { - rv.itr = itr - } else if err != vellum.ErrIteratorDone { - rv.err = err - } - } - - return rv -} - -// RangeIterator returns an iterator which only visits terms between the -// start and end terms. NOTE: bleve.index API specifies the end is inclusive. -func (d *Dictionary) RangeIterator(start, end string) segment.DictionaryIterator { - rv := &DictionaryIterator{ - d: d, - } - - // need to increment the end position to be inclusive - var endBytes []byte - if len(end) > 0 { - endBytes = []byte(end) - if endBytes[len(endBytes)-1] < 0xff { - endBytes[len(endBytes)-1]++ - } else { - endBytes = append(endBytes, 0xff) - } - } - - if d.fst != nil { - itr, err := d.fst.Iterator([]byte(start), endBytes) - if err == nil { - rv.itr = itr - } else if err != vellum.ErrIteratorDone { - rv.err = err - } - } - - return rv -} - -// AutomatonIterator returns an iterator which only visits terms -// having the the vellum automaton and start/end key range -func (d *Dictionary) AutomatonIterator(a vellum.Automaton, - startKeyInclusive, endKeyExclusive []byte) segment.DictionaryIterator { - rv := &DictionaryIterator{ - d: d, - } - - if d.fst != nil { - itr, err := d.fst.Search(a, startKeyInclusive, endKeyExclusive) - if err == nil { - rv.itr = itr - } else if err != vellum.ErrIteratorDone { - rv.err = err - } - } - - return rv -} - -func (d *Dictionary) OnlyIterator(onlyTerms [][]byte, - includeCount bool) segment.DictionaryIterator { - - rv := &DictionaryIterator{ - d: d, - omitCount: !includeCount, - } - - var buf bytes.Buffer - builder, err := vellum.New(&buf, nil) - if err != nil { - rv.err = err - return rv - } - for _, term := range onlyTerms { - err = builder.Insert(term, 0) - if err != nil { - rv.err = err - return rv - } - } - err = builder.Close() - if err != nil { - rv.err = err - return rv - } - - onlyFST, err := vellum.Load(buf.Bytes()) - if err != nil { - rv.err = err - return rv - } - - itr, err := d.fst.Search(onlyFST, nil, nil) - if err == nil { - rv.itr = itr - } else if err != vellum.ErrIteratorDone { - rv.err = err - } - - return rv -} - -// DictionaryIterator is an iterator for term dictionary -type DictionaryIterator struct { - d *Dictionary - itr vellum.Iterator - err error - tmp PostingsList - entry index.DictEntry - omitCount bool -} - -// Next returns the next entry in the dictionary -func (i *DictionaryIterator) Next() (*index.DictEntry, error) { - if i.err != nil && i.err != vellum.ErrIteratorDone { - return nil, i.err - } else if i.itr == nil || i.err == vellum.ErrIteratorDone { - return nil, nil - } - term, postingsOffset := i.itr.Current() - i.entry.Term = string(term) - if !i.omitCount { - i.err = i.tmp.read(postingsOffset, i.d) - if i.err != nil { - return nil, i.err - } - i.entry.Count = i.tmp.Count() - } - i.err = i.itr.Next() - return &i.entry, nil -} diff --git a/vendor/github.com/blevesearch/zap/v12/docvalues.go b/vendor/github.com/blevesearch/zap/v12/docvalues.go deleted file mode 100644 index 793797b..0000000 --- a/vendor/github.com/blevesearch/zap/v12/docvalues.go +++ /dev/null @@ -1,312 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "encoding/binary" - "fmt" - "math" - "reflect" - "sort" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/blevesearch/bleve/size" - "github.com/golang/snappy" -) - -var reflectStaticSizedocValueReader int - -func init() { - var dvi docValueReader - reflectStaticSizedocValueReader = int(reflect.TypeOf(dvi).Size()) -} - -type docNumTermsVisitor func(docNum uint64, terms []byte) error - -type docVisitState struct { - dvrs map[uint16]*docValueReader - segment *SegmentBase -} - -type docValueReader struct { - field string - curChunkNum uint64 - chunkOffsets []uint64 - dvDataLoc uint64 - curChunkHeader []MetaData - curChunkData []byte // compressed data cache - uncompressed []byte // temp buf for snappy decompression -} - -func (di *docValueReader) size() int { - return reflectStaticSizedocValueReader + size.SizeOfPtr + - len(di.field) + - len(di.chunkOffsets)*size.SizeOfUint64 + - len(di.curChunkHeader)*reflectStaticSizeMetaData + - len(di.curChunkData) -} - -func (di *docValueReader) cloneInto(rv *docValueReader) *docValueReader { - if rv == nil { - rv = &docValueReader{} - } - - rv.field = di.field - rv.curChunkNum = math.MaxUint64 - rv.chunkOffsets = di.chunkOffsets // immutable, so it's sharable - rv.dvDataLoc = di.dvDataLoc - rv.curChunkHeader = rv.curChunkHeader[:0] - rv.curChunkData = nil - rv.uncompressed = rv.uncompressed[:0] - - return rv -} - -func (di *docValueReader) curChunkNumber() uint64 { - return di.curChunkNum -} - -func (s *SegmentBase) loadFieldDocValueReader(field string, - fieldDvLocStart, fieldDvLocEnd uint64) (*docValueReader, error) { - // get the docValue offset for the given fields - if fieldDvLocStart == fieldNotUninverted { - // no docValues found, nothing to do - return nil, nil - } - - // read the number of chunks, and chunk offsets position - var numChunks, chunkOffsetsPosition uint64 - - if fieldDvLocEnd-fieldDvLocStart > 16 { - numChunks = binary.BigEndian.Uint64(s.mem[fieldDvLocEnd-8 : fieldDvLocEnd]) - // read the length of chunk offsets - chunkOffsetsLen := binary.BigEndian.Uint64(s.mem[fieldDvLocEnd-16 : fieldDvLocEnd-8]) - // acquire position of chunk offsets - chunkOffsetsPosition = (fieldDvLocEnd - 16) - chunkOffsetsLen - } else { - return nil, fmt.Errorf("loadFieldDocValueReader: fieldDvLoc too small: %d-%d", fieldDvLocEnd, fieldDvLocStart) - } - - fdvIter := &docValueReader{ - curChunkNum: math.MaxUint64, - field: field, - chunkOffsets: make([]uint64, int(numChunks)), - } - - // read the chunk offsets - var offset uint64 - for i := 0; i < int(numChunks); i++ { - loc, read := binary.Uvarint(s.mem[chunkOffsetsPosition+offset : chunkOffsetsPosition+offset+binary.MaxVarintLen64]) - if read <= 0 { - return nil, fmt.Errorf("corrupted chunk offset during segment load") - } - fdvIter.chunkOffsets[i] = loc - offset += uint64(read) - } - - // set the data offset - fdvIter.dvDataLoc = fieldDvLocStart - - return fdvIter, nil -} - -func (di *docValueReader) loadDvChunk(chunkNumber uint64, s *SegmentBase) error { - // advance to the chunk where the docValues - // reside for the given docNum - destChunkDataLoc, curChunkEnd := di.dvDataLoc, di.dvDataLoc - start, end := readChunkBoundary(int(chunkNumber), di.chunkOffsets) - if start >= end { - di.curChunkHeader = di.curChunkHeader[:0] - di.curChunkData = nil - di.curChunkNum = chunkNumber - di.uncompressed = di.uncompressed[:0] - return nil - } - - destChunkDataLoc += start - curChunkEnd += end - - // read the number of docs reside in the chunk - numDocs, read := binary.Uvarint(s.mem[destChunkDataLoc : destChunkDataLoc+binary.MaxVarintLen64]) - if read <= 0 { - return fmt.Errorf("failed to read the chunk") - } - chunkMetaLoc := destChunkDataLoc + uint64(read) - - offset := uint64(0) - if cap(di.curChunkHeader) < int(numDocs) { - di.curChunkHeader = make([]MetaData, int(numDocs)) - } else { - di.curChunkHeader = di.curChunkHeader[:int(numDocs)] - } - for i := 0; i < int(numDocs); i++ { - di.curChunkHeader[i].DocNum, read = binary.Uvarint(s.mem[chunkMetaLoc+offset : chunkMetaLoc+offset+binary.MaxVarintLen64]) - offset += uint64(read) - di.curChunkHeader[i].DocDvOffset, read = binary.Uvarint(s.mem[chunkMetaLoc+offset : chunkMetaLoc+offset+binary.MaxVarintLen64]) - offset += uint64(read) - } - - compressedDataLoc := chunkMetaLoc + offset - dataLength := curChunkEnd - compressedDataLoc - di.curChunkData = s.mem[compressedDataLoc : compressedDataLoc+dataLength] - di.curChunkNum = chunkNumber - di.uncompressed = di.uncompressed[:0] - return nil -} - -func (di *docValueReader) iterateAllDocValues(s *SegmentBase, visitor docNumTermsVisitor) error { - for i := 0; i < len(di.chunkOffsets); i++ { - err := di.loadDvChunk(uint64(i), s) - if err != nil { - return err - } - if di.curChunkData == nil || len(di.curChunkHeader) == 0 { - continue - } - - // uncompress the already loaded data - uncompressed, err := snappy.Decode(di.uncompressed[:cap(di.uncompressed)], di.curChunkData) - if err != nil { - return err - } - di.uncompressed = uncompressed - - start := uint64(0) - for _, entry := range di.curChunkHeader { - err = visitor(entry.DocNum, uncompressed[start:entry.DocDvOffset]) - if err != nil { - return err - } - - start = entry.DocDvOffset - } - } - - return nil -} - -func (di *docValueReader) visitDocValues(docNum uint64, - visitor index.DocumentFieldTermVisitor) error { - // binary search the term locations for the docNum - start, end := di.getDocValueLocs(docNum) - if start == math.MaxUint64 || end == math.MaxUint64 || start == end { - return nil - } - - var uncompressed []byte - var err error - // use the uncompressed copy if available - if len(di.uncompressed) > 0 { - uncompressed = di.uncompressed - } else { - // uncompress the already loaded data - uncompressed, err = snappy.Decode(di.uncompressed[:cap(di.uncompressed)], di.curChunkData) - if err != nil { - return err - } - di.uncompressed = uncompressed - } - - // pick the terms for the given docNum - uncompressed = uncompressed[start:end] - for { - i := bytes.Index(uncompressed, termSeparatorSplitSlice) - if i < 0 { - break - } - - visitor(di.field, uncompressed[0:i]) - uncompressed = uncompressed[i+1:] - } - - return nil -} - -func (di *docValueReader) getDocValueLocs(docNum uint64) (uint64, uint64) { - i := sort.Search(len(di.curChunkHeader), func(i int) bool { - return di.curChunkHeader[i].DocNum >= docNum - }) - if i < len(di.curChunkHeader) && di.curChunkHeader[i].DocNum == docNum { - return ReadDocValueBoundary(i, di.curChunkHeader) - } - return math.MaxUint64, math.MaxUint64 -} - -// VisitDocumentFieldTerms is an implementation of the -// DocumentFieldTermVisitable interface -func (s *SegmentBase) VisitDocumentFieldTerms(localDocNum uint64, fields []string, - visitor index.DocumentFieldTermVisitor, dvsIn segment.DocVisitState) ( - segment.DocVisitState, error) { - dvs, ok := dvsIn.(*docVisitState) - if !ok || dvs == nil { - dvs = &docVisitState{} - } else { - if dvs.segment != s { - dvs.segment = s - dvs.dvrs = nil - } - } - - var fieldIDPlus1 uint16 - if dvs.dvrs == nil { - dvs.dvrs = make(map[uint16]*docValueReader, len(fields)) - for _, field := range fields { - if fieldIDPlus1, ok = s.fieldsMap[field]; !ok { - continue - } - fieldID := fieldIDPlus1 - 1 - if dvIter, exists := s.fieldDvReaders[fieldID]; exists && - dvIter != nil { - dvs.dvrs[fieldID] = dvIter.cloneInto(dvs.dvrs[fieldID]) - } - } - } - - // find the chunkNumber where the docValues are stored - // NOTE: doc values continue to use legacy chunk mode - chunkFactor, err := getChunkSize(LegacyChunkMode, 0, 0) - if err != nil { - return nil, err - } - docInChunk := localDocNum / chunkFactor - var dvr *docValueReader - for _, field := range fields { - if fieldIDPlus1, ok = s.fieldsMap[field]; !ok { - continue - } - fieldID := fieldIDPlus1 - 1 - if dvr, ok = dvs.dvrs[fieldID]; ok && dvr != nil { - // check if the chunk is already loaded - if docInChunk != dvr.curChunkNumber() { - err := dvr.loadDvChunk(docInChunk, s) - if err != nil { - return dvs, err - } - } - - _ = dvr.visitDocValues(localDocNum, visitor) - } - } - return dvs, nil -} - -// VisitableDocValueFields returns the list of fields with -// persisted doc value terms ready to be visitable using the -// VisitDocumentFieldTerms method. -func (s *SegmentBase) VisitableDocValueFields() ([]string, error) { - return s.fieldDvNames, nil -} diff --git a/vendor/github.com/blevesearch/zap/v12/enumerator.go b/vendor/github.com/blevesearch/zap/v12/enumerator.go deleted file mode 100644 index bc5b7e6..0000000 --- a/vendor/github.com/blevesearch/zap/v12/enumerator.go +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright (c) 2018 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - - "github.com/couchbase/vellum" -) - -// enumerator provides an ordered traversal of multiple vellum -// iterators. Like JOIN of iterators, the enumerator produces a -// sequence of (key, iteratorIndex, value) tuples, sorted by key ASC, -// then iteratorIndex ASC, where the same key might be seen or -// repeated across multiple child iterators. -type enumerator struct { - itrs []vellum.Iterator - currKs [][]byte - currVs []uint64 - - lowK []byte - lowIdxs []int - lowCurr int -} - -// newEnumerator returns a new enumerator over the vellum Iterators -func newEnumerator(itrs []vellum.Iterator) (*enumerator, error) { - rv := &enumerator{ - itrs: itrs, - currKs: make([][]byte, len(itrs)), - currVs: make([]uint64, len(itrs)), - lowIdxs: make([]int, 0, len(itrs)), - } - for i, itr := range rv.itrs { - rv.currKs[i], rv.currVs[i] = itr.Current() - } - rv.updateMatches(false) - if rv.lowK == nil && len(rv.lowIdxs) == 0 { - return rv, vellum.ErrIteratorDone - } - return rv, nil -} - -// updateMatches maintains the low key matches based on the currKs -func (m *enumerator) updateMatches(skipEmptyKey bool) { - m.lowK = nil - m.lowIdxs = m.lowIdxs[:0] - m.lowCurr = 0 - - for i, key := range m.currKs { - if (key == nil && m.currVs[i] == 0) || // in case of empty iterator - (len(key) == 0 && skipEmptyKey) { // skip empty keys - continue - } - - cmp := bytes.Compare(key, m.lowK) - if cmp < 0 || len(m.lowIdxs) == 0 { - // reached a new low - m.lowK = key - m.lowIdxs = m.lowIdxs[:0] - m.lowIdxs = append(m.lowIdxs, i) - } else if cmp == 0 { - m.lowIdxs = append(m.lowIdxs, i) - } - } -} - -// Current returns the enumerator's current key, iterator-index, and -// value. If the enumerator is not pointing at a valid value (because -// Next returned an error previously), Current will return nil,0,0. -func (m *enumerator) Current() ([]byte, int, uint64) { - var i int - var v uint64 - if m.lowCurr < len(m.lowIdxs) { - i = m.lowIdxs[m.lowCurr] - v = m.currVs[i] - } - return m.lowK, i, v -} - -// GetLowIdxsAndValues will return all of the iterator indices -// which point to the current key, and their corresponding -// values. This can be used by advanced caller which may need -// to peek into these other sets of data before processing. -func (m *enumerator) GetLowIdxsAndValues() ([]int, []uint64) { - values := make([]uint64, 0, len(m.lowIdxs)) - for _, idx := range m.lowIdxs { - values = append(values, m.currVs[idx]) - } - return m.lowIdxs, values -} - -// Next advances the enumerator to the next key/iterator/value result, -// else vellum.ErrIteratorDone is returned. -func (m *enumerator) Next() error { - m.lowCurr += 1 - if m.lowCurr >= len(m.lowIdxs) { - // move all the current low iterators forwards - for _, vi := range m.lowIdxs { - err := m.itrs[vi].Next() - if err != nil && err != vellum.ErrIteratorDone { - return err - } - m.currKs[vi], m.currVs[vi] = m.itrs[vi].Current() - } - // can skip any empty keys encountered at this point - m.updateMatches(true) - } - if m.lowK == nil && len(m.lowIdxs) == 0 { - return vellum.ErrIteratorDone - } - return nil -} - -// Close all the underlying Iterators. The first error, if any, will -// be returned. -func (m *enumerator) Close() error { - var rv error - for _, itr := range m.itrs { - err := itr.Close() - if rv == nil { - rv = err - } - } - return rv -} diff --git a/vendor/github.com/blevesearch/zap/v12/intDecoder.go b/vendor/github.com/blevesearch/zap/v12/intDecoder.go deleted file mode 100644 index 4cd008f..0000000 --- a/vendor/github.com/blevesearch/zap/v12/intDecoder.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright (c) 2019 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "encoding/binary" - "fmt" - - "github.com/blevesearch/bleve/index/scorch/segment" -) - -type chunkedIntDecoder struct { - startOffset uint64 - dataStartOffset uint64 - chunkOffsets []uint64 - curChunkBytes []byte - data []byte - r *segment.MemUvarintReader -} - -func newChunkedIntDecoder(buf []byte, offset uint64) *chunkedIntDecoder { - rv := &chunkedIntDecoder{startOffset: offset, data: buf} - var n, numChunks uint64 - var read int - if offset == termNotEncoded { - numChunks = 0 - } else { - numChunks, read = binary.Uvarint(buf[offset+n : offset+n+binary.MaxVarintLen64]) - } - - n += uint64(read) - if cap(rv.chunkOffsets) >= int(numChunks) { - rv.chunkOffsets = rv.chunkOffsets[:int(numChunks)] - } else { - rv.chunkOffsets = make([]uint64, int(numChunks)) - } - for i := 0; i < int(numChunks); i++ { - rv.chunkOffsets[i], read = binary.Uvarint(buf[offset+n : offset+n+binary.MaxVarintLen64]) - n += uint64(read) - } - rv.dataStartOffset = offset + n - return rv -} - -func (d *chunkedIntDecoder) loadChunk(chunk int) error { - if d.startOffset == termNotEncoded { - d.r = segment.NewMemUvarintReader([]byte(nil)) - return nil - } - - if chunk >= len(d.chunkOffsets) { - return fmt.Errorf("tried to load freq chunk that doesn't exist %d/(%d)", - chunk, len(d.chunkOffsets)) - } - - end, start := d.dataStartOffset, d.dataStartOffset - s, e := readChunkBoundary(chunk, d.chunkOffsets) - start += s - end += e - d.curChunkBytes = d.data[start:end] - if d.r == nil { - d.r = segment.NewMemUvarintReader(d.curChunkBytes) - } else { - d.r.Reset(d.curChunkBytes) - } - - return nil -} - -func (d *chunkedIntDecoder) reset() { - d.startOffset = 0 - d.dataStartOffset = 0 - d.chunkOffsets = d.chunkOffsets[:0] - d.curChunkBytes = d.curChunkBytes[:0] - d.data = d.data[:0] - if d.r != nil { - d.r.Reset([]byte(nil)) - } -} - -func (d *chunkedIntDecoder) isNil() bool { - return d.curChunkBytes == nil -} - -func (d *chunkedIntDecoder) readUvarint() (uint64, error) { - return d.r.ReadUvarint() -} - -func (d *chunkedIntDecoder) SkipUvarint() { - d.r.SkipUvarint() -} - -func (d *chunkedIntDecoder) SkipBytes(count int) { - d.r.SkipBytes(count) -} - -func (d *chunkedIntDecoder) Len() int { - return d.r.Len() -} diff --git a/vendor/github.com/blevesearch/zap/v12/intcoder.go b/vendor/github.com/blevesearch/zap/v12/intcoder.go deleted file mode 100644 index 7682593..0000000 --- a/vendor/github.com/blevesearch/zap/v12/intcoder.go +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "encoding/binary" - "io" - "math" -) - -const termNotEncoded = math.MaxUint64 - -type chunkedIntCoder struct { - final []byte - chunkSize uint64 - chunkBuf bytes.Buffer - chunkLens []uint64 - currChunk uint64 - - buf []byte -} - -// newChunkedIntCoder returns a new chunk int coder which packs data into -// chunks based on the provided chunkSize and supports up to the specified -// maxDocNum -func newChunkedIntCoder(chunkSize uint64, maxDocNum uint64) *chunkedIntCoder { - total := maxDocNum/chunkSize + 1 - rv := &chunkedIntCoder{ - chunkSize: chunkSize, - chunkLens: make([]uint64, total), - final: make([]byte, 0, 64), - } - - return rv -} - -// Reset lets you reuse this chunked int coder. buffers are reset and reused -// from previous use. you cannot change the chunk size or max doc num. -func (c *chunkedIntCoder) Reset() { - c.final = c.final[:0] - c.chunkBuf.Reset() - c.currChunk = 0 - for i := range c.chunkLens { - c.chunkLens[i] = 0 - } -} - -// SetChunkSize changes the chunk size. It is only valid to do so -// with a new chunkedIntCoder, or immediately after calling Reset() -func (c *chunkedIntCoder) SetChunkSize(chunkSize uint64, maxDocNum uint64) { - total := int(maxDocNum/chunkSize + 1) - c.chunkSize = chunkSize - if cap(c.chunkLens) < total { - c.chunkLens = make([]uint64, total) - } else { - c.chunkLens = c.chunkLens[:total] - } -} - -// Add encodes the provided integers into the correct chunk for the provided -// doc num. You MUST call Add() with increasing docNums. -func (c *chunkedIntCoder) Add(docNum uint64, vals ...uint64) error { - chunk := docNum / c.chunkSize - if chunk != c.currChunk { - // starting a new chunk - c.Close() - c.chunkBuf.Reset() - c.currChunk = chunk - } - - if len(c.buf) < binary.MaxVarintLen64 { - c.buf = make([]byte, binary.MaxVarintLen64) - } - - for _, val := range vals { - wb := binary.PutUvarint(c.buf, val) - _, err := c.chunkBuf.Write(c.buf[:wb]) - if err != nil { - return err - } - } - - return nil -} - -func (c *chunkedIntCoder) AddBytes(docNum uint64, buf []byte) error { - chunk := docNum / c.chunkSize - if chunk != c.currChunk { - // starting a new chunk - c.Close() - c.chunkBuf.Reset() - c.currChunk = chunk - } - - _, err := c.chunkBuf.Write(buf) - return err -} - -// Close indicates you are done calling Add() this allows the final chunk -// to be encoded. -func (c *chunkedIntCoder) Close() { - encodingBytes := c.chunkBuf.Bytes() - c.chunkLens[c.currChunk] = uint64(len(encodingBytes)) - c.final = append(c.final, encodingBytes...) - c.currChunk = uint64(cap(c.chunkLens)) // sentinel to detect double close -} - -// Write commits all the encoded chunked integers to the provided writer. -func (c *chunkedIntCoder) Write(w io.Writer) (int, error) { - bufNeeded := binary.MaxVarintLen64 * (1 + len(c.chunkLens)) - if len(c.buf) < bufNeeded { - c.buf = make([]byte, bufNeeded) - } - buf := c.buf - - // convert the chunk lengths into chunk offsets - chunkOffsets := modifyLengthsToEndOffsets(c.chunkLens) - - // write out the number of chunks & each chunk offsets - n := binary.PutUvarint(buf, uint64(len(chunkOffsets))) - for _, chunkOffset := range chunkOffsets { - n += binary.PutUvarint(buf[n:], chunkOffset) - } - - tw, err := w.Write(buf[:n]) - if err != nil { - return tw, err - } - - // write out the data - nw, err := w.Write(c.final) - tw += nw - if err != nil { - return tw, err - } - return tw, nil -} - -// writeAt commits all the encoded chunked integers to the provided writer -// and returns the starting offset, total bytes written and an error -func (c *chunkedIntCoder) writeAt(w io.Writer) (uint64, int, error) { - startOffset := uint64(termNotEncoded) - if len(c.final) <= 0 { - return startOffset, 0, nil - } - - if chw := w.(*CountHashWriter); chw != nil { - startOffset = uint64(chw.Count()) - } - - tw, err := c.Write(w) - return startOffset, tw, err -} - -func (c *chunkedIntCoder) FinalSize() int { - return len(c.final) -} - -// modifyLengthsToEndOffsets converts the chunk length array -// to a chunk offset array. The readChunkBoundary -// will figure out the start and end of every chunk from -// these offsets. Starting offset of i'th index is stored -// in i-1'th position except for 0'th index and ending offset -// is stored at i'th index position. -// For 0'th element, starting position is always zero. -// eg: -// Lens -> 5 5 5 5 => 5 10 15 20 -// Lens -> 0 5 0 5 => 0 5 5 10 -// Lens -> 0 0 0 5 => 0 0 0 5 -// Lens -> 5 0 0 0 => 5 5 5 5 -// Lens -> 0 5 0 0 => 0 5 5 5 -// Lens -> 0 0 5 0 => 0 0 5 5 -func modifyLengthsToEndOffsets(lengths []uint64) []uint64 { - var runningOffset uint64 - var index, i int - for i = 1; i <= len(lengths); i++ { - runningOffset += lengths[i-1] - lengths[index] = runningOffset - index++ - } - return lengths -} - -func readChunkBoundary(chunk int, offsets []uint64) (uint64, uint64) { - var start uint64 - if chunk > 0 { - start = offsets[chunk-1] - } - return start, offsets[chunk] -} diff --git a/vendor/github.com/blevesearch/zap/v12/merge.go b/vendor/github.com/blevesearch/zap/v12/merge.go deleted file mode 100644 index 805100f..0000000 --- a/vendor/github.com/blevesearch/zap/v12/merge.go +++ /dev/null @@ -1,847 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bufio" - "bytes" - "encoding/binary" - "fmt" - "math" - "os" - "sort" - - "github.com/RoaringBitmap/roaring" - seg "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/couchbase/vellum" - "github.com/golang/snappy" -) - -var DefaultFileMergerBufferSize = 1024 * 1024 - -const docDropped = math.MaxUint64 // sentinel docNum to represent a deleted doc - -// Merge takes a slice of segments and bit masks describing which -// documents may be dropped, and creates a new segment containing the -// remaining data. This new segment is built at the specified path. -func (*ZapPlugin) Merge(segments []seg.Segment, drops []*roaring.Bitmap, path string, - closeCh chan struct{}, s seg.StatsReporter) ( - [][]uint64, uint64, error) { - - segmentBases := make([]*SegmentBase, len(segments)) - for segmenti, segment := range segments { - switch segmentx := segment.(type) { - case *Segment: - segmentBases[segmenti] = &segmentx.SegmentBase - case *SegmentBase: - segmentBases[segmenti] = segmentx - default: - panic(fmt.Sprintf("oops, unexpected segment type: %T", segment)) - } - } - return mergeSegmentBases(segmentBases, drops, path, DefaultChunkMode, closeCh, s) -} - -func mergeSegmentBases(segmentBases []*SegmentBase, drops []*roaring.Bitmap, path string, - chunkMode uint32, closeCh chan struct{}, s seg.StatsReporter) ( - [][]uint64, uint64, error) { - flag := os.O_RDWR | os.O_CREATE - - f, err := os.OpenFile(path, flag, 0600) - if err != nil { - return nil, 0, err - } - - cleanup := func() { - _ = f.Close() - _ = os.Remove(path) - } - - // buffer the output - br := bufio.NewWriterSize(f, DefaultFileMergerBufferSize) - - // wrap it for counting (tracking offsets) - cr := NewCountHashWriterWithStatsReporter(br, s) - - newDocNums, numDocs, storedIndexOffset, fieldsIndexOffset, docValueOffset, _, _, _, err := - MergeToWriter(segmentBases, drops, chunkMode, cr, closeCh) - if err != nil { - cleanup() - return nil, 0, err - } - - err = persistFooter(numDocs, storedIndexOffset, fieldsIndexOffset, - docValueOffset, chunkMode, cr.Sum32(), cr) - if err != nil { - cleanup() - return nil, 0, err - } - - err = br.Flush() - if err != nil { - cleanup() - return nil, 0, err - } - - err = f.Sync() - if err != nil { - cleanup() - return nil, 0, err - } - - err = f.Close() - if err != nil { - cleanup() - return nil, 0, err - } - - return newDocNums, uint64(cr.Count()), nil -} - -func MergeToWriter(segments []*SegmentBase, drops []*roaring.Bitmap, - chunkMode uint32, cr *CountHashWriter, closeCh chan struct{}) ( - newDocNums [][]uint64, - numDocs, storedIndexOffset, fieldsIndexOffset, docValueOffset uint64, - dictLocs []uint64, fieldsInv []string, fieldsMap map[string]uint16, - err error) { - docValueOffset = uint64(fieldNotUninverted) - - var fieldsSame bool - fieldsSame, fieldsInv = mergeFields(segments) - fieldsMap = mapFields(fieldsInv) - - numDocs = computeNewDocCount(segments, drops) - - if isClosed(closeCh) { - return nil, 0, 0, 0, 0, nil, nil, nil, seg.ErrClosed - } - - if numDocs > 0 { - storedIndexOffset, newDocNums, err = mergeStoredAndRemap(segments, drops, - fieldsMap, fieldsInv, fieldsSame, numDocs, cr, closeCh) - if err != nil { - return nil, 0, 0, 0, 0, nil, nil, nil, err - } - - dictLocs, docValueOffset, err = persistMergedRest(segments, drops, - fieldsInv, fieldsMap, fieldsSame, - newDocNums, numDocs, chunkMode, cr, closeCh) - if err != nil { - return nil, 0, 0, 0, 0, nil, nil, nil, err - } - } else { - dictLocs = make([]uint64, len(fieldsInv)) - } - - fieldsIndexOffset, err = persistFields(fieldsInv, cr, dictLocs) - if err != nil { - return nil, 0, 0, 0, 0, nil, nil, nil, err - } - - return newDocNums, numDocs, storedIndexOffset, fieldsIndexOffset, docValueOffset, dictLocs, fieldsInv, fieldsMap, nil -} - -// mapFields takes the fieldsInv list and returns a map of fieldName -// to fieldID+1 -func mapFields(fields []string) map[string]uint16 { - rv := make(map[string]uint16, len(fields)) - for i, fieldName := range fields { - rv[fieldName] = uint16(i) + 1 - } - return rv -} - -// computeNewDocCount determines how many documents will be in the newly -// merged segment when obsoleted docs are dropped -func computeNewDocCount(segments []*SegmentBase, drops []*roaring.Bitmap) uint64 { - var newDocCount uint64 - for segI, segment := range segments { - newDocCount += segment.numDocs - if drops[segI] != nil { - newDocCount -= drops[segI].GetCardinality() - } - } - return newDocCount -} - -func persistMergedRest(segments []*SegmentBase, dropsIn []*roaring.Bitmap, - fieldsInv []string, fieldsMap map[string]uint16, fieldsSame bool, - newDocNumsIn [][]uint64, newSegDocCount uint64, chunkMode uint32, - w *CountHashWriter, closeCh chan struct{}) ([]uint64, uint64, error) { - - var bufMaxVarintLen64 []byte = make([]byte, binary.MaxVarintLen64) - var bufLoc []uint64 - - var postings *PostingsList - var postItr *PostingsIterator - - rv := make([]uint64, len(fieldsInv)) - fieldDvLocsStart := make([]uint64, len(fieldsInv)) - fieldDvLocsEnd := make([]uint64, len(fieldsInv)) - - // these int coders are initialized with chunk size 1024 - // however this will be reset to the correct chunk size - // while processing each individual field-term section - tfEncoder := newChunkedIntCoder(1024, newSegDocCount-1) - locEncoder := newChunkedIntCoder(1024, newSegDocCount-1) - - var vellumBuf bytes.Buffer - newVellum, err := vellum.New(&vellumBuf, nil) - if err != nil { - return nil, 0, err - } - - newRoaring := roaring.NewBitmap() - - // for each field - for fieldID, fieldName := range fieldsInv { - - // collect FST iterators from all active segments for this field - var newDocNums [][]uint64 - var drops []*roaring.Bitmap - var dicts []*Dictionary - var itrs []vellum.Iterator - - var segmentsInFocus []*SegmentBase - - for segmentI, segment := range segments { - - // check for the closure in meantime - if isClosed(closeCh) { - return nil, 0, seg.ErrClosed - } - - dict, err2 := segment.dictionary(fieldName) - if err2 != nil { - return nil, 0, err2 - } - if dict != nil && dict.fst != nil { - itr, err2 := dict.fst.Iterator(nil, nil) - if err2 != nil && err2 != vellum.ErrIteratorDone { - return nil, 0, err2 - } - if itr != nil { - newDocNums = append(newDocNums, newDocNumsIn[segmentI]) - if dropsIn[segmentI] != nil && !dropsIn[segmentI].IsEmpty() { - drops = append(drops, dropsIn[segmentI]) - } else { - drops = append(drops, nil) - } - dicts = append(dicts, dict) - itrs = append(itrs, itr) - segmentsInFocus = append(segmentsInFocus, segment) - } - } - } - - var prevTerm []byte - - newRoaring.Clear() - - var lastDocNum, lastFreq, lastNorm uint64 - - // determines whether to use "1-hit" encoding optimization - // when a term appears in only 1 doc, with no loc info, - // has freq of 1, and the docNum fits into 31-bits - use1HitEncoding := func(termCardinality uint64) (bool, uint64, uint64) { - if termCardinality == uint64(1) && locEncoder.FinalSize() <= 0 { - docNum := uint64(newRoaring.Minimum()) - if under32Bits(docNum) && docNum == lastDocNum && lastFreq == 1 { - return true, docNum, lastNorm - } - } - return false, 0, 0 - } - - finishTerm := func(term []byte) error { - tfEncoder.Close() - locEncoder.Close() - - postingsOffset, err := writePostings(newRoaring, - tfEncoder, locEncoder, use1HitEncoding, w, bufMaxVarintLen64) - if err != nil { - return err - } - - if postingsOffset > 0 { - err = newVellum.Insert(term, postingsOffset) - if err != nil { - return err - } - } - - newRoaring.Clear() - - tfEncoder.Reset() - locEncoder.Reset() - - lastDocNum = 0 - lastFreq = 0 - lastNorm = 0 - - return nil - } - - enumerator, err := newEnumerator(itrs) - - for err == nil { - term, itrI, postingsOffset := enumerator.Current() - - if !bytes.Equal(prevTerm, term) { - // check for the closure in meantime - if isClosed(closeCh) { - return nil, 0, seg.ErrClosed - } - - // if the term changed, write out the info collected - // for the previous term - err = finishTerm(prevTerm) - if err != nil { - return nil, 0, err - } - } - if !bytes.Equal(prevTerm, term) || prevTerm == nil { - // compute cardinality of field-term in new seg - var newCard uint64 - lowItrIdxs, lowItrVals := enumerator.GetLowIdxsAndValues() - for i, idx := range lowItrIdxs { - pl, err := dicts[idx].postingsListFromOffset(lowItrVals[i], drops[idx], nil) - if err != nil { - return nil, 0, err - } - newCard += pl.Count() - } - // compute correct chunk size with this - chunkSize, err := getChunkSize(chunkMode, newCard, newSegDocCount) - if err != nil { - return nil, 0, err - } - // update encoders chunk - tfEncoder.SetChunkSize(chunkSize, newSegDocCount-1) - locEncoder.SetChunkSize(chunkSize, newSegDocCount-1) - } - - postings, err = dicts[itrI].postingsListFromOffset( - postingsOffset, drops[itrI], postings) - if err != nil { - return nil, 0, err - } - - postItr = postings.iterator(true, true, true, postItr) - - // can no longer optimize by copying, since chunk factor could have changed - lastDocNum, lastFreq, lastNorm, bufLoc, err = mergeTermFreqNormLocs( - fieldsMap, term, postItr, newDocNums[itrI], newRoaring, - tfEncoder, locEncoder, bufLoc) - - if err != nil { - return nil, 0, err - } - - prevTerm = prevTerm[:0] // copy to prevTerm in case Next() reuses term mem - prevTerm = append(prevTerm, term...) - - err = enumerator.Next() - } - if err != vellum.ErrIteratorDone { - return nil, 0, err - } - - err = finishTerm(prevTerm) - if err != nil { - return nil, 0, err - } - - dictOffset := uint64(w.Count()) - - err = newVellum.Close() - if err != nil { - return nil, 0, err - } - vellumData := vellumBuf.Bytes() - - // write out the length of the vellum data - n := binary.PutUvarint(bufMaxVarintLen64, uint64(len(vellumData))) - _, err = w.Write(bufMaxVarintLen64[:n]) - if err != nil { - return nil, 0, err - } - - // write this vellum to disk - _, err = w.Write(vellumData) - if err != nil { - return nil, 0, err - } - - rv[fieldID] = dictOffset - - // get the field doc value offset (start) - fieldDvLocsStart[fieldID] = uint64(w.Count()) - - // update the field doc values - // NOTE: doc values continue to use legacy chunk mode - chunkSize, err := getChunkSize(LegacyChunkMode, 0, 0) - if err != nil { - return nil, 0, err - } - fdvEncoder := newChunkedContentCoder(chunkSize, newSegDocCount-1, w, true) - - fdvReadersAvailable := false - var dvIterClone *docValueReader - for segmentI, segment := range segmentsInFocus { - // check for the closure in meantime - if isClosed(closeCh) { - return nil, 0, seg.ErrClosed - } - - fieldIDPlus1 := uint16(segment.fieldsMap[fieldName]) - if dvIter, exists := segment.fieldDvReaders[fieldIDPlus1-1]; exists && - dvIter != nil { - fdvReadersAvailable = true - dvIterClone = dvIter.cloneInto(dvIterClone) - err = dvIterClone.iterateAllDocValues(segment, func(docNum uint64, terms []byte) error { - if newDocNums[segmentI][docNum] == docDropped { - return nil - } - err := fdvEncoder.Add(newDocNums[segmentI][docNum], terms) - if err != nil { - return err - } - return nil - }) - if err != nil { - return nil, 0, err - } - } - } - - if fdvReadersAvailable { - err = fdvEncoder.Close() - if err != nil { - return nil, 0, err - } - - // persist the doc value details for this field - _, err = fdvEncoder.Write() - if err != nil { - return nil, 0, err - } - - // get the field doc value offset (end) - fieldDvLocsEnd[fieldID] = uint64(w.Count()) - } else { - fieldDvLocsStart[fieldID] = fieldNotUninverted - fieldDvLocsEnd[fieldID] = fieldNotUninverted - } - - // reset vellum buffer and vellum builder - vellumBuf.Reset() - err = newVellum.Reset(&vellumBuf) - if err != nil { - return nil, 0, err - } - } - - fieldDvLocsOffset := uint64(w.Count()) - - buf := bufMaxVarintLen64 - for i := 0; i < len(fieldDvLocsStart); i++ { - n := binary.PutUvarint(buf, fieldDvLocsStart[i]) - _, err := w.Write(buf[:n]) - if err != nil { - return nil, 0, err - } - n = binary.PutUvarint(buf, fieldDvLocsEnd[i]) - _, err = w.Write(buf[:n]) - if err != nil { - return nil, 0, err - } - } - - return rv, fieldDvLocsOffset, nil -} - -func mergeTermFreqNormLocs(fieldsMap map[string]uint16, term []byte, postItr *PostingsIterator, - newDocNums []uint64, newRoaring *roaring.Bitmap, - tfEncoder *chunkedIntCoder, locEncoder *chunkedIntCoder, bufLoc []uint64) ( - lastDocNum uint64, lastFreq uint64, lastNorm uint64, bufLocOut []uint64, err error) { - next, err := postItr.Next() - for next != nil && err == nil { - hitNewDocNum := newDocNums[next.Number()] - if hitNewDocNum == docDropped { - return 0, 0, 0, nil, fmt.Errorf("see hit with dropped docNum") - } - - newRoaring.Add(uint32(hitNewDocNum)) - - nextFreq := next.Frequency() - nextNorm := uint64(math.Float32bits(float32(next.Norm()))) - - locs := next.Locations() - - err = tfEncoder.Add(hitNewDocNum, - encodeFreqHasLocs(nextFreq, len(locs) > 0), nextNorm) - if err != nil { - return 0, 0, 0, nil, err - } - - if len(locs) > 0 { - numBytesLocs := 0 - for _, loc := range locs { - ap := loc.ArrayPositions() - numBytesLocs += totalUvarintBytes(uint64(fieldsMap[loc.Field()]-1), - loc.Pos(), loc.Start(), loc.End(), uint64(len(ap)), ap) - } - - err = locEncoder.Add(hitNewDocNum, uint64(numBytesLocs)) - if err != nil { - return 0, 0, 0, nil, err - } - - for _, loc := range locs { - ap := loc.ArrayPositions() - if cap(bufLoc) < 5+len(ap) { - bufLoc = make([]uint64, 0, 5+len(ap)) - } - args := bufLoc[0:5] - args[0] = uint64(fieldsMap[loc.Field()] - 1) - args[1] = loc.Pos() - args[2] = loc.Start() - args[3] = loc.End() - args[4] = uint64(len(ap)) - args = append(args, ap...) - err = locEncoder.Add(hitNewDocNum, args...) - if err != nil { - return 0, 0, 0, nil, err - } - } - } - - lastDocNum = hitNewDocNum - lastFreq = nextFreq - lastNorm = nextNorm - - next, err = postItr.Next() - } - - return lastDocNum, lastFreq, lastNorm, bufLoc, err -} - -func writePostings(postings *roaring.Bitmap, tfEncoder, locEncoder *chunkedIntCoder, - use1HitEncoding func(uint64) (bool, uint64, uint64), - w *CountHashWriter, bufMaxVarintLen64 []byte) ( - offset uint64, err error) { - termCardinality := postings.GetCardinality() - if termCardinality <= 0 { - return 0, nil - } - - if use1HitEncoding != nil { - encodeAs1Hit, docNum1Hit, normBits1Hit := use1HitEncoding(termCardinality) - if encodeAs1Hit { - return FSTValEncode1Hit(docNum1Hit, normBits1Hit), nil - } - } - - var tfOffset uint64 - tfOffset, _, err = tfEncoder.writeAt(w) - if err != nil { - return 0, err - } - - var locOffset uint64 - locOffset, _, err = locEncoder.writeAt(w) - if err != nil { - return 0, err - } - - postingsOffset := uint64(w.Count()) - - n := binary.PutUvarint(bufMaxVarintLen64, tfOffset) - _, err = w.Write(bufMaxVarintLen64[:n]) - if err != nil { - return 0, err - } - - n = binary.PutUvarint(bufMaxVarintLen64, locOffset) - _, err = w.Write(bufMaxVarintLen64[:n]) - if err != nil { - return 0, err - } - - _, err = writeRoaringWithLen(postings, w, bufMaxVarintLen64) - if err != nil { - return 0, err - } - - return postingsOffset, nil -} - -type varintEncoder func(uint64) (int, error) - -func mergeStoredAndRemap(segments []*SegmentBase, drops []*roaring.Bitmap, - fieldsMap map[string]uint16, fieldsInv []string, fieldsSame bool, newSegDocCount uint64, - w *CountHashWriter, closeCh chan struct{}) (uint64, [][]uint64, error) { - var rv [][]uint64 // The remapped or newDocNums for each segment. - - var newDocNum uint64 - - var curr int - var data, compressed []byte - var metaBuf bytes.Buffer - varBuf := make([]byte, binary.MaxVarintLen64) - metaEncode := func(val uint64) (int, error) { - wb := binary.PutUvarint(varBuf, val) - return metaBuf.Write(varBuf[:wb]) - } - - vals := make([][][]byte, len(fieldsInv)) - typs := make([][]byte, len(fieldsInv)) - poss := make([][][]uint64, len(fieldsInv)) - - var posBuf []uint64 - - docNumOffsets := make([]uint64, newSegDocCount) - - vdc := visitDocumentCtxPool.Get().(*visitDocumentCtx) - defer visitDocumentCtxPool.Put(vdc) - - // for each segment - for segI, segment := range segments { - // check for the closure in meantime - if isClosed(closeCh) { - return 0, nil, seg.ErrClosed - } - - segNewDocNums := make([]uint64, segment.numDocs) - - dropsI := drops[segI] - - // optimize when the field mapping is the same across all - // segments and there are no deletions, via byte-copying - // of stored docs bytes directly to the writer - if fieldsSame && (dropsI == nil || dropsI.GetCardinality() == 0) { - err := segment.copyStoredDocs(newDocNum, docNumOffsets, w) - if err != nil { - return 0, nil, err - } - - for i := uint64(0); i < segment.numDocs; i++ { - segNewDocNums[i] = newDocNum - newDocNum++ - } - rv = append(rv, segNewDocNums) - - continue - } - - // for each doc num - for docNum := uint64(0); docNum < segment.numDocs; docNum++ { - // TODO: roaring's API limits docNums to 32-bits? - if dropsI != nil && dropsI.Contains(uint32(docNum)) { - segNewDocNums[docNum] = docDropped - continue - } - - segNewDocNums[docNum] = newDocNum - - curr = 0 - metaBuf.Reset() - data = data[:0] - - posTemp := posBuf - - // collect all the data - for i := 0; i < len(fieldsInv); i++ { - vals[i] = vals[i][:0] - typs[i] = typs[i][:0] - poss[i] = poss[i][:0] - } - err := segment.visitDocument(vdc, docNum, func(field string, typ byte, value []byte, pos []uint64) bool { - fieldID := int(fieldsMap[field]) - 1 - vals[fieldID] = append(vals[fieldID], value) - typs[fieldID] = append(typs[fieldID], typ) - - // copy array positions to preserve them beyond the scope of this callback - var curPos []uint64 - if len(pos) > 0 { - if cap(posTemp) < len(pos) { - posBuf = make([]uint64, len(pos)*len(fieldsInv)) - posTemp = posBuf - } - curPos = posTemp[0:len(pos)] - copy(curPos, pos) - posTemp = posTemp[len(pos):] - } - poss[fieldID] = append(poss[fieldID], curPos) - - return true - }) - if err != nil { - return 0, nil, err - } - - // _id field special case optimizes ExternalID() lookups - idFieldVal := vals[uint16(0)][0] - _, err = metaEncode(uint64(len(idFieldVal))) - if err != nil { - return 0, nil, err - } - - // now walk the non-"_id" fields in order - for fieldID := 1; fieldID < len(fieldsInv); fieldID++ { - storedFieldValues := vals[fieldID] - - stf := typs[fieldID] - spf := poss[fieldID] - - var err2 error - curr, data, err2 = persistStoredFieldValues(fieldID, - storedFieldValues, stf, spf, curr, metaEncode, data) - if err2 != nil { - return 0, nil, err2 - } - } - - metaBytes := metaBuf.Bytes() - - compressed = snappy.Encode(compressed[:cap(compressed)], data) - - // record where we're about to start writing - docNumOffsets[newDocNum] = uint64(w.Count()) - - // write out the meta len and compressed data len - _, err = writeUvarints(w, - uint64(len(metaBytes)), - uint64(len(idFieldVal)+len(compressed))) - if err != nil { - return 0, nil, err - } - // now write the meta - _, err = w.Write(metaBytes) - if err != nil { - return 0, nil, err - } - // now write the _id field val (counted as part of the 'compressed' data) - _, err = w.Write(idFieldVal) - if err != nil { - return 0, nil, err - } - // now write the compressed data - _, err = w.Write(compressed) - if err != nil { - return 0, nil, err - } - - newDocNum++ - } - - rv = append(rv, segNewDocNums) - } - - // return value is the start of the stored index - storedIndexOffset := uint64(w.Count()) - - // now write out the stored doc index - for _, docNumOffset := range docNumOffsets { - err := binary.Write(w, binary.BigEndian, docNumOffset) - if err != nil { - return 0, nil, err - } - } - - return storedIndexOffset, rv, nil -} - -// copyStoredDocs writes out a segment's stored doc info, optimized by -// using a single Write() call for the entire set of bytes. The -// newDocNumOffsets is filled with the new offsets for each doc. -func (s *SegmentBase) copyStoredDocs(newDocNum uint64, newDocNumOffsets []uint64, - w *CountHashWriter) error { - if s.numDocs <= 0 { - return nil - } - - indexOffset0, storedOffset0, _, _, _ := - s.getDocStoredOffsets(0) // the segment's first doc - - indexOffsetN, storedOffsetN, readN, metaLenN, dataLenN := - s.getDocStoredOffsets(s.numDocs - 1) // the segment's last doc - - storedOffset0New := uint64(w.Count()) - - storedBytes := s.mem[storedOffset0 : storedOffsetN+readN+metaLenN+dataLenN] - _, err := w.Write(storedBytes) - if err != nil { - return err - } - - // remap the storedOffset's for the docs into new offsets relative - // to storedOffset0New, filling the given docNumOffsetsOut array - for indexOffset := indexOffset0; indexOffset <= indexOffsetN; indexOffset += 8 { - storedOffset := binary.BigEndian.Uint64(s.mem[indexOffset : indexOffset+8]) - storedOffsetNew := storedOffset - storedOffset0 + storedOffset0New - newDocNumOffsets[newDocNum] = storedOffsetNew - newDocNum += 1 - } - - return nil -} - -// mergeFields builds a unified list of fields used across all the -// input segments, and computes whether the fields are the same across -// segments (which depends on fields to be sorted in the same way -// across segments) -func mergeFields(segments []*SegmentBase) (bool, []string) { - fieldsSame := true - - var segment0Fields []string - if len(segments) > 0 { - segment0Fields = segments[0].Fields() - } - - fieldsExist := map[string]struct{}{} - for _, segment := range segments { - fields := segment.Fields() - for fieldi, field := range fields { - fieldsExist[field] = struct{}{} - if len(segment0Fields) != len(fields) || segment0Fields[fieldi] != field { - fieldsSame = false - } - } - } - - rv := make([]string, 0, len(fieldsExist)) - // ensure _id stays first - rv = append(rv, "_id") - for k := range fieldsExist { - if k != "_id" { - rv = append(rv, k) - } - } - - sort.Strings(rv[1:]) // leave _id as first - - return fieldsSame, rv -} - -func isClosed(closeCh chan struct{}) bool { - select { - case <-closeCh: - return true - default: - return false - } -} diff --git a/vendor/github.com/blevesearch/zap/v12/new.go b/vendor/github.com/blevesearch/zap/v12/new.go deleted file mode 100644 index 9815818..0000000 --- a/vendor/github.com/blevesearch/zap/v12/new.go +++ /dev/null @@ -1,860 +0,0 @@ -// Copyright (c) 2018 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "encoding/binary" - "math" - "sort" - "sync" - - "github.com/RoaringBitmap/roaring" - "github.com/blevesearch/bleve/analysis" - "github.com/blevesearch/bleve/document" - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/couchbase/vellum" - "github.com/golang/snappy" -) - -var NewSegmentBufferNumResultsBump int = 100 -var NewSegmentBufferNumResultsFactor float64 = 1.0 -var NewSegmentBufferAvgBytesPerDocFactor float64 = 1.0 - -// ValidateDocFields can be set by applications to perform additional checks -// on fields in a document being added to a new segment, by default it does -// nothing. -// This API is experimental and may be removed at any time. -var ValidateDocFields = func(field document.Field) error { - return nil -} - -// AnalysisResultsToSegmentBase produces an in-memory zap-encoded -// SegmentBase from analysis results -func (z *ZapPlugin) New(results []*index.AnalysisResult) ( - segment.Segment, uint64, error) { - return z.newWithChunkMode(results, DefaultChunkMode) -} - -func (*ZapPlugin) newWithChunkMode(results []*index.AnalysisResult, - chunkMode uint32) (segment.Segment, uint64, error) { - s := interimPool.Get().(*interim) - - var br bytes.Buffer - if s.lastNumDocs > 0 { - // use previous results to initialize the buf with an estimate - // size, but note that the interim instance comes from a - // global interimPool, so multiple scorch instances indexing - // different docs can lead to low quality estimates - estimateAvgBytesPerDoc := int(float64(s.lastOutSize/s.lastNumDocs) * - NewSegmentBufferNumResultsFactor) - estimateNumResults := int(float64(len(results)+NewSegmentBufferNumResultsBump) * - NewSegmentBufferAvgBytesPerDocFactor) - br.Grow(estimateAvgBytesPerDoc * estimateNumResults) - } - - s.results = results - s.chunkMode = chunkMode - s.w = NewCountHashWriter(&br) - - storedIndexOffset, fieldsIndexOffset, fdvIndexOffset, dictOffsets, - err := s.convert() - if err != nil { - return nil, uint64(0), err - } - - sb, err := InitSegmentBase(br.Bytes(), s.w.Sum32(), chunkMode, - s.FieldsMap, s.FieldsInv, uint64(len(results)), - storedIndexOffset, fieldsIndexOffset, fdvIndexOffset, dictOffsets) - - if err == nil && s.reset() == nil { - s.lastNumDocs = len(results) - s.lastOutSize = len(br.Bytes()) - interimPool.Put(s) - } - - return sb, uint64(len(br.Bytes())), err -} - -var interimPool = sync.Pool{New: func() interface{} { return &interim{} }} - -// interim holds temporary working data used while converting from -// analysis results to a zap-encoded segment -type interim struct { - results []*index.AnalysisResult - - chunkMode uint32 - - w *CountHashWriter - - // FieldsMap adds 1 to field id to avoid zero value issues - // name -> field id + 1 - FieldsMap map[string]uint16 - - // FieldsInv is the inverse of FieldsMap - // field id -> name - FieldsInv []string - - // Term dictionaries for each field - // field id -> term -> postings list id + 1 - Dicts []map[string]uint64 - - // Terms for each field, where terms are sorted ascending - // field id -> []term - DictKeys [][]string - - // Fields whose IncludeDocValues is true - // field id -> bool - IncludeDocValues []bool - - // postings id -> bitmap of docNums - Postings []*roaring.Bitmap - - // postings id -> freq/norm's, one for each docNum in postings - FreqNorms [][]interimFreqNorm - freqNormsBacking []interimFreqNorm - - // postings id -> locs, one for each freq - Locs [][]interimLoc - locsBacking []interimLoc - - numTermsPerPostingsList []int // key is postings list id - numLocsPerPostingsList []int // key is postings list id - - builder *vellum.Builder - builderBuf bytes.Buffer - - metaBuf bytes.Buffer - - tmp0 []byte - tmp1 []byte - - lastNumDocs int - lastOutSize int -} - -func (s *interim) reset() (err error) { - s.results = nil - s.chunkMode = 0 - s.w = nil - s.FieldsMap = nil - s.FieldsInv = nil - for i := range s.Dicts { - s.Dicts[i] = nil - } - s.Dicts = s.Dicts[:0] - for i := range s.DictKeys { - s.DictKeys[i] = s.DictKeys[i][:0] - } - s.DictKeys = s.DictKeys[:0] - for i := range s.IncludeDocValues { - s.IncludeDocValues[i] = false - } - s.IncludeDocValues = s.IncludeDocValues[:0] - for _, idn := range s.Postings { - idn.Clear() - } - s.Postings = s.Postings[:0] - s.FreqNorms = s.FreqNorms[:0] - for i := range s.freqNormsBacking { - s.freqNormsBacking[i] = interimFreqNorm{} - } - s.freqNormsBacking = s.freqNormsBacking[:0] - s.Locs = s.Locs[:0] - for i := range s.locsBacking { - s.locsBacking[i] = interimLoc{} - } - s.locsBacking = s.locsBacking[:0] - s.numTermsPerPostingsList = s.numTermsPerPostingsList[:0] - s.numLocsPerPostingsList = s.numLocsPerPostingsList[:0] - s.builderBuf.Reset() - if s.builder != nil { - err = s.builder.Reset(&s.builderBuf) - } - s.metaBuf.Reset() - s.tmp0 = s.tmp0[:0] - s.tmp1 = s.tmp1[:0] - s.lastNumDocs = 0 - s.lastOutSize = 0 - - return err -} - -func (s *interim) grabBuf(size int) []byte { - buf := s.tmp0 - if cap(buf) < size { - buf = make([]byte, size) - s.tmp0 = buf - } - return buf[0:size] -} - -type interimStoredField struct { - vals [][]byte - typs []byte - arrayposs [][]uint64 // array positions -} - -type interimFreqNorm struct { - freq uint64 - norm float32 - numLocs int -} - -type interimLoc struct { - fieldID uint16 - pos uint64 - start uint64 - end uint64 - arrayposs []uint64 -} - -func (s *interim) convert() (uint64, uint64, uint64, []uint64, error) { - s.FieldsMap = map[string]uint16{} - - s.getOrDefineField("_id") // _id field is fieldID 0 - - for _, result := range s.results { - for _, field := range result.Document.CompositeFields { - s.getOrDefineField(field.Name()) - } - for _, field := range result.Document.Fields { - s.getOrDefineField(field.Name()) - } - } - - sort.Strings(s.FieldsInv[1:]) // keep _id as first field - - for fieldID, fieldName := range s.FieldsInv { - s.FieldsMap[fieldName] = uint16(fieldID + 1) - } - - if cap(s.IncludeDocValues) >= len(s.FieldsInv) { - s.IncludeDocValues = s.IncludeDocValues[:len(s.FieldsInv)] - } else { - s.IncludeDocValues = make([]bool, len(s.FieldsInv)) - } - - s.prepareDicts() - - for _, dict := range s.DictKeys { - sort.Strings(dict) - } - - s.processDocuments() - - storedIndexOffset, err := s.writeStoredFields() - if err != nil { - return 0, 0, 0, nil, err - } - - var fdvIndexOffset uint64 - var dictOffsets []uint64 - - if len(s.results) > 0 { - fdvIndexOffset, dictOffsets, err = s.writeDicts() - if err != nil { - return 0, 0, 0, nil, err - } - } else { - dictOffsets = make([]uint64, len(s.FieldsInv)) - } - - fieldsIndexOffset, err := persistFields(s.FieldsInv, s.w, dictOffsets) - if err != nil { - return 0, 0, 0, nil, err - } - - return storedIndexOffset, fieldsIndexOffset, fdvIndexOffset, dictOffsets, nil -} - -func (s *interim) getOrDefineField(fieldName string) int { - fieldIDPlus1, exists := s.FieldsMap[fieldName] - if !exists { - fieldIDPlus1 = uint16(len(s.FieldsInv) + 1) - s.FieldsMap[fieldName] = fieldIDPlus1 - s.FieldsInv = append(s.FieldsInv, fieldName) - - s.Dicts = append(s.Dicts, make(map[string]uint64)) - - n := len(s.DictKeys) - if n < cap(s.DictKeys) { - s.DictKeys = s.DictKeys[:n+1] - s.DictKeys[n] = s.DictKeys[n][:0] - } else { - s.DictKeys = append(s.DictKeys, []string(nil)) - } - } - - return int(fieldIDPlus1 - 1) -} - -// fill Dicts and DictKeys from analysis results -func (s *interim) prepareDicts() { - var pidNext int - - var totTFs int - var totLocs int - - visitField := func(fieldID uint16, tfs analysis.TokenFrequencies) { - dict := s.Dicts[fieldID] - dictKeys := s.DictKeys[fieldID] - - for term, tf := range tfs { - pidPlus1, exists := dict[term] - if !exists { - pidNext++ - pidPlus1 = uint64(pidNext) - - dict[term] = pidPlus1 - dictKeys = append(dictKeys, term) - - s.numTermsPerPostingsList = append(s.numTermsPerPostingsList, 0) - s.numLocsPerPostingsList = append(s.numLocsPerPostingsList, 0) - } - - pid := pidPlus1 - 1 - - s.numTermsPerPostingsList[pid] += 1 - s.numLocsPerPostingsList[pid] += len(tf.Locations) - - totLocs += len(tf.Locations) - } - - totTFs += len(tfs) - - s.DictKeys[fieldID] = dictKeys - } - - for _, result := range s.results { - // walk each composite field - for _, field := range result.Document.CompositeFields { - fieldID := uint16(s.getOrDefineField(field.Name())) - _, tf := field.Analyze() - visitField(fieldID, tf) - } - - // walk each field - for i, field := range result.Document.Fields { - fieldID := uint16(s.getOrDefineField(field.Name())) - tf := result.Analyzed[i] - visitField(fieldID, tf) - } - } - - numPostingsLists := pidNext - - if cap(s.Postings) >= numPostingsLists { - s.Postings = s.Postings[:numPostingsLists] - } else { - postings := make([]*roaring.Bitmap, numPostingsLists) - copy(postings, s.Postings[:cap(s.Postings)]) - for i := 0; i < numPostingsLists; i++ { - if postings[i] == nil { - postings[i] = roaring.New() - } - } - s.Postings = postings - } - - if cap(s.FreqNorms) >= numPostingsLists { - s.FreqNorms = s.FreqNorms[:numPostingsLists] - } else { - s.FreqNorms = make([][]interimFreqNorm, numPostingsLists) - } - - if cap(s.freqNormsBacking) >= totTFs { - s.freqNormsBacking = s.freqNormsBacking[:totTFs] - } else { - s.freqNormsBacking = make([]interimFreqNorm, totTFs) - } - - freqNormsBacking := s.freqNormsBacking - for pid, numTerms := range s.numTermsPerPostingsList { - s.FreqNorms[pid] = freqNormsBacking[0:0] - freqNormsBacking = freqNormsBacking[numTerms:] - } - - if cap(s.Locs) >= numPostingsLists { - s.Locs = s.Locs[:numPostingsLists] - } else { - s.Locs = make([][]interimLoc, numPostingsLists) - } - - if cap(s.locsBacking) >= totLocs { - s.locsBacking = s.locsBacking[:totLocs] - } else { - s.locsBacking = make([]interimLoc, totLocs) - } - - locsBacking := s.locsBacking - for pid, numLocs := range s.numLocsPerPostingsList { - s.Locs[pid] = locsBacking[0:0] - locsBacking = locsBacking[numLocs:] - } -} - -func (s *interim) processDocuments() { - numFields := len(s.FieldsInv) - reuseFieldLens := make([]int, numFields) - reuseFieldTFs := make([]analysis.TokenFrequencies, numFields) - - for docNum, result := range s.results { - for i := 0; i < numFields; i++ { // clear these for reuse - reuseFieldLens[i] = 0 - reuseFieldTFs[i] = nil - } - - s.processDocument(uint64(docNum), result, - reuseFieldLens, reuseFieldTFs) - } -} - -func (s *interim) processDocument(docNum uint64, - result *index.AnalysisResult, - fieldLens []int, fieldTFs []analysis.TokenFrequencies) { - visitField := func(fieldID uint16, fieldName string, - ln int, tf analysis.TokenFrequencies) { - fieldLens[fieldID] += ln - - existingFreqs := fieldTFs[fieldID] - if existingFreqs != nil { - existingFreqs.MergeAll(fieldName, tf) - } else { - fieldTFs[fieldID] = tf - } - } - - // walk each composite field - for _, field := range result.Document.CompositeFields { - fieldID := uint16(s.getOrDefineField(field.Name())) - ln, tf := field.Analyze() - visitField(fieldID, field.Name(), ln, tf) - } - - // walk each field - for i, field := range result.Document.Fields { - fieldID := uint16(s.getOrDefineField(field.Name())) - ln := result.Length[i] - tf := result.Analyzed[i] - visitField(fieldID, field.Name(), ln, tf) - } - - // now that it's been rolled up into fieldTFs, walk that - for fieldID, tfs := range fieldTFs { - dict := s.Dicts[fieldID] - norm := float32(1.0 / math.Sqrt(float64(fieldLens[fieldID]))) - - for term, tf := range tfs { - pid := dict[term] - 1 - bs := s.Postings[pid] - bs.Add(uint32(docNum)) - - s.FreqNorms[pid] = append(s.FreqNorms[pid], - interimFreqNorm{ - freq: uint64(tf.Frequency()), - norm: norm, - numLocs: len(tf.Locations), - }) - - if len(tf.Locations) > 0 { - locs := s.Locs[pid] - - for _, loc := range tf.Locations { - var locf = uint16(fieldID) - if loc.Field != "" { - locf = uint16(s.getOrDefineField(loc.Field)) - } - var arrayposs []uint64 - if len(loc.ArrayPositions) > 0 { - arrayposs = loc.ArrayPositions - } - locs = append(locs, interimLoc{ - fieldID: locf, - pos: uint64(loc.Position), - start: uint64(loc.Start), - end: uint64(loc.End), - arrayposs: arrayposs, - }) - } - - s.Locs[pid] = locs - } - } - } -} - -func (s *interim) writeStoredFields() ( - storedIndexOffset uint64, err error) { - varBuf := make([]byte, binary.MaxVarintLen64) - metaEncode := func(val uint64) (int, error) { - wb := binary.PutUvarint(varBuf, val) - return s.metaBuf.Write(varBuf[:wb]) - } - - data, compressed := s.tmp0[:0], s.tmp1[:0] - defer func() { s.tmp0, s.tmp1 = data, compressed }() - - // keyed by docNum - docStoredOffsets := make([]uint64, len(s.results)) - - // keyed by fieldID, for the current doc in the loop - docStoredFields := map[uint16]interimStoredField{} - - for docNum, result := range s.results { - for fieldID := range docStoredFields { // reset for next doc - delete(docStoredFields, fieldID) - } - - for _, field := range result.Document.Fields { - fieldID := uint16(s.getOrDefineField(field.Name())) - - opts := field.Options() - - if opts.IsStored() { - isf := docStoredFields[fieldID] - isf.vals = append(isf.vals, field.Value()) - isf.typs = append(isf.typs, encodeFieldType(field)) - isf.arrayposs = append(isf.arrayposs, field.ArrayPositions()) - docStoredFields[fieldID] = isf - } - - if opts.IncludeDocValues() { - s.IncludeDocValues[fieldID] = true - } - - err := ValidateDocFields(field) - if err != nil { - return 0, err - } - } - - var curr int - - s.metaBuf.Reset() - data = data[:0] - - // _id field special case optimizes ExternalID() lookups - idFieldVal := docStoredFields[uint16(0)].vals[0] - _, err = metaEncode(uint64(len(idFieldVal))) - if err != nil { - return 0, err - } - - // handle non-"_id" fields - for fieldID := 1; fieldID < len(s.FieldsInv); fieldID++ { - isf, exists := docStoredFields[uint16(fieldID)] - if exists { - curr, data, err = persistStoredFieldValues( - fieldID, isf.vals, isf.typs, isf.arrayposs, - curr, metaEncode, data) - if err != nil { - return 0, err - } - } - } - - metaBytes := s.metaBuf.Bytes() - - compressed = snappy.Encode(compressed[:cap(compressed)], data) - - docStoredOffsets[docNum] = uint64(s.w.Count()) - - _, err := writeUvarints(s.w, - uint64(len(metaBytes)), - uint64(len(idFieldVal)+len(compressed))) - if err != nil { - return 0, err - } - - _, err = s.w.Write(metaBytes) - if err != nil { - return 0, err - } - - _, err = s.w.Write(idFieldVal) - if err != nil { - return 0, err - } - - _, err = s.w.Write(compressed) - if err != nil { - return 0, err - } - } - - storedIndexOffset = uint64(s.w.Count()) - - for _, docStoredOffset := range docStoredOffsets { - err = binary.Write(s.w, binary.BigEndian, docStoredOffset) - if err != nil { - return 0, err - } - } - - return storedIndexOffset, nil -} - -func (s *interim) writeDicts() (fdvIndexOffset uint64, dictOffsets []uint64, err error) { - dictOffsets = make([]uint64, len(s.FieldsInv)) - - fdvOffsetsStart := make([]uint64, len(s.FieldsInv)) - fdvOffsetsEnd := make([]uint64, len(s.FieldsInv)) - - buf := s.grabBuf(binary.MaxVarintLen64) - - // these int coders are initialized with chunk size 1024 - // however this will be reset to the correct chunk size - // while processing each individual field-term section - tfEncoder := newChunkedIntCoder(1024, uint64(len(s.results)-1)) - locEncoder := newChunkedIntCoder(1024, uint64(len(s.results)-1)) - - var docTermMap [][]byte - - if s.builder == nil { - s.builder, err = vellum.New(&s.builderBuf, nil) - if err != nil { - return 0, nil, err - } - } - - for fieldID, terms := range s.DictKeys { - if cap(docTermMap) < len(s.results) { - docTermMap = make([][]byte, len(s.results)) - } else { - docTermMap = docTermMap[0:len(s.results)] - for docNum := range docTermMap { // reset the docTermMap - docTermMap[docNum] = docTermMap[docNum][:0] - } - } - - dict := s.Dicts[fieldID] - - for _, term := range terms { // terms are already sorted - pid := dict[term] - 1 - - postingsBS := s.Postings[pid] - - freqNorms := s.FreqNorms[pid] - freqNormOffset := 0 - - locs := s.Locs[pid] - locOffset := 0 - - chunkSize, err := getChunkSize(s.chunkMode, postingsBS.GetCardinality(), uint64(len(s.results))) - if err != nil { - return 0, nil, err - } - tfEncoder.SetChunkSize(chunkSize, uint64(len(s.results)-1)) - locEncoder.SetChunkSize(chunkSize, uint64(len(s.results)-1)) - - postingsItr := postingsBS.Iterator() - for postingsItr.HasNext() { - docNum := uint64(postingsItr.Next()) - - freqNorm := freqNorms[freqNormOffset] - - err = tfEncoder.Add(docNum, - encodeFreqHasLocs(freqNorm.freq, freqNorm.numLocs > 0), - uint64(math.Float32bits(freqNorm.norm))) - if err != nil { - return 0, nil, err - } - - if freqNorm.numLocs > 0 { - numBytesLocs := 0 - for _, loc := range locs[locOffset : locOffset+freqNorm.numLocs] { - numBytesLocs += totalUvarintBytes( - uint64(loc.fieldID), loc.pos, loc.start, loc.end, - uint64(len(loc.arrayposs)), loc.arrayposs) - } - - err = locEncoder.Add(docNum, uint64(numBytesLocs)) - if err != nil { - return 0, nil, err - } - - for _, loc := range locs[locOffset : locOffset+freqNorm.numLocs] { - err = locEncoder.Add(docNum, - uint64(loc.fieldID), loc.pos, loc.start, loc.end, - uint64(len(loc.arrayposs))) - if err != nil { - return 0, nil, err - } - - err = locEncoder.Add(docNum, loc.arrayposs...) - if err != nil { - return 0, nil, err - } - } - - locOffset += freqNorm.numLocs - } - - freqNormOffset++ - - docTermMap[docNum] = append( - append(docTermMap[docNum], term...), - termSeparator) - } - - tfEncoder.Close() - locEncoder.Close() - - postingsOffset, err := - writePostings(postingsBS, tfEncoder, locEncoder, nil, s.w, buf) - if err != nil { - return 0, nil, err - } - - if postingsOffset > uint64(0) { - err = s.builder.Insert([]byte(term), postingsOffset) - if err != nil { - return 0, nil, err - } - } - - tfEncoder.Reset() - locEncoder.Reset() - } - - err = s.builder.Close() - if err != nil { - return 0, nil, err - } - - // record where this dictionary starts - dictOffsets[fieldID] = uint64(s.w.Count()) - - vellumData := s.builderBuf.Bytes() - - // write out the length of the vellum data - n := binary.PutUvarint(buf, uint64(len(vellumData))) - _, err = s.w.Write(buf[:n]) - if err != nil { - return 0, nil, err - } - - // write this vellum to disk - _, err = s.w.Write(vellumData) - if err != nil { - return 0, nil, err - } - - // reset vellum for reuse - s.builderBuf.Reset() - - err = s.builder.Reset(&s.builderBuf) - if err != nil { - return 0, nil, err - } - - // write the field doc values - // NOTE: doc values continue to use legacy chunk mode - chunkSize, err := getChunkSize(LegacyChunkMode, 0, 0) - if err != nil { - return 0, nil, err - } - fdvEncoder := newChunkedContentCoder(chunkSize, uint64(len(s.results)-1), s.w, false) - if s.IncludeDocValues[fieldID] { - for docNum, docTerms := range docTermMap { - if len(docTerms) > 0 { - err = fdvEncoder.Add(uint64(docNum), docTerms) - if err != nil { - return 0, nil, err - } - } - } - err = fdvEncoder.Close() - if err != nil { - return 0, nil, err - } - - fdvOffsetsStart[fieldID] = uint64(s.w.Count()) - - _, err = fdvEncoder.Write() - if err != nil { - return 0, nil, err - } - - fdvOffsetsEnd[fieldID] = uint64(s.w.Count()) - - fdvEncoder.Reset() - } else { - fdvOffsetsStart[fieldID] = fieldNotUninverted - fdvOffsetsEnd[fieldID] = fieldNotUninverted - } - } - - fdvIndexOffset = uint64(s.w.Count()) - - for i := 0; i < len(fdvOffsetsStart); i++ { - n := binary.PutUvarint(buf, fdvOffsetsStart[i]) - _, err := s.w.Write(buf[:n]) - if err != nil { - return 0, nil, err - } - n = binary.PutUvarint(buf, fdvOffsetsEnd[i]) - _, err = s.w.Write(buf[:n]) - if err != nil { - return 0, nil, err - } - } - - return fdvIndexOffset, dictOffsets, nil -} - -func encodeFieldType(f document.Field) byte { - fieldType := byte('x') - switch f.(type) { - case *document.TextField: - fieldType = 't' - case *document.NumericField: - fieldType = 'n' - case *document.DateTimeField: - fieldType = 'd' - case *document.BooleanField: - fieldType = 'b' - case *document.GeoPointField: - fieldType = 'g' - case *document.CompositeField: - fieldType = 'c' - } - return fieldType -} - -// returns the total # of bytes needed to encode the given uint64's -// into binary.PutUVarint() encoding -func totalUvarintBytes(a, b, c, d, e uint64, more []uint64) (n int) { - n = numUvarintBytes(a) - n += numUvarintBytes(b) - n += numUvarintBytes(c) - n += numUvarintBytes(d) - n += numUvarintBytes(e) - for _, v := range more { - n += numUvarintBytes(v) - } - return n -} - -// returns # of bytes needed to encode x in binary.PutUvarint() encoding -func numUvarintBytes(x uint64) (n int) { - for x >= 0x80 { - x >>= 7 - n++ - } - return n + 1 -} diff --git a/vendor/github.com/blevesearch/zap/v12/plugin.go b/vendor/github.com/blevesearch/zap/v12/plugin.go deleted file mode 100644 index 38a0638..0000000 --- a/vendor/github.com/blevesearch/zap/v12/plugin.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2020 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "github.com/blevesearch/bleve/index/scorch/segment" -) - -// ZapPlugin implements the Plugin interface of -// the blevesearch/bleve/index/scorch/segment pkg -type ZapPlugin struct{} - -func (*ZapPlugin) Type() string { - return Type -} - -func (*ZapPlugin) Version() uint32 { - return Version -} - -// Plugin returns an instance segment.Plugin for use -// by the Scorch indexing scheme -func Plugin() segment.Plugin { - return &ZapPlugin{} -} diff --git a/vendor/github.com/blevesearch/zap/v12/posting.go b/vendor/github.com/blevesearch/zap/v12/posting.go deleted file mode 100644 index 3a6ee54..0000000 --- a/vendor/github.com/blevesearch/zap/v12/posting.go +++ /dev/null @@ -1,798 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "encoding/binary" - "fmt" - "math" - "reflect" - - "github.com/RoaringBitmap/roaring" - "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/blevesearch/bleve/size" -) - -var reflectStaticSizePostingsList int -var reflectStaticSizePostingsIterator int -var reflectStaticSizePosting int -var reflectStaticSizeLocation int - -func init() { - var pl PostingsList - reflectStaticSizePostingsList = int(reflect.TypeOf(pl).Size()) - var pi PostingsIterator - reflectStaticSizePostingsIterator = int(reflect.TypeOf(pi).Size()) - var p Posting - reflectStaticSizePosting = int(reflect.TypeOf(p).Size()) - var l Location - reflectStaticSizeLocation = int(reflect.TypeOf(l).Size()) -} - -// FST or vellum value (uint64) encoding is determined by the top two -// highest-order or most significant bits... -// -// encoding : MSB -// name : 63 62 61...to...bit #0 (LSB) -// ----------+---+---+--------------------------------------------------- -// general : 0 | 0 | 62-bits of postingsOffset. -// ~ : 0 | 1 | reserved for future. -// 1-hit : 1 | 0 | 31-bits of positive float31 norm | 31-bits docNum. -// ~ : 1 | 1 | reserved for future. -// -// Encoding "general" is able to handle all cases, where the -// postingsOffset points to more information about the postings for -// the term. -// -// Encoding "1-hit" is used to optimize a commonly seen case when a -// term has only a single hit. For example, a term in the _id field -// will have only 1 hit. The "1-hit" encoding is used for a term -// in a field when... -// -// - term vector info is disabled for that field; -// - and, the term appears in only a single doc for that field; -// - and, the term's freq is exactly 1 in that single doc for that field; -// - and, the docNum must fit into 31-bits; -// -// Otherwise, the "general" encoding is used instead. -// -// In the "1-hit" encoding, the field in that single doc may have -// other terms, which is supported in the "1-hit" encoding by the -// positive float31 norm. - -const FSTValEncodingMask = uint64(0xc000000000000000) -const FSTValEncodingGeneral = uint64(0x0000000000000000) -const FSTValEncoding1Hit = uint64(0x8000000000000000) - -func FSTValEncode1Hit(docNum uint64, normBits uint64) uint64 { - return FSTValEncoding1Hit | ((mask31Bits & normBits) << 31) | (mask31Bits & docNum) -} - -func FSTValDecode1Hit(v uint64) (docNum uint64, normBits uint64) { - return (mask31Bits & v), (mask31Bits & (v >> 31)) -} - -const mask31Bits = uint64(0x000000007fffffff) - -func under32Bits(x uint64) bool { - return x <= mask31Bits -} - -const DocNum1HitFinished = math.MaxUint64 - -var NormBits1Hit = uint64(math.Float32bits(float32(1))) - -// PostingsList is an in-memory representation of a postings list -type PostingsList struct { - sb *SegmentBase - postingsOffset uint64 - freqOffset uint64 - locOffset uint64 - postings *roaring.Bitmap - except *roaring.Bitmap - - // when normBits1Hit != 0, then this postings list came from a - // 1-hit encoding, and only the docNum1Hit & normBits1Hit apply - docNum1Hit uint64 - normBits1Hit uint64 -} - -// represents an immutable, empty postings list -var emptyPostingsList = &PostingsList{} - -func (p *PostingsList) Size() int { - sizeInBytes := reflectStaticSizePostingsList + size.SizeOfPtr - - if p.except != nil { - sizeInBytes += int(p.except.GetSizeInBytes()) - } - - return sizeInBytes -} - -func (p *PostingsList) OrInto(receiver *roaring.Bitmap) { - if p.normBits1Hit != 0 { - receiver.Add(uint32(p.docNum1Hit)) - return - } - - if p.postings != nil { - receiver.Or(p.postings) - } -} - -// Iterator returns an iterator for this postings list -func (p *PostingsList) Iterator(includeFreq, includeNorm, includeLocs bool, - prealloc segment.PostingsIterator) segment.PostingsIterator { - if p.normBits1Hit == 0 && p.postings == nil { - return emptyPostingsIterator - } - - var preallocPI *PostingsIterator - pi, ok := prealloc.(*PostingsIterator) - if ok && pi != nil { - preallocPI = pi - } - if preallocPI == emptyPostingsIterator { - preallocPI = nil - } - - return p.iterator(includeFreq, includeNorm, includeLocs, preallocPI) -} - -func (p *PostingsList) iterator(includeFreq, includeNorm, includeLocs bool, - rv *PostingsIterator) *PostingsIterator { - if rv == nil { - rv = &PostingsIterator{} - } else { - freqNormReader := rv.freqNormReader - if freqNormReader != nil { - freqNormReader.reset() - } - - locReader := rv.locReader - if locReader != nil { - locReader.reset() - } - - nextLocs := rv.nextLocs[:0] - nextSegmentLocs := rv.nextSegmentLocs[:0] - - buf := rv.buf - - *rv = PostingsIterator{} // clear the struct - - rv.freqNormReader = freqNormReader - rv.locReader = locReader - - rv.nextLocs = nextLocs - rv.nextSegmentLocs = nextSegmentLocs - - rv.buf = buf - } - - rv.postings = p - rv.includeFreqNorm = includeFreq || includeNorm || includeLocs - rv.includeLocs = includeLocs - - if p.normBits1Hit != 0 { - // "1-hit" encoding - rv.docNum1Hit = p.docNum1Hit - rv.normBits1Hit = p.normBits1Hit - - if p.except != nil && p.except.Contains(uint32(rv.docNum1Hit)) { - rv.docNum1Hit = DocNum1HitFinished - } - - return rv - } - - // "general" encoding, check if empty - if p.postings == nil { - return rv - } - - // initialize freq chunk reader - if rv.includeFreqNorm { - rv.freqNormReader = newChunkedIntDecoder(p.sb.mem, p.freqOffset) - } - - // initialize the loc chunk reader - if rv.includeLocs { - rv.locReader = newChunkedIntDecoder(p.sb.mem, p.locOffset) - } - - rv.all = p.postings.Iterator() - if p.except != nil { - rv.ActualBM = roaring.AndNot(p.postings, p.except) - rv.Actual = rv.ActualBM.Iterator() - } else { - rv.ActualBM = p.postings - rv.Actual = rv.all // Optimize to use same iterator for all & Actual. - } - - return rv -} - -// Count returns the number of items on this postings list -func (p *PostingsList) Count() uint64 { - var n, e uint64 - if p.normBits1Hit != 0 { - n = 1 - if p.except != nil && p.except.Contains(uint32(p.docNum1Hit)) { - e = 1 - } - } else if p.postings != nil { - n = p.postings.GetCardinality() - if p.except != nil { - e = p.postings.AndCardinality(p.except) - } - } - return n - e -} - -func (rv *PostingsList) read(postingsOffset uint64, d *Dictionary) error { - rv.postingsOffset = postingsOffset - - // handle "1-hit" encoding special case - if rv.postingsOffset&FSTValEncodingMask == FSTValEncoding1Hit { - return rv.init1Hit(postingsOffset) - } - - // read the location of the freq/norm details - var n uint64 - var read int - - rv.freqOffset, read = binary.Uvarint(d.sb.mem[postingsOffset+n : postingsOffset+binary.MaxVarintLen64]) - n += uint64(read) - - rv.locOffset, read = binary.Uvarint(d.sb.mem[postingsOffset+n : postingsOffset+n+binary.MaxVarintLen64]) - n += uint64(read) - - var postingsLen uint64 - postingsLen, read = binary.Uvarint(d.sb.mem[postingsOffset+n : postingsOffset+n+binary.MaxVarintLen64]) - n += uint64(read) - - roaringBytes := d.sb.mem[postingsOffset+n : postingsOffset+n+postingsLen] - - if rv.postings == nil { - rv.postings = roaring.NewBitmap() - } - _, err := rv.postings.FromBuffer(roaringBytes) - if err != nil { - return fmt.Errorf("error loading roaring bitmap: %v", err) - } - - return nil -} - -func (rv *PostingsList) init1Hit(fstVal uint64) error { - docNum, normBits := FSTValDecode1Hit(fstVal) - - rv.docNum1Hit = docNum - rv.normBits1Hit = normBits - - return nil -} - -// PostingsIterator provides a way to iterate through the postings list -type PostingsIterator struct { - postings *PostingsList - all roaring.IntPeekable - Actual roaring.IntPeekable - ActualBM *roaring.Bitmap - - currChunk uint32 - freqNormReader *chunkedIntDecoder - locReader *chunkedIntDecoder - - next Posting // reused across Next() calls - nextLocs []Location // reused across Next() calls - nextSegmentLocs []segment.Location // reused across Next() calls - - docNum1Hit uint64 - normBits1Hit uint64 - - buf []byte - - includeFreqNorm bool - includeLocs bool -} - -var emptyPostingsIterator = &PostingsIterator{} - -func (i *PostingsIterator) Size() int { - sizeInBytes := reflectStaticSizePostingsIterator + size.SizeOfPtr + - i.next.Size() - // account for freqNormReader, locReader if we start using this. - for _, entry := range i.nextLocs { - sizeInBytes += entry.Size() - } - - return sizeInBytes -} - -func (i *PostingsIterator) loadChunk(chunk int) error { - if i.includeFreqNorm { - err := i.freqNormReader.loadChunk(chunk) - if err != nil { - return err - } - } - - if i.includeLocs { - err := i.locReader.loadChunk(chunk) - if err != nil { - return err - } - } - - i.currChunk = uint32(chunk) - return nil -} - -func (i *PostingsIterator) readFreqNormHasLocs() (uint64, uint64, bool, error) { - if i.normBits1Hit != 0 { - return 1, i.normBits1Hit, false, nil - } - - freqHasLocs, err := i.freqNormReader.readUvarint() - if err != nil { - return 0, 0, false, fmt.Errorf("error reading frequency: %v", err) - } - - freq, hasLocs := decodeFreqHasLocs(freqHasLocs) - - normBits, err := i.freqNormReader.readUvarint() - if err != nil { - return 0, 0, false, fmt.Errorf("error reading norm: %v", err) - } - - return freq, normBits, hasLocs, nil -} - -func (i *PostingsIterator) skipFreqNormReadHasLocs() (bool, error) { - if i.normBits1Hit != 0 { - return false, nil - } - - freqHasLocs, err := i.freqNormReader.readUvarint() - if err != nil { - return false, fmt.Errorf("error reading freqHasLocs: %v", err) - } - - i.freqNormReader.SkipUvarint() // Skip normBits. - - return freqHasLocs&0x01 != 0, nil // See decodeFreqHasLocs() / hasLocs. -} - -func encodeFreqHasLocs(freq uint64, hasLocs bool) uint64 { - rv := freq << 1 - if hasLocs { - rv = rv | 0x01 // 0'th LSB encodes whether there are locations - } - return rv -} - -func decodeFreqHasLocs(freqHasLocs uint64) (uint64, bool) { - freq := freqHasLocs >> 1 - hasLocs := freqHasLocs&0x01 != 0 - return freq, hasLocs -} - -// readLocation processes all the integers on the stream representing a single -// location. -func (i *PostingsIterator) readLocation(l *Location) error { - // read off field - fieldID, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading location field: %v", err) - } - // read off pos - pos, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading location pos: %v", err) - } - // read off start - start, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading location start: %v", err) - } - // read off end - end, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading location end: %v", err) - } - // read off num array pos - numArrayPos, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading location num array pos: %v", err) - } - - l.field = i.postings.sb.fieldsInv[fieldID] - l.pos = pos - l.start = start - l.end = end - - if cap(l.ap) < int(numArrayPos) { - l.ap = make([]uint64, int(numArrayPos)) - } else { - l.ap = l.ap[:int(numArrayPos)] - } - - // read off array positions - for k := 0; k < int(numArrayPos); k++ { - ap, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading array position: %v", err) - } - - l.ap[k] = ap - } - - return nil -} - -// Next returns the next posting on the postings list, or nil at the end -func (i *PostingsIterator) Next() (segment.Posting, error) { - return i.nextAtOrAfter(0) -} - -// Advance returns the posting at the specified docNum or it is not present -// the next posting, or if the end is reached, nil -func (i *PostingsIterator) Advance(docNum uint64) (segment.Posting, error) { - return i.nextAtOrAfter(docNum) -} - -// Next returns the next posting on the postings list, or nil at the end -func (i *PostingsIterator) nextAtOrAfter(atOrAfter uint64) (segment.Posting, error) { - docNum, exists, err := i.nextDocNumAtOrAfter(atOrAfter) - if err != nil || !exists { - return nil, err - } - - i.next = Posting{} // clear the struct - rv := &i.next - rv.docNum = docNum - - if !i.includeFreqNorm { - return rv, nil - } - - var normBits uint64 - var hasLocs bool - - rv.freq, normBits, hasLocs, err = i.readFreqNormHasLocs() - if err != nil { - return nil, err - } - - rv.norm = math.Float32frombits(uint32(normBits)) - - if i.includeLocs && hasLocs { - // prepare locations into reused slices, where we assume - // rv.freq >= "number of locs", since in a composite field, - // some component fields might have their IncludeTermVector - // flags disabled while other component fields are enabled - if cap(i.nextLocs) >= int(rv.freq) { - i.nextLocs = i.nextLocs[0:rv.freq] - } else { - i.nextLocs = make([]Location, rv.freq, rv.freq*2) - } - if cap(i.nextSegmentLocs) < int(rv.freq) { - i.nextSegmentLocs = make([]segment.Location, rv.freq, rv.freq*2) - } - rv.locs = i.nextSegmentLocs[:0] - - numLocsBytes, err := i.locReader.readUvarint() - if err != nil { - return nil, fmt.Errorf("error reading location numLocsBytes: %v", err) - } - - j := 0 - startBytesRemaining := i.locReader.Len() // # bytes remaining in the locReader - for startBytesRemaining-i.locReader.Len() < int(numLocsBytes) { - err := i.readLocation(&i.nextLocs[j]) - if err != nil { - return nil, err - } - rv.locs = append(rv.locs, &i.nextLocs[j]) - j++ - } - } - - return rv, nil -} - -// nextDocNum returns the next docNum on the postings list, and also -// sets up the currChunk / loc related fields of the iterator. -func (i *PostingsIterator) nextDocNumAtOrAfter(atOrAfter uint64) (uint64, bool, error) { - if i.normBits1Hit != 0 { - if i.docNum1Hit == DocNum1HitFinished { - return 0, false, nil - } - if i.docNum1Hit < atOrAfter { - // advanced past our 1-hit - i.docNum1Hit = DocNum1HitFinished // consume our 1-hit docNum - return 0, false, nil - } - docNum := i.docNum1Hit - i.docNum1Hit = DocNum1HitFinished // consume our 1-hit docNum - return docNum, true, nil - } - - if i.Actual == nil || !i.Actual.HasNext() { - return 0, false, nil - } - - if i.postings == nil || i.postings.postings == i.ActualBM { - return i.nextDocNumAtOrAfterClean(atOrAfter) - } - - i.Actual.AdvanceIfNeeded(uint32(atOrAfter)) - - if !i.Actual.HasNext() { - // couldn't find anything - return 0, false, nil - } - - n := i.Actual.Next() - allN := i.all.Next() - - chunkSize, err := getChunkSize(i.postings.sb.chunkMode, i.postings.postings.GetCardinality(), i.postings.sb.numDocs) - if err != nil { - return 0, false, err - } - nChunk := n / uint32(chunkSize) - - // when allN becomes >= to here, then allN is in the same chunk as nChunk. - allNReachesNChunk := nChunk * uint32(chunkSize) - - // n is the next actual hit (excluding some postings), and - // allN is the next hit in the full postings, and - // if they don't match, move 'all' forwards until they do - for allN != n { - // we've reached same chunk, so move the freq/norm/loc decoders forward - if i.includeFreqNorm && allN >= allNReachesNChunk { - err := i.currChunkNext(nChunk) - if err != nil { - return 0, false, err - } - } - - allN = i.all.Next() - } - - if i.includeFreqNorm && (i.currChunk != nChunk || i.freqNormReader.isNil()) { - err := i.loadChunk(int(nChunk)) - if err != nil { - return 0, false, fmt.Errorf("error loading chunk: %v", err) - } - } - - return uint64(n), true, nil -} - -// optimization when the postings list is "clean" (e.g., no updates & -// no deletions) where the all bitmap is the same as the actual bitmap -func (i *PostingsIterator) nextDocNumAtOrAfterClean( - atOrAfter uint64) (uint64, bool, error) { - - if !i.includeFreqNorm { - i.Actual.AdvanceIfNeeded(uint32(atOrAfter)) - - if !i.Actual.HasNext() { - return 0, false, nil // couldn't find anything - } - - return uint64(i.Actual.Next()), true, nil - } - - chunkSize, err := getChunkSize(i.postings.sb.chunkMode, i.postings.postings.GetCardinality(), i.postings.sb.numDocs) - if err != nil { - return 0, false, err - } - - // freq-norm's needed, so maintain freq-norm chunk reader - sameChunkNexts := 0 // # of times we called Next() in the same chunk - n := i.Actual.Next() - nChunk := n / uint32(chunkSize) - - for uint64(n) < atOrAfter && i.Actual.HasNext() { - n = i.Actual.Next() - - nChunkPrev := nChunk - nChunk = n / uint32(chunkSize) - - if nChunk != nChunkPrev { - sameChunkNexts = 0 - } else { - sameChunkNexts += 1 - } - } - - if uint64(n) < atOrAfter { - // couldn't find anything - return 0, false, nil - } - - for j := 0; j < sameChunkNexts; j++ { - err := i.currChunkNext(nChunk) - if err != nil { - return 0, false, fmt.Errorf("error optimized currChunkNext: %v", err) - } - } - - if i.currChunk != nChunk || i.freqNormReader.isNil() { - err := i.loadChunk(int(nChunk)) - if err != nil { - return 0, false, fmt.Errorf("error loading chunk: %v", err) - } - } - - return uint64(n), true, nil -} - -func (i *PostingsIterator) currChunkNext(nChunk uint32) error { - if i.currChunk != nChunk || i.freqNormReader.isNil() { - err := i.loadChunk(int(nChunk)) - if err != nil { - return fmt.Errorf("error loading chunk: %v", err) - } - } - - // read off freq/offsets even though we don't care about them - hasLocs, err := i.skipFreqNormReadHasLocs() - if err != nil { - return err - } - - if i.includeLocs && hasLocs { - numLocsBytes, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading location numLocsBytes: %v", err) - } - - // skip over all the location bytes - i.locReader.SkipBytes(int(numLocsBytes)) - } - - return nil -} - -// DocNum1Hit returns the docNum and true if this is "1-hit" optimized -// and the docNum is available. -func (p *PostingsIterator) DocNum1Hit() (uint64, bool) { - if p.normBits1Hit != 0 && p.docNum1Hit != DocNum1HitFinished { - return p.docNum1Hit, true - } - return 0, false -} - -// ActualBitmap returns the underlying actual bitmap -// which can be used up the stack for optimizations -func (p *PostingsIterator) ActualBitmap() *roaring.Bitmap { - return p.ActualBM -} - -// ReplaceActual replaces the ActualBM with the provided -// bitmap -func (p *PostingsIterator) ReplaceActual(abm *roaring.Bitmap) { - p.ActualBM = abm - p.Actual = abm.Iterator() -} - -// PostingsIteratorFromBitmap constructs a PostingsIterator given an -// "actual" bitmap. -func PostingsIteratorFromBitmap(bm *roaring.Bitmap, - includeFreqNorm, includeLocs bool) (segment.PostingsIterator, error) { - return &PostingsIterator{ - ActualBM: bm, - Actual: bm.Iterator(), - includeFreqNorm: includeFreqNorm, - includeLocs: includeLocs, - }, nil -} - -// PostingsIteratorFrom1Hit constructs a PostingsIterator given a -// 1-hit docNum. -func PostingsIteratorFrom1Hit(docNum1Hit uint64, - includeFreqNorm, includeLocs bool) (segment.PostingsIterator, error) { - return &PostingsIterator{ - docNum1Hit: docNum1Hit, - normBits1Hit: NormBits1Hit, - includeFreqNorm: includeFreqNorm, - includeLocs: includeLocs, - }, nil -} - -// Posting is a single entry in a postings list -type Posting struct { - docNum uint64 - freq uint64 - norm float32 - locs []segment.Location -} - -func (p *Posting) Size() int { - sizeInBytes := reflectStaticSizePosting - - for _, entry := range p.locs { - sizeInBytes += entry.Size() - } - - return sizeInBytes -} - -// Number returns the document number of this posting in this segment -func (p *Posting) Number() uint64 { - return p.docNum -} - -// Frequency returns the frequencies of occurrence of this term in this doc/field -func (p *Posting) Frequency() uint64 { - return p.freq -} - -// Norm returns the normalization factor for this posting -func (p *Posting) Norm() float64 { - return float64(p.norm) -} - -// Locations returns the location information for each occurrence -func (p *Posting) Locations() []segment.Location { - return p.locs -} - -// Location represents the location of a single occurrence -type Location struct { - field string - pos uint64 - start uint64 - end uint64 - ap []uint64 -} - -func (l *Location) Size() int { - return reflectStaticSizeLocation + - len(l.field) + - len(l.ap)*size.SizeOfUint64 -} - -// Field returns the name of the field (useful in composite fields to know -// which original field the value came from) -func (l *Location) Field() string { - return l.field -} - -// Start returns the start byte offset of this occurrence -func (l *Location) Start() uint64 { - return l.start -} - -// End returns the end byte offset of this occurrence -func (l *Location) End() uint64 { - return l.end -} - -// Pos returns the 1-based phrase position of this occurrence -func (l *Location) Pos() uint64 { - return l.pos -} - -// ArrayPositions returns the array position vector associated with this occurrence -func (l *Location) ArrayPositions() []uint64 { - return l.ap -} diff --git a/vendor/github.com/blevesearch/zap/v12/read.go b/vendor/github.com/blevesearch/zap/v12/read.go deleted file mode 100644 index e47d4c6..0000000 --- a/vendor/github.com/blevesearch/zap/v12/read.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import "encoding/binary" - -func (s *SegmentBase) getDocStoredMetaAndCompressed(docNum uint64) ([]byte, []byte) { - _, storedOffset, n, metaLen, dataLen := s.getDocStoredOffsets(docNum) - - meta := s.mem[storedOffset+n : storedOffset+n+metaLen] - data := s.mem[storedOffset+n+metaLen : storedOffset+n+metaLen+dataLen] - - return meta, data -} - -func (s *SegmentBase) getDocStoredOffsets(docNum uint64) ( - uint64, uint64, uint64, uint64, uint64) { - indexOffset := s.storedIndexOffset + (8 * docNum) - - storedOffset := binary.BigEndian.Uint64(s.mem[indexOffset : indexOffset+8]) - - var n uint64 - - metaLen, read := binary.Uvarint(s.mem[storedOffset : storedOffset+binary.MaxVarintLen64]) - n += uint64(read) - - dataLen, read := binary.Uvarint(s.mem[storedOffset+n : storedOffset+n+binary.MaxVarintLen64]) - n += uint64(read) - - return indexOffset, storedOffset, n, metaLen, dataLen -} diff --git a/vendor/github.com/blevesearch/zap/v12/segment.go b/vendor/github.com/blevesearch/zap/v12/segment.go deleted file mode 100644 index e8b1f06..0000000 --- a/vendor/github.com/blevesearch/zap/v12/segment.go +++ /dev/null @@ -1,572 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "encoding/binary" - "fmt" - "io" - "os" - "sync" - "unsafe" - - "github.com/RoaringBitmap/roaring" - "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/blevesearch/bleve/size" - "github.com/couchbase/vellum" - mmap "github.com/blevesearch/mmap-go" - "github.com/golang/snappy" -) - -var reflectStaticSizeSegmentBase int - -func init() { - var sb SegmentBase - reflectStaticSizeSegmentBase = int(unsafe.Sizeof(sb)) -} - -// Open returns a zap impl of a segment -func (*ZapPlugin) Open(path string) (segment.Segment, error) { - f, err := os.Open(path) - if err != nil { - return nil, err - } - mm, err := mmap.Map(f, mmap.RDONLY, 0) - if err != nil { - // mmap failed, try to close the file - _ = f.Close() - return nil, err - } - - rv := &Segment{ - SegmentBase: SegmentBase{ - mem: mm[0 : len(mm)-FooterSize], - fieldsMap: make(map[string]uint16), - fieldDvReaders: make(map[uint16]*docValueReader), - fieldFSTs: make(map[uint16]*vellum.FST), - }, - f: f, - mm: mm, - path: path, - refs: 1, - } - rv.SegmentBase.updateSize() - - err = rv.loadConfig() - if err != nil { - _ = rv.Close() - return nil, err - } - - err = rv.loadFields() - if err != nil { - _ = rv.Close() - return nil, err - } - - err = rv.loadDvReaders() - if err != nil { - _ = rv.Close() - return nil, err - } - - return rv, nil -} - -// SegmentBase is a memory only, read-only implementation of the -// segment.Segment interface, using zap's data representation. -type SegmentBase struct { - mem []byte - memCRC uint32 - chunkMode uint32 - fieldsMap map[string]uint16 // fieldName -> fieldID+1 - fieldsInv []string // fieldID -> fieldName - numDocs uint64 - storedIndexOffset uint64 - fieldsIndexOffset uint64 - docValueOffset uint64 - dictLocs []uint64 - fieldDvReaders map[uint16]*docValueReader // naive chunk cache per field - fieldDvNames []string // field names cached in fieldDvReaders - size uint64 - - m sync.Mutex - fieldFSTs map[uint16]*vellum.FST -} - -func (sb *SegmentBase) Size() int { - return int(sb.size) -} - -func (sb *SegmentBase) updateSize() { - sizeInBytes := reflectStaticSizeSegmentBase + - cap(sb.mem) - - // fieldsMap - for k := range sb.fieldsMap { - sizeInBytes += (len(k) + size.SizeOfString) + size.SizeOfUint16 - } - - // fieldsInv, dictLocs - for _, entry := range sb.fieldsInv { - sizeInBytes += len(entry) + size.SizeOfString - } - sizeInBytes += len(sb.dictLocs) * size.SizeOfUint64 - - // fieldDvReaders - for _, v := range sb.fieldDvReaders { - sizeInBytes += size.SizeOfUint16 + size.SizeOfPtr - if v != nil { - sizeInBytes += v.size() - } - } - - sb.size = uint64(sizeInBytes) -} - -func (sb *SegmentBase) AddRef() {} -func (sb *SegmentBase) DecRef() (err error) { return nil } -func (sb *SegmentBase) Close() (err error) { return nil } - -// Segment implements a persisted segment.Segment interface, by -// embedding an mmap()'ed SegmentBase. -type Segment struct { - SegmentBase - - f *os.File - mm mmap.MMap - path string - version uint32 - crc uint32 - - m sync.Mutex // Protects the fields that follow. - refs int64 -} - -func (s *Segment) Size() int { - // 8 /* size of file pointer */ - // 4 /* size of version -> uint32 */ - // 4 /* size of crc -> uint32 */ - sizeOfUints := 16 - - sizeInBytes := (len(s.path) + size.SizeOfString) + sizeOfUints - - // mutex, refs -> int64 - sizeInBytes += 16 - - // do not include the mmap'ed part - return sizeInBytes + s.SegmentBase.Size() - cap(s.mem) -} - -func (s *Segment) AddRef() { - s.m.Lock() - s.refs++ - s.m.Unlock() -} - -func (s *Segment) DecRef() (err error) { - s.m.Lock() - s.refs-- - if s.refs == 0 { - err = s.closeActual() - } - s.m.Unlock() - return err -} - -func (s *Segment) loadConfig() error { - crcOffset := len(s.mm) - 4 - s.crc = binary.BigEndian.Uint32(s.mm[crcOffset : crcOffset+4]) - - verOffset := crcOffset - 4 - s.version = binary.BigEndian.Uint32(s.mm[verOffset : verOffset+4]) - if s.version != Version { - return fmt.Errorf("unsupported version %d", s.version) - } - - chunkOffset := verOffset - 4 - s.chunkMode = binary.BigEndian.Uint32(s.mm[chunkOffset : chunkOffset+4]) - - docValueOffset := chunkOffset - 8 - s.docValueOffset = binary.BigEndian.Uint64(s.mm[docValueOffset : docValueOffset+8]) - - fieldsIndexOffset := docValueOffset - 8 - s.fieldsIndexOffset = binary.BigEndian.Uint64(s.mm[fieldsIndexOffset : fieldsIndexOffset+8]) - - storedIndexOffset := fieldsIndexOffset - 8 - s.storedIndexOffset = binary.BigEndian.Uint64(s.mm[storedIndexOffset : storedIndexOffset+8]) - - numDocsOffset := storedIndexOffset - 8 - s.numDocs = binary.BigEndian.Uint64(s.mm[numDocsOffset : numDocsOffset+8]) - return nil -} - -func (s *SegmentBase) loadFields() error { - // NOTE for now we assume the fields index immediately precedes - // the footer, and if this changes, need to adjust accordingly (or - // store explicit length), where s.mem was sliced from s.mm in Open(). - fieldsIndexEnd := uint64(len(s.mem)) - - // iterate through fields index - var fieldID uint64 - for s.fieldsIndexOffset+(8*fieldID) < fieldsIndexEnd { - addr := binary.BigEndian.Uint64(s.mem[s.fieldsIndexOffset+(8*fieldID) : s.fieldsIndexOffset+(8*fieldID)+8]) - - dictLoc, read := binary.Uvarint(s.mem[addr:fieldsIndexEnd]) - n := uint64(read) - s.dictLocs = append(s.dictLocs, dictLoc) - - var nameLen uint64 - nameLen, read = binary.Uvarint(s.mem[addr+n : fieldsIndexEnd]) - n += uint64(read) - - name := string(s.mem[addr+n : addr+n+nameLen]) - s.fieldsInv = append(s.fieldsInv, name) - s.fieldsMap[name] = uint16(fieldID + 1) - - fieldID++ - } - return nil -} - -// Dictionary returns the term dictionary for the specified field -func (s *SegmentBase) Dictionary(field string) (segment.TermDictionary, error) { - dict, err := s.dictionary(field) - if err == nil && dict == nil { - return &segment.EmptyDictionary{}, nil - } - return dict, err -} - -func (sb *SegmentBase) dictionary(field string) (rv *Dictionary, err error) { - fieldIDPlus1 := sb.fieldsMap[field] - if fieldIDPlus1 > 0 { - rv = &Dictionary{ - sb: sb, - field: field, - fieldID: fieldIDPlus1 - 1, - } - - dictStart := sb.dictLocs[rv.fieldID] - if dictStart > 0 { - var ok bool - sb.m.Lock() - if rv.fst, ok = sb.fieldFSTs[rv.fieldID]; !ok { - // read the length of the vellum data - vellumLen, read := binary.Uvarint(sb.mem[dictStart : dictStart+binary.MaxVarintLen64]) - fstBytes := sb.mem[dictStart+uint64(read) : dictStart+uint64(read)+vellumLen] - rv.fst, err = vellum.Load(fstBytes) - if err != nil { - sb.m.Unlock() - return nil, fmt.Errorf("dictionary field %s vellum err: %v", field, err) - } - - sb.fieldFSTs[rv.fieldID] = rv.fst - } - - sb.m.Unlock() - rv.fstReader, err = rv.fst.Reader() - if err != nil { - return nil, fmt.Errorf("dictionary field %s vellum reader err: %v", field, err) - } - - } - } - - return rv, nil -} - -// visitDocumentCtx holds data structures that are reusable across -// multiple VisitDocument() calls to avoid memory allocations -type visitDocumentCtx struct { - buf []byte - reader bytes.Reader - arrayPos []uint64 -} - -var visitDocumentCtxPool = sync.Pool{ - New: func() interface{} { - reuse := &visitDocumentCtx{} - return reuse - }, -} - -// VisitDocument invokes the DocFieldValueVistor for each stored field -// for the specified doc number -func (s *SegmentBase) VisitDocument(num uint64, visitor segment.DocumentFieldValueVisitor) error { - vdc := visitDocumentCtxPool.Get().(*visitDocumentCtx) - defer visitDocumentCtxPool.Put(vdc) - return s.visitDocument(vdc, num, visitor) -} - -func (s *SegmentBase) visitDocument(vdc *visitDocumentCtx, num uint64, - visitor segment.DocumentFieldValueVisitor) error { - // first make sure this is a valid number in this segment - if num < s.numDocs { - meta, compressed := s.getDocStoredMetaAndCompressed(num) - - vdc.reader.Reset(meta) - - // handle _id field special case - idFieldValLen, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - idFieldVal := compressed[:idFieldValLen] - - keepGoing := visitor("_id", byte('t'), idFieldVal, nil) - if !keepGoing { - visitDocumentCtxPool.Put(vdc) - return nil - } - - // handle non-"_id" fields - compressed = compressed[idFieldValLen:] - - uncompressed, err := snappy.Decode(vdc.buf[:cap(vdc.buf)], compressed) - if err != nil { - return err - } - - for keepGoing { - field, err := binary.ReadUvarint(&vdc.reader) - if err == io.EOF { - break - } - if err != nil { - return err - } - typ, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - offset, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - l, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - numap, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - var arrayPos []uint64 - if numap > 0 { - if cap(vdc.arrayPos) < int(numap) { - vdc.arrayPos = make([]uint64, numap) - } - arrayPos = vdc.arrayPos[:numap] - for i := 0; i < int(numap); i++ { - ap, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - arrayPos[i] = ap - } - } - - value := uncompressed[offset : offset+l] - keepGoing = visitor(s.fieldsInv[field], byte(typ), value, arrayPos) - } - - vdc.buf = uncompressed - } - return nil -} - -// DocID returns the value of the _id field for the given docNum -func (s *SegmentBase) DocID(num uint64) ([]byte, error) { - if num >= s.numDocs { - return nil, nil - } - - vdc := visitDocumentCtxPool.Get().(*visitDocumentCtx) - - meta, compressed := s.getDocStoredMetaAndCompressed(num) - - vdc.reader.Reset(meta) - - // handle _id field special case - idFieldValLen, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return nil, err - } - idFieldVal := compressed[:idFieldValLen] - - visitDocumentCtxPool.Put(vdc) - - return idFieldVal, nil -} - -// Count returns the number of documents in this segment. -func (s *SegmentBase) Count() uint64 { - return s.numDocs -} - -// DocNumbers returns a bitset corresponding to the doc numbers of all the -// provided _id strings -func (s *SegmentBase) DocNumbers(ids []string) (*roaring.Bitmap, error) { - rv := roaring.New() - - if len(s.fieldsMap) > 0 { - idDict, err := s.dictionary("_id") - if err != nil { - return nil, err - } - - postingsList := emptyPostingsList - - sMax, err := idDict.fst.GetMaxKey() - if err != nil { - return nil, err - } - sMaxStr := string(sMax) - filteredIds := make([]string, 0, len(ids)) - for _, id := range ids { - if id <= sMaxStr { - filteredIds = append(filteredIds, id) - } - } - - for _, id := range filteredIds { - postingsList, err = idDict.postingsList([]byte(id), nil, postingsList) - if err != nil { - return nil, err - } - postingsList.OrInto(rv) - } - } - - return rv, nil -} - -// Fields returns the field names used in this segment -func (s *SegmentBase) Fields() []string { - return s.fieldsInv -} - -// Path returns the path of this segment on disk -func (s *Segment) Path() string { - return s.path -} - -// Close releases all resources associated with this segment -func (s *Segment) Close() (err error) { - return s.DecRef() -} - -func (s *Segment) closeActual() (err error) { - if s.mm != nil { - err = s.mm.Unmap() - } - // try to close file even if unmap failed - if s.f != nil { - err2 := s.f.Close() - if err == nil { - // try to return first error - err = err2 - } - } - return -} - -// some helpers i started adding for the command-line utility - -// Data returns the underlying mmaped data slice -func (s *Segment) Data() []byte { - return s.mm -} - -// CRC returns the CRC value stored in the file footer -func (s *Segment) CRC() uint32 { - return s.crc -} - -// Version returns the file version in the file footer -func (s *Segment) Version() uint32 { - return s.version -} - -// ChunkFactor returns the chunk factor in the file footer -func (s *Segment) ChunkMode() uint32 { - return s.chunkMode -} - -// FieldsIndexOffset returns the fields index offset in the file footer -func (s *Segment) FieldsIndexOffset() uint64 { - return s.fieldsIndexOffset -} - -// StoredIndexOffset returns the stored value index offset in the file footer -func (s *Segment) StoredIndexOffset() uint64 { - return s.storedIndexOffset -} - -// DocValueOffset returns the docValue offset in the file footer -func (s *Segment) DocValueOffset() uint64 { - return s.docValueOffset -} - -// NumDocs returns the number of documents in the file footer -func (s *Segment) NumDocs() uint64 { - return s.numDocs -} - -// DictAddr is a helper function to compute the file offset where the -// dictionary is stored for the specified field. -func (s *Segment) DictAddr(field string) (uint64, error) { - fieldIDPlus1, ok := s.fieldsMap[field] - if !ok { - return 0, fmt.Errorf("no such field '%s'", field) - } - - return s.dictLocs[fieldIDPlus1-1], nil -} - -func (s *SegmentBase) loadDvReaders() error { - if s.docValueOffset == fieldNotUninverted || s.numDocs == 0 { - return nil - } - - var read uint64 - for fieldID, field := range s.fieldsInv { - var fieldLocStart, fieldLocEnd uint64 - var n int - fieldLocStart, n = binary.Uvarint(s.mem[s.docValueOffset+read : s.docValueOffset+read+binary.MaxVarintLen64]) - if n <= 0 { - return fmt.Errorf("loadDvReaders: failed to read the docvalue offset start for field %d", fieldID) - } - read += uint64(n) - fieldLocEnd, n = binary.Uvarint(s.mem[s.docValueOffset+read : s.docValueOffset+read+binary.MaxVarintLen64]) - if n <= 0 { - return fmt.Errorf("loadDvReaders: failed to read the docvalue offset end for field %d", fieldID) - } - read += uint64(n) - - fieldDvReader, err := s.loadFieldDocValueReader(field, fieldLocStart, fieldLocEnd) - if err != nil { - return err - } - if fieldDvReader != nil { - s.fieldDvReaders[uint16(fieldID)] = fieldDvReader - s.fieldDvNames = append(s.fieldDvNames, field) - } - } - - return nil -} diff --git a/vendor/github.com/blevesearch/zap/v12/write.go b/vendor/github.com/blevesearch/zap/v12/write.go deleted file mode 100644 index 77aefdb..0000000 --- a/vendor/github.com/blevesearch/zap/v12/write.go +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "encoding/binary" - "io" - - "github.com/RoaringBitmap/roaring" -) - -// writes out the length of the roaring bitmap in bytes as varint -// then writes out the roaring bitmap itself -func writeRoaringWithLen(r *roaring.Bitmap, w io.Writer, - reuseBufVarint []byte) (int, error) { - buf, err := r.ToBytes() - if err != nil { - return 0, err - } - - var tw int - - // write out the length - n := binary.PutUvarint(reuseBufVarint, uint64(len(buf))) - nw, err := w.Write(reuseBufVarint[:n]) - tw += nw - if err != nil { - return tw, err - } - - // write out the roaring bytes - nw, err = w.Write(buf) - tw += nw - if err != nil { - return tw, err - } - - return tw, nil -} - -func persistFields(fieldsInv []string, w *CountHashWriter, dictLocs []uint64) (uint64, error) { - var rv uint64 - var fieldsOffsets []uint64 - - for fieldID, fieldName := range fieldsInv { - // record start of this field - fieldsOffsets = append(fieldsOffsets, uint64(w.Count())) - - // write out the dict location and field name length - _, err := writeUvarints(w, dictLocs[fieldID], uint64(len(fieldName))) - if err != nil { - return 0, err - } - - // write out the field name - _, err = w.Write([]byte(fieldName)) - if err != nil { - return 0, err - } - } - - // now write out the fields index - rv = uint64(w.Count()) - for fieldID := range fieldsInv { - err := binary.Write(w, binary.BigEndian, fieldsOffsets[fieldID]) - if err != nil { - return 0, err - } - } - - return rv, nil -} - -// FooterSize is the size of the footer record in bytes -// crc + ver + chunk + field offset + stored offset + num docs + docValueOffset -const FooterSize = 4 + 4 + 4 + 8 + 8 + 8 + 8 - -func persistFooter(numDocs, storedIndexOffset, fieldsIndexOffset, docValueOffset uint64, - chunkMode uint32, crcBeforeFooter uint32, writerIn io.Writer) error { - w := NewCountHashWriter(writerIn) - w.crc = crcBeforeFooter - - // write out the number of docs - err := binary.Write(w, binary.BigEndian, numDocs) - if err != nil { - return err - } - // write out the stored field index location: - err = binary.Write(w, binary.BigEndian, storedIndexOffset) - if err != nil { - return err - } - // write out the field index location - err = binary.Write(w, binary.BigEndian, fieldsIndexOffset) - if err != nil { - return err - } - // write out the fieldDocValue location - err = binary.Write(w, binary.BigEndian, docValueOffset) - if err != nil { - return err - } - // write out 32-bit chunk factor - err = binary.Write(w, binary.BigEndian, chunkMode) - if err != nil { - return err - } - // write out 32-bit version - err = binary.Write(w, binary.BigEndian, Version) - if err != nil { - return err - } - // write out CRC-32 of everything upto but not including this CRC - err = binary.Write(w, binary.BigEndian, w.crc) - if err != nil { - return err - } - return nil -} - -func writeUvarints(w io.Writer, vals ...uint64) (tw int, err error) { - buf := make([]byte, binary.MaxVarintLen64) - for _, val := range vals { - n := binary.PutUvarint(buf, val) - var nw int - nw, err = w.Write(buf[:n]) - tw += nw - if err != nil { - return tw, err - } - } - return tw, err -} diff --git a/vendor/github.com/blevesearch/zap/v12/zap.md b/vendor/github.com/blevesearch/zap/v12/zap.md deleted file mode 100644 index d74dc54..0000000 --- a/vendor/github.com/blevesearch/zap/v12/zap.md +++ /dev/null @@ -1,177 +0,0 @@ -# ZAP File Format - -## Legend - -### Sections - - |========| - | | section - |========| - -### Fixed-size fields - - |--------| |----| |--| |-| - | | uint64 | | uint32 | | uint16 | | uint8 - |--------| |----| |--| |-| - -### Varints - - |~~~~~~~~| - | | varint(up to uint64) - |~~~~~~~~| - -### Arbitrary-length fields - - |--------...---| - | | arbitrary-length field (string, vellum, roaring bitmap) - |--------...---| - -### Chunked data - - [--------] - [ ] - [--------] - -## Overview - -Footer section describes the configuration of particular ZAP file. The format of footer is version-dependent, so it is necessary to check `V` field before the parsing. - - |==================================================| - | Stored Fields | - |==================================================| - |-----> | Stored Fields Index | - | |==================================================| - | | Dictionaries + Postings + DocValues | - | |==================================================| - | |---> | DocValues Index | - | | |==================================================| - | | | Fields | - | | |==================================================| - | | |-> | Fields Index | - | | | |========|========|========|========|====|====|====| - | | | | D# | SF | F | FDV | CF | V | CC | (Footer) - | | | |========|====|===|====|===|====|===|====|====|====| - | | | | | | - |-+-+-----------------| | | - | |--------------------------| | - |-------------------------------------| - - D#. Number of Docs. - SF. Stored Fields Index Offset. - F. Field Index Offset. - FDV. Field DocValue Offset. - CF. Chunk Factor. - V. Version. - CC. CRC32. - -## Stored Fields - -Stored Fields Index is `D#` consecutive 64-bit unsigned integers - offsets, where relevant Stored Fields Data records are located. - - 0 [SF] [SF + D# * 8] - | Stored Fields | Stored Fields Index | - |================================|==================================| - | | | - | |--------------------| ||--------|--------|. . .|--------|| - | |-> | Stored Fields Data | || 0 | 1 | | D# - 1 || - | | |--------------------| ||--------|----|---|. . .|--------|| - | | | | | - |===|============================|==============|===================| - | | - |-------------------------------------------| - -Stored Fields Data is an arbitrary size record, which consists of metadata and [Snappy](https://github.com/golang/snappy)-compressed data. - - Stored Fields Data - |~~~~~~~~|~~~~~~~~|~~~~~~~~...~~~~~~~~|~~~~~~~~...~~~~~~~~| - | MDS | CDS | MD | CD | - |~~~~~~~~|~~~~~~~~|~~~~~~~~...~~~~~~~~|~~~~~~~~...~~~~~~~~| - - MDS. Metadata size. - CDS. Compressed data size. - MD. Metadata. - CD. Snappy-compressed data. - -## Fields - -Fields Index section located between addresses `F` and `len(file) - len(footer)` and consist of `uint64` values (`F1`, `F2`, ...) which are offsets to records in Fields section. We have `F# = (len(file) - len(footer) - F) / sizeof(uint64)` fields. - - - (...) [F] [F + F#] - | Fields | Fields Index. | - |================================|================================| - | | | - | |~~~~~~~~|~~~~~~~~|---...---|||--------|--------|...|--------|| - ||->| Dict | Length | Name ||| 0 | 1 | | F# - 1 || - || |~~~~~~~~|~~~~~~~~|---...---|||--------|----|---|...|--------|| - || | | | - ||===============================|==============|=================| - | | - |----------------------------------------------| - - -## Dictionaries + Postings - -Each of fields has its own dictionary, encoded in [Vellum](https://github.com/couchbase/vellum) format. Dictionary consists of pairs `(term, offset)`, where `offset` indicates the position of postings (list of documents) for this particular term. - - |================================================================|- Dictionaries + - | | Postings + - | | DocValues - | Freq/Norm (chunked) | - | [~~~~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~] | - | |->[ Freq | Norm (float32 under varint) ] | - | | [~~~~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~] | - | | | - | |------------------------------------------------------------| | - | Location Details (chunked) | | - | [~~~~~~|~~~~~|~~~~~~~|~~~~~|~~~~~~|~~~~~~~~|~~~~~] | | - | |->[ Size | Pos | Start | End | Arr# | ArrPos | ... ] | | - | | [~~~~~~|~~~~~|~~~~~~~|~~~~~|~~~~~~|~~~~~~~~|~~~~~] | | - | | | | - | |----------------------| | | - | Postings List | | | - | |~~~~~~~~|~~~~~|~~|~~~~~~~~|-----------...--| | | - | |->| F/N | LD | Length | ROARING BITMAP | | | - | | |~~~~~|~~|~~~~~~~~|~~~~~~~~|-----------...--| | | - | | |----------------------------------------------| | - | |--------------------------------------| | - | Dictionary | | - | |~~~~~~~~|--------------------------|-...-| | - | |->| Length | VELLUM DATA : (TERM -> OFFSET) | | - | | |~~~~~~~~|----------------------------...-| | - | | | - |======|=========================================================|- DocValues Index - | | | - |======|=========================================================|- Fields - | | | - | |~~~~|~~~|~~~~~~~~|---...---| | - | | Dict | Length | Name | | - | |~~~~~~~~|~~~~~~~~|---...---| | - | | - |================================================================| - -## DocValues - -DocValues Index is `F#` pairs of varints, one pair per field. Each pair of varints indicates start and end point of DocValues slice. - - |================================================================| - | |------...--| | - | |->| DocValues |<-| | - | | |------...--| | | - |==|=================|===========================================|- DocValues Index - ||~|~~~~~~~~~|~~~~~~~|~~| |~~~~~~~~~~~~~~|~~~~~~~~~~~~|| - || DV1 START | DV1 STOP | . . . . . | DV(F#) START | DV(F#) END || - ||~~~~~~~~~~~|~~~~~~~~~~| |~~~~~~~~~~~~~~|~~~~~~~~~~~~|| - |================================================================| - -DocValues is chunked Snappy-compressed values for each document and field. - - [~~~~~~~~~~~~~~~|~~~~~~|~~~~~~~~~|-...-|~~~~~~|~~~~~~~~~|--------------------...-] - [ Doc# in Chunk | Doc1 | Offset1 | ... | DocN | OffsetN | SNAPPY COMPRESSED DATA ] - [~~~~~~~~~~~~~~~|~~~~~~|~~~~~~~~~|-...-|~~~~~~|~~~~~~~~~|--------------------...-] - -Last 16 bytes are description of chunks. - - |~~~~~~~~~~~~...~|----------------|----------------| - | Chunk Sizes | Chunk Size Arr | Chunk# | - |~~~~~~~~~~~~...~|----------------|----------------| diff --git a/vendor/github.com/blevesearch/zap/v13/.gitignore b/vendor/github.com/blevesearch/zap/v13/.gitignore deleted file mode 100644 index 46d1cfa..0000000 --- a/vendor/github.com/blevesearch/zap/v13/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -#* -*.sublime-* -*~ -.#* -.project -.settings -**/.idea/ -**/*.iml -.DS_Store -/cmd/zap/zap -*.test -tags diff --git a/vendor/github.com/blevesearch/zap/v13/LICENSE b/vendor/github.com/blevesearch/zap/v13/LICENSE deleted file mode 100644 index 7a4a3ea..0000000 --- a/vendor/github.com/blevesearch/zap/v13/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/vendor/github.com/blevesearch/zap/v13/README.md b/vendor/github.com/blevesearch/zap/v13/README.md deleted file mode 100644 index 0facb66..0000000 --- a/vendor/github.com/blevesearch/zap/v13/README.md +++ /dev/null @@ -1,158 +0,0 @@ -# zap file format - -Advanced ZAP File Format Documentation is [here](zap.md). - -The file is written in the reverse order that we typically access data. This helps us write in one pass since later sections of the file require file offsets of things we've already written. - -Current usage: - -- mmap the entire file -- crc-32 bytes and version are in fixed position at end of the file -- reading remainder of footer could be version specific -- remainder of footer gives us: - - 3 important offsets (docValue , fields index and stored data index) - - 2 important values (number of docs and chunk factor) -- field data is processed once and memoized onto the heap so that we never have to go back to disk for it -- access to stored data by doc number means first navigating to the stored data index, then accessing a fixed position offset into that slice, which gives us the actual address of the data. the first bytes of that section tell us the size of data so that we know where it ends. -- access to all other indexed data follows the following pattern: - - first know the field name -> convert to id - - next navigate to term dictionary for that field - - some operations stop here and do dictionary ops - - next use dictionary to navigate to posting list for a specific term - - walk posting list - - if necessary, walk posting details as we go - - if location info is desired, consult location bitmap to see if it is there - -## stored fields section - -- for each document - - preparation phase: - - produce a slice of metadata bytes and data bytes - - produce these slices in field id order - - field value is appended to the data slice - - metadata slice is varint encoded with the following values for each field value - - field id (uint16) - - field type (byte) - - field value start offset in uncompressed data slice (uint64) - - field value length (uint64) - - field number of array positions (uint64) - - one additional value for each array position (uint64) - - compress the data slice using snappy - - file writing phase: - - remember the start offset for this document - - write out meta data length (varint uint64) - - write out compressed data length (varint uint64) - - write out the metadata bytes - - write out the compressed data bytes - -## stored fields idx - -- for each document - - write start offset (remembered from previous section) of stored data (big endian uint64) - -With this index and a known document number, we have direct access to all the stored field data. - -## posting details (freq/norm) section - -- for each posting list - - produce a slice containing multiple consecutive chunks (each chunk is varint stream) - - produce a slice remembering offsets of where each chunk starts - - preparation phase: - - for each hit in the posting list - - if this hit is in next chunk close out encoding of last chunk and record offset start of next - - encode term frequency (uint64) - - encode norm factor (float32) - - file writing phase: - - remember start position for this posting list details - - write out number of chunks that follow (varint uint64) - - write out length of each chunk (each a varint uint64) - - write out the byte slice containing all the chunk data - -If you know the doc number you're interested in, this format lets you jump to the correct chunk (docNum/chunkFactor) directly and then seek within that chunk until you find it. - -## posting details (location) section - -- for each posting list - - produce a slice containing multiple consecutive chunks (each chunk is varint stream) - - produce a slice remembering offsets of where each chunk starts - - preparation phase: - - for each hit in the posting list - - if this hit is in next chunk close out encoding of last chunk and record offset start of next - - encode field (uint16) - - encode field pos (uint64) - - encode field start (uint64) - - encode field end (uint64) - - encode number of array positions to follow (uint64) - - encode each array position (each uint64) - - file writing phase: - - remember start position for this posting list details - - write out number of chunks that follow (varint uint64) - - write out length of each chunk (each a varint uint64) - - write out the byte slice containing all the chunk data - -If you know the doc number you're interested in, this format lets you jump to the correct chunk (docNum/chunkFactor) directly and then seek within that chunk until you find it. - -## postings list section - -- for each posting list - - preparation phase: - - encode roaring bitmap posting list to bytes (so we know the length) - - file writing phase: - - remember the start position for this posting list - - write freq/norm details offset (remembered from previous, as varint uint64) - - write location details offset (remembered from previous, as varint uint64) - - write length of encoded roaring bitmap - - write the serialized roaring bitmap data - -## dictionary - -- for each field - - preparation phase: - - encode vellum FST with dictionary data pointing to file offset of posting list (remembered from previous) - - file writing phase: - - remember the start position of this persistDictionary - - write length of vellum data (varint uint64) - - write out vellum data - -## fields section - -- for each field - - file writing phase: - - remember start offset for each field - - write dictionary address (remembered from previous) (varint uint64) - - write length of field name (varint uint64) - - write field name bytes - -## fields idx - -- for each field - - file writing phase: - - write big endian uint64 of start offset for each field - -NOTE: currently we don't know or record the length of this fields index. Instead we rely on the fact that we know it immediately precedes a footer of known size. - -## fields DocValue - -- for each field - - preparation phase: - - produce a slice containing multiple consecutive chunks, where each chunk is composed of a meta section followed by compressed columnar field data - - produce a slice remembering the length of each chunk - - file writing phase: - - remember the start position of this first field DocValue offset in the footer - - write out number of chunks that follow (varint uint64) - - write out length of each chunk (each a varint uint64) - - write out the byte slice containing all the chunk data - -NOTE: currently the meta header inside each chunk gives clue to the location offsets and size of the data pertaining to a given docID and any -read operation leverage that meta information to extract the document specific data from the file. - -## footer - -- file writing phase - - write number of docs (big endian uint64) - - write stored field index location (big endian uint64) - - write field index location (big endian uint64) - - write field docValue location (big endian uint64) - - write out chunk factor (big endian uint32) - - write out version (big endian uint32) - - write out file CRC of everything preceding this (big endian uint32) diff --git a/vendor/github.com/blevesearch/zap/v13/build.go b/vendor/github.com/blevesearch/zap/v13/build.go deleted file mode 100644 index 58d829f..0000000 --- a/vendor/github.com/blevesearch/zap/v13/build.go +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bufio" - "math" - "os" - - "github.com/couchbase/vellum" -) - -const Version uint32 = 13 - -const Type string = "zap" - -const fieldNotUninverted = math.MaxUint64 - -func (sb *SegmentBase) Persist(path string) error { - return PersistSegmentBase(sb, path) -} - -// PersistSegmentBase persists SegmentBase in the zap file format. -func PersistSegmentBase(sb *SegmentBase, path string) error { - flag := os.O_RDWR | os.O_CREATE - - f, err := os.OpenFile(path, flag, 0600) - if err != nil { - return err - } - - cleanup := func() { - _ = f.Close() - _ = os.Remove(path) - } - - br := bufio.NewWriter(f) - - _, err = br.Write(sb.mem) - if err != nil { - cleanup() - return err - } - - err = persistFooter(sb.numDocs, sb.storedIndexOffset, sb.fieldsIndexOffset, sb.docValueOffset, - sb.chunkMode, sb.memCRC, br) - if err != nil { - cleanup() - return err - } - - err = br.Flush() - if err != nil { - cleanup() - return err - } - - err = f.Sync() - if err != nil { - cleanup() - return err - } - - err = f.Close() - if err != nil { - cleanup() - return err - } - - return nil -} - -func persistStoredFieldValues(fieldID int, - storedFieldValues [][]byte, stf []byte, spf [][]uint64, - curr int, metaEncode varintEncoder, data []byte) ( - int, []byte, error) { - for i := 0; i < len(storedFieldValues); i++ { - // encode field - _, err := metaEncode(uint64(fieldID)) - if err != nil { - return 0, nil, err - } - // encode type - _, err = metaEncode(uint64(stf[i])) - if err != nil { - return 0, nil, err - } - // encode start offset - _, err = metaEncode(uint64(curr)) - if err != nil { - return 0, nil, err - } - // end len - _, err = metaEncode(uint64(len(storedFieldValues[i]))) - if err != nil { - return 0, nil, err - } - // encode number of array pos - _, err = metaEncode(uint64(len(spf[i]))) - if err != nil { - return 0, nil, err - } - // encode all array positions - for _, pos := range spf[i] { - _, err = metaEncode(pos) - if err != nil { - return 0, nil, err - } - } - - data = append(data, storedFieldValues[i]...) - curr += len(storedFieldValues[i]) - } - - return curr, data, nil -} - -func InitSegmentBase(mem []byte, memCRC uint32, chunkMode uint32, - fieldsMap map[string]uint16, fieldsInv []string, numDocs uint64, - storedIndexOffset uint64, fieldsIndexOffset uint64, docValueOffset uint64, - dictLocs []uint64) (*SegmentBase, error) { - sb := &SegmentBase{ - mem: mem, - memCRC: memCRC, - chunkMode: chunkMode, - fieldsMap: fieldsMap, - fieldsInv: fieldsInv, - numDocs: numDocs, - storedIndexOffset: storedIndexOffset, - fieldsIndexOffset: fieldsIndexOffset, - docValueOffset: docValueOffset, - dictLocs: dictLocs, - fieldDvReaders: make(map[uint16]*docValueReader), - fieldFSTs: make(map[uint16]*vellum.FST), - } - sb.updateSize() - - err := sb.loadDvReaders() - if err != nil { - return nil, err - } - - return sb, nil -} diff --git a/vendor/github.com/blevesearch/zap/v13/chunk.go b/vendor/github.com/blevesearch/zap/v13/chunk.go deleted file mode 100644 index fe9f398..0000000 --- a/vendor/github.com/blevesearch/zap/v13/chunk.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (c) 2019 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "fmt" -) - -// LegacyChunkMode was the original chunk mode (always chunk size 1024) -// this mode is still used for chunking doc values. -var LegacyChunkMode uint32 = 1024 - -// DefaultChunkMode is the most recent improvement to chunking and should -// be used by default. -var DefaultChunkMode uint32 = 1025 - -func getChunkSize(chunkMode uint32, cardinality uint64, maxDocs uint64) (uint64, error) { - switch { - // any chunkMode <= 1024 will always chunk with chunkSize=chunkMode - case chunkMode <= 1024: - // legacy chunk size - return uint64(chunkMode), nil - - case chunkMode == 1025: - // attempt at simple improvement - // theory - the point of chunking is to put a bound on the maximum number of - // calls to Next() needed to find a random document. ie, you should be able - // to do one jump to the correct chunk, and then walk through at most - // chunk-size items - // previously 1024 was chosen as the chunk size, but this is particularly - // wasteful for low cardinality terms. the observation is that if there - // are less than 1024 items, why not put them all in one chunk, - // this way you'll still achieve the same goal of visiting at most - // chunk-size items. - // no attempt is made to tweak any other case - if cardinality <= 1024 { - return maxDocs, nil - } - return 1024, nil - } - return 0, fmt.Errorf("unknown chunk mode %d", chunkMode) -} diff --git a/vendor/github.com/blevesearch/zap/v13/contentcoder.go b/vendor/github.com/blevesearch/zap/v13/contentcoder.go deleted file mode 100644 index c145b5a..0000000 --- a/vendor/github.com/blevesearch/zap/v13/contentcoder.go +++ /dev/null @@ -1,243 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "encoding/binary" - "io" - "reflect" - - "github.com/golang/snappy" -) - -var reflectStaticSizeMetaData int - -func init() { - var md MetaData - reflectStaticSizeMetaData = int(reflect.TypeOf(md).Size()) -} - -var termSeparator byte = 0xff -var termSeparatorSplitSlice = []byte{termSeparator} - -type chunkedContentCoder struct { - final []byte - chunkSize uint64 - currChunk uint64 - chunkLens []uint64 - - w io.Writer - progressiveWrite bool - - chunkMetaBuf bytes.Buffer - chunkBuf bytes.Buffer - - chunkMeta []MetaData - - compressed []byte // temp buf for snappy compression -} - -// MetaData represents the data information inside a -// chunk. -type MetaData struct { - DocNum uint64 // docNum of the data inside the chunk - DocDvOffset uint64 // offset of data inside the chunk for the given docid -} - -// newChunkedContentCoder returns a new chunk content coder which -// packs data into chunks based on the provided chunkSize -func newChunkedContentCoder(chunkSize uint64, maxDocNum uint64, - w io.Writer, progressiveWrite bool) *chunkedContentCoder { - total := maxDocNum/chunkSize + 1 - rv := &chunkedContentCoder{ - chunkSize: chunkSize, - chunkLens: make([]uint64, total), - chunkMeta: make([]MetaData, 0, total), - w: w, - progressiveWrite: progressiveWrite, - } - - return rv -} - -// Reset lets you reuse this chunked content coder. Buffers are reset -// and re used. You cannot change the chunk size. -func (c *chunkedContentCoder) Reset() { - c.currChunk = 0 - c.final = c.final[:0] - c.chunkBuf.Reset() - c.chunkMetaBuf.Reset() - for i := range c.chunkLens { - c.chunkLens[i] = 0 - } - c.chunkMeta = c.chunkMeta[:0] -} - -func (c *chunkedContentCoder) SetChunkSize(chunkSize uint64, maxDocNum uint64) { - total := int(maxDocNum/chunkSize + 1) - c.chunkSize = chunkSize - if cap(c.chunkLens) < total { - c.chunkLens = make([]uint64, total) - } else { - c.chunkLens = c.chunkLens[:total] - } - if cap(c.chunkMeta) < total { - c.chunkMeta = make([]MetaData, 0, total) - } -} - -// Close indicates you are done calling Add() this allows -// the final chunk to be encoded. -func (c *chunkedContentCoder) Close() error { - return c.flushContents() -} - -func (c *chunkedContentCoder) flushContents() error { - // flush the contents, with meta information at first - buf := make([]byte, binary.MaxVarintLen64) - n := binary.PutUvarint(buf, uint64(len(c.chunkMeta))) - _, err := c.chunkMetaBuf.Write(buf[:n]) - if err != nil { - return err - } - - // write out the metaData slice - for _, meta := range c.chunkMeta { - _, err := writeUvarints(&c.chunkMetaBuf, meta.DocNum, meta.DocDvOffset) - if err != nil { - return err - } - } - - // write the metadata to final data - metaData := c.chunkMetaBuf.Bytes() - c.final = append(c.final, c.chunkMetaBuf.Bytes()...) - // write the compressed data to the final data - c.compressed = snappy.Encode(c.compressed[:cap(c.compressed)], c.chunkBuf.Bytes()) - c.final = append(c.final, c.compressed...) - - c.chunkLens[c.currChunk] = uint64(len(c.compressed) + len(metaData)) - - if c.progressiveWrite { - _, err := c.w.Write(c.final) - if err != nil { - return err - } - c.final = c.final[:0] - } - - return nil -} - -// Add encodes the provided byte slice into the correct chunk for the provided -// doc num. You MUST call Add() with increasing docNums. -func (c *chunkedContentCoder) Add(docNum uint64, vals []byte) error { - chunk := docNum / c.chunkSize - if chunk != c.currChunk { - // flush out the previous chunk details - err := c.flushContents() - if err != nil { - return err - } - // clearing the chunk specific meta for next chunk - c.chunkBuf.Reset() - c.chunkMetaBuf.Reset() - c.chunkMeta = c.chunkMeta[:0] - c.currChunk = chunk - } - - // get the starting offset for this doc - dvOffset := c.chunkBuf.Len() - dvSize, err := c.chunkBuf.Write(vals) - if err != nil { - return err - } - - c.chunkMeta = append(c.chunkMeta, MetaData{ - DocNum: docNum, - DocDvOffset: uint64(dvOffset + dvSize), - }) - return nil -} - -// Write commits all the encoded chunked contents to the provided writer. -// -// | ..... data ..... | chunk offsets (varints) -// | position of chunk offsets (uint64) | number of offsets (uint64) | -// -func (c *chunkedContentCoder) Write() (int, error) { - var tw int - - if c.final != nil { - // write out the data section first - nw, err := c.w.Write(c.final) - tw += nw - if err != nil { - return tw, err - } - } - - chunkOffsetsStart := uint64(tw) - - if cap(c.final) < binary.MaxVarintLen64 { - c.final = make([]byte, binary.MaxVarintLen64) - } else { - c.final = c.final[0:binary.MaxVarintLen64] - } - chunkOffsets := modifyLengthsToEndOffsets(c.chunkLens) - // write out the chunk offsets - for _, chunkOffset := range chunkOffsets { - n := binary.PutUvarint(c.final, chunkOffset) - nw, err := c.w.Write(c.final[:n]) - tw += nw - if err != nil { - return tw, err - } - } - - chunkOffsetsLen := uint64(tw) - chunkOffsetsStart - - c.final = c.final[0:8] - // write out the length of chunk offsets - binary.BigEndian.PutUint64(c.final, chunkOffsetsLen) - nw, err := c.w.Write(c.final) - tw += nw - if err != nil { - return tw, err - } - - // write out the number of chunks - binary.BigEndian.PutUint64(c.final, uint64(len(c.chunkLens))) - nw, err = c.w.Write(c.final) - tw += nw - if err != nil { - return tw, err - } - - c.final = c.final[:0] - - return tw, nil -} - -// ReadDocValueBoundary elicits the start, end offsets from a -// metaData header slice -func ReadDocValueBoundary(chunk int, metaHeaders []MetaData) (uint64, uint64) { - var start uint64 - if chunk > 0 { - start = metaHeaders[chunk-1].DocDvOffset - } - return start, metaHeaders[chunk].DocDvOffset -} diff --git a/vendor/github.com/blevesearch/zap/v13/count.go b/vendor/github.com/blevesearch/zap/v13/count.go deleted file mode 100644 index 50290f8..0000000 --- a/vendor/github.com/blevesearch/zap/v13/count.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "hash/crc32" - "io" - - "github.com/blevesearch/bleve/index/scorch/segment" -) - -// CountHashWriter is a wrapper around a Writer which counts the number of -// bytes which have been written and computes a crc32 hash -type CountHashWriter struct { - w io.Writer - crc uint32 - n int - s segment.StatsReporter -} - -// NewCountHashWriter returns a CountHashWriter which wraps the provided Writer -func NewCountHashWriter(w io.Writer) *CountHashWriter { - return &CountHashWriter{w: w} -} - -func NewCountHashWriterWithStatsReporter(w io.Writer, s segment.StatsReporter) *CountHashWriter { - return &CountHashWriter{w: w, s: s} -} - -// Write writes the provided bytes to the wrapped writer and counts the bytes -func (c *CountHashWriter) Write(b []byte) (int, error) { - n, err := c.w.Write(b) - c.crc = crc32.Update(c.crc, crc32.IEEETable, b[:n]) - c.n += n - if c.s != nil { - c.s.ReportBytesWritten(uint64(n)) - } - return n, err -} - -// Count returns the number of bytes written -func (c *CountHashWriter) Count() int { - return c.n -} - -// Sum32 returns the CRC-32 hash of the content written to this writer -func (c *CountHashWriter) Sum32() uint32 { - return c.crc -} diff --git a/vendor/github.com/blevesearch/zap/v13/dict.go b/vendor/github.com/blevesearch/zap/v13/dict.go deleted file mode 100644 index ad4a8f8..0000000 --- a/vendor/github.com/blevesearch/zap/v13/dict.go +++ /dev/null @@ -1,263 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "fmt" - - "github.com/RoaringBitmap/roaring" - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/couchbase/vellum" -) - -// Dictionary is the zap representation of the term dictionary -type Dictionary struct { - sb *SegmentBase - field string - fieldID uint16 - fst *vellum.FST - fstReader *vellum.Reader -} - -// PostingsList returns the postings list for the specified term -func (d *Dictionary) PostingsList(term []byte, except *roaring.Bitmap, - prealloc segment.PostingsList) (segment.PostingsList, error) { - var preallocPL *PostingsList - pl, ok := prealloc.(*PostingsList) - if ok && pl != nil { - preallocPL = pl - } - return d.postingsList(term, except, preallocPL) -} - -func (d *Dictionary) postingsList(term []byte, except *roaring.Bitmap, rv *PostingsList) (*PostingsList, error) { - if d.fstReader == nil { - if rv == nil || rv == emptyPostingsList { - return emptyPostingsList, nil - } - return d.postingsListInit(rv, except), nil - } - - postingsOffset, exists, err := d.fstReader.Get(term) - if err != nil { - return nil, fmt.Errorf("vellum err: %v", err) - } - if !exists { - if rv == nil || rv == emptyPostingsList { - return emptyPostingsList, nil - } - return d.postingsListInit(rv, except), nil - } - - return d.postingsListFromOffset(postingsOffset, except, rv) -} - -func (d *Dictionary) postingsListFromOffset(postingsOffset uint64, except *roaring.Bitmap, rv *PostingsList) (*PostingsList, error) { - rv = d.postingsListInit(rv, except) - - err := rv.read(postingsOffset, d) - if err != nil { - return nil, err - } - - return rv, nil -} - -func (d *Dictionary) postingsListInit(rv *PostingsList, except *roaring.Bitmap) *PostingsList { - if rv == nil || rv == emptyPostingsList { - rv = &PostingsList{} - } else { - postings := rv.postings - if postings != nil { - postings.Clear() - } - - *rv = PostingsList{} // clear the struct - - rv.postings = postings - } - rv.sb = d.sb - rv.except = except - return rv -} - -func (d *Dictionary) Contains(key []byte) (bool, error) { - return d.fst.Contains(key) -} - -// Iterator returns an iterator for this dictionary -func (d *Dictionary) Iterator() segment.DictionaryIterator { - rv := &DictionaryIterator{ - d: d, - } - - if d.fst != nil { - itr, err := d.fst.Iterator(nil, nil) - if err == nil { - rv.itr = itr - } else if err != vellum.ErrIteratorDone { - rv.err = err - } - } - - return rv -} - -// PrefixIterator returns an iterator which only visits terms having the -// the specified prefix -func (d *Dictionary) PrefixIterator(prefix string) segment.DictionaryIterator { - rv := &DictionaryIterator{ - d: d, - } - - kBeg := []byte(prefix) - kEnd := segment.IncrementBytes(kBeg) - - if d.fst != nil { - itr, err := d.fst.Iterator(kBeg, kEnd) - if err == nil { - rv.itr = itr - } else if err != vellum.ErrIteratorDone { - rv.err = err - } - } - - return rv -} - -// RangeIterator returns an iterator which only visits terms between the -// start and end terms. NOTE: bleve.index API specifies the end is inclusive. -func (d *Dictionary) RangeIterator(start, end string) segment.DictionaryIterator { - rv := &DictionaryIterator{ - d: d, - } - - // need to increment the end position to be inclusive - var endBytes []byte - if len(end) > 0 { - endBytes = []byte(end) - if endBytes[len(endBytes)-1] < 0xff { - endBytes[len(endBytes)-1]++ - } else { - endBytes = append(endBytes, 0xff) - } - } - - if d.fst != nil { - itr, err := d.fst.Iterator([]byte(start), endBytes) - if err == nil { - rv.itr = itr - } else if err != vellum.ErrIteratorDone { - rv.err = err - } - } - - return rv -} - -// AutomatonIterator returns an iterator which only visits terms -// having the the vellum automaton and start/end key range -func (d *Dictionary) AutomatonIterator(a vellum.Automaton, - startKeyInclusive, endKeyExclusive []byte) segment.DictionaryIterator { - rv := &DictionaryIterator{ - d: d, - } - - if d.fst != nil { - itr, err := d.fst.Search(a, startKeyInclusive, endKeyExclusive) - if err == nil { - rv.itr = itr - } else if err != vellum.ErrIteratorDone { - rv.err = err - } - } - - return rv -} - -func (d *Dictionary) OnlyIterator(onlyTerms [][]byte, - includeCount bool) segment.DictionaryIterator { - - rv := &DictionaryIterator{ - d: d, - omitCount: !includeCount, - } - - var buf bytes.Buffer - builder, err := vellum.New(&buf, nil) - if err != nil { - rv.err = err - return rv - } - for _, term := range onlyTerms { - err = builder.Insert(term, 0) - if err != nil { - rv.err = err - return rv - } - } - err = builder.Close() - if err != nil { - rv.err = err - return rv - } - - onlyFST, err := vellum.Load(buf.Bytes()) - if err != nil { - rv.err = err - return rv - } - - itr, err := d.fst.Search(onlyFST, nil, nil) - if err == nil { - rv.itr = itr - } else if err != vellum.ErrIteratorDone { - rv.err = err - } - - return rv -} - -// DictionaryIterator is an iterator for term dictionary -type DictionaryIterator struct { - d *Dictionary - itr vellum.Iterator - err error - tmp PostingsList - entry index.DictEntry - omitCount bool -} - -// Next returns the next entry in the dictionary -func (i *DictionaryIterator) Next() (*index.DictEntry, error) { - if i.err != nil && i.err != vellum.ErrIteratorDone { - return nil, i.err - } else if i.itr == nil || i.err == vellum.ErrIteratorDone { - return nil, nil - } - term, postingsOffset := i.itr.Current() - i.entry.Term = string(term) - if !i.omitCount { - i.err = i.tmp.read(postingsOffset, i.d) - if i.err != nil { - return nil, i.err - } - i.entry.Count = i.tmp.Count() - } - i.err = i.itr.Next() - return &i.entry, nil -} diff --git a/vendor/github.com/blevesearch/zap/v13/docvalues.go b/vendor/github.com/blevesearch/zap/v13/docvalues.go deleted file mode 100644 index 793797b..0000000 --- a/vendor/github.com/blevesearch/zap/v13/docvalues.go +++ /dev/null @@ -1,312 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "encoding/binary" - "fmt" - "math" - "reflect" - "sort" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/blevesearch/bleve/size" - "github.com/golang/snappy" -) - -var reflectStaticSizedocValueReader int - -func init() { - var dvi docValueReader - reflectStaticSizedocValueReader = int(reflect.TypeOf(dvi).Size()) -} - -type docNumTermsVisitor func(docNum uint64, terms []byte) error - -type docVisitState struct { - dvrs map[uint16]*docValueReader - segment *SegmentBase -} - -type docValueReader struct { - field string - curChunkNum uint64 - chunkOffsets []uint64 - dvDataLoc uint64 - curChunkHeader []MetaData - curChunkData []byte // compressed data cache - uncompressed []byte // temp buf for snappy decompression -} - -func (di *docValueReader) size() int { - return reflectStaticSizedocValueReader + size.SizeOfPtr + - len(di.field) + - len(di.chunkOffsets)*size.SizeOfUint64 + - len(di.curChunkHeader)*reflectStaticSizeMetaData + - len(di.curChunkData) -} - -func (di *docValueReader) cloneInto(rv *docValueReader) *docValueReader { - if rv == nil { - rv = &docValueReader{} - } - - rv.field = di.field - rv.curChunkNum = math.MaxUint64 - rv.chunkOffsets = di.chunkOffsets // immutable, so it's sharable - rv.dvDataLoc = di.dvDataLoc - rv.curChunkHeader = rv.curChunkHeader[:0] - rv.curChunkData = nil - rv.uncompressed = rv.uncompressed[:0] - - return rv -} - -func (di *docValueReader) curChunkNumber() uint64 { - return di.curChunkNum -} - -func (s *SegmentBase) loadFieldDocValueReader(field string, - fieldDvLocStart, fieldDvLocEnd uint64) (*docValueReader, error) { - // get the docValue offset for the given fields - if fieldDvLocStart == fieldNotUninverted { - // no docValues found, nothing to do - return nil, nil - } - - // read the number of chunks, and chunk offsets position - var numChunks, chunkOffsetsPosition uint64 - - if fieldDvLocEnd-fieldDvLocStart > 16 { - numChunks = binary.BigEndian.Uint64(s.mem[fieldDvLocEnd-8 : fieldDvLocEnd]) - // read the length of chunk offsets - chunkOffsetsLen := binary.BigEndian.Uint64(s.mem[fieldDvLocEnd-16 : fieldDvLocEnd-8]) - // acquire position of chunk offsets - chunkOffsetsPosition = (fieldDvLocEnd - 16) - chunkOffsetsLen - } else { - return nil, fmt.Errorf("loadFieldDocValueReader: fieldDvLoc too small: %d-%d", fieldDvLocEnd, fieldDvLocStart) - } - - fdvIter := &docValueReader{ - curChunkNum: math.MaxUint64, - field: field, - chunkOffsets: make([]uint64, int(numChunks)), - } - - // read the chunk offsets - var offset uint64 - for i := 0; i < int(numChunks); i++ { - loc, read := binary.Uvarint(s.mem[chunkOffsetsPosition+offset : chunkOffsetsPosition+offset+binary.MaxVarintLen64]) - if read <= 0 { - return nil, fmt.Errorf("corrupted chunk offset during segment load") - } - fdvIter.chunkOffsets[i] = loc - offset += uint64(read) - } - - // set the data offset - fdvIter.dvDataLoc = fieldDvLocStart - - return fdvIter, nil -} - -func (di *docValueReader) loadDvChunk(chunkNumber uint64, s *SegmentBase) error { - // advance to the chunk where the docValues - // reside for the given docNum - destChunkDataLoc, curChunkEnd := di.dvDataLoc, di.dvDataLoc - start, end := readChunkBoundary(int(chunkNumber), di.chunkOffsets) - if start >= end { - di.curChunkHeader = di.curChunkHeader[:0] - di.curChunkData = nil - di.curChunkNum = chunkNumber - di.uncompressed = di.uncompressed[:0] - return nil - } - - destChunkDataLoc += start - curChunkEnd += end - - // read the number of docs reside in the chunk - numDocs, read := binary.Uvarint(s.mem[destChunkDataLoc : destChunkDataLoc+binary.MaxVarintLen64]) - if read <= 0 { - return fmt.Errorf("failed to read the chunk") - } - chunkMetaLoc := destChunkDataLoc + uint64(read) - - offset := uint64(0) - if cap(di.curChunkHeader) < int(numDocs) { - di.curChunkHeader = make([]MetaData, int(numDocs)) - } else { - di.curChunkHeader = di.curChunkHeader[:int(numDocs)] - } - for i := 0; i < int(numDocs); i++ { - di.curChunkHeader[i].DocNum, read = binary.Uvarint(s.mem[chunkMetaLoc+offset : chunkMetaLoc+offset+binary.MaxVarintLen64]) - offset += uint64(read) - di.curChunkHeader[i].DocDvOffset, read = binary.Uvarint(s.mem[chunkMetaLoc+offset : chunkMetaLoc+offset+binary.MaxVarintLen64]) - offset += uint64(read) - } - - compressedDataLoc := chunkMetaLoc + offset - dataLength := curChunkEnd - compressedDataLoc - di.curChunkData = s.mem[compressedDataLoc : compressedDataLoc+dataLength] - di.curChunkNum = chunkNumber - di.uncompressed = di.uncompressed[:0] - return nil -} - -func (di *docValueReader) iterateAllDocValues(s *SegmentBase, visitor docNumTermsVisitor) error { - for i := 0; i < len(di.chunkOffsets); i++ { - err := di.loadDvChunk(uint64(i), s) - if err != nil { - return err - } - if di.curChunkData == nil || len(di.curChunkHeader) == 0 { - continue - } - - // uncompress the already loaded data - uncompressed, err := snappy.Decode(di.uncompressed[:cap(di.uncompressed)], di.curChunkData) - if err != nil { - return err - } - di.uncompressed = uncompressed - - start := uint64(0) - for _, entry := range di.curChunkHeader { - err = visitor(entry.DocNum, uncompressed[start:entry.DocDvOffset]) - if err != nil { - return err - } - - start = entry.DocDvOffset - } - } - - return nil -} - -func (di *docValueReader) visitDocValues(docNum uint64, - visitor index.DocumentFieldTermVisitor) error { - // binary search the term locations for the docNum - start, end := di.getDocValueLocs(docNum) - if start == math.MaxUint64 || end == math.MaxUint64 || start == end { - return nil - } - - var uncompressed []byte - var err error - // use the uncompressed copy if available - if len(di.uncompressed) > 0 { - uncompressed = di.uncompressed - } else { - // uncompress the already loaded data - uncompressed, err = snappy.Decode(di.uncompressed[:cap(di.uncompressed)], di.curChunkData) - if err != nil { - return err - } - di.uncompressed = uncompressed - } - - // pick the terms for the given docNum - uncompressed = uncompressed[start:end] - for { - i := bytes.Index(uncompressed, termSeparatorSplitSlice) - if i < 0 { - break - } - - visitor(di.field, uncompressed[0:i]) - uncompressed = uncompressed[i+1:] - } - - return nil -} - -func (di *docValueReader) getDocValueLocs(docNum uint64) (uint64, uint64) { - i := sort.Search(len(di.curChunkHeader), func(i int) bool { - return di.curChunkHeader[i].DocNum >= docNum - }) - if i < len(di.curChunkHeader) && di.curChunkHeader[i].DocNum == docNum { - return ReadDocValueBoundary(i, di.curChunkHeader) - } - return math.MaxUint64, math.MaxUint64 -} - -// VisitDocumentFieldTerms is an implementation of the -// DocumentFieldTermVisitable interface -func (s *SegmentBase) VisitDocumentFieldTerms(localDocNum uint64, fields []string, - visitor index.DocumentFieldTermVisitor, dvsIn segment.DocVisitState) ( - segment.DocVisitState, error) { - dvs, ok := dvsIn.(*docVisitState) - if !ok || dvs == nil { - dvs = &docVisitState{} - } else { - if dvs.segment != s { - dvs.segment = s - dvs.dvrs = nil - } - } - - var fieldIDPlus1 uint16 - if dvs.dvrs == nil { - dvs.dvrs = make(map[uint16]*docValueReader, len(fields)) - for _, field := range fields { - if fieldIDPlus1, ok = s.fieldsMap[field]; !ok { - continue - } - fieldID := fieldIDPlus1 - 1 - if dvIter, exists := s.fieldDvReaders[fieldID]; exists && - dvIter != nil { - dvs.dvrs[fieldID] = dvIter.cloneInto(dvs.dvrs[fieldID]) - } - } - } - - // find the chunkNumber where the docValues are stored - // NOTE: doc values continue to use legacy chunk mode - chunkFactor, err := getChunkSize(LegacyChunkMode, 0, 0) - if err != nil { - return nil, err - } - docInChunk := localDocNum / chunkFactor - var dvr *docValueReader - for _, field := range fields { - if fieldIDPlus1, ok = s.fieldsMap[field]; !ok { - continue - } - fieldID := fieldIDPlus1 - 1 - if dvr, ok = dvs.dvrs[fieldID]; ok && dvr != nil { - // check if the chunk is already loaded - if docInChunk != dvr.curChunkNumber() { - err := dvr.loadDvChunk(docInChunk, s) - if err != nil { - return dvs, err - } - } - - _ = dvr.visitDocValues(localDocNum, visitor) - } - } - return dvs, nil -} - -// VisitableDocValueFields returns the list of fields with -// persisted doc value terms ready to be visitable using the -// VisitDocumentFieldTerms method. -func (s *SegmentBase) VisitableDocValueFields() ([]string, error) { - return s.fieldDvNames, nil -} diff --git a/vendor/github.com/blevesearch/zap/v13/enumerator.go b/vendor/github.com/blevesearch/zap/v13/enumerator.go deleted file mode 100644 index bc5b7e6..0000000 --- a/vendor/github.com/blevesearch/zap/v13/enumerator.go +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright (c) 2018 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - - "github.com/couchbase/vellum" -) - -// enumerator provides an ordered traversal of multiple vellum -// iterators. Like JOIN of iterators, the enumerator produces a -// sequence of (key, iteratorIndex, value) tuples, sorted by key ASC, -// then iteratorIndex ASC, where the same key might be seen or -// repeated across multiple child iterators. -type enumerator struct { - itrs []vellum.Iterator - currKs [][]byte - currVs []uint64 - - lowK []byte - lowIdxs []int - lowCurr int -} - -// newEnumerator returns a new enumerator over the vellum Iterators -func newEnumerator(itrs []vellum.Iterator) (*enumerator, error) { - rv := &enumerator{ - itrs: itrs, - currKs: make([][]byte, len(itrs)), - currVs: make([]uint64, len(itrs)), - lowIdxs: make([]int, 0, len(itrs)), - } - for i, itr := range rv.itrs { - rv.currKs[i], rv.currVs[i] = itr.Current() - } - rv.updateMatches(false) - if rv.lowK == nil && len(rv.lowIdxs) == 0 { - return rv, vellum.ErrIteratorDone - } - return rv, nil -} - -// updateMatches maintains the low key matches based on the currKs -func (m *enumerator) updateMatches(skipEmptyKey bool) { - m.lowK = nil - m.lowIdxs = m.lowIdxs[:0] - m.lowCurr = 0 - - for i, key := range m.currKs { - if (key == nil && m.currVs[i] == 0) || // in case of empty iterator - (len(key) == 0 && skipEmptyKey) { // skip empty keys - continue - } - - cmp := bytes.Compare(key, m.lowK) - if cmp < 0 || len(m.lowIdxs) == 0 { - // reached a new low - m.lowK = key - m.lowIdxs = m.lowIdxs[:0] - m.lowIdxs = append(m.lowIdxs, i) - } else if cmp == 0 { - m.lowIdxs = append(m.lowIdxs, i) - } - } -} - -// Current returns the enumerator's current key, iterator-index, and -// value. If the enumerator is not pointing at a valid value (because -// Next returned an error previously), Current will return nil,0,0. -func (m *enumerator) Current() ([]byte, int, uint64) { - var i int - var v uint64 - if m.lowCurr < len(m.lowIdxs) { - i = m.lowIdxs[m.lowCurr] - v = m.currVs[i] - } - return m.lowK, i, v -} - -// GetLowIdxsAndValues will return all of the iterator indices -// which point to the current key, and their corresponding -// values. This can be used by advanced caller which may need -// to peek into these other sets of data before processing. -func (m *enumerator) GetLowIdxsAndValues() ([]int, []uint64) { - values := make([]uint64, 0, len(m.lowIdxs)) - for _, idx := range m.lowIdxs { - values = append(values, m.currVs[idx]) - } - return m.lowIdxs, values -} - -// Next advances the enumerator to the next key/iterator/value result, -// else vellum.ErrIteratorDone is returned. -func (m *enumerator) Next() error { - m.lowCurr += 1 - if m.lowCurr >= len(m.lowIdxs) { - // move all the current low iterators forwards - for _, vi := range m.lowIdxs { - err := m.itrs[vi].Next() - if err != nil && err != vellum.ErrIteratorDone { - return err - } - m.currKs[vi], m.currVs[vi] = m.itrs[vi].Current() - } - // can skip any empty keys encountered at this point - m.updateMatches(true) - } - if m.lowK == nil && len(m.lowIdxs) == 0 { - return vellum.ErrIteratorDone - } - return nil -} - -// Close all the underlying Iterators. The first error, if any, will -// be returned. -func (m *enumerator) Close() error { - var rv error - for _, itr := range m.itrs { - err := itr.Close() - if rv == nil { - rv = err - } - } - return rv -} diff --git a/vendor/github.com/blevesearch/zap/v13/intDecoder.go b/vendor/github.com/blevesearch/zap/v13/intDecoder.go deleted file mode 100644 index 4cd008f..0000000 --- a/vendor/github.com/blevesearch/zap/v13/intDecoder.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright (c) 2019 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "encoding/binary" - "fmt" - - "github.com/blevesearch/bleve/index/scorch/segment" -) - -type chunkedIntDecoder struct { - startOffset uint64 - dataStartOffset uint64 - chunkOffsets []uint64 - curChunkBytes []byte - data []byte - r *segment.MemUvarintReader -} - -func newChunkedIntDecoder(buf []byte, offset uint64) *chunkedIntDecoder { - rv := &chunkedIntDecoder{startOffset: offset, data: buf} - var n, numChunks uint64 - var read int - if offset == termNotEncoded { - numChunks = 0 - } else { - numChunks, read = binary.Uvarint(buf[offset+n : offset+n+binary.MaxVarintLen64]) - } - - n += uint64(read) - if cap(rv.chunkOffsets) >= int(numChunks) { - rv.chunkOffsets = rv.chunkOffsets[:int(numChunks)] - } else { - rv.chunkOffsets = make([]uint64, int(numChunks)) - } - for i := 0; i < int(numChunks); i++ { - rv.chunkOffsets[i], read = binary.Uvarint(buf[offset+n : offset+n+binary.MaxVarintLen64]) - n += uint64(read) - } - rv.dataStartOffset = offset + n - return rv -} - -func (d *chunkedIntDecoder) loadChunk(chunk int) error { - if d.startOffset == termNotEncoded { - d.r = segment.NewMemUvarintReader([]byte(nil)) - return nil - } - - if chunk >= len(d.chunkOffsets) { - return fmt.Errorf("tried to load freq chunk that doesn't exist %d/(%d)", - chunk, len(d.chunkOffsets)) - } - - end, start := d.dataStartOffset, d.dataStartOffset - s, e := readChunkBoundary(chunk, d.chunkOffsets) - start += s - end += e - d.curChunkBytes = d.data[start:end] - if d.r == nil { - d.r = segment.NewMemUvarintReader(d.curChunkBytes) - } else { - d.r.Reset(d.curChunkBytes) - } - - return nil -} - -func (d *chunkedIntDecoder) reset() { - d.startOffset = 0 - d.dataStartOffset = 0 - d.chunkOffsets = d.chunkOffsets[:0] - d.curChunkBytes = d.curChunkBytes[:0] - d.data = d.data[:0] - if d.r != nil { - d.r.Reset([]byte(nil)) - } -} - -func (d *chunkedIntDecoder) isNil() bool { - return d.curChunkBytes == nil -} - -func (d *chunkedIntDecoder) readUvarint() (uint64, error) { - return d.r.ReadUvarint() -} - -func (d *chunkedIntDecoder) SkipUvarint() { - d.r.SkipUvarint() -} - -func (d *chunkedIntDecoder) SkipBytes(count int) { - d.r.SkipBytes(count) -} - -func (d *chunkedIntDecoder) Len() int { - return d.r.Len() -} diff --git a/vendor/github.com/blevesearch/zap/v13/intcoder.go b/vendor/github.com/blevesearch/zap/v13/intcoder.go deleted file mode 100644 index c3c488f..0000000 --- a/vendor/github.com/blevesearch/zap/v13/intcoder.go +++ /dev/null @@ -1,206 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "encoding/binary" - "io" -) - -// We can safely use 0 to represent termNotEncoded since 0 -// could never be a valid address for term location information. -// (stored field index is always non-empty and earlier in the -// file) -const termNotEncoded = 0 - -type chunkedIntCoder struct { - final []byte - chunkSize uint64 - chunkBuf bytes.Buffer - chunkLens []uint64 - currChunk uint64 - - buf []byte -} - -// newChunkedIntCoder returns a new chunk int coder which packs data into -// chunks based on the provided chunkSize and supports up to the specified -// maxDocNum -func newChunkedIntCoder(chunkSize uint64, maxDocNum uint64) *chunkedIntCoder { - total := maxDocNum/chunkSize + 1 - rv := &chunkedIntCoder{ - chunkSize: chunkSize, - chunkLens: make([]uint64, total), - final: make([]byte, 0, 64), - } - - return rv -} - -// Reset lets you reuse this chunked int coder. buffers are reset and reused -// from previous use. you cannot change the chunk size or max doc num. -func (c *chunkedIntCoder) Reset() { - c.final = c.final[:0] - c.chunkBuf.Reset() - c.currChunk = 0 - for i := range c.chunkLens { - c.chunkLens[i] = 0 - } -} - -// SetChunkSize changes the chunk size. It is only valid to do so -// with a new chunkedIntCoder, or immediately after calling Reset() -func (c *chunkedIntCoder) SetChunkSize(chunkSize uint64, maxDocNum uint64) { - total := int(maxDocNum/chunkSize + 1) - c.chunkSize = chunkSize - if cap(c.chunkLens) < total { - c.chunkLens = make([]uint64, total) - } else { - c.chunkLens = c.chunkLens[:total] - } -} - -// Add encodes the provided integers into the correct chunk for the provided -// doc num. You MUST call Add() with increasing docNums. -func (c *chunkedIntCoder) Add(docNum uint64, vals ...uint64) error { - chunk := docNum / c.chunkSize - if chunk != c.currChunk { - // starting a new chunk - c.Close() - c.chunkBuf.Reset() - c.currChunk = chunk - } - - if len(c.buf) < binary.MaxVarintLen64 { - c.buf = make([]byte, binary.MaxVarintLen64) - } - - for _, val := range vals { - wb := binary.PutUvarint(c.buf, val) - _, err := c.chunkBuf.Write(c.buf[:wb]) - if err != nil { - return err - } - } - - return nil -} - -func (c *chunkedIntCoder) AddBytes(docNum uint64, buf []byte) error { - chunk := docNum / c.chunkSize - if chunk != c.currChunk { - // starting a new chunk - c.Close() - c.chunkBuf.Reset() - c.currChunk = chunk - } - - _, err := c.chunkBuf.Write(buf) - return err -} - -// Close indicates you are done calling Add() this allows the final chunk -// to be encoded. -func (c *chunkedIntCoder) Close() { - encodingBytes := c.chunkBuf.Bytes() - c.chunkLens[c.currChunk] = uint64(len(encodingBytes)) - c.final = append(c.final, encodingBytes...) - c.currChunk = uint64(cap(c.chunkLens)) // sentinel to detect double close -} - -// Write commits all the encoded chunked integers to the provided writer. -func (c *chunkedIntCoder) Write(w io.Writer) (int, error) { - bufNeeded := binary.MaxVarintLen64 * (1 + len(c.chunkLens)) - if len(c.buf) < bufNeeded { - c.buf = make([]byte, bufNeeded) - } - buf := c.buf - - // convert the chunk lengths into chunk offsets - chunkOffsets := modifyLengthsToEndOffsets(c.chunkLens) - - // write out the number of chunks & each chunk offsets - n := binary.PutUvarint(buf, uint64(len(chunkOffsets))) - for _, chunkOffset := range chunkOffsets { - n += binary.PutUvarint(buf[n:], chunkOffset) - } - - tw, err := w.Write(buf[:n]) - if err != nil { - return tw, err - } - - // write out the data - nw, err := w.Write(c.final) - tw += nw - if err != nil { - return tw, err - } - return tw, nil -} - -// writeAt commits all the encoded chunked integers to the provided writer -// and returns the starting offset, total bytes written and an error -func (c *chunkedIntCoder) writeAt(w io.Writer) (uint64, int, error) { - startOffset := uint64(termNotEncoded) - if len(c.final) <= 0 { - return startOffset, 0, nil - } - - if chw := w.(*CountHashWriter); chw != nil { - startOffset = uint64(chw.Count()) - } - - tw, err := c.Write(w) - return startOffset, tw, err -} - -func (c *chunkedIntCoder) FinalSize() int { - return len(c.final) -} - -// modifyLengthsToEndOffsets converts the chunk length array -// to a chunk offset array. The readChunkBoundary -// will figure out the start and end of every chunk from -// these offsets. Starting offset of i'th index is stored -// in i-1'th position except for 0'th index and ending offset -// is stored at i'th index position. -// For 0'th element, starting position is always zero. -// eg: -// Lens -> 5 5 5 5 => 5 10 15 20 -// Lens -> 0 5 0 5 => 0 5 5 10 -// Lens -> 0 0 0 5 => 0 0 0 5 -// Lens -> 5 0 0 0 => 5 5 5 5 -// Lens -> 0 5 0 0 => 0 5 5 5 -// Lens -> 0 0 5 0 => 0 0 5 5 -func modifyLengthsToEndOffsets(lengths []uint64) []uint64 { - var runningOffset uint64 - var index, i int - for i = 1; i <= len(lengths); i++ { - runningOffset += lengths[i-1] - lengths[index] = runningOffset - index++ - } - return lengths -} - -func readChunkBoundary(chunk int, offsets []uint64) (uint64, uint64) { - var start uint64 - if chunk > 0 { - start = offsets[chunk-1] - } - return start, offsets[chunk] -} diff --git a/vendor/github.com/blevesearch/zap/v13/merge.go b/vendor/github.com/blevesearch/zap/v13/merge.go deleted file mode 100644 index 805100f..0000000 --- a/vendor/github.com/blevesearch/zap/v13/merge.go +++ /dev/null @@ -1,847 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bufio" - "bytes" - "encoding/binary" - "fmt" - "math" - "os" - "sort" - - "github.com/RoaringBitmap/roaring" - seg "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/couchbase/vellum" - "github.com/golang/snappy" -) - -var DefaultFileMergerBufferSize = 1024 * 1024 - -const docDropped = math.MaxUint64 // sentinel docNum to represent a deleted doc - -// Merge takes a slice of segments and bit masks describing which -// documents may be dropped, and creates a new segment containing the -// remaining data. This new segment is built at the specified path. -func (*ZapPlugin) Merge(segments []seg.Segment, drops []*roaring.Bitmap, path string, - closeCh chan struct{}, s seg.StatsReporter) ( - [][]uint64, uint64, error) { - - segmentBases := make([]*SegmentBase, len(segments)) - for segmenti, segment := range segments { - switch segmentx := segment.(type) { - case *Segment: - segmentBases[segmenti] = &segmentx.SegmentBase - case *SegmentBase: - segmentBases[segmenti] = segmentx - default: - panic(fmt.Sprintf("oops, unexpected segment type: %T", segment)) - } - } - return mergeSegmentBases(segmentBases, drops, path, DefaultChunkMode, closeCh, s) -} - -func mergeSegmentBases(segmentBases []*SegmentBase, drops []*roaring.Bitmap, path string, - chunkMode uint32, closeCh chan struct{}, s seg.StatsReporter) ( - [][]uint64, uint64, error) { - flag := os.O_RDWR | os.O_CREATE - - f, err := os.OpenFile(path, flag, 0600) - if err != nil { - return nil, 0, err - } - - cleanup := func() { - _ = f.Close() - _ = os.Remove(path) - } - - // buffer the output - br := bufio.NewWriterSize(f, DefaultFileMergerBufferSize) - - // wrap it for counting (tracking offsets) - cr := NewCountHashWriterWithStatsReporter(br, s) - - newDocNums, numDocs, storedIndexOffset, fieldsIndexOffset, docValueOffset, _, _, _, err := - MergeToWriter(segmentBases, drops, chunkMode, cr, closeCh) - if err != nil { - cleanup() - return nil, 0, err - } - - err = persistFooter(numDocs, storedIndexOffset, fieldsIndexOffset, - docValueOffset, chunkMode, cr.Sum32(), cr) - if err != nil { - cleanup() - return nil, 0, err - } - - err = br.Flush() - if err != nil { - cleanup() - return nil, 0, err - } - - err = f.Sync() - if err != nil { - cleanup() - return nil, 0, err - } - - err = f.Close() - if err != nil { - cleanup() - return nil, 0, err - } - - return newDocNums, uint64(cr.Count()), nil -} - -func MergeToWriter(segments []*SegmentBase, drops []*roaring.Bitmap, - chunkMode uint32, cr *CountHashWriter, closeCh chan struct{}) ( - newDocNums [][]uint64, - numDocs, storedIndexOffset, fieldsIndexOffset, docValueOffset uint64, - dictLocs []uint64, fieldsInv []string, fieldsMap map[string]uint16, - err error) { - docValueOffset = uint64(fieldNotUninverted) - - var fieldsSame bool - fieldsSame, fieldsInv = mergeFields(segments) - fieldsMap = mapFields(fieldsInv) - - numDocs = computeNewDocCount(segments, drops) - - if isClosed(closeCh) { - return nil, 0, 0, 0, 0, nil, nil, nil, seg.ErrClosed - } - - if numDocs > 0 { - storedIndexOffset, newDocNums, err = mergeStoredAndRemap(segments, drops, - fieldsMap, fieldsInv, fieldsSame, numDocs, cr, closeCh) - if err != nil { - return nil, 0, 0, 0, 0, nil, nil, nil, err - } - - dictLocs, docValueOffset, err = persistMergedRest(segments, drops, - fieldsInv, fieldsMap, fieldsSame, - newDocNums, numDocs, chunkMode, cr, closeCh) - if err != nil { - return nil, 0, 0, 0, 0, nil, nil, nil, err - } - } else { - dictLocs = make([]uint64, len(fieldsInv)) - } - - fieldsIndexOffset, err = persistFields(fieldsInv, cr, dictLocs) - if err != nil { - return nil, 0, 0, 0, 0, nil, nil, nil, err - } - - return newDocNums, numDocs, storedIndexOffset, fieldsIndexOffset, docValueOffset, dictLocs, fieldsInv, fieldsMap, nil -} - -// mapFields takes the fieldsInv list and returns a map of fieldName -// to fieldID+1 -func mapFields(fields []string) map[string]uint16 { - rv := make(map[string]uint16, len(fields)) - for i, fieldName := range fields { - rv[fieldName] = uint16(i) + 1 - } - return rv -} - -// computeNewDocCount determines how many documents will be in the newly -// merged segment when obsoleted docs are dropped -func computeNewDocCount(segments []*SegmentBase, drops []*roaring.Bitmap) uint64 { - var newDocCount uint64 - for segI, segment := range segments { - newDocCount += segment.numDocs - if drops[segI] != nil { - newDocCount -= drops[segI].GetCardinality() - } - } - return newDocCount -} - -func persistMergedRest(segments []*SegmentBase, dropsIn []*roaring.Bitmap, - fieldsInv []string, fieldsMap map[string]uint16, fieldsSame bool, - newDocNumsIn [][]uint64, newSegDocCount uint64, chunkMode uint32, - w *CountHashWriter, closeCh chan struct{}) ([]uint64, uint64, error) { - - var bufMaxVarintLen64 []byte = make([]byte, binary.MaxVarintLen64) - var bufLoc []uint64 - - var postings *PostingsList - var postItr *PostingsIterator - - rv := make([]uint64, len(fieldsInv)) - fieldDvLocsStart := make([]uint64, len(fieldsInv)) - fieldDvLocsEnd := make([]uint64, len(fieldsInv)) - - // these int coders are initialized with chunk size 1024 - // however this will be reset to the correct chunk size - // while processing each individual field-term section - tfEncoder := newChunkedIntCoder(1024, newSegDocCount-1) - locEncoder := newChunkedIntCoder(1024, newSegDocCount-1) - - var vellumBuf bytes.Buffer - newVellum, err := vellum.New(&vellumBuf, nil) - if err != nil { - return nil, 0, err - } - - newRoaring := roaring.NewBitmap() - - // for each field - for fieldID, fieldName := range fieldsInv { - - // collect FST iterators from all active segments for this field - var newDocNums [][]uint64 - var drops []*roaring.Bitmap - var dicts []*Dictionary - var itrs []vellum.Iterator - - var segmentsInFocus []*SegmentBase - - for segmentI, segment := range segments { - - // check for the closure in meantime - if isClosed(closeCh) { - return nil, 0, seg.ErrClosed - } - - dict, err2 := segment.dictionary(fieldName) - if err2 != nil { - return nil, 0, err2 - } - if dict != nil && dict.fst != nil { - itr, err2 := dict.fst.Iterator(nil, nil) - if err2 != nil && err2 != vellum.ErrIteratorDone { - return nil, 0, err2 - } - if itr != nil { - newDocNums = append(newDocNums, newDocNumsIn[segmentI]) - if dropsIn[segmentI] != nil && !dropsIn[segmentI].IsEmpty() { - drops = append(drops, dropsIn[segmentI]) - } else { - drops = append(drops, nil) - } - dicts = append(dicts, dict) - itrs = append(itrs, itr) - segmentsInFocus = append(segmentsInFocus, segment) - } - } - } - - var prevTerm []byte - - newRoaring.Clear() - - var lastDocNum, lastFreq, lastNorm uint64 - - // determines whether to use "1-hit" encoding optimization - // when a term appears in only 1 doc, with no loc info, - // has freq of 1, and the docNum fits into 31-bits - use1HitEncoding := func(termCardinality uint64) (bool, uint64, uint64) { - if termCardinality == uint64(1) && locEncoder.FinalSize() <= 0 { - docNum := uint64(newRoaring.Minimum()) - if under32Bits(docNum) && docNum == lastDocNum && lastFreq == 1 { - return true, docNum, lastNorm - } - } - return false, 0, 0 - } - - finishTerm := func(term []byte) error { - tfEncoder.Close() - locEncoder.Close() - - postingsOffset, err := writePostings(newRoaring, - tfEncoder, locEncoder, use1HitEncoding, w, bufMaxVarintLen64) - if err != nil { - return err - } - - if postingsOffset > 0 { - err = newVellum.Insert(term, postingsOffset) - if err != nil { - return err - } - } - - newRoaring.Clear() - - tfEncoder.Reset() - locEncoder.Reset() - - lastDocNum = 0 - lastFreq = 0 - lastNorm = 0 - - return nil - } - - enumerator, err := newEnumerator(itrs) - - for err == nil { - term, itrI, postingsOffset := enumerator.Current() - - if !bytes.Equal(prevTerm, term) { - // check for the closure in meantime - if isClosed(closeCh) { - return nil, 0, seg.ErrClosed - } - - // if the term changed, write out the info collected - // for the previous term - err = finishTerm(prevTerm) - if err != nil { - return nil, 0, err - } - } - if !bytes.Equal(prevTerm, term) || prevTerm == nil { - // compute cardinality of field-term in new seg - var newCard uint64 - lowItrIdxs, lowItrVals := enumerator.GetLowIdxsAndValues() - for i, idx := range lowItrIdxs { - pl, err := dicts[idx].postingsListFromOffset(lowItrVals[i], drops[idx], nil) - if err != nil { - return nil, 0, err - } - newCard += pl.Count() - } - // compute correct chunk size with this - chunkSize, err := getChunkSize(chunkMode, newCard, newSegDocCount) - if err != nil { - return nil, 0, err - } - // update encoders chunk - tfEncoder.SetChunkSize(chunkSize, newSegDocCount-1) - locEncoder.SetChunkSize(chunkSize, newSegDocCount-1) - } - - postings, err = dicts[itrI].postingsListFromOffset( - postingsOffset, drops[itrI], postings) - if err != nil { - return nil, 0, err - } - - postItr = postings.iterator(true, true, true, postItr) - - // can no longer optimize by copying, since chunk factor could have changed - lastDocNum, lastFreq, lastNorm, bufLoc, err = mergeTermFreqNormLocs( - fieldsMap, term, postItr, newDocNums[itrI], newRoaring, - tfEncoder, locEncoder, bufLoc) - - if err != nil { - return nil, 0, err - } - - prevTerm = prevTerm[:0] // copy to prevTerm in case Next() reuses term mem - prevTerm = append(prevTerm, term...) - - err = enumerator.Next() - } - if err != vellum.ErrIteratorDone { - return nil, 0, err - } - - err = finishTerm(prevTerm) - if err != nil { - return nil, 0, err - } - - dictOffset := uint64(w.Count()) - - err = newVellum.Close() - if err != nil { - return nil, 0, err - } - vellumData := vellumBuf.Bytes() - - // write out the length of the vellum data - n := binary.PutUvarint(bufMaxVarintLen64, uint64(len(vellumData))) - _, err = w.Write(bufMaxVarintLen64[:n]) - if err != nil { - return nil, 0, err - } - - // write this vellum to disk - _, err = w.Write(vellumData) - if err != nil { - return nil, 0, err - } - - rv[fieldID] = dictOffset - - // get the field doc value offset (start) - fieldDvLocsStart[fieldID] = uint64(w.Count()) - - // update the field doc values - // NOTE: doc values continue to use legacy chunk mode - chunkSize, err := getChunkSize(LegacyChunkMode, 0, 0) - if err != nil { - return nil, 0, err - } - fdvEncoder := newChunkedContentCoder(chunkSize, newSegDocCount-1, w, true) - - fdvReadersAvailable := false - var dvIterClone *docValueReader - for segmentI, segment := range segmentsInFocus { - // check for the closure in meantime - if isClosed(closeCh) { - return nil, 0, seg.ErrClosed - } - - fieldIDPlus1 := uint16(segment.fieldsMap[fieldName]) - if dvIter, exists := segment.fieldDvReaders[fieldIDPlus1-1]; exists && - dvIter != nil { - fdvReadersAvailable = true - dvIterClone = dvIter.cloneInto(dvIterClone) - err = dvIterClone.iterateAllDocValues(segment, func(docNum uint64, terms []byte) error { - if newDocNums[segmentI][docNum] == docDropped { - return nil - } - err := fdvEncoder.Add(newDocNums[segmentI][docNum], terms) - if err != nil { - return err - } - return nil - }) - if err != nil { - return nil, 0, err - } - } - } - - if fdvReadersAvailable { - err = fdvEncoder.Close() - if err != nil { - return nil, 0, err - } - - // persist the doc value details for this field - _, err = fdvEncoder.Write() - if err != nil { - return nil, 0, err - } - - // get the field doc value offset (end) - fieldDvLocsEnd[fieldID] = uint64(w.Count()) - } else { - fieldDvLocsStart[fieldID] = fieldNotUninverted - fieldDvLocsEnd[fieldID] = fieldNotUninverted - } - - // reset vellum buffer and vellum builder - vellumBuf.Reset() - err = newVellum.Reset(&vellumBuf) - if err != nil { - return nil, 0, err - } - } - - fieldDvLocsOffset := uint64(w.Count()) - - buf := bufMaxVarintLen64 - for i := 0; i < len(fieldDvLocsStart); i++ { - n := binary.PutUvarint(buf, fieldDvLocsStart[i]) - _, err := w.Write(buf[:n]) - if err != nil { - return nil, 0, err - } - n = binary.PutUvarint(buf, fieldDvLocsEnd[i]) - _, err = w.Write(buf[:n]) - if err != nil { - return nil, 0, err - } - } - - return rv, fieldDvLocsOffset, nil -} - -func mergeTermFreqNormLocs(fieldsMap map[string]uint16, term []byte, postItr *PostingsIterator, - newDocNums []uint64, newRoaring *roaring.Bitmap, - tfEncoder *chunkedIntCoder, locEncoder *chunkedIntCoder, bufLoc []uint64) ( - lastDocNum uint64, lastFreq uint64, lastNorm uint64, bufLocOut []uint64, err error) { - next, err := postItr.Next() - for next != nil && err == nil { - hitNewDocNum := newDocNums[next.Number()] - if hitNewDocNum == docDropped { - return 0, 0, 0, nil, fmt.Errorf("see hit with dropped docNum") - } - - newRoaring.Add(uint32(hitNewDocNum)) - - nextFreq := next.Frequency() - nextNorm := uint64(math.Float32bits(float32(next.Norm()))) - - locs := next.Locations() - - err = tfEncoder.Add(hitNewDocNum, - encodeFreqHasLocs(nextFreq, len(locs) > 0), nextNorm) - if err != nil { - return 0, 0, 0, nil, err - } - - if len(locs) > 0 { - numBytesLocs := 0 - for _, loc := range locs { - ap := loc.ArrayPositions() - numBytesLocs += totalUvarintBytes(uint64(fieldsMap[loc.Field()]-1), - loc.Pos(), loc.Start(), loc.End(), uint64(len(ap)), ap) - } - - err = locEncoder.Add(hitNewDocNum, uint64(numBytesLocs)) - if err != nil { - return 0, 0, 0, nil, err - } - - for _, loc := range locs { - ap := loc.ArrayPositions() - if cap(bufLoc) < 5+len(ap) { - bufLoc = make([]uint64, 0, 5+len(ap)) - } - args := bufLoc[0:5] - args[0] = uint64(fieldsMap[loc.Field()] - 1) - args[1] = loc.Pos() - args[2] = loc.Start() - args[3] = loc.End() - args[4] = uint64(len(ap)) - args = append(args, ap...) - err = locEncoder.Add(hitNewDocNum, args...) - if err != nil { - return 0, 0, 0, nil, err - } - } - } - - lastDocNum = hitNewDocNum - lastFreq = nextFreq - lastNorm = nextNorm - - next, err = postItr.Next() - } - - return lastDocNum, lastFreq, lastNorm, bufLoc, err -} - -func writePostings(postings *roaring.Bitmap, tfEncoder, locEncoder *chunkedIntCoder, - use1HitEncoding func(uint64) (bool, uint64, uint64), - w *CountHashWriter, bufMaxVarintLen64 []byte) ( - offset uint64, err error) { - termCardinality := postings.GetCardinality() - if termCardinality <= 0 { - return 0, nil - } - - if use1HitEncoding != nil { - encodeAs1Hit, docNum1Hit, normBits1Hit := use1HitEncoding(termCardinality) - if encodeAs1Hit { - return FSTValEncode1Hit(docNum1Hit, normBits1Hit), nil - } - } - - var tfOffset uint64 - tfOffset, _, err = tfEncoder.writeAt(w) - if err != nil { - return 0, err - } - - var locOffset uint64 - locOffset, _, err = locEncoder.writeAt(w) - if err != nil { - return 0, err - } - - postingsOffset := uint64(w.Count()) - - n := binary.PutUvarint(bufMaxVarintLen64, tfOffset) - _, err = w.Write(bufMaxVarintLen64[:n]) - if err != nil { - return 0, err - } - - n = binary.PutUvarint(bufMaxVarintLen64, locOffset) - _, err = w.Write(bufMaxVarintLen64[:n]) - if err != nil { - return 0, err - } - - _, err = writeRoaringWithLen(postings, w, bufMaxVarintLen64) - if err != nil { - return 0, err - } - - return postingsOffset, nil -} - -type varintEncoder func(uint64) (int, error) - -func mergeStoredAndRemap(segments []*SegmentBase, drops []*roaring.Bitmap, - fieldsMap map[string]uint16, fieldsInv []string, fieldsSame bool, newSegDocCount uint64, - w *CountHashWriter, closeCh chan struct{}) (uint64, [][]uint64, error) { - var rv [][]uint64 // The remapped or newDocNums for each segment. - - var newDocNum uint64 - - var curr int - var data, compressed []byte - var metaBuf bytes.Buffer - varBuf := make([]byte, binary.MaxVarintLen64) - metaEncode := func(val uint64) (int, error) { - wb := binary.PutUvarint(varBuf, val) - return metaBuf.Write(varBuf[:wb]) - } - - vals := make([][][]byte, len(fieldsInv)) - typs := make([][]byte, len(fieldsInv)) - poss := make([][][]uint64, len(fieldsInv)) - - var posBuf []uint64 - - docNumOffsets := make([]uint64, newSegDocCount) - - vdc := visitDocumentCtxPool.Get().(*visitDocumentCtx) - defer visitDocumentCtxPool.Put(vdc) - - // for each segment - for segI, segment := range segments { - // check for the closure in meantime - if isClosed(closeCh) { - return 0, nil, seg.ErrClosed - } - - segNewDocNums := make([]uint64, segment.numDocs) - - dropsI := drops[segI] - - // optimize when the field mapping is the same across all - // segments and there are no deletions, via byte-copying - // of stored docs bytes directly to the writer - if fieldsSame && (dropsI == nil || dropsI.GetCardinality() == 0) { - err := segment.copyStoredDocs(newDocNum, docNumOffsets, w) - if err != nil { - return 0, nil, err - } - - for i := uint64(0); i < segment.numDocs; i++ { - segNewDocNums[i] = newDocNum - newDocNum++ - } - rv = append(rv, segNewDocNums) - - continue - } - - // for each doc num - for docNum := uint64(0); docNum < segment.numDocs; docNum++ { - // TODO: roaring's API limits docNums to 32-bits? - if dropsI != nil && dropsI.Contains(uint32(docNum)) { - segNewDocNums[docNum] = docDropped - continue - } - - segNewDocNums[docNum] = newDocNum - - curr = 0 - metaBuf.Reset() - data = data[:0] - - posTemp := posBuf - - // collect all the data - for i := 0; i < len(fieldsInv); i++ { - vals[i] = vals[i][:0] - typs[i] = typs[i][:0] - poss[i] = poss[i][:0] - } - err := segment.visitDocument(vdc, docNum, func(field string, typ byte, value []byte, pos []uint64) bool { - fieldID := int(fieldsMap[field]) - 1 - vals[fieldID] = append(vals[fieldID], value) - typs[fieldID] = append(typs[fieldID], typ) - - // copy array positions to preserve them beyond the scope of this callback - var curPos []uint64 - if len(pos) > 0 { - if cap(posTemp) < len(pos) { - posBuf = make([]uint64, len(pos)*len(fieldsInv)) - posTemp = posBuf - } - curPos = posTemp[0:len(pos)] - copy(curPos, pos) - posTemp = posTemp[len(pos):] - } - poss[fieldID] = append(poss[fieldID], curPos) - - return true - }) - if err != nil { - return 0, nil, err - } - - // _id field special case optimizes ExternalID() lookups - idFieldVal := vals[uint16(0)][0] - _, err = metaEncode(uint64(len(idFieldVal))) - if err != nil { - return 0, nil, err - } - - // now walk the non-"_id" fields in order - for fieldID := 1; fieldID < len(fieldsInv); fieldID++ { - storedFieldValues := vals[fieldID] - - stf := typs[fieldID] - spf := poss[fieldID] - - var err2 error - curr, data, err2 = persistStoredFieldValues(fieldID, - storedFieldValues, stf, spf, curr, metaEncode, data) - if err2 != nil { - return 0, nil, err2 - } - } - - metaBytes := metaBuf.Bytes() - - compressed = snappy.Encode(compressed[:cap(compressed)], data) - - // record where we're about to start writing - docNumOffsets[newDocNum] = uint64(w.Count()) - - // write out the meta len and compressed data len - _, err = writeUvarints(w, - uint64(len(metaBytes)), - uint64(len(idFieldVal)+len(compressed))) - if err != nil { - return 0, nil, err - } - // now write the meta - _, err = w.Write(metaBytes) - if err != nil { - return 0, nil, err - } - // now write the _id field val (counted as part of the 'compressed' data) - _, err = w.Write(idFieldVal) - if err != nil { - return 0, nil, err - } - // now write the compressed data - _, err = w.Write(compressed) - if err != nil { - return 0, nil, err - } - - newDocNum++ - } - - rv = append(rv, segNewDocNums) - } - - // return value is the start of the stored index - storedIndexOffset := uint64(w.Count()) - - // now write out the stored doc index - for _, docNumOffset := range docNumOffsets { - err := binary.Write(w, binary.BigEndian, docNumOffset) - if err != nil { - return 0, nil, err - } - } - - return storedIndexOffset, rv, nil -} - -// copyStoredDocs writes out a segment's stored doc info, optimized by -// using a single Write() call for the entire set of bytes. The -// newDocNumOffsets is filled with the new offsets for each doc. -func (s *SegmentBase) copyStoredDocs(newDocNum uint64, newDocNumOffsets []uint64, - w *CountHashWriter) error { - if s.numDocs <= 0 { - return nil - } - - indexOffset0, storedOffset0, _, _, _ := - s.getDocStoredOffsets(0) // the segment's first doc - - indexOffsetN, storedOffsetN, readN, metaLenN, dataLenN := - s.getDocStoredOffsets(s.numDocs - 1) // the segment's last doc - - storedOffset0New := uint64(w.Count()) - - storedBytes := s.mem[storedOffset0 : storedOffsetN+readN+metaLenN+dataLenN] - _, err := w.Write(storedBytes) - if err != nil { - return err - } - - // remap the storedOffset's for the docs into new offsets relative - // to storedOffset0New, filling the given docNumOffsetsOut array - for indexOffset := indexOffset0; indexOffset <= indexOffsetN; indexOffset += 8 { - storedOffset := binary.BigEndian.Uint64(s.mem[indexOffset : indexOffset+8]) - storedOffsetNew := storedOffset - storedOffset0 + storedOffset0New - newDocNumOffsets[newDocNum] = storedOffsetNew - newDocNum += 1 - } - - return nil -} - -// mergeFields builds a unified list of fields used across all the -// input segments, and computes whether the fields are the same across -// segments (which depends on fields to be sorted in the same way -// across segments) -func mergeFields(segments []*SegmentBase) (bool, []string) { - fieldsSame := true - - var segment0Fields []string - if len(segments) > 0 { - segment0Fields = segments[0].Fields() - } - - fieldsExist := map[string]struct{}{} - for _, segment := range segments { - fields := segment.Fields() - for fieldi, field := range fields { - fieldsExist[field] = struct{}{} - if len(segment0Fields) != len(fields) || segment0Fields[fieldi] != field { - fieldsSame = false - } - } - } - - rv := make([]string, 0, len(fieldsExist)) - // ensure _id stays first - rv = append(rv, "_id") - for k := range fieldsExist { - if k != "_id" { - rv = append(rv, k) - } - } - - sort.Strings(rv[1:]) // leave _id as first - - return fieldsSame, rv -} - -func isClosed(closeCh chan struct{}) bool { - select { - case <-closeCh: - return true - default: - return false - } -} diff --git a/vendor/github.com/blevesearch/zap/v13/new.go b/vendor/github.com/blevesearch/zap/v13/new.go deleted file mode 100644 index 9815818..0000000 --- a/vendor/github.com/blevesearch/zap/v13/new.go +++ /dev/null @@ -1,860 +0,0 @@ -// Copyright (c) 2018 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "encoding/binary" - "math" - "sort" - "sync" - - "github.com/RoaringBitmap/roaring" - "github.com/blevesearch/bleve/analysis" - "github.com/blevesearch/bleve/document" - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/couchbase/vellum" - "github.com/golang/snappy" -) - -var NewSegmentBufferNumResultsBump int = 100 -var NewSegmentBufferNumResultsFactor float64 = 1.0 -var NewSegmentBufferAvgBytesPerDocFactor float64 = 1.0 - -// ValidateDocFields can be set by applications to perform additional checks -// on fields in a document being added to a new segment, by default it does -// nothing. -// This API is experimental and may be removed at any time. -var ValidateDocFields = func(field document.Field) error { - return nil -} - -// AnalysisResultsToSegmentBase produces an in-memory zap-encoded -// SegmentBase from analysis results -func (z *ZapPlugin) New(results []*index.AnalysisResult) ( - segment.Segment, uint64, error) { - return z.newWithChunkMode(results, DefaultChunkMode) -} - -func (*ZapPlugin) newWithChunkMode(results []*index.AnalysisResult, - chunkMode uint32) (segment.Segment, uint64, error) { - s := interimPool.Get().(*interim) - - var br bytes.Buffer - if s.lastNumDocs > 0 { - // use previous results to initialize the buf with an estimate - // size, but note that the interim instance comes from a - // global interimPool, so multiple scorch instances indexing - // different docs can lead to low quality estimates - estimateAvgBytesPerDoc := int(float64(s.lastOutSize/s.lastNumDocs) * - NewSegmentBufferNumResultsFactor) - estimateNumResults := int(float64(len(results)+NewSegmentBufferNumResultsBump) * - NewSegmentBufferAvgBytesPerDocFactor) - br.Grow(estimateAvgBytesPerDoc * estimateNumResults) - } - - s.results = results - s.chunkMode = chunkMode - s.w = NewCountHashWriter(&br) - - storedIndexOffset, fieldsIndexOffset, fdvIndexOffset, dictOffsets, - err := s.convert() - if err != nil { - return nil, uint64(0), err - } - - sb, err := InitSegmentBase(br.Bytes(), s.w.Sum32(), chunkMode, - s.FieldsMap, s.FieldsInv, uint64(len(results)), - storedIndexOffset, fieldsIndexOffset, fdvIndexOffset, dictOffsets) - - if err == nil && s.reset() == nil { - s.lastNumDocs = len(results) - s.lastOutSize = len(br.Bytes()) - interimPool.Put(s) - } - - return sb, uint64(len(br.Bytes())), err -} - -var interimPool = sync.Pool{New: func() interface{} { return &interim{} }} - -// interim holds temporary working data used while converting from -// analysis results to a zap-encoded segment -type interim struct { - results []*index.AnalysisResult - - chunkMode uint32 - - w *CountHashWriter - - // FieldsMap adds 1 to field id to avoid zero value issues - // name -> field id + 1 - FieldsMap map[string]uint16 - - // FieldsInv is the inverse of FieldsMap - // field id -> name - FieldsInv []string - - // Term dictionaries for each field - // field id -> term -> postings list id + 1 - Dicts []map[string]uint64 - - // Terms for each field, where terms are sorted ascending - // field id -> []term - DictKeys [][]string - - // Fields whose IncludeDocValues is true - // field id -> bool - IncludeDocValues []bool - - // postings id -> bitmap of docNums - Postings []*roaring.Bitmap - - // postings id -> freq/norm's, one for each docNum in postings - FreqNorms [][]interimFreqNorm - freqNormsBacking []interimFreqNorm - - // postings id -> locs, one for each freq - Locs [][]interimLoc - locsBacking []interimLoc - - numTermsPerPostingsList []int // key is postings list id - numLocsPerPostingsList []int // key is postings list id - - builder *vellum.Builder - builderBuf bytes.Buffer - - metaBuf bytes.Buffer - - tmp0 []byte - tmp1 []byte - - lastNumDocs int - lastOutSize int -} - -func (s *interim) reset() (err error) { - s.results = nil - s.chunkMode = 0 - s.w = nil - s.FieldsMap = nil - s.FieldsInv = nil - for i := range s.Dicts { - s.Dicts[i] = nil - } - s.Dicts = s.Dicts[:0] - for i := range s.DictKeys { - s.DictKeys[i] = s.DictKeys[i][:0] - } - s.DictKeys = s.DictKeys[:0] - for i := range s.IncludeDocValues { - s.IncludeDocValues[i] = false - } - s.IncludeDocValues = s.IncludeDocValues[:0] - for _, idn := range s.Postings { - idn.Clear() - } - s.Postings = s.Postings[:0] - s.FreqNorms = s.FreqNorms[:0] - for i := range s.freqNormsBacking { - s.freqNormsBacking[i] = interimFreqNorm{} - } - s.freqNormsBacking = s.freqNormsBacking[:0] - s.Locs = s.Locs[:0] - for i := range s.locsBacking { - s.locsBacking[i] = interimLoc{} - } - s.locsBacking = s.locsBacking[:0] - s.numTermsPerPostingsList = s.numTermsPerPostingsList[:0] - s.numLocsPerPostingsList = s.numLocsPerPostingsList[:0] - s.builderBuf.Reset() - if s.builder != nil { - err = s.builder.Reset(&s.builderBuf) - } - s.metaBuf.Reset() - s.tmp0 = s.tmp0[:0] - s.tmp1 = s.tmp1[:0] - s.lastNumDocs = 0 - s.lastOutSize = 0 - - return err -} - -func (s *interim) grabBuf(size int) []byte { - buf := s.tmp0 - if cap(buf) < size { - buf = make([]byte, size) - s.tmp0 = buf - } - return buf[0:size] -} - -type interimStoredField struct { - vals [][]byte - typs []byte - arrayposs [][]uint64 // array positions -} - -type interimFreqNorm struct { - freq uint64 - norm float32 - numLocs int -} - -type interimLoc struct { - fieldID uint16 - pos uint64 - start uint64 - end uint64 - arrayposs []uint64 -} - -func (s *interim) convert() (uint64, uint64, uint64, []uint64, error) { - s.FieldsMap = map[string]uint16{} - - s.getOrDefineField("_id") // _id field is fieldID 0 - - for _, result := range s.results { - for _, field := range result.Document.CompositeFields { - s.getOrDefineField(field.Name()) - } - for _, field := range result.Document.Fields { - s.getOrDefineField(field.Name()) - } - } - - sort.Strings(s.FieldsInv[1:]) // keep _id as first field - - for fieldID, fieldName := range s.FieldsInv { - s.FieldsMap[fieldName] = uint16(fieldID + 1) - } - - if cap(s.IncludeDocValues) >= len(s.FieldsInv) { - s.IncludeDocValues = s.IncludeDocValues[:len(s.FieldsInv)] - } else { - s.IncludeDocValues = make([]bool, len(s.FieldsInv)) - } - - s.prepareDicts() - - for _, dict := range s.DictKeys { - sort.Strings(dict) - } - - s.processDocuments() - - storedIndexOffset, err := s.writeStoredFields() - if err != nil { - return 0, 0, 0, nil, err - } - - var fdvIndexOffset uint64 - var dictOffsets []uint64 - - if len(s.results) > 0 { - fdvIndexOffset, dictOffsets, err = s.writeDicts() - if err != nil { - return 0, 0, 0, nil, err - } - } else { - dictOffsets = make([]uint64, len(s.FieldsInv)) - } - - fieldsIndexOffset, err := persistFields(s.FieldsInv, s.w, dictOffsets) - if err != nil { - return 0, 0, 0, nil, err - } - - return storedIndexOffset, fieldsIndexOffset, fdvIndexOffset, dictOffsets, nil -} - -func (s *interim) getOrDefineField(fieldName string) int { - fieldIDPlus1, exists := s.FieldsMap[fieldName] - if !exists { - fieldIDPlus1 = uint16(len(s.FieldsInv) + 1) - s.FieldsMap[fieldName] = fieldIDPlus1 - s.FieldsInv = append(s.FieldsInv, fieldName) - - s.Dicts = append(s.Dicts, make(map[string]uint64)) - - n := len(s.DictKeys) - if n < cap(s.DictKeys) { - s.DictKeys = s.DictKeys[:n+1] - s.DictKeys[n] = s.DictKeys[n][:0] - } else { - s.DictKeys = append(s.DictKeys, []string(nil)) - } - } - - return int(fieldIDPlus1 - 1) -} - -// fill Dicts and DictKeys from analysis results -func (s *interim) prepareDicts() { - var pidNext int - - var totTFs int - var totLocs int - - visitField := func(fieldID uint16, tfs analysis.TokenFrequencies) { - dict := s.Dicts[fieldID] - dictKeys := s.DictKeys[fieldID] - - for term, tf := range tfs { - pidPlus1, exists := dict[term] - if !exists { - pidNext++ - pidPlus1 = uint64(pidNext) - - dict[term] = pidPlus1 - dictKeys = append(dictKeys, term) - - s.numTermsPerPostingsList = append(s.numTermsPerPostingsList, 0) - s.numLocsPerPostingsList = append(s.numLocsPerPostingsList, 0) - } - - pid := pidPlus1 - 1 - - s.numTermsPerPostingsList[pid] += 1 - s.numLocsPerPostingsList[pid] += len(tf.Locations) - - totLocs += len(tf.Locations) - } - - totTFs += len(tfs) - - s.DictKeys[fieldID] = dictKeys - } - - for _, result := range s.results { - // walk each composite field - for _, field := range result.Document.CompositeFields { - fieldID := uint16(s.getOrDefineField(field.Name())) - _, tf := field.Analyze() - visitField(fieldID, tf) - } - - // walk each field - for i, field := range result.Document.Fields { - fieldID := uint16(s.getOrDefineField(field.Name())) - tf := result.Analyzed[i] - visitField(fieldID, tf) - } - } - - numPostingsLists := pidNext - - if cap(s.Postings) >= numPostingsLists { - s.Postings = s.Postings[:numPostingsLists] - } else { - postings := make([]*roaring.Bitmap, numPostingsLists) - copy(postings, s.Postings[:cap(s.Postings)]) - for i := 0; i < numPostingsLists; i++ { - if postings[i] == nil { - postings[i] = roaring.New() - } - } - s.Postings = postings - } - - if cap(s.FreqNorms) >= numPostingsLists { - s.FreqNorms = s.FreqNorms[:numPostingsLists] - } else { - s.FreqNorms = make([][]interimFreqNorm, numPostingsLists) - } - - if cap(s.freqNormsBacking) >= totTFs { - s.freqNormsBacking = s.freqNormsBacking[:totTFs] - } else { - s.freqNormsBacking = make([]interimFreqNorm, totTFs) - } - - freqNormsBacking := s.freqNormsBacking - for pid, numTerms := range s.numTermsPerPostingsList { - s.FreqNorms[pid] = freqNormsBacking[0:0] - freqNormsBacking = freqNormsBacking[numTerms:] - } - - if cap(s.Locs) >= numPostingsLists { - s.Locs = s.Locs[:numPostingsLists] - } else { - s.Locs = make([][]interimLoc, numPostingsLists) - } - - if cap(s.locsBacking) >= totLocs { - s.locsBacking = s.locsBacking[:totLocs] - } else { - s.locsBacking = make([]interimLoc, totLocs) - } - - locsBacking := s.locsBacking - for pid, numLocs := range s.numLocsPerPostingsList { - s.Locs[pid] = locsBacking[0:0] - locsBacking = locsBacking[numLocs:] - } -} - -func (s *interim) processDocuments() { - numFields := len(s.FieldsInv) - reuseFieldLens := make([]int, numFields) - reuseFieldTFs := make([]analysis.TokenFrequencies, numFields) - - for docNum, result := range s.results { - for i := 0; i < numFields; i++ { // clear these for reuse - reuseFieldLens[i] = 0 - reuseFieldTFs[i] = nil - } - - s.processDocument(uint64(docNum), result, - reuseFieldLens, reuseFieldTFs) - } -} - -func (s *interim) processDocument(docNum uint64, - result *index.AnalysisResult, - fieldLens []int, fieldTFs []analysis.TokenFrequencies) { - visitField := func(fieldID uint16, fieldName string, - ln int, tf analysis.TokenFrequencies) { - fieldLens[fieldID] += ln - - existingFreqs := fieldTFs[fieldID] - if existingFreqs != nil { - existingFreqs.MergeAll(fieldName, tf) - } else { - fieldTFs[fieldID] = tf - } - } - - // walk each composite field - for _, field := range result.Document.CompositeFields { - fieldID := uint16(s.getOrDefineField(field.Name())) - ln, tf := field.Analyze() - visitField(fieldID, field.Name(), ln, tf) - } - - // walk each field - for i, field := range result.Document.Fields { - fieldID := uint16(s.getOrDefineField(field.Name())) - ln := result.Length[i] - tf := result.Analyzed[i] - visitField(fieldID, field.Name(), ln, tf) - } - - // now that it's been rolled up into fieldTFs, walk that - for fieldID, tfs := range fieldTFs { - dict := s.Dicts[fieldID] - norm := float32(1.0 / math.Sqrt(float64(fieldLens[fieldID]))) - - for term, tf := range tfs { - pid := dict[term] - 1 - bs := s.Postings[pid] - bs.Add(uint32(docNum)) - - s.FreqNorms[pid] = append(s.FreqNorms[pid], - interimFreqNorm{ - freq: uint64(tf.Frequency()), - norm: norm, - numLocs: len(tf.Locations), - }) - - if len(tf.Locations) > 0 { - locs := s.Locs[pid] - - for _, loc := range tf.Locations { - var locf = uint16(fieldID) - if loc.Field != "" { - locf = uint16(s.getOrDefineField(loc.Field)) - } - var arrayposs []uint64 - if len(loc.ArrayPositions) > 0 { - arrayposs = loc.ArrayPositions - } - locs = append(locs, interimLoc{ - fieldID: locf, - pos: uint64(loc.Position), - start: uint64(loc.Start), - end: uint64(loc.End), - arrayposs: arrayposs, - }) - } - - s.Locs[pid] = locs - } - } - } -} - -func (s *interim) writeStoredFields() ( - storedIndexOffset uint64, err error) { - varBuf := make([]byte, binary.MaxVarintLen64) - metaEncode := func(val uint64) (int, error) { - wb := binary.PutUvarint(varBuf, val) - return s.metaBuf.Write(varBuf[:wb]) - } - - data, compressed := s.tmp0[:0], s.tmp1[:0] - defer func() { s.tmp0, s.tmp1 = data, compressed }() - - // keyed by docNum - docStoredOffsets := make([]uint64, len(s.results)) - - // keyed by fieldID, for the current doc in the loop - docStoredFields := map[uint16]interimStoredField{} - - for docNum, result := range s.results { - for fieldID := range docStoredFields { // reset for next doc - delete(docStoredFields, fieldID) - } - - for _, field := range result.Document.Fields { - fieldID := uint16(s.getOrDefineField(field.Name())) - - opts := field.Options() - - if opts.IsStored() { - isf := docStoredFields[fieldID] - isf.vals = append(isf.vals, field.Value()) - isf.typs = append(isf.typs, encodeFieldType(field)) - isf.arrayposs = append(isf.arrayposs, field.ArrayPositions()) - docStoredFields[fieldID] = isf - } - - if opts.IncludeDocValues() { - s.IncludeDocValues[fieldID] = true - } - - err := ValidateDocFields(field) - if err != nil { - return 0, err - } - } - - var curr int - - s.metaBuf.Reset() - data = data[:0] - - // _id field special case optimizes ExternalID() lookups - idFieldVal := docStoredFields[uint16(0)].vals[0] - _, err = metaEncode(uint64(len(idFieldVal))) - if err != nil { - return 0, err - } - - // handle non-"_id" fields - for fieldID := 1; fieldID < len(s.FieldsInv); fieldID++ { - isf, exists := docStoredFields[uint16(fieldID)] - if exists { - curr, data, err = persistStoredFieldValues( - fieldID, isf.vals, isf.typs, isf.arrayposs, - curr, metaEncode, data) - if err != nil { - return 0, err - } - } - } - - metaBytes := s.metaBuf.Bytes() - - compressed = snappy.Encode(compressed[:cap(compressed)], data) - - docStoredOffsets[docNum] = uint64(s.w.Count()) - - _, err := writeUvarints(s.w, - uint64(len(metaBytes)), - uint64(len(idFieldVal)+len(compressed))) - if err != nil { - return 0, err - } - - _, err = s.w.Write(metaBytes) - if err != nil { - return 0, err - } - - _, err = s.w.Write(idFieldVal) - if err != nil { - return 0, err - } - - _, err = s.w.Write(compressed) - if err != nil { - return 0, err - } - } - - storedIndexOffset = uint64(s.w.Count()) - - for _, docStoredOffset := range docStoredOffsets { - err = binary.Write(s.w, binary.BigEndian, docStoredOffset) - if err != nil { - return 0, err - } - } - - return storedIndexOffset, nil -} - -func (s *interim) writeDicts() (fdvIndexOffset uint64, dictOffsets []uint64, err error) { - dictOffsets = make([]uint64, len(s.FieldsInv)) - - fdvOffsetsStart := make([]uint64, len(s.FieldsInv)) - fdvOffsetsEnd := make([]uint64, len(s.FieldsInv)) - - buf := s.grabBuf(binary.MaxVarintLen64) - - // these int coders are initialized with chunk size 1024 - // however this will be reset to the correct chunk size - // while processing each individual field-term section - tfEncoder := newChunkedIntCoder(1024, uint64(len(s.results)-1)) - locEncoder := newChunkedIntCoder(1024, uint64(len(s.results)-1)) - - var docTermMap [][]byte - - if s.builder == nil { - s.builder, err = vellum.New(&s.builderBuf, nil) - if err != nil { - return 0, nil, err - } - } - - for fieldID, terms := range s.DictKeys { - if cap(docTermMap) < len(s.results) { - docTermMap = make([][]byte, len(s.results)) - } else { - docTermMap = docTermMap[0:len(s.results)] - for docNum := range docTermMap { // reset the docTermMap - docTermMap[docNum] = docTermMap[docNum][:0] - } - } - - dict := s.Dicts[fieldID] - - for _, term := range terms { // terms are already sorted - pid := dict[term] - 1 - - postingsBS := s.Postings[pid] - - freqNorms := s.FreqNorms[pid] - freqNormOffset := 0 - - locs := s.Locs[pid] - locOffset := 0 - - chunkSize, err := getChunkSize(s.chunkMode, postingsBS.GetCardinality(), uint64(len(s.results))) - if err != nil { - return 0, nil, err - } - tfEncoder.SetChunkSize(chunkSize, uint64(len(s.results)-1)) - locEncoder.SetChunkSize(chunkSize, uint64(len(s.results)-1)) - - postingsItr := postingsBS.Iterator() - for postingsItr.HasNext() { - docNum := uint64(postingsItr.Next()) - - freqNorm := freqNorms[freqNormOffset] - - err = tfEncoder.Add(docNum, - encodeFreqHasLocs(freqNorm.freq, freqNorm.numLocs > 0), - uint64(math.Float32bits(freqNorm.norm))) - if err != nil { - return 0, nil, err - } - - if freqNorm.numLocs > 0 { - numBytesLocs := 0 - for _, loc := range locs[locOffset : locOffset+freqNorm.numLocs] { - numBytesLocs += totalUvarintBytes( - uint64(loc.fieldID), loc.pos, loc.start, loc.end, - uint64(len(loc.arrayposs)), loc.arrayposs) - } - - err = locEncoder.Add(docNum, uint64(numBytesLocs)) - if err != nil { - return 0, nil, err - } - - for _, loc := range locs[locOffset : locOffset+freqNorm.numLocs] { - err = locEncoder.Add(docNum, - uint64(loc.fieldID), loc.pos, loc.start, loc.end, - uint64(len(loc.arrayposs))) - if err != nil { - return 0, nil, err - } - - err = locEncoder.Add(docNum, loc.arrayposs...) - if err != nil { - return 0, nil, err - } - } - - locOffset += freqNorm.numLocs - } - - freqNormOffset++ - - docTermMap[docNum] = append( - append(docTermMap[docNum], term...), - termSeparator) - } - - tfEncoder.Close() - locEncoder.Close() - - postingsOffset, err := - writePostings(postingsBS, tfEncoder, locEncoder, nil, s.w, buf) - if err != nil { - return 0, nil, err - } - - if postingsOffset > uint64(0) { - err = s.builder.Insert([]byte(term), postingsOffset) - if err != nil { - return 0, nil, err - } - } - - tfEncoder.Reset() - locEncoder.Reset() - } - - err = s.builder.Close() - if err != nil { - return 0, nil, err - } - - // record where this dictionary starts - dictOffsets[fieldID] = uint64(s.w.Count()) - - vellumData := s.builderBuf.Bytes() - - // write out the length of the vellum data - n := binary.PutUvarint(buf, uint64(len(vellumData))) - _, err = s.w.Write(buf[:n]) - if err != nil { - return 0, nil, err - } - - // write this vellum to disk - _, err = s.w.Write(vellumData) - if err != nil { - return 0, nil, err - } - - // reset vellum for reuse - s.builderBuf.Reset() - - err = s.builder.Reset(&s.builderBuf) - if err != nil { - return 0, nil, err - } - - // write the field doc values - // NOTE: doc values continue to use legacy chunk mode - chunkSize, err := getChunkSize(LegacyChunkMode, 0, 0) - if err != nil { - return 0, nil, err - } - fdvEncoder := newChunkedContentCoder(chunkSize, uint64(len(s.results)-1), s.w, false) - if s.IncludeDocValues[fieldID] { - for docNum, docTerms := range docTermMap { - if len(docTerms) > 0 { - err = fdvEncoder.Add(uint64(docNum), docTerms) - if err != nil { - return 0, nil, err - } - } - } - err = fdvEncoder.Close() - if err != nil { - return 0, nil, err - } - - fdvOffsetsStart[fieldID] = uint64(s.w.Count()) - - _, err = fdvEncoder.Write() - if err != nil { - return 0, nil, err - } - - fdvOffsetsEnd[fieldID] = uint64(s.w.Count()) - - fdvEncoder.Reset() - } else { - fdvOffsetsStart[fieldID] = fieldNotUninverted - fdvOffsetsEnd[fieldID] = fieldNotUninverted - } - } - - fdvIndexOffset = uint64(s.w.Count()) - - for i := 0; i < len(fdvOffsetsStart); i++ { - n := binary.PutUvarint(buf, fdvOffsetsStart[i]) - _, err := s.w.Write(buf[:n]) - if err != nil { - return 0, nil, err - } - n = binary.PutUvarint(buf, fdvOffsetsEnd[i]) - _, err = s.w.Write(buf[:n]) - if err != nil { - return 0, nil, err - } - } - - return fdvIndexOffset, dictOffsets, nil -} - -func encodeFieldType(f document.Field) byte { - fieldType := byte('x') - switch f.(type) { - case *document.TextField: - fieldType = 't' - case *document.NumericField: - fieldType = 'n' - case *document.DateTimeField: - fieldType = 'd' - case *document.BooleanField: - fieldType = 'b' - case *document.GeoPointField: - fieldType = 'g' - case *document.CompositeField: - fieldType = 'c' - } - return fieldType -} - -// returns the total # of bytes needed to encode the given uint64's -// into binary.PutUVarint() encoding -func totalUvarintBytes(a, b, c, d, e uint64, more []uint64) (n int) { - n = numUvarintBytes(a) - n += numUvarintBytes(b) - n += numUvarintBytes(c) - n += numUvarintBytes(d) - n += numUvarintBytes(e) - for _, v := range more { - n += numUvarintBytes(v) - } - return n -} - -// returns # of bytes needed to encode x in binary.PutUvarint() encoding -func numUvarintBytes(x uint64) (n int) { - for x >= 0x80 { - x >>= 7 - n++ - } - return n + 1 -} diff --git a/vendor/github.com/blevesearch/zap/v13/plugin.go b/vendor/github.com/blevesearch/zap/v13/plugin.go deleted file mode 100644 index 38a0638..0000000 --- a/vendor/github.com/blevesearch/zap/v13/plugin.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2020 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "github.com/blevesearch/bleve/index/scorch/segment" -) - -// ZapPlugin implements the Plugin interface of -// the blevesearch/bleve/index/scorch/segment pkg -type ZapPlugin struct{} - -func (*ZapPlugin) Type() string { - return Type -} - -func (*ZapPlugin) Version() uint32 { - return Version -} - -// Plugin returns an instance segment.Plugin for use -// by the Scorch indexing scheme -func Plugin() segment.Plugin { - return &ZapPlugin{} -} diff --git a/vendor/github.com/blevesearch/zap/v13/posting.go b/vendor/github.com/blevesearch/zap/v13/posting.go deleted file mode 100644 index 3a6ee54..0000000 --- a/vendor/github.com/blevesearch/zap/v13/posting.go +++ /dev/null @@ -1,798 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "encoding/binary" - "fmt" - "math" - "reflect" - - "github.com/RoaringBitmap/roaring" - "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/blevesearch/bleve/size" -) - -var reflectStaticSizePostingsList int -var reflectStaticSizePostingsIterator int -var reflectStaticSizePosting int -var reflectStaticSizeLocation int - -func init() { - var pl PostingsList - reflectStaticSizePostingsList = int(reflect.TypeOf(pl).Size()) - var pi PostingsIterator - reflectStaticSizePostingsIterator = int(reflect.TypeOf(pi).Size()) - var p Posting - reflectStaticSizePosting = int(reflect.TypeOf(p).Size()) - var l Location - reflectStaticSizeLocation = int(reflect.TypeOf(l).Size()) -} - -// FST or vellum value (uint64) encoding is determined by the top two -// highest-order or most significant bits... -// -// encoding : MSB -// name : 63 62 61...to...bit #0 (LSB) -// ----------+---+---+--------------------------------------------------- -// general : 0 | 0 | 62-bits of postingsOffset. -// ~ : 0 | 1 | reserved for future. -// 1-hit : 1 | 0 | 31-bits of positive float31 norm | 31-bits docNum. -// ~ : 1 | 1 | reserved for future. -// -// Encoding "general" is able to handle all cases, where the -// postingsOffset points to more information about the postings for -// the term. -// -// Encoding "1-hit" is used to optimize a commonly seen case when a -// term has only a single hit. For example, a term in the _id field -// will have only 1 hit. The "1-hit" encoding is used for a term -// in a field when... -// -// - term vector info is disabled for that field; -// - and, the term appears in only a single doc for that field; -// - and, the term's freq is exactly 1 in that single doc for that field; -// - and, the docNum must fit into 31-bits; -// -// Otherwise, the "general" encoding is used instead. -// -// In the "1-hit" encoding, the field in that single doc may have -// other terms, which is supported in the "1-hit" encoding by the -// positive float31 norm. - -const FSTValEncodingMask = uint64(0xc000000000000000) -const FSTValEncodingGeneral = uint64(0x0000000000000000) -const FSTValEncoding1Hit = uint64(0x8000000000000000) - -func FSTValEncode1Hit(docNum uint64, normBits uint64) uint64 { - return FSTValEncoding1Hit | ((mask31Bits & normBits) << 31) | (mask31Bits & docNum) -} - -func FSTValDecode1Hit(v uint64) (docNum uint64, normBits uint64) { - return (mask31Bits & v), (mask31Bits & (v >> 31)) -} - -const mask31Bits = uint64(0x000000007fffffff) - -func under32Bits(x uint64) bool { - return x <= mask31Bits -} - -const DocNum1HitFinished = math.MaxUint64 - -var NormBits1Hit = uint64(math.Float32bits(float32(1))) - -// PostingsList is an in-memory representation of a postings list -type PostingsList struct { - sb *SegmentBase - postingsOffset uint64 - freqOffset uint64 - locOffset uint64 - postings *roaring.Bitmap - except *roaring.Bitmap - - // when normBits1Hit != 0, then this postings list came from a - // 1-hit encoding, and only the docNum1Hit & normBits1Hit apply - docNum1Hit uint64 - normBits1Hit uint64 -} - -// represents an immutable, empty postings list -var emptyPostingsList = &PostingsList{} - -func (p *PostingsList) Size() int { - sizeInBytes := reflectStaticSizePostingsList + size.SizeOfPtr - - if p.except != nil { - sizeInBytes += int(p.except.GetSizeInBytes()) - } - - return sizeInBytes -} - -func (p *PostingsList) OrInto(receiver *roaring.Bitmap) { - if p.normBits1Hit != 0 { - receiver.Add(uint32(p.docNum1Hit)) - return - } - - if p.postings != nil { - receiver.Or(p.postings) - } -} - -// Iterator returns an iterator for this postings list -func (p *PostingsList) Iterator(includeFreq, includeNorm, includeLocs bool, - prealloc segment.PostingsIterator) segment.PostingsIterator { - if p.normBits1Hit == 0 && p.postings == nil { - return emptyPostingsIterator - } - - var preallocPI *PostingsIterator - pi, ok := prealloc.(*PostingsIterator) - if ok && pi != nil { - preallocPI = pi - } - if preallocPI == emptyPostingsIterator { - preallocPI = nil - } - - return p.iterator(includeFreq, includeNorm, includeLocs, preallocPI) -} - -func (p *PostingsList) iterator(includeFreq, includeNorm, includeLocs bool, - rv *PostingsIterator) *PostingsIterator { - if rv == nil { - rv = &PostingsIterator{} - } else { - freqNormReader := rv.freqNormReader - if freqNormReader != nil { - freqNormReader.reset() - } - - locReader := rv.locReader - if locReader != nil { - locReader.reset() - } - - nextLocs := rv.nextLocs[:0] - nextSegmentLocs := rv.nextSegmentLocs[:0] - - buf := rv.buf - - *rv = PostingsIterator{} // clear the struct - - rv.freqNormReader = freqNormReader - rv.locReader = locReader - - rv.nextLocs = nextLocs - rv.nextSegmentLocs = nextSegmentLocs - - rv.buf = buf - } - - rv.postings = p - rv.includeFreqNorm = includeFreq || includeNorm || includeLocs - rv.includeLocs = includeLocs - - if p.normBits1Hit != 0 { - // "1-hit" encoding - rv.docNum1Hit = p.docNum1Hit - rv.normBits1Hit = p.normBits1Hit - - if p.except != nil && p.except.Contains(uint32(rv.docNum1Hit)) { - rv.docNum1Hit = DocNum1HitFinished - } - - return rv - } - - // "general" encoding, check if empty - if p.postings == nil { - return rv - } - - // initialize freq chunk reader - if rv.includeFreqNorm { - rv.freqNormReader = newChunkedIntDecoder(p.sb.mem, p.freqOffset) - } - - // initialize the loc chunk reader - if rv.includeLocs { - rv.locReader = newChunkedIntDecoder(p.sb.mem, p.locOffset) - } - - rv.all = p.postings.Iterator() - if p.except != nil { - rv.ActualBM = roaring.AndNot(p.postings, p.except) - rv.Actual = rv.ActualBM.Iterator() - } else { - rv.ActualBM = p.postings - rv.Actual = rv.all // Optimize to use same iterator for all & Actual. - } - - return rv -} - -// Count returns the number of items on this postings list -func (p *PostingsList) Count() uint64 { - var n, e uint64 - if p.normBits1Hit != 0 { - n = 1 - if p.except != nil && p.except.Contains(uint32(p.docNum1Hit)) { - e = 1 - } - } else if p.postings != nil { - n = p.postings.GetCardinality() - if p.except != nil { - e = p.postings.AndCardinality(p.except) - } - } - return n - e -} - -func (rv *PostingsList) read(postingsOffset uint64, d *Dictionary) error { - rv.postingsOffset = postingsOffset - - // handle "1-hit" encoding special case - if rv.postingsOffset&FSTValEncodingMask == FSTValEncoding1Hit { - return rv.init1Hit(postingsOffset) - } - - // read the location of the freq/norm details - var n uint64 - var read int - - rv.freqOffset, read = binary.Uvarint(d.sb.mem[postingsOffset+n : postingsOffset+binary.MaxVarintLen64]) - n += uint64(read) - - rv.locOffset, read = binary.Uvarint(d.sb.mem[postingsOffset+n : postingsOffset+n+binary.MaxVarintLen64]) - n += uint64(read) - - var postingsLen uint64 - postingsLen, read = binary.Uvarint(d.sb.mem[postingsOffset+n : postingsOffset+n+binary.MaxVarintLen64]) - n += uint64(read) - - roaringBytes := d.sb.mem[postingsOffset+n : postingsOffset+n+postingsLen] - - if rv.postings == nil { - rv.postings = roaring.NewBitmap() - } - _, err := rv.postings.FromBuffer(roaringBytes) - if err != nil { - return fmt.Errorf("error loading roaring bitmap: %v", err) - } - - return nil -} - -func (rv *PostingsList) init1Hit(fstVal uint64) error { - docNum, normBits := FSTValDecode1Hit(fstVal) - - rv.docNum1Hit = docNum - rv.normBits1Hit = normBits - - return nil -} - -// PostingsIterator provides a way to iterate through the postings list -type PostingsIterator struct { - postings *PostingsList - all roaring.IntPeekable - Actual roaring.IntPeekable - ActualBM *roaring.Bitmap - - currChunk uint32 - freqNormReader *chunkedIntDecoder - locReader *chunkedIntDecoder - - next Posting // reused across Next() calls - nextLocs []Location // reused across Next() calls - nextSegmentLocs []segment.Location // reused across Next() calls - - docNum1Hit uint64 - normBits1Hit uint64 - - buf []byte - - includeFreqNorm bool - includeLocs bool -} - -var emptyPostingsIterator = &PostingsIterator{} - -func (i *PostingsIterator) Size() int { - sizeInBytes := reflectStaticSizePostingsIterator + size.SizeOfPtr + - i.next.Size() - // account for freqNormReader, locReader if we start using this. - for _, entry := range i.nextLocs { - sizeInBytes += entry.Size() - } - - return sizeInBytes -} - -func (i *PostingsIterator) loadChunk(chunk int) error { - if i.includeFreqNorm { - err := i.freqNormReader.loadChunk(chunk) - if err != nil { - return err - } - } - - if i.includeLocs { - err := i.locReader.loadChunk(chunk) - if err != nil { - return err - } - } - - i.currChunk = uint32(chunk) - return nil -} - -func (i *PostingsIterator) readFreqNormHasLocs() (uint64, uint64, bool, error) { - if i.normBits1Hit != 0 { - return 1, i.normBits1Hit, false, nil - } - - freqHasLocs, err := i.freqNormReader.readUvarint() - if err != nil { - return 0, 0, false, fmt.Errorf("error reading frequency: %v", err) - } - - freq, hasLocs := decodeFreqHasLocs(freqHasLocs) - - normBits, err := i.freqNormReader.readUvarint() - if err != nil { - return 0, 0, false, fmt.Errorf("error reading norm: %v", err) - } - - return freq, normBits, hasLocs, nil -} - -func (i *PostingsIterator) skipFreqNormReadHasLocs() (bool, error) { - if i.normBits1Hit != 0 { - return false, nil - } - - freqHasLocs, err := i.freqNormReader.readUvarint() - if err != nil { - return false, fmt.Errorf("error reading freqHasLocs: %v", err) - } - - i.freqNormReader.SkipUvarint() // Skip normBits. - - return freqHasLocs&0x01 != 0, nil // See decodeFreqHasLocs() / hasLocs. -} - -func encodeFreqHasLocs(freq uint64, hasLocs bool) uint64 { - rv := freq << 1 - if hasLocs { - rv = rv | 0x01 // 0'th LSB encodes whether there are locations - } - return rv -} - -func decodeFreqHasLocs(freqHasLocs uint64) (uint64, bool) { - freq := freqHasLocs >> 1 - hasLocs := freqHasLocs&0x01 != 0 - return freq, hasLocs -} - -// readLocation processes all the integers on the stream representing a single -// location. -func (i *PostingsIterator) readLocation(l *Location) error { - // read off field - fieldID, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading location field: %v", err) - } - // read off pos - pos, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading location pos: %v", err) - } - // read off start - start, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading location start: %v", err) - } - // read off end - end, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading location end: %v", err) - } - // read off num array pos - numArrayPos, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading location num array pos: %v", err) - } - - l.field = i.postings.sb.fieldsInv[fieldID] - l.pos = pos - l.start = start - l.end = end - - if cap(l.ap) < int(numArrayPos) { - l.ap = make([]uint64, int(numArrayPos)) - } else { - l.ap = l.ap[:int(numArrayPos)] - } - - // read off array positions - for k := 0; k < int(numArrayPos); k++ { - ap, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading array position: %v", err) - } - - l.ap[k] = ap - } - - return nil -} - -// Next returns the next posting on the postings list, or nil at the end -func (i *PostingsIterator) Next() (segment.Posting, error) { - return i.nextAtOrAfter(0) -} - -// Advance returns the posting at the specified docNum or it is not present -// the next posting, or if the end is reached, nil -func (i *PostingsIterator) Advance(docNum uint64) (segment.Posting, error) { - return i.nextAtOrAfter(docNum) -} - -// Next returns the next posting on the postings list, or nil at the end -func (i *PostingsIterator) nextAtOrAfter(atOrAfter uint64) (segment.Posting, error) { - docNum, exists, err := i.nextDocNumAtOrAfter(atOrAfter) - if err != nil || !exists { - return nil, err - } - - i.next = Posting{} // clear the struct - rv := &i.next - rv.docNum = docNum - - if !i.includeFreqNorm { - return rv, nil - } - - var normBits uint64 - var hasLocs bool - - rv.freq, normBits, hasLocs, err = i.readFreqNormHasLocs() - if err != nil { - return nil, err - } - - rv.norm = math.Float32frombits(uint32(normBits)) - - if i.includeLocs && hasLocs { - // prepare locations into reused slices, where we assume - // rv.freq >= "number of locs", since in a composite field, - // some component fields might have their IncludeTermVector - // flags disabled while other component fields are enabled - if cap(i.nextLocs) >= int(rv.freq) { - i.nextLocs = i.nextLocs[0:rv.freq] - } else { - i.nextLocs = make([]Location, rv.freq, rv.freq*2) - } - if cap(i.nextSegmentLocs) < int(rv.freq) { - i.nextSegmentLocs = make([]segment.Location, rv.freq, rv.freq*2) - } - rv.locs = i.nextSegmentLocs[:0] - - numLocsBytes, err := i.locReader.readUvarint() - if err != nil { - return nil, fmt.Errorf("error reading location numLocsBytes: %v", err) - } - - j := 0 - startBytesRemaining := i.locReader.Len() // # bytes remaining in the locReader - for startBytesRemaining-i.locReader.Len() < int(numLocsBytes) { - err := i.readLocation(&i.nextLocs[j]) - if err != nil { - return nil, err - } - rv.locs = append(rv.locs, &i.nextLocs[j]) - j++ - } - } - - return rv, nil -} - -// nextDocNum returns the next docNum on the postings list, and also -// sets up the currChunk / loc related fields of the iterator. -func (i *PostingsIterator) nextDocNumAtOrAfter(atOrAfter uint64) (uint64, bool, error) { - if i.normBits1Hit != 0 { - if i.docNum1Hit == DocNum1HitFinished { - return 0, false, nil - } - if i.docNum1Hit < atOrAfter { - // advanced past our 1-hit - i.docNum1Hit = DocNum1HitFinished // consume our 1-hit docNum - return 0, false, nil - } - docNum := i.docNum1Hit - i.docNum1Hit = DocNum1HitFinished // consume our 1-hit docNum - return docNum, true, nil - } - - if i.Actual == nil || !i.Actual.HasNext() { - return 0, false, nil - } - - if i.postings == nil || i.postings.postings == i.ActualBM { - return i.nextDocNumAtOrAfterClean(atOrAfter) - } - - i.Actual.AdvanceIfNeeded(uint32(atOrAfter)) - - if !i.Actual.HasNext() { - // couldn't find anything - return 0, false, nil - } - - n := i.Actual.Next() - allN := i.all.Next() - - chunkSize, err := getChunkSize(i.postings.sb.chunkMode, i.postings.postings.GetCardinality(), i.postings.sb.numDocs) - if err != nil { - return 0, false, err - } - nChunk := n / uint32(chunkSize) - - // when allN becomes >= to here, then allN is in the same chunk as nChunk. - allNReachesNChunk := nChunk * uint32(chunkSize) - - // n is the next actual hit (excluding some postings), and - // allN is the next hit in the full postings, and - // if they don't match, move 'all' forwards until they do - for allN != n { - // we've reached same chunk, so move the freq/norm/loc decoders forward - if i.includeFreqNorm && allN >= allNReachesNChunk { - err := i.currChunkNext(nChunk) - if err != nil { - return 0, false, err - } - } - - allN = i.all.Next() - } - - if i.includeFreqNorm && (i.currChunk != nChunk || i.freqNormReader.isNil()) { - err := i.loadChunk(int(nChunk)) - if err != nil { - return 0, false, fmt.Errorf("error loading chunk: %v", err) - } - } - - return uint64(n), true, nil -} - -// optimization when the postings list is "clean" (e.g., no updates & -// no deletions) where the all bitmap is the same as the actual bitmap -func (i *PostingsIterator) nextDocNumAtOrAfterClean( - atOrAfter uint64) (uint64, bool, error) { - - if !i.includeFreqNorm { - i.Actual.AdvanceIfNeeded(uint32(atOrAfter)) - - if !i.Actual.HasNext() { - return 0, false, nil // couldn't find anything - } - - return uint64(i.Actual.Next()), true, nil - } - - chunkSize, err := getChunkSize(i.postings.sb.chunkMode, i.postings.postings.GetCardinality(), i.postings.sb.numDocs) - if err != nil { - return 0, false, err - } - - // freq-norm's needed, so maintain freq-norm chunk reader - sameChunkNexts := 0 // # of times we called Next() in the same chunk - n := i.Actual.Next() - nChunk := n / uint32(chunkSize) - - for uint64(n) < atOrAfter && i.Actual.HasNext() { - n = i.Actual.Next() - - nChunkPrev := nChunk - nChunk = n / uint32(chunkSize) - - if nChunk != nChunkPrev { - sameChunkNexts = 0 - } else { - sameChunkNexts += 1 - } - } - - if uint64(n) < atOrAfter { - // couldn't find anything - return 0, false, nil - } - - for j := 0; j < sameChunkNexts; j++ { - err := i.currChunkNext(nChunk) - if err != nil { - return 0, false, fmt.Errorf("error optimized currChunkNext: %v", err) - } - } - - if i.currChunk != nChunk || i.freqNormReader.isNil() { - err := i.loadChunk(int(nChunk)) - if err != nil { - return 0, false, fmt.Errorf("error loading chunk: %v", err) - } - } - - return uint64(n), true, nil -} - -func (i *PostingsIterator) currChunkNext(nChunk uint32) error { - if i.currChunk != nChunk || i.freqNormReader.isNil() { - err := i.loadChunk(int(nChunk)) - if err != nil { - return fmt.Errorf("error loading chunk: %v", err) - } - } - - // read off freq/offsets even though we don't care about them - hasLocs, err := i.skipFreqNormReadHasLocs() - if err != nil { - return err - } - - if i.includeLocs && hasLocs { - numLocsBytes, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading location numLocsBytes: %v", err) - } - - // skip over all the location bytes - i.locReader.SkipBytes(int(numLocsBytes)) - } - - return nil -} - -// DocNum1Hit returns the docNum and true if this is "1-hit" optimized -// and the docNum is available. -func (p *PostingsIterator) DocNum1Hit() (uint64, bool) { - if p.normBits1Hit != 0 && p.docNum1Hit != DocNum1HitFinished { - return p.docNum1Hit, true - } - return 0, false -} - -// ActualBitmap returns the underlying actual bitmap -// which can be used up the stack for optimizations -func (p *PostingsIterator) ActualBitmap() *roaring.Bitmap { - return p.ActualBM -} - -// ReplaceActual replaces the ActualBM with the provided -// bitmap -func (p *PostingsIterator) ReplaceActual(abm *roaring.Bitmap) { - p.ActualBM = abm - p.Actual = abm.Iterator() -} - -// PostingsIteratorFromBitmap constructs a PostingsIterator given an -// "actual" bitmap. -func PostingsIteratorFromBitmap(bm *roaring.Bitmap, - includeFreqNorm, includeLocs bool) (segment.PostingsIterator, error) { - return &PostingsIterator{ - ActualBM: bm, - Actual: bm.Iterator(), - includeFreqNorm: includeFreqNorm, - includeLocs: includeLocs, - }, nil -} - -// PostingsIteratorFrom1Hit constructs a PostingsIterator given a -// 1-hit docNum. -func PostingsIteratorFrom1Hit(docNum1Hit uint64, - includeFreqNorm, includeLocs bool) (segment.PostingsIterator, error) { - return &PostingsIterator{ - docNum1Hit: docNum1Hit, - normBits1Hit: NormBits1Hit, - includeFreqNorm: includeFreqNorm, - includeLocs: includeLocs, - }, nil -} - -// Posting is a single entry in a postings list -type Posting struct { - docNum uint64 - freq uint64 - norm float32 - locs []segment.Location -} - -func (p *Posting) Size() int { - sizeInBytes := reflectStaticSizePosting - - for _, entry := range p.locs { - sizeInBytes += entry.Size() - } - - return sizeInBytes -} - -// Number returns the document number of this posting in this segment -func (p *Posting) Number() uint64 { - return p.docNum -} - -// Frequency returns the frequencies of occurrence of this term in this doc/field -func (p *Posting) Frequency() uint64 { - return p.freq -} - -// Norm returns the normalization factor for this posting -func (p *Posting) Norm() float64 { - return float64(p.norm) -} - -// Locations returns the location information for each occurrence -func (p *Posting) Locations() []segment.Location { - return p.locs -} - -// Location represents the location of a single occurrence -type Location struct { - field string - pos uint64 - start uint64 - end uint64 - ap []uint64 -} - -func (l *Location) Size() int { - return reflectStaticSizeLocation + - len(l.field) + - len(l.ap)*size.SizeOfUint64 -} - -// Field returns the name of the field (useful in composite fields to know -// which original field the value came from) -func (l *Location) Field() string { - return l.field -} - -// Start returns the start byte offset of this occurrence -func (l *Location) Start() uint64 { - return l.start -} - -// End returns the end byte offset of this occurrence -func (l *Location) End() uint64 { - return l.end -} - -// Pos returns the 1-based phrase position of this occurrence -func (l *Location) Pos() uint64 { - return l.pos -} - -// ArrayPositions returns the array position vector associated with this occurrence -func (l *Location) ArrayPositions() []uint64 { - return l.ap -} diff --git a/vendor/github.com/blevesearch/zap/v13/read.go b/vendor/github.com/blevesearch/zap/v13/read.go deleted file mode 100644 index e47d4c6..0000000 --- a/vendor/github.com/blevesearch/zap/v13/read.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import "encoding/binary" - -func (s *SegmentBase) getDocStoredMetaAndCompressed(docNum uint64) ([]byte, []byte) { - _, storedOffset, n, metaLen, dataLen := s.getDocStoredOffsets(docNum) - - meta := s.mem[storedOffset+n : storedOffset+n+metaLen] - data := s.mem[storedOffset+n+metaLen : storedOffset+n+metaLen+dataLen] - - return meta, data -} - -func (s *SegmentBase) getDocStoredOffsets(docNum uint64) ( - uint64, uint64, uint64, uint64, uint64) { - indexOffset := s.storedIndexOffset + (8 * docNum) - - storedOffset := binary.BigEndian.Uint64(s.mem[indexOffset : indexOffset+8]) - - var n uint64 - - metaLen, read := binary.Uvarint(s.mem[storedOffset : storedOffset+binary.MaxVarintLen64]) - n += uint64(read) - - dataLen, read := binary.Uvarint(s.mem[storedOffset+n : storedOffset+n+binary.MaxVarintLen64]) - n += uint64(read) - - return indexOffset, storedOffset, n, metaLen, dataLen -} diff --git a/vendor/github.com/blevesearch/zap/v13/segment.go b/vendor/github.com/blevesearch/zap/v13/segment.go deleted file mode 100644 index e8b1f06..0000000 --- a/vendor/github.com/blevesearch/zap/v13/segment.go +++ /dev/null @@ -1,572 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "encoding/binary" - "fmt" - "io" - "os" - "sync" - "unsafe" - - "github.com/RoaringBitmap/roaring" - "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/blevesearch/bleve/size" - "github.com/couchbase/vellum" - mmap "github.com/blevesearch/mmap-go" - "github.com/golang/snappy" -) - -var reflectStaticSizeSegmentBase int - -func init() { - var sb SegmentBase - reflectStaticSizeSegmentBase = int(unsafe.Sizeof(sb)) -} - -// Open returns a zap impl of a segment -func (*ZapPlugin) Open(path string) (segment.Segment, error) { - f, err := os.Open(path) - if err != nil { - return nil, err - } - mm, err := mmap.Map(f, mmap.RDONLY, 0) - if err != nil { - // mmap failed, try to close the file - _ = f.Close() - return nil, err - } - - rv := &Segment{ - SegmentBase: SegmentBase{ - mem: mm[0 : len(mm)-FooterSize], - fieldsMap: make(map[string]uint16), - fieldDvReaders: make(map[uint16]*docValueReader), - fieldFSTs: make(map[uint16]*vellum.FST), - }, - f: f, - mm: mm, - path: path, - refs: 1, - } - rv.SegmentBase.updateSize() - - err = rv.loadConfig() - if err != nil { - _ = rv.Close() - return nil, err - } - - err = rv.loadFields() - if err != nil { - _ = rv.Close() - return nil, err - } - - err = rv.loadDvReaders() - if err != nil { - _ = rv.Close() - return nil, err - } - - return rv, nil -} - -// SegmentBase is a memory only, read-only implementation of the -// segment.Segment interface, using zap's data representation. -type SegmentBase struct { - mem []byte - memCRC uint32 - chunkMode uint32 - fieldsMap map[string]uint16 // fieldName -> fieldID+1 - fieldsInv []string // fieldID -> fieldName - numDocs uint64 - storedIndexOffset uint64 - fieldsIndexOffset uint64 - docValueOffset uint64 - dictLocs []uint64 - fieldDvReaders map[uint16]*docValueReader // naive chunk cache per field - fieldDvNames []string // field names cached in fieldDvReaders - size uint64 - - m sync.Mutex - fieldFSTs map[uint16]*vellum.FST -} - -func (sb *SegmentBase) Size() int { - return int(sb.size) -} - -func (sb *SegmentBase) updateSize() { - sizeInBytes := reflectStaticSizeSegmentBase + - cap(sb.mem) - - // fieldsMap - for k := range sb.fieldsMap { - sizeInBytes += (len(k) + size.SizeOfString) + size.SizeOfUint16 - } - - // fieldsInv, dictLocs - for _, entry := range sb.fieldsInv { - sizeInBytes += len(entry) + size.SizeOfString - } - sizeInBytes += len(sb.dictLocs) * size.SizeOfUint64 - - // fieldDvReaders - for _, v := range sb.fieldDvReaders { - sizeInBytes += size.SizeOfUint16 + size.SizeOfPtr - if v != nil { - sizeInBytes += v.size() - } - } - - sb.size = uint64(sizeInBytes) -} - -func (sb *SegmentBase) AddRef() {} -func (sb *SegmentBase) DecRef() (err error) { return nil } -func (sb *SegmentBase) Close() (err error) { return nil } - -// Segment implements a persisted segment.Segment interface, by -// embedding an mmap()'ed SegmentBase. -type Segment struct { - SegmentBase - - f *os.File - mm mmap.MMap - path string - version uint32 - crc uint32 - - m sync.Mutex // Protects the fields that follow. - refs int64 -} - -func (s *Segment) Size() int { - // 8 /* size of file pointer */ - // 4 /* size of version -> uint32 */ - // 4 /* size of crc -> uint32 */ - sizeOfUints := 16 - - sizeInBytes := (len(s.path) + size.SizeOfString) + sizeOfUints - - // mutex, refs -> int64 - sizeInBytes += 16 - - // do not include the mmap'ed part - return sizeInBytes + s.SegmentBase.Size() - cap(s.mem) -} - -func (s *Segment) AddRef() { - s.m.Lock() - s.refs++ - s.m.Unlock() -} - -func (s *Segment) DecRef() (err error) { - s.m.Lock() - s.refs-- - if s.refs == 0 { - err = s.closeActual() - } - s.m.Unlock() - return err -} - -func (s *Segment) loadConfig() error { - crcOffset := len(s.mm) - 4 - s.crc = binary.BigEndian.Uint32(s.mm[crcOffset : crcOffset+4]) - - verOffset := crcOffset - 4 - s.version = binary.BigEndian.Uint32(s.mm[verOffset : verOffset+4]) - if s.version != Version { - return fmt.Errorf("unsupported version %d", s.version) - } - - chunkOffset := verOffset - 4 - s.chunkMode = binary.BigEndian.Uint32(s.mm[chunkOffset : chunkOffset+4]) - - docValueOffset := chunkOffset - 8 - s.docValueOffset = binary.BigEndian.Uint64(s.mm[docValueOffset : docValueOffset+8]) - - fieldsIndexOffset := docValueOffset - 8 - s.fieldsIndexOffset = binary.BigEndian.Uint64(s.mm[fieldsIndexOffset : fieldsIndexOffset+8]) - - storedIndexOffset := fieldsIndexOffset - 8 - s.storedIndexOffset = binary.BigEndian.Uint64(s.mm[storedIndexOffset : storedIndexOffset+8]) - - numDocsOffset := storedIndexOffset - 8 - s.numDocs = binary.BigEndian.Uint64(s.mm[numDocsOffset : numDocsOffset+8]) - return nil -} - -func (s *SegmentBase) loadFields() error { - // NOTE for now we assume the fields index immediately precedes - // the footer, and if this changes, need to adjust accordingly (or - // store explicit length), where s.mem was sliced from s.mm in Open(). - fieldsIndexEnd := uint64(len(s.mem)) - - // iterate through fields index - var fieldID uint64 - for s.fieldsIndexOffset+(8*fieldID) < fieldsIndexEnd { - addr := binary.BigEndian.Uint64(s.mem[s.fieldsIndexOffset+(8*fieldID) : s.fieldsIndexOffset+(8*fieldID)+8]) - - dictLoc, read := binary.Uvarint(s.mem[addr:fieldsIndexEnd]) - n := uint64(read) - s.dictLocs = append(s.dictLocs, dictLoc) - - var nameLen uint64 - nameLen, read = binary.Uvarint(s.mem[addr+n : fieldsIndexEnd]) - n += uint64(read) - - name := string(s.mem[addr+n : addr+n+nameLen]) - s.fieldsInv = append(s.fieldsInv, name) - s.fieldsMap[name] = uint16(fieldID + 1) - - fieldID++ - } - return nil -} - -// Dictionary returns the term dictionary for the specified field -func (s *SegmentBase) Dictionary(field string) (segment.TermDictionary, error) { - dict, err := s.dictionary(field) - if err == nil && dict == nil { - return &segment.EmptyDictionary{}, nil - } - return dict, err -} - -func (sb *SegmentBase) dictionary(field string) (rv *Dictionary, err error) { - fieldIDPlus1 := sb.fieldsMap[field] - if fieldIDPlus1 > 0 { - rv = &Dictionary{ - sb: sb, - field: field, - fieldID: fieldIDPlus1 - 1, - } - - dictStart := sb.dictLocs[rv.fieldID] - if dictStart > 0 { - var ok bool - sb.m.Lock() - if rv.fst, ok = sb.fieldFSTs[rv.fieldID]; !ok { - // read the length of the vellum data - vellumLen, read := binary.Uvarint(sb.mem[dictStart : dictStart+binary.MaxVarintLen64]) - fstBytes := sb.mem[dictStart+uint64(read) : dictStart+uint64(read)+vellumLen] - rv.fst, err = vellum.Load(fstBytes) - if err != nil { - sb.m.Unlock() - return nil, fmt.Errorf("dictionary field %s vellum err: %v", field, err) - } - - sb.fieldFSTs[rv.fieldID] = rv.fst - } - - sb.m.Unlock() - rv.fstReader, err = rv.fst.Reader() - if err != nil { - return nil, fmt.Errorf("dictionary field %s vellum reader err: %v", field, err) - } - - } - } - - return rv, nil -} - -// visitDocumentCtx holds data structures that are reusable across -// multiple VisitDocument() calls to avoid memory allocations -type visitDocumentCtx struct { - buf []byte - reader bytes.Reader - arrayPos []uint64 -} - -var visitDocumentCtxPool = sync.Pool{ - New: func() interface{} { - reuse := &visitDocumentCtx{} - return reuse - }, -} - -// VisitDocument invokes the DocFieldValueVistor for each stored field -// for the specified doc number -func (s *SegmentBase) VisitDocument(num uint64, visitor segment.DocumentFieldValueVisitor) error { - vdc := visitDocumentCtxPool.Get().(*visitDocumentCtx) - defer visitDocumentCtxPool.Put(vdc) - return s.visitDocument(vdc, num, visitor) -} - -func (s *SegmentBase) visitDocument(vdc *visitDocumentCtx, num uint64, - visitor segment.DocumentFieldValueVisitor) error { - // first make sure this is a valid number in this segment - if num < s.numDocs { - meta, compressed := s.getDocStoredMetaAndCompressed(num) - - vdc.reader.Reset(meta) - - // handle _id field special case - idFieldValLen, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - idFieldVal := compressed[:idFieldValLen] - - keepGoing := visitor("_id", byte('t'), idFieldVal, nil) - if !keepGoing { - visitDocumentCtxPool.Put(vdc) - return nil - } - - // handle non-"_id" fields - compressed = compressed[idFieldValLen:] - - uncompressed, err := snappy.Decode(vdc.buf[:cap(vdc.buf)], compressed) - if err != nil { - return err - } - - for keepGoing { - field, err := binary.ReadUvarint(&vdc.reader) - if err == io.EOF { - break - } - if err != nil { - return err - } - typ, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - offset, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - l, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - numap, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - var arrayPos []uint64 - if numap > 0 { - if cap(vdc.arrayPos) < int(numap) { - vdc.arrayPos = make([]uint64, numap) - } - arrayPos = vdc.arrayPos[:numap] - for i := 0; i < int(numap); i++ { - ap, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - arrayPos[i] = ap - } - } - - value := uncompressed[offset : offset+l] - keepGoing = visitor(s.fieldsInv[field], byte(typ), value, arrayPos) - } - - vdc.buf = uncompressed - } - return nil -} - -// DocID returns the value of the _id field for the given docNum -func (s *SegmentBase) DocID(num uint64) ([]byte, error) { - if num >= s.numDocs { - return nil, nil - } - - vdc := visitDocumentCtxPool.Get().(*visitDocumentCtx) - - meta, compressed := s.getDocStoredMetaAndCompressed(num) - - vdc.reader.Reset(meta) - - // handle _id field special case - idFieldValLen, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return nil, err - } - idFieldVal := compressed[:idFieldValLen] - - visitDocumentCtxPool.Put(vdc) - - return idFieldVal, nil -} - -// Count returns the number of documents in this segment. -func (s *SegmentBase) Count() uint64 { - return s.numDocs -} - -// DocNumbers returns a bitset corresponding to the doc numbers of all the -// provided _id strings -func (s *SegmentBase) DocNumbers(ids []string) (*roaring.Bitmap, error) { - rv := roaring.New() - - if len(s.fieldsMap) > 0 { - idDict, err := s.dictionary("_id") - if err != nil { - return nil, err - } - - postingsList := emptyPostingsList - - sMax, err := idDict.fst.GetMaxKey() - if err != nil { - return nil, err - } - sMaxStr := string(sMax) - filteredIds := make([]string, 0, len(ids)) - for _, id := range ids { - if id <= sMaxStr { - filteredIds = append(filteredIds, id) - } - } - - for _, id := range filteredIds { - postingsList, err = idDict.postingsList([]byte(id), nil, postingsList) - if err != nil { - return nil, err - } - postingsList.OrInto(rv) - } - } - - return rv, nil -} - -// Fields returns the field names used in this segment -func (s *SegmentBase) Fields() []string { - return s.fieldsInv -} - -// Path returns the path of this segment on disk -func (s *Segment) Path() string { - return s.path -} - -// Close releases all resources associated with this segment -func (s *Segment) Close() (err error) { - return s.DecRef() -} - -func (s *Segment) closeActual() (err error) { - if s.mm != nil { - err = s.mm.Unmap() - } - // try to close file even if unmap failed - if s.f != nil { - err2 := s.f.Close() - if err == nil { - // try to return first error - err = err2 - } - } - return -} - -// some helpers i started adding for the command-line utility - -// Data returns the underlying mmaped data slice -func (s *Segment) Data() []byte { - return s.mm -} - -// CRC returns the CRC value stored in the file footer -func (s *Segment) CRC() uint32 { - return s.crc -} - -// Version returns the file version in the file footer -func (s *Segment) Version() uint32 { - return s.version -} - -// ChunkFactor returns the chunk factor in the file footer -func (s *Segment) ChunkMode() uint32 { - return s.chunkMode -} - -// FieldsIndexOffset returns the fields index offset in the file footer -func (s *Segment) FieldsIndexOffset() uint64 { - return s.fieldsIndexOffset -} - -// StoredIndexOffset returns the stored value index offset in the file footer -func (s *Segment) StoredIndexOffset() uint64 { - return s.storedIndexOffset -} - -// DocValueOffset returns the docValue offset in the file footer -func (s *Segment) DocValueOffset() uint64 { - return s.docValueOffset -} - -// NumDocs returns the number of documents in the file footer -func (s *Segment) NumDocs() uint64 { - return s.numDocs -} - -// DictAddr is a helper function to compute the file offset where the -// dictionary is stored for the specified field. -func (s *Segment) DictAddr(field string) (uint64, error) { - fieldIDPlus1, ok := s.fieldsMap[field] - if !ok { - return 0, fmt.Errorf("no such field '%s'", field) - } - - return s.dictLocs[fieldIDPlus1-1], nil -} - -func (s *SegmentBase) loadDvReaders() error { - if s.docValueOffset == fieldNotUninverted || s.numDocs == 0 { - return nil - } - - var read uint64 - for fieldID, field := range s.fieldsInv { - var fieldLocStart, fieldLocEnd uint64 - var n int - fieldLocStart, n = binary.Uvarint(s.mem[s.docValueOffset+read : s.docValueOffset+read+binary.MaxVarintLen64]) - if n <= 0 { - return fmt.Errorf("loadDvReaders: failed to read the docvalue offset start for field %d", fieldID) - } - read += uint64(n) - fieldLocEnd, n = binary.Uvarint(s.mem[s.docValueOffset+read : s.docValueOffset+read+binary.MaxVarintLen64]) - if n <= 0 { - return fmt.Errorf("loadDvReaders: failed to read the docvalue offset end for field %d", fieldID) - } - read += uint64(n) - - fieldDvReader, err := s.loadFieldDocValueReader(field, fieldLocStart, fieldLocEnd) - if err != nil { - return err - } - if fieldDvReader != nil { - s.fieldDvReaders[uint16(fieldID)] = fieldDvReader - s.fieldDvNames = append(s.fieldDvNames, field) - } - } - - return nil -} diff --git a/vendor/github.com/blevesearch/zap/v13/write.go b/vendor/github.com/blevesearch/zap/v13/write.go deleted file mode 100644 index 77aefdb..0000000 --- a/vendor/github.com/blevesearch/zap/v13/write.go +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "encoding/binary" - "io" - - "github.com/RoaringBitmap/roaring" -) - -// writes out the length of the roaring bitmap in bytes as varint -// then writes out the roaring bitmap itself -func writeRoaringWithLen(r *roaring.Bitmap, w io.Writer, - reuseBufVarint []byte) (int, error) { - buf, err := r.ToBytes() - if err != nil { - return 0, err - } - - var tw int - - // write out the length - n := binary.PutUvarint(reuseBufVarint, uint64(len(buf))) - nw, err := w.Write(reuseBufVarint[:n]) - tw += nw - if err != nil { - return tw, err - } - - // write out the roaring bytes - nw, err = w.Write(buf) - tw += nw - if err != nil { - return tw, err - } - - return tw, nil -} - -func persistFields(fieldsInv []string, w *CountHashWriter, dictLocs []uint64) (uint64, error) { - var rv uint64 - var fieldsOffsets []uint64 - - for fieldID, fieldName := range fieldsInv { - // record start of this field - fieldsOffsets = append(fieldsOffsets, uint64(w.Count())) - - // write out the dict location and field name length - _, err := writeUvarints(w, dictLocs[fieldID], uint64(len(fieldName))) - if err != nil { - return 0, err - } - - // write out the field name - _, err = w.Write([]byte(fieldName)) - if err != nil { - return 0, err - } - } - - // now write out the fields index - rv = uint64(w.Count()) - for fieldID := range fieldsInv { - err := binary.Write(w, binary.BigEndian, fieldsOffsets[fieldID]) - if err != nil { - return 0, err - } - } - - return rv, nil -} - -// FooterSize is the size of the footer record in bytes -// crc + ver + chunk + field offset + stored offset + num docs + docValueOffset -const FooterSize = 4 + 4 + 4 + 8 + 8 + 8 + 8 - -func persistFooter(numDocs, storedIndexOffset, fieldsIndexOffset, docValueOffset uint64, - chunkMode uint32, crcBeforeFooter uint32, writerIn io.Writer) error { - w := NewCountHashWriter(writerIn) - w.crc = crcBeforeFooter - - // write out the number of docs - err := binary.Write(w, binary.BigEndian, numDocs) - if err != nil { - return err - } - // write out the stored field index location: - err = binary.Write(w, binary.BigEndian, storedIndexOffset) - if err != nil { - return err - } - // write out the field index location - err = binary.Write(w, binary.BigEndian, fieldsIndexOffset) - if err != nil { - return err - } - // write out the fieldDocValue location - err = binary.Write(w, binary.BigEndian, docValueOffset) - if err != nil { - return err - } - // write out 32-bit chunk factor - err = binary.Write(w, binary.BigEndian, chunkMode) - if err != nil { - return err - } - // write out 32-bit version - err = binary.Write(w, binary.BigEndian, Version) - if err != nil { - return err - } - // write out CRC-32 of everything upto but not including this CRC - err = binary.Write(w, binary.BigEndian, w.crc) - if err != nil { - return err - } - return nil -} - -func writeUvarints(w io.Writer, vals ...uint64) (tw int, err error) { - buf := make([]byte, binary.MaxVarintLen64) - for _, val := range vals { - n := binary.PutUvarint(buf, val) - var nw int - nw, err = w.Write(buf[:n]) - tw += nw - if err != nil { - return tw, err - } - } - return tw, err -} diff --git a/vendor/github.com/blevesearch/zap/v13/zap.md b/vendor/github.com/blevesearch/zap/v13/zap.md deleted file mode 100644 index d74dc54..0000000 --- a/vendor/github.com/blevesearch/zap/v13/zap.md +++ /dev/null @@ -1,177 +0,0 @@ -# ZAP File Format - -## Legend - -### Sections - - |========| - | | section - |========| - -### Fixed-size fields - - |--------| |----| |--| |-| - | | uint64 | | uint32 | | uint16 | | uint8 - |--------| |----| |--| |-| - -### Varints - - |~~~~~~~~| - | | varint(up to uint64) - |~~~~~~~~| - -### Arbitrary-length fields - - |--------...---| - | | arbitrary-length field (string, vellum, roaring bitmap) - |--------...---| - -### Chunked data - - [--------] - [ ] - [--------] - -## Overview - -Footer section describes the configuration of particular ZAP file. The format of footer is version-dependent, so it is necessary to check `V` field before the parsing. - - |==================================================| - | Stored Fields | - |==================================================| - |-----> | Stored Fields Index | - | |==================================================| - | | Dictionaries + Postings + DocValues | - | |==================================================| - | |---> | DocValues Index | - | | |==================================================| - | | | Fields | - | | |==================================================| - | | |-> | Fields Index | - | | | |========|========|========|========|====|====|====| - | | | | D# | SF | F | FDV | CF | V | CC | (Footer) - | | | |========|====|===|====|===|====|===|====|====|====| - | | | | | | - |-+-+-----------------| | | - | |--------------------------| | - |-------------------------------------| - - D#. Number of Docs. - SF. Stored Fields Index Offset. - F. Field Index Offset. - FDV. Field DocValue Offset. - CF. Chunk Factor. - V. Version. - CC. CRC32. - -## Stored Fields - -Stored Fields Index is `D#` consecutive 64-bit unsigned integers - offsets, where relevant Stored Fields Data records are located. - - 0 [SF] [SF + D# * 8] - | Stored Fields | Stored Fields Index | - |================================|==================================| - | | | - | |--------------------| ||--------|--------|. . .|--------|| - | |-> | Stored Fields Data | || 0 | 1 | | D# - 1 || - | | |--------------------| ||--------|----|---|. . .|--------|| - | | | | | - |===|============================|==============|===================| - | | - |-------------------------------------------| - -Stored Fields Data is an arbitrary size record, which consists of metadata and [Snappy](https://github.com/golang/snappy)-compressed data. - - Stored Fields Data - |~~~~~~~~|~~~~~~~~|~~~~~~~~...~~~~~~~~|~~~~~~~~...~~~~~~~~| - | MDS | CDS | MD | CD | - |~~~~~~~~|~~~~~~~~|~~~~~~~~...~~~~~~~~|~~~~~~~~...~~~~~~~~| - - MDS. Metadata size. - CDS. Compressed data size. - MD. Metadata. - CD. Snappy-compressed data. - -## Fields - -Fields Index section located between addresses `F` and `len(file) - len(footer)` and consist of `uint64` values (`F1`, `F2`, ...) which are offsets to records in Fields section. We have `F# = (len(file) - len(footer) - F) / sizeof(uint64)` fields. - - - (...) [F] [F + F#] - | Fields | Fields Index. | - |================================|================================| - | | | - | |~~~~~~~~|~~~~~~~~|---...---|||--------|--------|...|--------|| - ||->| Dict | Length | Name ||| 0 | 1 | | F# - 1 || - || |~~~~~~~~|~~~~~~~~|---...---|||--------|----|---|...|--------|| - || | | | - ||===============================|==============|=================| - | | - |----------------------------------------------| - - -## Dictionaries + Postings - -Each of fields has its own dictionary, encoded in [Vellum](https://github.com/couchbase/vellum) format. Dictionary consists of pairs `(term, offset)`, where `offset` indicates the position of postings (list of documents) for this particular term. - - |================================================================|- Dictionaries + - | | Postings + - | | DocValues - | Freq/Norm (chunked) | - | [~~~~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~] | - | |->[ Freq | Norm (float32 under varint) ] | - | | [~~~~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~] | - | | | - | |------------------------------------------------------------| | - | Location Details (chunked) | | - | [~~~~~~|~~~~~|~~~~~~~|~~~~~|~~~~~~|~~~~~~~~|~~~~~] | | - | |->[ Size | Pos | Start | End | Arr# | ArrPos | ... ] | | - | | [~~~~~~|~~~~~|~~~~~~~|~~~~~|~~~~~~|~~~~~~~~|~~~~~] | | - | | | | - | |----------------------| | | - | Postings List | | | - | |~~~~~~~~|~~~~~|~~|~~~~~~~~|-----------...--| | | - | |->| F/N | LD | Length | ROARING BITMAP | | | - | | |~~~~~|~~|~~~~~~~~|~~~~~~~~|-----------...--| | | - | | |----------------------------------------------| | - | |--------------------------------------| | - | Dictionary | | - | |~~~~~~~~|--------------------------|-...-| | - | |->| Length | VELLUM DATA : (TERM -> OFFSET) | | - | | |~~~~~~~~|----------------------------...-| | - | | | - |======|=========================================================|- DocValues Index - | | | - |======|=========================================================|- Fields - | | | - | |~~~~|~~~|~~~~~~~~|---...---| | - | | Dict | Length | Name | | - | |~~~~~~~~|~~~~~~~~|---...---| | - | | - |================================================================| - -## DocValues - -DocValues Index is `F#` pairs of varints, one pair per field. Each pair of varints indicates start and end point of DocValues slice. - - |================================================================| - | |------...--| | - | |->| DocValues |<-| | - | | |------...--| | | - |==|=================|===========================================|- DocValues Index - ||~|~~~~~~~~~|~~~~~~~|~~| |~~~~~~~~~~~~~~|~~~~~~~~~~~~|| - || DV1 START | DV1 STOP | . . . . . | DV(F#) START | DV(F#) END || - ||~~~~~~~~~~~|~~~~~~~~~~| |~~~~~~~~~~~~~~|~~~~~~~~~~~~|| - |================================================================| - -DocValues is chunked Snappy-compressed values for each document and field. - - [~~~~~~~~~~~~~~~|~~~~~~|~~~~~~~~~|-...-|~~~~~~|~~~~~~~~~|--------------------...-] - [ Doc# in Chunk | Doc1 | Offset1 | ... | DocN | OffsetN | SNAPPY COMPRESSED DATA ] - [~~~~~~~~~~~~~~~|~~~~~~|~~~~~~~~~|-...-|~~~~~~|~~~~~~~~~|--------------------...-] - -Last 16 bytes are description of chunks. - - |~~~~~~~~~~~~...~|----------------|----------------| - | Chunk Sizes | Chunk Size Arr | Chunk# | - |~~~~~~~~~~~~...~|----------------|----------------| diff --git a/vendor/github.com/blevesearch/zap/v14/.gitignore b/vendor/github.com/blevesearch/zap/v14/.gitignore deleted file mode 100644 index 46d1cfa..0000000 --- a/vendor/github.com/blevesearch/zap/v14/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -#* -*.sublime-* -*~ -.#* -.project -.settings -**/.idea/ -**/*.iml -.DS_Store -/cmd/zap/zap -*.test -tags diff --git a/vendor/github.com/blevesearch/zap/v14/LICENSE b/vendor/github.com/blevesearch/zap/v14/LICENSE deleted file mode 100644 index 7a4a3ea..0000000 --- a/vendor/github.com/blevesearch/zap/v14/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/vendor/github.com/blevesearch/zap/v14/README.md b/vendor/github.com/blevesearch/zap/v14/README.md deleted file mode 100644 index 0facb66..0000000 --- a/vendor/github.com/blevesearch/zap/v14/README.md +++ /dev/null @@ -1,158 +0,0 @@ -# zap file format - -Advanced ZAP File Format Documentation is [here](zap.md). - -The file is written in the reverse order that we typically access data. This helps us write in one pass since later sections of the file require file offsets of things we've already written. - -Current usage: - -- mmap the entire file -- crc-32 bytes and version are in fixed position at end of the file -- reading remainder of footer could be version specific -- remainder of footer gives us: - - 3 important offsets (docValue , fields index and stored data index) - - 2 important values (number of docs and chunk factor) -- field data is processed once and memoized onto the heap so that we never have to go back to disk for it -- access to stored data by doc number means first navigating to the stored data index, then accessing a fixed position offset into that slice, which gives us the actual address of the data. the first bytes of that section tell us the size of data so that we know where it ends. -- access to all other indexed data follows the following pattern: - - first know the field name -> convert to id - - next navigate to term dictionary for that field - - some operations stop here and do dictionary ops - - next use dictionary to navigate to posting list for a specific term - - walk posting list - - if necessary, walk posting details as we go - - if location info is desired, consult location bitmap to see if it is there - -## stored fields section - -- for each document - - preparation phase: - - produce a slice of metadata bytes and data bytes - - produce these slices in field id order - - field value is appended to the data slice - - metadata slice is varint encoded with the following values for each field value - - field id (uint16) - - field type (byte) - - field value start offset in uncompressed data slice (uint64) - - field value length (uint64) - - field number of array positions (uint64) - - one additional value for each array position (uint64) - - compress the data slice using snappy - - file writing phase: - - remember the start offset for this document - - write out meta data length (varint uint64) - - write out compressed data length (varint uint64) - - write out the metadata bytes - - write out the compressed data bytes - -## stored fields idx - -- for each document - - write start offset (remembered from previous section) of stored data (big endian uint64) - -With this index and a known document number, we have direct access to all the stored field data. - -## posting details (freq/norm) section - -- for each posting list - - produce a slice containing multiple consecutive chunks (each chunk is varint stream) - - produce a slice remembering offsets of where each chunk starts - - preparation phase: - - for each hit in the posting list - - if this hit is in next chunk close out encoding of last chunk and record offset start of next - - encode term frequency (uint64) - - encode norm factor (float32) - - file writing phase: - - remember start position for this posting list details - - write out number of chunks that follow (varint uint64) - - write out length of each chunk (each a varint uint64) - - write out the byte slice containing all the chunk data - -If you know the doc number you're interested in, this format lets you jump to the correct chunk (docNum/chunkFactor) directly and then seek within that chunk until you find it. - -## posting details (location) section - -- for each posting list - - produce a slice containing multiple consecutive chunks (each chunk is varint stream) - - produce a slice remembering offsets of where each chunk starts - - preparation phase: - - for each hit in the posting list - - if this hit is in next chunk close out encoding of last chunk and record offset start of next - - encode field (uint16) - - encode field pos (uint64) - - encode field start (uint64) - - encode field end (uint64) - - encode number of array positions to follow (uint64) - - encode each array position (each uint64) - - file writing phase: - - remember start position for this posting list details - - write out number of chunks that follow (varint uint64) - - write out length of each chunk (each a varint uint64) - - write out the byte slice containing all the chunk data - -If you know the doc number you're interested in, this format lets you jump to the correct chunk (docNum/chunkFactor) directly and then seek within that chunk until you find it. - -## postings list section - -- for each posting list - - preparation phase: - - encode roaring bitmap posting list to bytes (so we know the length) - - file writing phase: - - remember the start position for this posting list - - write freq/norm details offset (remembered from previous, as varint uint64) - - write location details offset (remembered from previous, as varint uint64) - - write length of encoded roaring bitmap - - write the serialized roaring bitmap data - -## dictionary - -- for each field - - preparation phase: - - encode vellum FST with dictionary data pointing to file offset of posting list (remembered from previous) - - file writing phase: - - remember the start position of this persistDictionary - - write length of vellum data (varint uint64) - - write out vellum data - -## fields section - -- for each field - - file writing phase: - - remember start offset for each field - - write dictionary address (remembered from previous) (varint uint64) - - write length of field name (varint uint64) - - write field name bytes - -## fields idx - -- for each field - - file writing phase: - - write big endian uint64 of start offset for each field - -NOTE: currently we don't know or record the length of this fields index. Instead we rely on the fact that we know it immediately precedes a footer of known size. - -## fields DocValue - -- for each field - - preparation phase: - - produce a slice containing multiple consecutive chunks, where each chunk is composed of a meta section followed by compressed columnar field data - - produce a slice remembering the length of each chunk - - file writing phase: - - remember the start position of this first field DocValue offset in the footer - - write out number of chunks that follow (varint uint64) - - write out length of each chunk (each a varint uint64) - - write out the byte slice containing all the chunk data - -NOTE: currently the meta header inside each chunk gives clue to the location offsets and size of the data pertaining to a given docID and any -read operation leverage that meta information to extract the document specific data from the file. - -## footer - -- file writing phase - - write number of docs (big endian uint64) - - write stored field index location (big endian uint64) - - write field index location (big endian uint64) - - write field docValue location (big endian uint64) - - write out chunk factor (big endian uint32) - - write out version (big endian uint32) - - write out file CRC of everything preceding this (big endian uint32) diff --git a/vendor/github.com/blevesearch/zap/v14/build.go b/vendor/github.com/blevesearch/zap/v14/build.go deleted file mode 100644 index 7a8dce0..0000000 --- a/vendor/github.com/blevesearch/zap/v14/build.go +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bufio" - "math" - "os" - - "github.com/couchbase/vellum" -) - -const Version uint32 = 14 - -const Type string = "zap" - -const fieldNotUninverted = math.MaxUint64 - -func (sb *SegmentBase) Persist(path string) error { - return PersistSegmentBase(sb, path) -} - -// PersistSegmentBase persists SegmentBase in the zap file format. -func PersistSegmentBase(sb *SegmentBase, path string) error { - flag := os.O_RDWR | os.O_CREATE - - f, err := os.OpenFile(path, flag, 0600) - if err != nil { - return err - } - - cleanup := func() { - _ = f.Close() - _ = os.Remove(path) - } - - br := bufio.NewWriter(f) - - _, err = br.Write(sb.mem) - if err != nil { - cleanup() - return err - } - - err = persistFooter(sb.numDocs, sb.storedIndexOffset, sb.fieldsIndexOffset, sb.docValueOffset, - sb.chunkMode, sb.memCRC, br) - if err != nil { - cleanup() - return err - } - - err = br.Flush() - if err != nil { - cleanup() - return err - } - - err = f.Sync() - if err != nil { - cleanup() - return err - } - - err = f.Close() - if err != nil { - cleanup() - return err - } - - return nil -} - -func persistStoredFieldValues(fieldID int, - storedFieldValues [][]byte, stf []byte, spf [][]uint64, - curr int, metaEncode varintEncoder, data []byte) ( - int, []byte, error) { - for i := 0; i < len(storedFieldValues); i++ { - // encode field - _, err := metaEncode(uint64(fieldID)) - if err != nil { - return 0, nil, err - } - // encode type - _, err = metaEncode(uint64(stf[i])) - if err != nil { - return 0, nil, err - } - // encode start offset - _, err = metaEncode(uint64(curr)) - if err != nil { - return 0, nil, err - } - // end len - _, err = metaEncode(uint64(len(storedFieldValues[i]))) - if err != nil { - return 0, nil, err - } - // encode number of array pos - _, err = metaEncode(uint64(len(spf[i]))) - if err != nil { - return 0, nil, err - } - // encode all array positions - for _, pos := range spf[i] { - _, err = metaEncode(pos) - if err != nil { - return 0, nil, err - } - } - - data = append(data, storedFieldValues[i]...) - curr += len(storedFieldValues[i]) - } - - return curr, data, nil -} - -func InitSegmentBase(mem []byte, memCRC uint32, chunkMode uint32, - fieldsMap map[string]uint16, fieldsInv []string, numDocs uint64, - storedIndexOffset uint64, fieldsIndexOffset uint64, docValueOffset uint64, - dictLocs []uint64) (*SegmentBase, error) { - sb := &SegmentBase{ - mem: mem, - memCRC: memCRC, - chunkMode: chunkMode, - fieldsMap: fieldsMap, - fieldsInv: fieldsInv, - numDocs: numDocs, - storedIndexOffset: storedIndexOffset, - fieldsIndexOffset: fieldsIndexOffset, - docValueOffset: docValueOffset, - dictLocs: dictLocs, - fieldDvReaders: make(map[uint16]*docValueReader), - fieldFSTs: make(map[uint16]*vellum.FST), - } - sb.updateSize() - - err := sb.loadDvReaders() - if err != nil { - return nil, err - } - - return sb, nil -} diff --git a/vendor/github.com/blevesearch/zap/v14/chunk.go b/vendor/github.com/blevesearch/zap/v14/chunk.go deleted file mode 100644 index 4307d0e..0000000 --- a/vendor/github.com/blevesearch/zap/v14/chunk.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (c) 2019 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "fmt" -) - -// LegacyChunkMode was the original chunk mode (always chunk size 1024) -// this mode is still used for chunking doc values. -var LegacyChunkMode uint32 = 1024 - -// DefaultChunkMode is the most recent improvement to chunking and should -// be used by default. -var DefaultChunkMode uint32 = 1026 - -func getChunkSize(chunkMode uint32, cardinality uint64, maxDocs uint64) (uint64, error) { - switch { - // any chunkMode <= 1024 will always chunk with chunkSize=chunkMode - case chunkMode <= 1024: - // legacy chunk size - return uint64(chunkMode), nil - - case chunkMode == 1025: - // attempt at simple improvement - // theory - the point of chunking is to put a bound on the maximum number of - // calls to Next() needed to find a random document. ie, you should be able - // to do one jump to the correct chunk, and then walk through at most - // chunk-size items - // previously 1024 was chosen as the chunk size, but this is particularly - // wasteful for low cardinality terms. the observation is that if there - // are less than 1024 items, why not put them all in one chunk, - // this way you'll still achieve the same goal of visiting at most - // chunk-size items. - // no attempt is made to tweak any other case - if cardinality <= 1024 { - return maxDocs, nil - } - return 1024, nil - - case chunkMode == 1026: - // improve upon the ideas tested in chunkMode 1025 - // the observation that the fewest number of dense chunks is the most - // desirable layout, given the built-in assumptions of chunking - // (that we want to put an upper-bound on the number of items you must - // walk over without skipping, currently tuned to 1024) - // - // 1. compute the number of chunks needed (max 1024/chunk) - // 2. convert to chunkSize, dividing into maxDocs - numChunks := (cardinality / 1024) + 1 - chunkSize := maxDocs / numChunks - return chunkSize, nil - } - return 0, fmt.Errorf("unknown chunk mode %d", chunkMode) -} diff --git a/vendor/github.com/blevesearch/zap/v14/contentcoder.go b/vendor/github.com/blevesearch/zap/v14/contentcoder.go deleted file mode 100644 index c145b5a..0000000 --- a/vendor/github.com/blevesearch/zap/v14/contentcoder.go +++ /dev/null @@ -1,243 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "encoding/binary" - "io" - "reflect" - - "github.com/golang/snappy" -) - -var reflectStaticSizeMetaData int - -func init() { - var md MetaData - reflectStaticSizeMetaData = int(reflect.TypeOf(md).Size()) -} - -var termSeparator byte = 0xff -var termSeparatorSplitSlice = []byte{termSeparator} - -type chunkedContentCoder struct { - final []byte - chunkSize uint64 - currChunk uint64 - chunkLens []uint64 - - w io.Writer - progressiveWrite bool - - chunkMetaBuf bytes.Buffer - chunkBuf bytes.Buffer - - chunkMeta []MetaData - - compressed []byte // temp buf for snappy compression -} - -// MetaData represents the data information inside a -// chunk. -type MetaData struct { - DocNum uint64 // docNum of the data inside the chunk - DocDvOffset uint64 // offset of data inside the chunk for the given docid -} - -// newChunkedContentCoder returns a new chunk content coder which -// packs data into chunks based on the provided chunkSize -func newChunkedContentCoder(chunkSize uint64, maxDocNum uint64, - w io.Writer, progressiveWrite bool) *chunkedContentCoder { - total := maxDocNum/chunkSize + 1 - rv := &chunkedContentCoder{ - chunkSize: chunkSize, - chunkLens: make([]uint64, total), - chunkMeta: make([]MetaData, 0, total), - w: w, - progressiveWrite: progressiveWrite, - } - - return rv -} - -// Reset lets you reuse this chunked content coder. Buffers are reset -// and re used. You cannot change the chunk size. -func (c *chunkedContentCoder) Reset() { - c.currChunk = 0 - c.final = c.final[:0] - c.chunkBuf.Reset() - c.chunkMetaBuf.Reset() - for i := range c.chunkLens { - c.chunkLens[i] = 0 - } - c.chunkMeta = c.chunkMeta[:0] -} - -func (c *chunkedContentCoder) SetChunkSize(chunkSize uint64, maxDocNum uint64) { - total := int(maxDocNum/chunkSize + 1) - c.chunkSize = chunkSize - if cap(c.chunkLens) < total { - c.chunkLens = make([]uint64, total) - } else { - c.chunkLens = c.chunkLens[:total] - } - if cap(c.chunkMeta) < total { - c.chunkMeta = make([]MetaData, 0, total) - } -} - -// Close indicates you are done calling Add() this allows -// the final chunk to be encoded. -func (c *chunkedContentCoder) Close() error { - return c.flushContents() -} - -func (c *chunkedContentCoder) flushContents() error { - // flush the contents, with meta information at first - buf := make([]byte, binary.MaxVarintLen64) - n := binary.PutUvarint(buf, uint64(len(c.chunkMeta))) - _, err := c.chunkMetaBuf.Write(buf[:n]) - if err != nil { - return err - } - - // write out the metaData slice - for _, meta := range c.chunkMeta { - _, err := writeUvarints(&c.chunkMetaBuf, meta.DocNum, meta.DocDvOffset) - if err != nil { - return err - } - } - - // write the metadata to final data - metaData := c.chunkMetaBuf.Bytes() - c.final = append(c.final, c.chunkMetaBuf.Bytes()...) - // write the compressed data to the final data - c.compressed = snappy.Encode(c.compressed[:cap(c.compressed)], c.chunkBuf.Bytes()) - c.final = append(c.final, c.compressed...) - - c.chunkLens[c.currChunk] = uint64(len(c.compressed) + len(metaData)) - - if c.progressiveWrite { - _, err := c.w.Write(c.final) - if err != nil { - return err - } - c.final = c.final[:0] - } - - return nil -} - -// Add encodes the provided byte slice into the correct chunk for the provided -// doc num. You MUST call Add() with increasing docNums. -func (c *chunkedContentCoder) Add(docNum uint64, vals []byte) error { - chunk := docNum / c.chunkSize - if chunk != c.currChunk { - // flush out the previous chunk details - err := c.flushContents() - if err != nil { - return err - } - // clearing the chunk specific meta for next chunk - c.chunkBuf.Reset() - c.chunkMetaBuf.Reset() - c.chunkMeta = c.chunkMeta[:0] - c.currChunk = chunk - } - - // get the starting offset for this doc - dvOffset := c.chunkBuf.Len() - dvSize, err := c.chunkBuf.Write(vals) - if err != nil { - return err - } - - c.chunkMeta = append(c.chunkMeta, MetaData{ - DocNum: docNum, - DocDvOffset: uint64(dvOffset + dvSize), - }) - return nil -} - -// Write commits all the encoded chunked contents to the provided writer. -// -// | ..... data ..... | chunk offsets (varints) -// | position of chunk offsets (uint64) | number of offsets (uint64) | -// -func (c *chunkedContentCoder) Write() (int, error) { - var tw int - - if c.final != nil { - // write out the data section first - nw, err := c.w.Write(c.final) - tw += nw - if err != nil { - return tw, err - } - } - - chunkOffsetsStart := uint64(tw) - - if cap(c.final) < binary.MaxVarintLen64 { - c.final = make([]byte, binary.MaxVarintLen64) - } else { - c.final = c.final[0:binary.MaxVarintLen64] - } - chunkOffsets := modifyLengthsToEndOffsets(c.chunkLens) - // write out the chunk offsets - for _, chunkOffset := range chunkOffsets { - n := binary.PutUvarint(c.final, chunkOffset) - nw, err := c.w.Write(c.final[:n]) - tw += nw - if err != nil { - return tw, err - } - } - - chunkOffsetsLen := uint64(tw) - chunkOffsetsStart - - c.final = c.final[0:8] - // write out the length of chunk offsets - binary.BigEndian.PutUint64(c.final, chunkOffsetsLen) - nw, err := c.w.Write(c.final) - tw += nw - if err != nil { - return tw, err - } - - // write out the number of chunks - binary.BigEndian.PutUint64(c.final, uint64(len(c.chunkLens))) - nw, err = c.w.Write(c.final) - tw += nw - if err != nil { - return tw, err - } - - c.final = c.final[:0] - - return tw, nil -} - -// ReadDocValueBoundary elicits the start, end offsets from a -// metaData header slice -func ReadDocValueBoundary(chunk int, metaHeaders []MetaData) (uint64, uint64) { - var start uint64 - if chunk > 0 { - start = metaHeaders[chunk-1].DocDvOffset - } - return start, metaHeaders[chunk].DocDvOffset -} diff --git a/vendor/github.com/blevesearch/zap/v14/count.go b/vendor/github.com/blevesearch/zap/v14/count.go deleted file mode 100644 index 50290f8..0000000 --- a/vendor/github.com/blevesearch/zap/v14/count.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "hash/crc32" - "io" - - "github.com/blevesearch/bleve/index/scorch/segment" -) - -// CountHashWriter is a wrapper around a Writer which counts the number of -// bytes which have been written and computes a crc32 hash -type CountHashWriter struct { - w io.Writer - crc uint32 - n int - s segment.StatsReporter -} - -// NewCountHashWriter returns a CountHashWriter which wraps the provided Writer -func NewCountHashWriter(w io.Writer) *CountHashWriter { - return &CountHashWriter{w: w} -} - -func NewCountHashWriterWithStatsReporter(w io.Writer, s segment.StatsReporter) *CountHashWriter { - return &CountHashWriter{w: w, s: s} -} - -// Write writes the provided bytes to the wrapped writer and counts the bytes -func (c *CountHashWriter) Write(b []byte) (int, error) { - n, err := c.w.Write(b) - c.crc = crc32.Update(c.crc, crc32.IEEETable, b[:n]) - c.n += n - if c.s != nil { - c.s.ReportBytesWritten(uint64(n)) - } - return n, err -} - -// Count returns the number of bytes written -func (c *CountHashWriter) Count() int { - return c.n -} - -// Sum32 returns the CRC-32 hash of the content written to this writer -func (c *CountHashWriter) Sum32() uint32 { - return c.crc -} diff --git a/vendor/github.com/blevesearch/zap/v14/dict.go b/vendor/github.com/blevesearch/zap/v14/dict.go deleted file mode 100644 index ad4a8f8..0000000 --- a/vendor/github.com/blevesearch/zap/v14/dict.go +++ /dev/null @@ -1,263 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "fmt" - - "github.com/RoaringBitmap/roaring" - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/couchbase/vellum" -) - -// Dictionary is the zap representation of the term dictionary -type Dictionary struct { - sb *SegmentBase - field string - fieldID uint16 - fst *vellum.FST - fstReader *vellum.Reader -} - -// PostingsList returns the postings list for the specified term -func (d *Dictionary) PostingsList(term []byte, except *roaring.Bitmap, - prealloc segment.PostingsList) (segment.PostingsList, error) { - var preallocPL *PostingsList - pl, ok := prealloc.(*PostingsList) - if ok && pl != nil { - preallocPL = pl - } - return d.postingsList(term, except, preallocPL) -} - -func (d *Dictionary) postingsList(term []byte, except *roaring.Bitmap, rv *PostingsList) (*PostingsList, error) { - if d.fstReader == nil { - if rv == nil || rv == emptyPostingsList { - return emptyPostingsList, nil - } - return d.postingsListInit(rv, except), nil - } - - postingsOffset, exists, err := d.fstReader.Get(term) - if err != nil { - return nil, fmt.Errorf("vellum err: %v", err) - } - if !exists { - if rv == nil || rv == emptyPostingsList { - return emptyPostingsList, nil - } - return d.postingsListInit(rv, except), nil - } - - return d.postingsListFromOffset(postingsOffset, except, rv) -} - -func (d *Dictionary) postingsListFromOffset(postingsOffset uint64, except *roaring.Bitmap, rv *PostingsList) (*PostingsList, error) { - rv = d.postingsListInit(rv, except) - - err := rv.read(postingsOffset, d) - if err != nil { - return nil, err - } - - return rv, nil -} - -func (d *Dictionary) postingsListInit(rv *PostingsList, except *roaring.Bitmap) *PostingsList { - if rv == nil || rv == emptyPostingsList { - rv = &PostingsList{} - } else { - postings := rv.postings - if postings != nil { - postings.Clear() - } - - *rv = PostingsList{} // clear the struct - - rv.postings = postings - } - rv.sb = d.sb - rv.except = except - return rv -} - -func (d *Dictionary) Contains(key []byte) (bool, error) { - return d.fst.Contains(key) -} - -// Iterator returns an iterator for this dictionary -func (d *Dictionary) Iterator() segment.DictionaryIterator { - rv := &DictionaryIterator{ - d: d, - } - - if d.fst != nil { - itr, err := d.fst.Iterator(nil, nil) - if err == nil { - rv.itr = itr - } else if err != vellum.ErrIteratorDone { - rv.err = err - } - } - - return rv -} - -// PrefixIterator returns an iterator which only visits terms having the -// the specified prefix -func (d *Dictionary) PrefixIterator(prefix string) segment.DictionaryIterator { - rv := &DictionaryIterator{ - d: d, - } - - kBeg := []byte(prefix) - kEnd := segment.IncrementBytes(kBeg) - - if d.fst != nil { - itr, err := d.fst.Iterator(kBeg, kEnd) - if err == nil { - rv.itr = itr - } else if err != vellum.ErrIteratorDone { - rv.err = err - } - } - - return rv -} - -// RangeIterator returns an iterator which only visits terms between the -// start and end terms. NOTE: bleve.index API specifies the end is inclusive. -func (d *Dictionary) RangeIterator(start, end string) segment.DictionaryIterator { - rv := &DictionaryIterator{ - d: d, - } - - // need to increment the end position to be inclusive - var endBytes []byte - if len(end) > 0 { - endBytes = []byte(end) - if endBytes[len(endBytes)-1] < 0xff { - endBytes[len(endBytes)-1]++ - } else { - endBytes = append(endBytes, 0xff) - } - } - - if d.fst != nil { - itr, err := d.fst.Iterator([]byte(start), endBytes) - if err == nil { - rv.itr = itr - } else if err != vellum.ErrIteratorDone { - rv.err = err - } - } - - return rv -} - -// AutomatonIterator returns an iterator which only visits terms -// having the the vellum automaton and start/end key range -func (d *Dictionary) AutomatonIterator(a vellum.Automaton, - startKeyInclusive, endKeyExclusive []byte) segment.DictionaryIterator { - rv := &DictionaryIterator{ - d: d, - } - - if d.fst != nil { - itr, err := d.fst.Search(a, startKeyInclusive, endKeyExclusive) - if err == nil { - rv.itr = itr - } else if err != vellum.ErrIteratorDone { - rv.err = err - } - } - - return rv -} - -func (d *Dictionary) OnlyIterator(onlyTerms [][]byte, - includeCount bool) segment.DictionaryIterator { - - rv := &DictionaryIterator{ - d: d, - omitCount: !includeCount, - } - - var buf bytes.Buffer - builder, err := vellum.New(&buf, nil) - if err != nil { - rv.err = err - return rv - } - for _, term := range onlyTerms { - err = builder.Insert(term, 0) - if err != nil { - rv.err = err - return rv - } - } - err = builder.Close() - if err != nil { - rv.err = err - return rv - } - - onlyFST, err := vellum.Load(buf.Bytes()) - if err != nil { - rv.err = err - return rv - } - - itr, err := d.fst.Search(onlyFST, nil, nil) - if err == nil { - rv.itr = itr - } else if err != vellum.ErrIteratorDone { - rv.err = err - } - - return rv -} - -// DictionaryIterator is an iterator for term dictionary -type DictionaryIterator struct { - d *Dictionary - itr vellum.Iterator - err error - tmp PostingsList - entry index.DictEntry - omitCount bool -} - -// Next returns the next entry in the dictionary -func (i *DictionaryIterator) Next() (*index.DictEntry, error) { - if i.err != nil && i.err != vellum.ErrIteratorDone { - return nil, i.err - } else if i.itr == nil || i.err == vellum.ErrIteratorDone { - return nil, nil - } - term, postingsOffset := i.itr.Current() - i.entry.Term = string(term) - if !i.omitCount { - i.err = i.tmp.read(postingsOffset, i.d) - if i.err != nil { - return nil, i.err - } - i.entry.Count = i.tmp.Count() - } - i.err = i.itr.Next() - return &i.entry, nil -} diff --git a/vendor/github.com/blevesearch/zap/v14/docvalues.go b/vendor/github.com/blevesearch/zap/v14/docvalues.go deleted file mode 100644 index 793797b..0000000 --- a/vendor/github.com/blevesearch/zap/v14/docvalues.go +++ /dev/null @@ -1,312 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "encoding/binary" - "fmt" - "math" - "reflect" - "sort" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/blevesearch/bleve/size" - "github.com/golang/snappy" -) - -var reflectStaticSizedocValueReader int - -func init() { - var dvi docValueReader - reflectStaticSizedocValueReader = int(reflect.TypeOf(dvi).Size()) -} - -type docNumTermsVisitor func(docNum uint64, terms []byte) error - -type docVisitState struct { - dvrs map[uint16]*docValueReader - segment *SegmentBase -} - -type docValueReader struct { - field string - curChunkNum uint64 - chunkOffsets []uint64 - dvDataLoc uint64 - curChunkHeader []MetaData - curChunkData []byte // compressed data cache - uncompressed []byte // temp buf for snappy decompression -} - -func (di *docValueReader) size() int { - return reflectStaticSizedocValueReader + size.SizeOfPtr + - len(di.field) + - len(di.chunkOffsets)*size.SizeOfUint64 + - len(di.curChunkHeader)*reflectStaticSizeMetaData + - len(di.curChunkData) -} - -func (di *docValueReader) cloneInto(rv *docValueReader) *docValueReader { - if rv == nil { - rv = &docValueReader{} - } - - rv.field = di.field - rv.curChunkNum = math.MaxUint64 - rv.chunkOffsets = di.chunkOffsets // immutable, so it's sharable - rv.dvDataLoc = di.dvDataLoc - rv.curChunkHeader = rv.curChunkHeader[:0] - rv.curChunkData = nil - rv.uncompressed = rv.uncompressed[:0] - - return rv -} - -func (di *docValueReader) curChunkNumber() uint64 { - return di.curChunkNum -} - -func (s *SegmentBase) loadFieldDocValueReader(field string, - fieldDvLocStart, fieldDvLocEnd uint64) (*docValueReader, error) { - // get the docValue offset for the given fields - if fieldDvLocStart == fieldNotUninverted { - // no docValues found, nothing to do - return nil, nil - } - - // read the number of chunks, and chunk offsets position - var numChunks, chunkOffsetsPosition uint64 - - if fieldDvLocEnd-fieldDvLocStart > 16 { - numChunks = binary.BigEndian.Uint64(s.mem[fieldDvLocEnd-8 : fieldDvLocEnd]) - // read the length of chunk offsets - chunkOffsetsLen := binary.BigEndian.Uint64(s.mem[fieldDvLocEnd-16 : fieldDvLocEnd-8]) - // acquire position of chunk offsets - chunkOffsetsPosition = (fieldDvLocEnd - 16) - chunkOffsetsLen - } else { - return nil, fmt.Errorf("loadFieldDocValueReader: fieldDvLoc too small: %d-%d", fieldDvLocEnd, fieldDvLocStart) - } - - fdvIter := &docValueReader{ - curChunkNum: math.MaxUint64, - field: field, - chunkOffsets: make([]uint64, int(numChunks)), - } - - // read the chunk offsets - var offset uint64 - for i := 0; i < int(numChunks); i++ { - loc, read := binary.Uvarint(s.mem[chunkOffsetsPosition+offset : chunkOffsetsPosition+offset+binary.MaxVarintLen64]) - if read <= 0 { - return nil, fmt.Errorf("corrupted chunk offset during segment load") - } - fdvIter.chunkOffsets[i] = loc - offset += uint64(read) - } - - // set the data offset - fdvIter.dvDataLoc = fieldDvLocStart - - return fdvIter, nil -} - -func (di *docValueReader) loadDvChunk(chunkNumber uint64, s *SegmentBase) error { - // advance to the chunk where the docValues - // reside for the given docNum - destChunkDataLoc, curChunkEnd := di.dvDataLoc, di.dvDataLoc - start, end := readChunkBoundary(int(chunkNumber), di.chunkOffsets) - if start >= end { - di.curChunkHeader = di.curChunkHeader[:0] - di.curChunkData = nil - di.curChunkNum = chunkNumber - di.uncompressed = di.uncompressed[:0] - return nil - } - - destChunkDataLoc += start - curChunkEnd += end - - // read the number of docs reside in the chunk - numDocs, read := binary.Uvarint(s.mem[destChunkDataLoc : destChunkDataLoc+binary.MaxVarintLen64]) - if read <= 0 { - return fmt.Errorf("failed to read the chunk") - } - chunkMetaLoc := destChunkDataLoc + uint64(read) - - offset := uint64(0) - if cap(di.curChunkHeader) < int(numDocs) { - di.curChunkHeader = make([]MetaData, int(numDocs)) - } else { - di.curChunkHeader = di.curChunkHeader[:int(numDocs)] - } - for i := 0; i < int(numDocs); i++ { - di.curChunkHeader[i].DocNum, read = binary.Uvarint(s.mem[chunkMetaLoc+offset : chunkMetaLoc+offset+binary.MaxVarintLen64]) - offset += uint64(read) - di.curChunkHeader[i].DocDvOffset, read = binary.Uvarint(s.mem[chunkMetaLoc+offset : chunkMetaLoc+offset+binary.MaxVarintLen64]) - offset += uint64(read) - } - - compressedDataLoc := chunkMetaLoc + offset - dataLength := curChunkEnd - compressedDataLoc - di.curChunkData = s.mem[compressedDataLoc : compressedDataLoc+dataLength] - di.curChunkNum = chunkNumber - di.uncompressed = di.uncompressed[:0] - return nil -} - -func (di *docValueReader) iterateAllDocValues(s *SegmentBase, visitor docNumTermsVisitor) error { - for i := 0; i < len(di.chunkOffsets); i++ { - err := di.loadDvChunk(uint64(i), s) - if err != nil { - return err - } - if di.curChunkData == nil || len(di.curChunkHeader) == 0 { - continue - } - - // uncompress the already loaded data - uncompressed, err := snappy.Decode(di.uncompressed[:cap(di.uncompressed)], di.curChunkData) - if err != nil { - return err - } - di.uncompressed = uncompressed - - start := uint64(0) - for _, entry := range di.curChunkHeader { - err = visitor(entry.DocNum, uncompressed[start:entry.DocDvOffset]) - if err != nil { - return err - } - - start = entry.DocDvOffset - } - } - - return nil -} - -func (di *docValueReader) visitDocValues(docNum uint64, - visitor index.DocumentFieldTermVisitor) error { - // binary search the term locations for the docNum - start, end := di.getDocValueLocs(docNum) - if start == math.MaxUint64 || end == math.MaxUint64 || start == end { - return nil - } - - var uncompressed []byte - var err error - // use the uncompressed copy if available - if len(di.uncompressed) > 0 { - uncompressed = di.uncompressed - } else { - // uncompress the already loaded data - uncompressed, err = snappy.Decode(di.uncompressed[:cap(di.uncompressed)], di.curChunkData) - if err != nil { - return err - } - di.uncompressed = uncompressed - } - - // pick the terms for the given docNum - uncompressed = uncompressed[start:end] - for { - i := bytes.Index(uncompressed, termSeparatorSplitSlice) - if i < 0 { - break - } - - visitor(di.field, uncompressed[0:i]) - uncompressed = uncompressed[i+1:] - } - - return nil -} - -func (di *docValueReader) getDocValueLocs(docNum uint64) (uint64, uint64) { - i := sort.Search(len(di.curChunkHeader), func(i int) bool { - return di.curChunkHeader[i].DocNum >= docNum - }) - if i < len(di.curChunkHeader) && di.curChunkHeader[i].DocNum == docNum { - return ReadDocValueBoundary(i, di.curChunkHeader) - } - return math.MaxUint64, math.MaxUint64 -} - -// VisitDocumentFieldTerms is an implementation of the -// DocumentFieldTermVisitable interface -func (s *SegmentBase) VisitDocumentFieldTerms(localDocNum uint64, fields []string, - visitor index.DocumentFieldTermVisitor, dvsIn segment.DocVisitState) ( - segment.DocVisitState, error) { - dvs, ok := dvsIn.(*docVisitState) - if !ok || dvs == nil { - dvs = &docVisitState{} - } else { - if dvs.segment != s { - dvs.segment = s - dvs.dvrs = nil - } - } - - var fieldIDPlus1 uint16 - if dvs.dvrs == nil { - dvs.dvrs = make(map[uint16]*docValueReader, len(fields)) - for _, field := range fields { - if fieldIDPlus1, ok = s.fieldsMap[field]; !ok { - continue - } - fieldID := fieldIDPlus1 - 1 - if dvIter, exists := s.fieldDvReaders[fieldID]; exists && - dvIter != nil { - dvs.dvrs[fieldID] = dvIter.cloneInto(dvs.dvrs[fieldID]) - } - } - } - - // find the chunkNumber where the docValues are stored - // NOTE: doc values continue to use legacy chunk mode - chunkFactor, err := getChunkSize(LegacyChunkMode, 0, 0) - if err != nil { - return nil, err - } - docInChunk := localDocNum / chunkFactor - var dvr *docValueReader - for _, field := range fields { - if fieldIDPlus1, ok = s.fieldsMap[field]; !ok { - continue - } - fieldID := fieldIDPlus1 - 1 - if dvr, ok = dvs.dvrs[fieldID]; ok && dvr != nil { - // check if the chunk is already loaded - if docInChunk != dvr.curChunkNumber() { - err := dvr.loadDvChunk(docInChunk, s) - if err != nil { - return dvs, err - } - } - - _ = dvr.visitDocValues(localDocNum, visitor) - } - } - return dvs, nil -} - -// VisitableDocValueFields returns the list of fields with -// persisted doc value terms ready to be visitable using the -// VisitDocumentFieldTerms method. -func (s *SegmentBase) VisitableDocValueFields() ([]string, error) { - return s.fieldDvNames, nil -} diff --git a/vendor/github.com/blevesearch/zap/v14/enumerator.go b/vendor/github.com/blevesearch/zap/v14/enumerator.go deleted file mode 100644 index bc5b7e6..0000000 --- a/vendor/github.com/blevesearch/zap/v14/enumerator.go +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright (c) 2018 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - - "github.com/couchbase/vellum" -) - -// enumerator provides an ordered traversal of multiple vellum -// iterators. Like JOIN of iterators, the enumerator produces a -// sequence of (key, iteratorIndex, value) tuples, sorted by key ASC, -// then iteratorIndex ASC, where the same key might be seen or -// repeated across multiple child iterators. -type enumerator struct { - itrs []vellum.Iterator - currKs [][]byte - currVs []uint64 - - lowK []byte - lowIdxs []int - lowCurr int -} - -// newEnumerator returns a new enumerator over the vellum Iterators -func newEnumerator(itrs []vellum.Iterator) (*enumerator, error) { - rv := &enumerator{ - itrs: itrs, - currKs: make([][]byte, len(itrs)), - currVs: make([]uint64, len(itrs)), - lowIdxs: make([]int, 0, len(itrs)), - } - for i, itr := range rv.itrs { - rv.currKs[i], rv.currVs[i] = itr.Current() - } - rv.updateMatches(false) - if rv.lowK == nil && len(rv.lowIdxs) == 0 { - return rv, vellum.ErrIteratorDone - } - return rv, nil -} - -// updateMatches maintains the low key matches based on the currKs -func (m *enumerator) updateMatches(skipEmptyKey bool) { - m.lowK = nil - m.lowIdxs = m.lowIdxs[:0] - m.lowCurr = 0 - - for i, key := range m.currKs { - if (key == nil && m.currVs[i] == 0) || // in case of empty iterator - (len(key) == 0 && skipEmptyKey) { // skip empty keys - continue - } - - cmp := bytes.Compare(key, m.lowK) - if cmp < 0 || len(m.lowIdxs) == 0 { - // reached a new low - m.lowK = key - m.lowIdxs = m.lowIdxs[:0] - m.lowIdxs = append(m.lowIdxs, i) - } else if cmp == 0 { - m.lowIdxs = append(m.lowIdxs, i) - } - } -} - -// Current returns the enumerator's current key, iterator-index, and -// value. If the enumerator is not pointing at a valid value (because -// Next returned an error previously), Current will return nil,0,0. -func (m *enumerator) Current() ([]byte, int, uint64) { - var i int - var v uint64 - if m.lowCurr < len(m.lowIdxs) { - i = m.lowIdxs[m.lowCurr] - v = m.currVs[i] - } - return m.lowK, i, v -} - -// GetLowIdxsAndValues will return all of the iterator indices -// which point to the current key, and their corresponding -// values. This can be used by advanced caller which may need -// to peek into these other sets of data before processing. -func (m *enumerator) GetLowIdxsAndValues() ([]int, []uint64) { - values := make([]uint64, 0, len(m.lowIdxs)) - for _, idx := range m.lowIdxs { - values = append(values, m.currVs[idx]) - } - return m.lowIdxs, values -} - -// Next advances the enumerator to the next key/iterator/value result, -// else vellum.ErrIteratorDone is returned. -func (m *enumerator) Next() error { - m.lowCurr += 1 - if m.lowCurr >= len(m.lowIdxs) { - // move all the current low iterators forwards - for _, vi := range m.lowIdxs { - err := m.itrs[vi].Next() - if err != nil && err != vellum.ErrIteratorDone { - return err - } - m.currKs[vi], m.currVs[vi] = m.itrs[vi].Current() - } - // can skip any empty keys encountered at this point - m.updateMatches(true) - } - if m.lowK == nil && len(m.lowIdxs) == 0 { - return vellum.ErrIteratorDone - } - return nil -} - -// Close all the underlying Iterators. The first error, if any, will -// be returned. -func (m *enumerator) Close() error { - var rv error - for _, itr := range m.itrs { - err := itr.Close() - if rv == nil { - rv = err - } - } - return rv -} diff --git a/vendor/github.com/blevesearch/zap/v14/intDecoder.go b/vendor/github.com/blevesearch/zap/v14/intDecoder.go deleted file mode 100644 index 3baa0c2..0000000 --- a/vendor/github.com/blevesearch/zap/v14/intDecoder.go +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright (c) 2019 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "encoding/binary" - "fmt" - - "github.com/blevesearch/bleve/index/scorch/segment" -) - -type chunkedIntDecoder struct { - startOffset uint64 - dataStartOffset uint64 - chunkOffsets []uint64 - curChunkBytes []byte - data []byte - r *segment.MemUvarintReader -} - -// newChunkedIntDecoder expects an optional or reset chunkedIntDecoder for better reuse. -func newChunkedIntDecoder(buf []byte, offset uint64, rv *chunkedIntDecoder) *chunkedIntDecoder { - if rv == nil { - rv = &chunkedIntDecoder{startOffset: offset, data: buf} - } else { - rv.startOffset = offset - rv.data = buf - } - - var n, numChunks uint64 - var read int - if offset == termNotEncoded { - numChunks = 0 - } else { - numChunks, read = binary.Uvarint(buf[offset+n : offset+n+binary.MaxVarintLen64]) - } - - n += uint64(read) - if cap(rv.chunkOffsets) >= int(numChunks) { - rv.chunkOffsets = rv.chunkOffsets[:int(numChunks)] - } else { - rv.chunkOffsets = make([]uint64, int(numChunks)) - } - for i := 0; i < int(numChunks); i++ { - rv.chunkOffsets[i], read = binary.Uvarint(buf[offset+n : offset+n+binary.MaxVarintLen64]) - n += uint64(read) - } - rv.dataStartOffset = offset + n - return rv -} - -func (d *chunkedIntDecoder) loadChunk(chunk int) error { - if d.startOffset == termNotEncoded { - d.r = segment.NewMemUvarintReader([]byte(nil)) - return nil - } - - if chunk >= len(d.chunkOffsets) { - return fmt.Errorf("tried to load freq chunk that doesn't exist %d/(%d)", - chunk, len(d.chunkOffsets)) - } - - end, start := d.dataStartOffset, d.dataStartOffset - s, e := readChunkBoundary(chunk, d.chunkOffsets) - start += s - end += e - d.curChunkBytes = d.data[start:end] - if d.r == nil { - d.r = segment.NewMemUvarintReader(d.curChunkBytes) - } else { - d.r.Reset(d.curChunkBytes) - } - - return nil -} - -func (d *chunkedIntDecoder) reset() { - d.startOffset = 0 - d.dataStartOffset = 0 - d.chunkOffsets = d.chunkOffsets[:0] - d.curChunkBytes = d.curChunkBytes[:0] - d.data = d.data[:0] - if d.r != nil { - d.r.Reset([]byte(nil)) - } -} - -func (d *chunkedIntDecoder) isNil() bool { - return d.curChunkBytes == nil || len(d.curChunkBytes) == 0 -} - -func (d *chunkedIntDecoder) readUvarint() (uint64, error) { - return d.r.ReadUvarint() -} - -func (d *chunkedIntDecoder) SkipUvarint() { - d.r.SkipUvarint() -} - -func (d *chunkedIntDecoder) SkipBytes(count int) { - d.r.SkipBytes(count) -} - -func (d *chunkedIntDecoder) Len() int { - return d.r.Len() -} diff --git a/vendor/github.com/blevesearch/zap/v14/intcoder.go b/vendor/github.com/blevesearch/zap/v14/intcoder.go deleted file mode 100644 index c3c488f..0000000 --- a/vendor/github.com/blevesearch/zap/v14/intcoder.go +++ /dev/null @@ -1,206 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "encoding/binary" - "io" -) - -// We can safely use 0 to represent termNotEncoded since 0 -// could never be a valid address for term location information. -// (stored field index is always non-empty and earlier in the -// file) -const termNotEncoded = 0 - -type chunkedIntCoder struct { - final []byte - chunkSize uint64 - chunkBuf bytes.Buffer - chunkLens []uint64 - currChunk uint64 - - buf []byte -} - -// newChunkedIntCoder returns a new chunk int coder which packs data into -// chunks based on the provided chunkSize and supports up to the specified -// maxDocNum -func newChunkedIntCoder(chunkSize uint64, maxDocNum uint64) *chunkedIntCoder { - total := maxDocNum/chunkSize + 1 - rv := &chunkedIntCoder{ - chunkSize: chunkSize, - chunkLens: make([]uint64, total), - final: make([]byte, 0, 64), - } - - return rv -} - -// Reset lets you reuse this chunked int coder. buffers are reset and reused -// from previous use. you cannot change the chunk size or max doc num. -func (c *chunkedIntCoder) Reset() { - c.final = c.final[:0] - c.chunkBuf.Reset() - c.currChunk = 0 - for i := range c.chunkLens { - c.chunkLens[i] = 0 - } -} - -// SetChunkSize changes the chunk size. It is only valid to do so -// with a new chunkedIntCoder, or immediately after calling Reset() -func (c *chunkedIntCoder) SetChunkSize(chunkSize uint64, maxDocNum uint64) { - total := int(maxDocNum/chunkSize + 1) - c.chunkSize = chunkSize - if cap(c.chunkLens) < total { - c.chunkLens = make([]uint64, total) - } else { - c.chunkLens = c.chunkLens[:total] - } -} - -// Add encodes the provided integers into the correct chunk for the provided -// doc num. You MUST call Add() with increasing docNums. -func (c *chunkedIntCoder) Add(docNum uint64, vals ...uint64) error { - chunk := docNum / c.chunkSize - if chunk != c.currChunk { - // starting a new chunk - c.Close() - c.chunkBuf.Reset() - c.currChunk = chunk - } - - if len(c.buf) < binary.MaxVarintLen64 { - c.buf = make([]byte, binary.MaxVarintLen64) - } - - for _, val := range vals { - wb := binary.PutUvarint(c.buf, val) - _, err := c.chunkBuf.Write(c.buf[:wb]) - if err != nil { - return err - } - } - - return nil -} - -func (c *chunkedIntCoder) AddBytes(docNum uint64, buf []byte) error { - chunk := docNum / c.chunkSize - if chunk != c.currChunk { - // starting a new chunk - c.Close() - c.chunkBuf.Reset() - c.currChunk = chunk - } - - _, err := c.chunkBuf.Write(buf) - return err -} - -// Close indicates you are done calling Add() this allows the final chunk -// to be encoded. -func (c *chunkedIntCoder) Close() { - encodingBytes := c.chunkBuf.Bytes() - c.chunkLens[c.currChunk] = uint64(len(encodingBytes)) - c.final = append(c.final, encodingBytes...) - c.currChunk = uint64(cap(c.chunkLens)) // sentinel to detect double close -} - -// Write commits all the encoded chunked integers to the provided writer. -func (c *chunkedIntCoder) Write(w io.Writer) (int, error) { - bufNeeded := binary.MaxVarintLen64 * (1 + len(c.chunkLens)) - if len(c.buf) < bufNeeded { - c.buf = make([]byte, bufNeeded) - } - buf := c.buf - - // convert the chunk lengths into chunk offsets - chunkOffsets := modifyLengthsToEndOffsets(c.chunkLens) - - // write out the number of chunks & each chunk offsets - n := binary.PutUvarint(buf, uint64(len(chunkOffsets))) - for _, chunkOffset := range chunkOffsets { - n += binary.PutUvarint(buf[n:], chunkOffset) - } - - tw, err := w.Write(buf[:n]) - if err != nil { - return tw, err - } - - // write out the data - nw, err := w.Write(c.final) - tw += nw - if err != nil { - return tw, err - } - return tw, nil -} - -// writeAt commits all the encoded chunked integers to the provided writer -// and returns the starting offset, total bytes written and an error -func (c *chunkedIntCoder) writeAt(w io.Writer) (uint64, int, error) { - startOffset := uint64(termNotEncoded) - if len(c.final) <= 0 { - return startOffset, 0, nil - } - - if chw := w.(*CountHashWriter); chw != nil { - startOffset = uint64(chw.Count()) - } - - tw, err := c.Write(w) - return startOffset, tw, err -} - -func (c *chunkedIntCoder) FinalSize() int { - return len(c.final) -} - -// modifyLengthsToEndOffsets converts the chunk length array -// to a chunk offset array. The readChunkBoundary -// will figure out the start and end of every chunk from -// these offsets. Starting offset of i'th index is stored -// in i-1'th position except for 0'th index and ending offset -// is stored at i'th index position. -// For 0'th element, starting position is always zero. -// eg: -// Lens -> 5 5 5 5 => 5 10 15 20 -// Lens -> 0 5 0 5 => 0 5 5 10 -// Lens -> 0 0 0 5 => 0 0 0 5 -// Lens -> 5 0 0 0 => 5 5 5 5 -// Lens -> 0 5 0 0 => 0 5 5 5 -// Lens -> 0 0 5 0 => 0 0 5 5 -func modifyLengthsToEndOffsets(lengths []uint64) []uint64 { - var runningOffset uint64 - var index, i int - for i = 1; i <= len(lengths); i++ { - runningOffset += lengths[i-1] - lengths[index] = runningOffset - index++ - } - return lengths -} - -func readChunkBoundary(chunk int, offsets []uint64) (uint64, uint64) { - var start uint64 - if chunk > 0 { - start = offsets[chunk-1] - } - return start, offsets[chunk] -} diff --git a/vendor/github.com/blevesearch/zap/v14/merge.go b/vendor/github.com/blevesearch/zap/v14/merge.go deleted file mode 100644 index 805100f..0000000 --- a/vendor/github.com/blevesearch/zap/v14/merge.go +++ /dev/null @@ -1,847 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bufio" - "bytes" - "encoding/binary" - "fmt" - "math" - "os" - "sort" - - "github.com/RoaringBitmap/roaring" - seg "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/couchbase/vellum" - "github.com/golang/snappy" -) - -var DefaultFileMergerBufferSize = 1024 * 1024 - -const docDropped = math.MaxUint64 // sentinel docNum to represent a deleted doc - -// Merge takes a slice of segments and bit masks describing which -// documents may be dropped, and creates a new segment containing the -// remaining data. This new segment is built at the specified path. -func (*ZapPlugin) Merge(segments []seg.Segment, drops []*roaring.Bitmap, path string, - closeCh chan struct{}, s seg.StatsReporter) ( - [][]uint64, uint64, error) { - - segmentBases := make([]*SegmentBase, len(segments)) - for segmenti, segment := range segments { - switch segmentx := segment.(type) { - case *Segment: - segmentBases[segmenti] = &segmentx.SegmentBase - case *SegmentBase: - segmentBases[segmenti] = segmentx - default: - panic(fmt.Sprintf("oops, unexpected segment type: %T", segment)) - } - } - return mergeSegmentBases(segmentBases, drops, path, DefaultChunkMode, closeCh, s) -} - -func mergeSegmentBases(segmentBases []*SegmentBase, drops []*roaring.Bitmap, path string, - chunkMode uint32, closeCh chan struct{}, s seg.StatsReporter) ( - [][]uint64, uint64, error) { - flag := os.O_RDWR | os.O_CREATE - - f, err := os.OpenFile(path, flag, 0600) - if err != nil { - return nil, 0, err - } - - cleanup := func() { - _ = f.Close() - _ = os.Remove(path) - } - - // buffer the output - br := bufio.NewWriterSize(f, DefaultFileMergerBufferSize) - - // wrap it for counting (tracking offsets) - cr := NewCountHashWriterWithStatsReporter(br, s) - - newDocNums, numDocs, storedIndexOffset, fieldsIndexOffset, docValueOffset, _, _, _, err := - MergeToWriter(segmentBases, drops, chunkMode, cr, closeCh) - if err != nil { - cleanup() - return nil, 0, err - } - - err = persistFooter(numDocs, storedIndexOffset, fieldsIndexOffset, - docValueOffset, chunkMode, cr.Sum32(), cr) - if err != nil { - cleanup() - return nil, 0, err - } - - err = br.Flush() - if err != nil { - cleanup() - return nil, 0, err - } - - err = f.Sync() - if err != nil { - cleanup() - return nil, 0, err - } - - err = f.Close() - if err != nil { - cleanup() - return nil, 0, err - } - - return newDocNums, uint64(cr.Count()), nil -} - -func MergeToWriter(segments []*SegmentBase, drops []*roaring.Bitmap, - chunkMode uint32, cr *CountHashWriter, closeCh chan struct{}) ( - newDocNums [][]uint64, - numDocs, storedIndexOffset, fieldsIndexOffset, docValueOffset uint64, - dictLocs []uint64, fieldsInv []string, fieldsMap map[string]uint16, - err error) { - docValueOffset = uint64(fieldNotUninverted) - - var fieldsSame bool - fieldsSame, fieldsInv = mergeFields(segments) - fieldsMap = mapFields(fieldsInv) - - numDocs = computeNewDocCount(segments, drops) - - if isClosed(closeCh) { - return nil, 0, 0, 0, 0, nil, nil, nil, seg.ErrClosed - } - - if numDocs > 0 { - storedIndexOffset, newDocNums, err = mergeStoredAndRemap(segments, drops, - fieldsMap, fieldsInv, fieldsSame, numDocs, cr, closeCh) - if err != nil { - return nil, 0, 0, 0, 0, nil, nil, nil, err - } - - dictLocs, docValueOffset, err = persistMergedRest(segments, drops, - fieldsInv, fieldsMap, fieldsSame, - newDocNums, numDocs, chunkMode, cr, closeCh) - if err != nil { - return nil, 0, 0, 0, 0, nil, nil, nil, err - } - } else { - dictLocs = make([]uint64, len(fieldsInv)) - } - - fieldsIndexOffset, err = persistFields(fieldsInv, cr, dictLocs) - if err != nil { - return nil, 0, 0, 0, 0, nil, nil, nil, err - } - - return newDocNums, numDocs, storedIndexOffset, fieldsIndexOffset, docValueOffset, dictLocs, fieldsInv, fieldsMap, nil -} - -// mapFields takes the fieldsInv list and returns a map of fieldName -// to fieldID+1 -func mapFields(fields []string) map[string]uint16 { - rv := make(map[string]uint16, len(fields)) - for i, fieldName := range fields { - rv[fieldName] = uint16(i) + 1 - } - return rv -} - -// computeNewDocCount determines how many documents will be in the newly -// merged segment when obsoleted docs are dropped -func computeNewDocCount(segments []*SegmentBase, drops []*roaring.Bitmap) uint64 { - var newDocCount uint64 - for segI, segment := range segments { - newDocCount += segment.numDocs - if drops[segI] != nil { - newDocCount -= drops[segI].GetCardinality() - } - } - return newDocCount -} - -func persistMergedRest(segments []*SegmentBase, dropsIn []*roaring.Bitmap, - fieldsInv []string, fieldsMap map[string]uint16, fieldsSame bool, - newDocNumsIn [][]uint64, newSegDocCount uint64, chunkMode uint32, - w *CountHashWriter, closeCh chan struct{}) ([]uint64, uint64, error) { - - var bufMaxVarintLen64 []byte = make([]byte, binary.MaxVarintLen64) - var bufLoc []uint64 - - var postings *PostingsList - var postItr *PostingsIterator - - rv := make([]uint64, len(fieldsInv)) - fieldDvLocsStart := make([]uint64, len(fieldsInv)) - fieldDvLocsEnd := make([]uint64, len(fieldsInv)) - - // these int coders are initialized with chunk size 1024 - // however this will be reset to the correct chunk size - // while processing each individual field-term section - tfEncoder := newChunkedIntCoder(1024, newSegDocCount-1) - locEncoder := newChunkedIntCoder(1024, newSegDocCount-1) - - var vellumBuf bytes.Buffer - newVellum, err := vellum.New(&vellumBuf, nil) - if err != nil { - return nil, 0, err - } - - newRoaring := roaring.NewBitmap() - - // for each field - for fieldID, fieldName := range fieldsInv { - - // collect FST iterators from all active segments for this field - var newDocNums [][]uint64 - var drops []*roaring.Bitmap - var dicts []*Dictionary - var itrs []vellum.Iterator - - var segmentsInFocus []*SegmentBase - - for segmentI, segment := range segments { - - // check for the closure in meantime - if isClosed(closeCh) { - return nil, 0, seg.ErrClosed - } - - dict, err2 := segment.dictionary(fieldName) - if err2 != nil { - return nil, 0, err2 - } - if dict != nil && dict.fst != nil { - itr, err2 := dict.fst.Iterator(nil, nil) - if err2 != nil && err2 != vellum.ErrIteratorDone { - return nil, 0, err2 - } - if itr != nil { - newDocNums = append(newDocNums, newDocNumsIn[segmentI]) - if dropsIn[segmentI] != nil && !dropsIn[segmentI].IsEmpty() { - drops = append(drops, dropsIn[segmentI]) - } else { - drops = append(drops, nil) - } - dicts = append(dicts, dict) - itrs = append(itrs, itr) - segmentsInFocus = append(segmentsInFocus, segment) - } - } - } - - var prevTerm []byte - - newRoaring.Clear() - - var lastDocNum, lastFreq, lastNorm uint64 - - // determines whether to use "1-hit" encoding optimization - // when a term appears in only 1 doc, with no loc info, - // has freq of 1, and the docNum fits into 31-bits - use1HitEncoding := func(termCardinality uint64) (bool, uint64, uint64) { - if termCardinality == uint64(1) && locEncoder.FinalSize() <= 0 { - docNum := uint64(newRoaring.Minimum()) - if under32Bits(docNum) && docNum == lastDocNum && lastFreq == 1 { - return true, docNum, lastNorm - } - } - return false, 0, 0 - } - - finishTerm := func(term []byte) error { - tfEncoder.Close() - locEncoder.Close() - - postingsOffset, err := writePostings(newRoaring, - tfEncoder, locEncoder, use1HitEncoding, w, bufMaxVarintLen64) - if err != nil { - return err - } - - if postingsOffset > 0 { - err = newVellum.Insert(term, postingsOffset) - if err != nil { - return err - } - } - - newRoaring.Clear() - - tfEncoder.Reset() - locEncoder.Reset() - - lastDocNum = 0 - lastFreq = 0 - lastNorm = 0 - - return nil - } - - enumerator, err := newEnumerator(itrs) - - for err == nil { - term, itrI, postingsOffset := enumerator.Current() - - if !bytes.Equal(prevTerm, term) { - // check for the closure in meantime - if isClosed(closeCh) { - return nil, 0, seg.ErrClosed - } - - // if the term changed, write out the info collected - // for the previous term - err = finishTerm(prevTerm) - if err != nil { - return nil, 0, err - } - } - if !bytes.Equal(prevTerm, term) || prevTerm == nil { - // compute cardinality of field-term in new seg - var newCard uint64 - lowItrIdxs, lowItrVals := enumerator.GetLowIdxsAndValues() - for i, idx := range lowItrIdxs { - pl, err := dicts[idx].postingsListFromOffset(lowItrVals[i], drops[idx], nil) - if err != nil { - return nil, 0, err - } - newCard += pl.Count() - } - // compute correct chunk size with this - chunkSize, err := getChunkSize(chunkMode, newCard, newSegDocCount) - if err != nil { - return nil, 0, err - } - // update encoders chunk - tfEncoder.SetChunkSize(chunkSize, newSegDocCount-1) - locEncoder.SetChunkSize(chunkSize, newSegDocCount-1) - } - - postings, err = dicts[itrI].postingsListFromOffset( - postingsOffset, drops[itrI], postings) - if err != nil { - return nil, 0, err - } - - postItr = postings.iterator(true, true, true, postItr) - - // can no longer optimize by copying, since chunk factor could have changed - lastDocNum, lastFreq, lastNorm, bufLoc, err = mergeTermFreqNormLocs( - fieldsMap, term, postItr, newDocNums[itrI], newRoaring, - tfEncoder, locEncoder, bufLoc) - - if err != nil { - return nil, 0, err - } - - prevTerm = prevTerm[:0] // copy to prevTerm in case Next() reuses term mem - prevTerm = append(prevTerm, term...) - - err = enumerator.Next() - } - if err != vellum.ErrIteratorDone { - return nil, 0, err - } - - err = finishTerm(prevTerm) - if err != nil { - return nil, 0, err - } - - dictOffset := uint64(w.Count()) - - err = newVellum.Close() - if err != nil { - return nil, 0, err - } - vellumData := vellumBuf.Bytes() - - // write out the length of the vellum data - n := binary.PutUvarint(bufMaxVarintLen64, uint64(len(vellumData))) - _, err = w.Write(bufMaxVarintLen64[:n]) - if err != nil { - return nil, 0, err - } - - // write this vellum to disk - _, err = w.Write(vellumData) - if err != nil { - return nil, 0, err - } - - rv[fieldID] = dictOffset - - // get the field doc value offset (start) - fieldDvLocsStart[fieldID] = uint64(w.Count()) - - // update the field doc values - // NOTE: doc values continue to use legacy chunk mode - chunkSize, err := getChunkSize(LegacyChunkMode, 0, 0) - if err != nil { - return nil, 0, err - } - fdvEncoder := newChunkedContentCoder(chunkSize, newSegDocCount-1, w, true) - - fdvReadersAvailable := false - var dvIterClone *docValueReader - for segmentI, segment := range segmentsInFocus { - // check for the closure in meantime - if isClosed(closeCh) { - return nil, 0, seg.ErrClosed - } - - fieldIDPlus1 := uint16(segment.fieldsMap[fieldName]) - if dvIter, exists := segment.fieldDvReaders[fieldIDPlus1-1]; exists && - dvIter != nil { - fdvReadersAvailable = true - dvIterClone = dvIter.cloneInto(dvIterClone) - err = dvIterClone.iterateAllDocValues(segment, func(docNum uint64, terms []byte) error { - if newDocNums[segmentI][docNum] == docDropped { - return nil - } - err := fdvEncoder.Add(newDocNums[segmentI][docNum], terms) - if err != nil { - return err - } - return nil - }) - if err != nil { - return nil, 0, err - } - } - } - - if fdvReadersAvailable { - err = fdvEncoder.Close() - if err != nil { - return nil, 0, err - } - - // persist the doc value details for this field - _, err = fdvEncoder.Write() - if err != nil { - return nil, 0, err - } - - // get the field doc value offset (end) - fieldDvLocsEnd[fieldID] = uint64(w.Count()) - } else { - fieldDvLocsStart[fieldID] = fieldNotUninverted - fieldDvLocsEnd[fieldID] = fieldNotUninverted - } - - // reset vellum buffer and vellum builder - vellumBuf.Reset() - err = newVellum.Reset(&vellumBuf) - if err != nil { - return nil, 0, err - } - } - - fieldDvLocsOffset := uint64(w.Count()) - - buf := bufMaxVarintLen64 - for i := 0; i < len(fieldDvLocsStart); i++ { - n := binary.PutUvarint(buf, fieldDvLocsStart[i]) - _, err := w.Write(buf[:n]) - if err != nil { - return nil, 0, err - } - n = binary.PutUvarint(buf, fieldDvLocsEnd[i]) - _, err = w.Write(buf[:n]) - if err != nil { - return nil, 0, err - } - } - - return rv, fieldDvLocsOffset, nil -} - -func mergeTermFreqNormLocs(fieldsMap map[string]uint16, term []byte, postItr *PostingsIterator, - newDocNums []uint64, newRoaring *roaring.Bitmap, - tfEncoder *chunkedIntCoder, locEncoder *chunkedIntCoder, bufLoc []uint64) ( - lastDocNum uint64, lastFreq uint64, lastNorm uint64, bufLocOut []uint64, err error) { - next, err := postItr.Next() - for next != nil && err == nil { - hitNewDocNum := newDocNums[next.Number()] - if hitNewDocNum == docDropped { - return 0, 0, 0, nil, fmt.Errorf("see hit with dropped docNum") - } - - newRoaring.Add(uint32(hitNewDocNum)) - - nextFreq := next.Frequency() - nextNorm := uint64(math.Float32bits(float32(next.Norm()))) - - locs := next.Locations() - - err = tfEncoder.Add(hitNewDocNum, - encodeFreqHasLocs(nextFreq, len(locs) > 0), nextNorm) - if err != nil { - return 0, 0, 0, nil, err - } - - if len(locs) > 0 { - numBytesLocs := 0 - for _, loc := range locs { - ap := loc.ArrayPositions() - numBytesLocs += totalUvarintBytes(uint64(fieldsMap[loc.Field()]-1), - loc.Pos(), loc.Start(), loc.End(), uint64(len(ap)), ap) - } - - err = locEncoder.Add(hitNewDocNum, uint64(numBytesLocs)) - if err != nil { - return 0, 0, 0, nil, err - } - - for _, loc := range locs { - ap := loc.ArrayPositions() - if cap(bufLoc) < 5+len(ap) { - bufLoc = make([]uint64, 0, 5+len(ap)) - } - args := bufLoc[0:5] - args[0] = uint64(fieldsMap[loc.Field()] - 1) - args[1] = loc.Pos() - args[2] = loc.Start() - args[3] = loc.End() - args[4] = uint64(len(ap)) - args = append(args, ap...) - err = locEncoder.Add(hitNewDocNum, args...) - if err != nil { - return 0, 0, 0, nil, err - } - } - } - - lastDocNum = hitNewDocNum - lastFreq = nextFreq - lastNorm = nextNorm - - next, err = postItr.Next() - } - - return lastDocNum, lastFreq, lastNorm, bufLoc, err -} - -func writePostings(postings *roaring.Bitmap, tfEncoder, locEncoder *chunkedIntCoder, - use1HitEncoding func(uint64) (bool, uint64, uint64), - w *CountHashWriter, bufMaxVarintLen64 []byte) ( - offset uint64, err error) { - termCardinality := postings.GetCardinality() - if termCardinality <= 0 { - return 0, nil - } - - if use1HitEncoding != nil { - encodeAs1Hit, docNum1Hit, normBits1Hit := use1HitEncoding(termCardinality) - if encodeAs1Hit { - return FSTValEncode1Hit(docNum1Hit, normBits1Hit), nil - } - } - - var tfOffset uint64 - tfOffset, _, err = tfEncoder.writeAt(w) - if err != nil { - return 0, err - } - - var locOffset uint64 - locOffset, _, err = locEncoder.writeAt(w) - if err != nil { - return 0, err - } - - postingsOffset := uint64(w.Count()) - - n := binary.PutUvarint(bufMaxVarintLen64, tfOffset) - _, err = w.Write(bufMaxVarintLen64[:n]) - if err != nil { - return 0, err - } - - n = binary.PutUvarint(bufMaxVarintLen64, locOffset) - _, err = w.Write(bufMaxVarintLen64[:n]) - if err != nil { - return 0, err - } - - _, err = writeRoaringWithLen(postings, w, bufMaxVarintLen64) - if err != nil { - return 0, err - } - - return postingsOffset, nil -} - -type varintEncoder func(uint64) (int, error) - -func mergeStoredAndRemap(segments []*SegmentBase, drops []*roaring.Bitmap, - fieldsMap map[string]uint16, fieldsInv []string, fieldsSame bool, newSegDocCount uint64, - w *CountHashWriter, closeCh chan struct{}) (uint64, [][]uint64, error) { - var rv [][]uint64 // The remapped or newDocNums for each segment. - - var newDocNum uint64 - - var curr int - var data, compressed []byte - var metaBuf bytes.Buffer - varBuf := make([]byte, binary.MaxVarintLen64) - metaEncode := func(val uint64) (int, error) { - wb := binary.PutUvarint(varBuf, val) - return metaBuf.Write(varBuf[:wb]) - } - - vals := make([][][]byte, len(fieldsInv)) - typs := make([][]byte, len(fieldsInv)) - poss := make([][][]uint64, len(fieldsInv)) - - var posBuf []uint64 - - docNumOffsets := make([]uint64, newSegDocCount) - - vdc := visitDocumentCtxPool.Get().(*visitDocumentCtx) - defer visitDocumentCtxPool.Put(vdc) - - // for each segment - for segI, segment := range segments { - // check for the closure in meantime - if isClosed(closeCh) { - return 0, nil, seg.ErrClosed - } - - segNewDocNums := make([]uint64, segment.numDocs) - - dropsI := drops[segI] - - // optimize when the field mapping is the same across all - // segments and there are no deletions, via byte-copying - // of stored docs bytes directly to the writer - if fieldsSame && (dropsI == nil || dropsI.GetCardinality() == 0) { - err := segment.copyStoredDocs(newDocNum, docNumOffsets, w) - if err != nil { - return 0, nil, err - } - - for i := uint64(0); i < segment.numDocs; i++ { - segNewDocNums[i] = newDocNum - newDocNum++ - } - rv = append(rv, segNewDocNums) - - continue - } - - // for each doc num - for docNum := uint64(0); docNum < segment.numDocs; docNum++ { - // TODO: roaring's API limits docNums to 32-bits? - if dropsI != nil && dropsI.Contains(uint32(docNum)) { - segNewDocNums[docNum] = docDropped - continue - } - - segNewDocNums[docNum] = newDocNum - - curr = 0 - metaBuf.Reset() - data = data[:0] - - posTemp := posBuf - - // collect all the data - for i := 0; i < len(fieldsInv); i++ { - vals[i] = vals[i][:0] - typs[i] = typs[i][:0] - poss[i] = poss[i][:0] - } - err := segment.visitDocument(vdc, docNum, func(field string, typ byte, value []byte, pos []uint64) bool { - fieldID := int(fieldsMap[field]) - 1 - vals[fieldID] = append(vals[fieldID], value) - typs[fieldID] = append(typs[fieldID], typ) - - // copy array positions to preserve them beyond the scope of this callback - var curPos []uint64 - if len(pos) > 0 { - if cap(posTemp) < len(pos) { - posBuf = make([]uint64, len(pos)*len(fieldsInv)) - posTemp = posBuf - } - curPos = posTemp[0:len(pos)] - copy(curPos, pos) - posTemp = posTemp[len(pos):] - } - poss[fieldID] = append(poss[fieldID], curPos) - - return true - }) - if err != nil { - return 0, nil, err - } - - // _id field special case optimizes ExternalID() lookups - idFieldVal := vals[uint16(0)][0] - _, err = metaEncode(uint64(len(idFieldVal))) - if err != nil { - return 0, nil, err - } - - // now walk the non-"_id" fields in order - for fieldID := 1; fieldID < len(fieldsInv); fieldID++ { - storedFieldValues := vals[fieldID] - - stf := typs[fieldID] - spf := poss[fieldID] - - var err2 error - curr, data, err2 = persistStoredFieldValues(fieldID, - storedFieldValues, stf, spf, curr, metaEncode, data) - if err2 != nil { - return 0, nil, err2 - } - } - - metaBytes := metaBuf.Bytes() - - compressed = snappy.Encode(compressed[:cap(compressed)], data) - - // record where we're about to start writing - docNumOffsets[newDocNum] = uint64(w.Count()) - - // write out the meta len and compressed data len - _, err = writeUvarints(w, - uint64(len(metaBytes)), - uint64(len(idFieldVal)+len(compressed))) - if err != nil { - return 0, nil, err - } - // now write the meta - _, err = w.Write(metaBytes) - if err != nil { - return 0, nil, err - } - // now write the _id field val (counted as part of the 'compressed' data) - _, err = w.Write(idFieldVal) - if err != nil { - return 0, nil, err - } - // now write the compressed data - _, err = w.Write(compressed) - if err != nil { - return 0, nil, err - } - - newDocNum++ - } - - rv = append(rv, segNewDocNums) - } - - // return value is the start of the stored index - storedIndexOffset := uint64(w.Count()) - - // now write out the stored doc index - for _, docNumOffset := range docNumOffsets { - err := binary.Write(w, binary.BigEndian, docNumOffset) - if err != nil { - return 0, nil, err - } - } - - return storedIndexOffset, rv, nil -} - -// copyStoredDocs writes out a segment's stored doc info, optimized by -// using a single Write() call for the entire set of bytes. The -// newDocNumOffsets is filled with the new offsets for each doc. -func (s *SegmentBase) copyStoredDocs(newDocNum uint64, newDocNumOffsets []uint64, - w *CountHashWriter) error { - if s.numDocs <= 0 { - return nil - } - - indexOffset0, storedOffset0, _, _, _ := - s.getDocStoredOffsets(0) // the segment's first doc - - indexOffsetN, storedOffsetN, readN, metaLenN, dataLenN := - s.getDocStoredOffsets(s.numDocs - 1) // the segment's last doc - - storedOffset0New := uint64(w.Count()) - - storedBytes := s.mem[storedOffset0 : storedOffsetN+readN+metaLenN+dataLenN] - _, err := w.Write(storedBytes) - if err != nil { - return err - } - - // remap the storedOffset's for the docs into new offsets relative - // to storedOffset0New, filling the given docNumOffsetsOut array - for indexOffset := indexOffset0; indexOffset <= indexOffsetN; indexOffset += 8 { - storedOffset := binary.BigEndian.Uint64(s.mem[indexOffset : indexOffset+8]) - storedOffsetNew := storedOffset - storedOffset0 + storedOffset0New - newDocNumOffsets[newDocNum] = storedOffsetNew - newDocNum += 1 - } - - return nil -} - -// mergeFields builds a unified list of fields used across all the -// input segments, and computes whether the fields are the same across -// segments (which depends on fields to be sorted in the same way -// across segments) -func mergeFields(segments []*SegmentBase) (bool, []string) { - fieldsSame := true - - var segment0Fields []string - if len(segments) > 0 { - segment0Fields = segments[0].Fields() - } - - fieldsExist := map[string]struct{}{} - for _, segment := range segments { - fields := segment.Fields() - for fieldi, field := range fields { - fieldsExist[field] = struct{}{} - if len(segment0Fields) != len(fields) || segment0Fields[fieldi] != field { - fieldsSame = false - } - } - } - - rv := make([]string, 0, len(fieldsExist)) - // ensure _id stays first - rv = append(rv, "_id") - for k := range fieldsExist { - if k != "_id" { - rv = append(rv, k) - } - } - - sort.Strings(rv[1:]) // leave _id as first - - return fieldsSame, rv -} - -func isClosed(closeCh chan struct{}) bool { - select { - case <-closeCh: - return true - default: - return false - } -} diff --git a/vendor/github.com/blevesearch/zap/v14/new.go b/vendor/github.com/blevesearch/zap/v14/new.go deleted file mode 100644 index 9815818..0000000 --- a/vendor/github.com/blevesearch/zap/v14/new.go +++ /dev/null @@ -1,860 +0,0 @@ -// Copyright (c) 2018 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "encoding/binary" - "math" - "sort" - "sync" - - "github.com/RoaringBitmap/roaring" - "github.com/blevesearch/bleve/analysis" - "github.com/blevesearch/bleve/document" - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/couchbase/vellum" - "github.com/golang/snappy" -) - -var NewSegmentBufferNumResultsBump int = 100 -var NewSegmentBufferNumResultsFactor float64 = 1.0 -var NewSegmentBufferAvgBytesPerDocFactor float64 = 1.0 - -// ValidateDocFields can be set by applications to perform additional checks -// on fields in a document being added to a new segment, by default it does -// nothing. -// This API is experimental and may be removed at any time. -var ValidateDocFields = func(field document.Field) error { - return nil -} - -// AnalysisResultsToSegmentBase produces an in-memory zap-encoded -// SegmentBase from analysis results -func (z *ZapPlugin) New(results []*index.AnalysisResult) ( - segment.Segment, uint64, error) { - return z.newWithChunkMode(results, DefaultChunkMode) -} - -func (*ZapPlugin) newWithChunkMode(results []*index.AnalysisResult, - chunkMode uint32) (segment.Segment, uint64, error) { - s := interimPool.Get().(*interim) - - var br bytes.Buffer - if s.lastNumDocs > 0 { - // use previous results to initialize the buf with an estimate - // size, but note that the interim instance comes from a - // global interimPool, so multiple scorch instances indexing - // different docs can lead to low quality estimates - estimateAvgBytesPerDoc := int(float64(s.lastOutSize/s.lastNumDocs) * - NewSegmentBufferNumResultsFactor) - estimateNumResults := int(float64(len(results)+NewSegmentBufferNumResultsBump) * - NewSegmentBufferAvgBytesPerDocFactor) - br.Grow(estimateAvgBytesPerDoc * estimateNumResults) - } - - s.results = results - s.chunkMode = chunkMode - s.w = NewCountHashWriter(&br) - - storedIndexOffset, fieldsIndexOffset, fdvIndexOffset, dictOffsets, - err := s.convert() - if err != nil { - return nil, uint64(0), err - } - - sb, err := InitSegmentBase(br.Bytes(), s.w.Sum32(), chunkMode, - s.FieldsMap, s.FieldsInv, uint64(len(results)), - storedIndexOffset, fieldsIndexOffset, fdvIndexOffset, dictOffsets) - - if err == nil && s.reset() == nil { - s.lastNumDocs = len(results) - s.lastOutSize = len(br.Bytes()) - interimPool.Put(s) - } - - return sb, uint64(len(br.Bytes())), err -} - -var interimPool = sync.Pool{New: func() interface{} { return &interim{} }} - -// interim holds temporary working data used while converting from -// analysis results to a zap-encoded segment -type interim struct { - results []*index.AnalysisResult - - chunkMode uint32 - - w *CountHashWriter - - // FieldsMap adds 1 to field id to avoid zero value issues - // name -> field id + 1 - FieldsMap map[string]uint16 - - // FieldsInv is the inverse of FieldsMap - // field id -> name - FieldsInv []string - - // Term dictionaries for each field - // field id -> term -> postings list id + 1 - Dicts []map[string]uint64 - - // Terms for each field, where terms are sorted ascending - // field id -> []term - DictKeys [][]string - - // Fields whose IncludeDocValues is true - // field id -> bool - IncludeDocValues []bool - - // postings id -> bitmap of docNums - Postings []*roaring.Bitmap - - // postings id -> freq/norm's, one for each docNum in postings - FreqNorms [][]interimFreqNorm - freqNormsBacking []interimFreqNorm - - // postings id -> locs, one for each freq - Locs [][]interimLoc - locsBacking []interimLoc - - numTermsPerPostingsList []int // key is postings list id - numLocsPerPostingsList []int // key is postings list id - - builder *vellum.Builder - builderBuf bytes.Buffer - - metaBuf bytes.Buffer - - tmp0 []byte - tmp1 []byte - - lastNumDocs int - lastOutSize int -} - -func (s *interim) reset() (err error) { - s.results = nil - s.chunkMode = 0 - s.w = nil - s.FieldsMap = nil - s.FieldsInv = nil - for i := range s.Dicts { - s.Dicts[i] = nil - } - s.Dicts = s.Dicts[:0] - for i := range s.DictKeys { - s.DictKeys[i] = s.DictKeys[i][:0] - } - s.DictKeys = s.DictKeys[:0] - for i := range s.IncludeDocValues { - s.IncludeDocValues[i] = false - } - s.IncludeDocValues = s.IncludeDocValues[:0] - for _, idn := range s.Postings { - idn.Clear() - } - s.Postings = s.Postings[:0] - s.FreqNorms = s.FreqNorms[:0] - for i := range s.freqNormsBacking { - s.freqNormsBacking[i] = interimFreqNorm{} - } - s.freqNormsBacking = s.freqNormsBacking[:0] - s.Locs = s.Locs[:0] - for i := range s.locsBacking { - s.locsBacking[i] = interimLoc{} - } - s.locsBacking = s.locsBacking[:0] - s.numTermsPerPostingsList = s.numTermsPerPostingsList[:0] - s.numLocsPerPostingsList = s.numLocsPerPostingsList[:0] - s.builderBuf.Reset() - if s.builder != nil { - err = s.builder.Reset(&s.builderBuf) - } - s.metaBuf.Reset() - s.tmp0 = s.tmp0[:0] - s.tmp1 = s.tmp1[:0] - s.lastNumDocs = 0 - s.lastOutSize = 0 - - return err -} - -func (s *interim) grabBuf(size int) []byte { - buf := s.tmp0 - if cap(buf) < size { - buf = make([]byte, size) - s.tmp0 = buf - } - return buf[0:size] -} - -type interimStoredField struct { - vals [][]byte - typs []byte - arrayposs [][]uint64 // array positions -} - -type interimFreqNorm struct { - freq uint64 - norm float32 - numLocs int -} - -type interimLoc struct { - fieldID uint16 - pos uint64 - start uint64 - end uint64 - arrayposs []uint64 -} - -func (s *interim) convert() (uint64, uint64, uint64, []uint64, error) { - s.FieldsMap = map[string]uint16{} - - s.getOrDefineField("_id") // _id field is fieldID 0 - - for _, result := range s.results { - for _, field := range result.Document.CompositeFields { - s.getOrDefineField(field.Name()) - } - for _, field := range result.Document.Fields { - s.getOrDefineField(field.Name()) - } - } - - sort.Strings(s.FieldsInv[1:]) // keep _id as first field - - for fieldID, fieldName := range s.FieldsInv { - s.FieldsMap[fieldName] = uint16(fieldID + 1) - } - - if cap(s.IncludeDocValues) >= len(s.FieldsInv) { - s.IncludeDocValues = s.IncludeDocValues[:len(s.FieldsInv)] - } else { - s.IncludeDocValues = make([]bool, len(s.FieldsInv)) - } - - s.prepareDicts() - - for _, dict := range s.DictKeys { - sort.Strings(dict) - } - - s.processDocuments() - - storedIndexOffset, err := s.writeStoredFields() - if err != nil { - return 0, 0, 0, nil, err - } - - var fdvIndexOffset uint64 - var dictOffsets []uint64 - - if len(s.results) > 0 { - fdvIndexOffset, dictOffsets, err = s.writeDicts() - if err != nil { - return 0, 0, 0, nil, err - } - } else { - dictOffsets = make([]uint64, len(s.FieldsInv)) - } - - fieldsIndexOffset, err := persistFields(s.FieldsInv, s.w, dictOffsets) - if err != nil { - return 0, 0, 0, nil, err - } - - return storedIndexOffset, fieldsIndexOffset, fdvIndexOffset, dictOffsets, nil -} - -func (s *interim) getOrDefineField(fieldName string) int { - fieldIDPlus1, exists := s.FieldsMap[fieldName] - if !exists { - fieldIDPlus1 = uint16(len(s.FieldsInv) + 1) - s.FieldsMap[fieldName] = fieldIDPlus1 - s.FieldsInv = append(s.FieldsInv, fieldName) - - s.Dicts = append(s.Dicts, make(map[string]uint64)) - - n := len(s.DictKeys) - if n < cap(s.DictKeys) { - s.DictKeys = s.DictKeys[:n+1] - s.DictKeys[n] = s.DictKeys[n][:0] - } else { - s.DictKeys = append(s.DictKeys, []string(nil)) - } - } - - return int(fieldIDPlus1 - 1) -} - -// fill Dicts and DictKeys from analysis results -func (s *interim) prepareDicts() { - var pidNext int - - var totTFs int - var totLocs int - - visitField := func(fieldID uint16, tfs analysis.TokenFrequencies) { - dict := s.Dicts[fieldID] - dictKeys := s.DictKeys[fieldID] - - for term, tf := range tfs { - pidPlus1, exists := dict[term] - if !exists { - pidNext++ - pidPlus1 = uint64(pidNext) - - dict[term] = pidPlus1 - dictKeys = append(dictKeys, term) - - s.numTermsPerPostingsList = append(s.numTermsPerPostingsList, 0) - s.numLocsPerPostingsList = append(s.numLocsPerPostingsList, 0) - } - - pid := pidPlus1 - 1 - - s.numTermsPerPostingsList[pid] += 1 - s.numLocsPerPostingsList[pid] += len(tf.Locations) - - totLocs += len(tf.Locations) - } - - totTFs += len(tfs) - - s.DictKeys[fieldID] = dictKeys - } - - for _, result := range s.results { - // walk each composite field - for _, field := range result.Document.CompositeFields { - fieldID := uint16(s.getOrDefineField(field.Name())) - _, tf := field.Analyze() - visitField(fieldID, tf) - } - - // walk each field - for i, field := range result.Document.Fields { - fieldID := uint16(s.getOrDefineField(field.Name())) - tf := result.Analyzed[i] - visitField(fieldID, tf) - } - } - - numPostingsLists := pidNext - - if cap(s.Postings) >= numPostingsLists { - s.Postings = s.Postings[:numPostingsLists] - } else { - postings := make([]*roaring.Bitmap, numPostingsLists) - copy(postings, s.Postings[:cap(s.Postings)]) - for i := 0; i < numPostingsLists; i++ { - if postings[i] == nil { - postings[i] = roaring.New() - } - } - s.Postings = postings - } - - if cap(s.FreqNorms) >= numPostingsLists { - s.FreqNorms = s.FreqNorms[:numPostingsLists] - } else { - s.FreqNorms = make([][]interimFreqNorm, numPostingsLists) - } - - if cap(s.freqNormsBacking) >= totTFs { - s.freqNormsBacking = s.freqNormsBacking[:totTFs] - } else { - s.freqNormsBacking = make([]interimFreqNorm, totTFs) - } - - freqNormsBacking := s.freqNormsBacking - for pid, numTerms := range s.numTermsPerPostingsList { - s.FreqNorms[pid] = freqNormsBacking[0:0] - freqNormsBacking = freqNormsBacking[numTerms:] - } - - if cap(s.Locs) >= numPostingsLists { - s.Locs = s.Locs[:numPostingsLists] - } else { - s.Locs = make([][]interimLoc, numPostingsLists) - } - - if cap(s.locsBacking) >= totLocs { - s.locsBacking = s.locsBacking[:totLocs] - } else { - s.locsBacking = make([]interimLoc, totLocs) - } - - locsBacking := s.locsBacking - for pid, numLocs := range s.numLocsPerPostingsList { - s.Locs[pid] = locsBacking[0:0] - locsBacking = locsBacking[numLocs:] - } -} - -func (s *interim) processDocuments() { - numFields := len(s.FieldsInv) - reuseFieldLens := make([]int, numFields) - reuseFieldTFs := make([]analysis.TokenFrequencies, numFields) - - for docNum, result := range s.results { - for i := 0; i < numFields; i++ { // clear these for reuse - reuseFieldLens[i] = 0 - reuseFieldTFs[i] = nil - } - - s.processDocument(uint64(docNum), result, - reuseFieldLens, reuseFieldTFs) - } -} - -func (s *interim) processDocument(docNum uint64, - result *index.AnalysisResult, - fieldLens []int, fieldTFs []analysis.TokenFrequencies) { - visitField := func(fieldID uint16, fieldName string, - ln int, tf analysis.TokenFrequencies) { - fieldLens[fieldID] += ln - - existingFreqs := fieldTFs[fieldID] - if existingFreqs != nil { - existingFreqs.MergeAll(fieldName, tf) - } else { - fieldTFs[fieldID] = tf - } - } - - // walk each composite field - for _, field := range result.Document.CompositeFields { - fieldID := uint16(s.getOrDefineField(field.Name())) - ln, tf := field.Analyze() - visitField(fieldID, field.Name(), ln, tf) - } - - // walk each field - for i, field := range result.Document.Fields { - fieldID := uint16(s.getOrDefineField(field.Name())) - ln := result.Length[i] - tf := result.Analyzed[i] - visitField(fieldID, field.Name(), ln, tf) - } - - // now that it's been rolled up into fieldTFs, walk that - for fieldID, tfs := range fieldTFs { - dict := s.Dicts[fieldID] - norm := float32(1.0 / math.Sqrt(float64(fieldLens[fieldID]))) - - for term, tf := range tfs { - pid := dict[term] - 1 - bs := s.Postings[pid] - bs.Add(uint32(docNum)) - - s.FreqNorms[pid] = append(s.FreqNorms[pid], - interimFreqNorm{ - freq: uint64(tf.Frequency()), - norm: norm, - numLocs: len(tf.Locations), - }) - - if len(tf.Locations) > 0 { - locs := s.Locs[pid] - - for _, loc := range tf.Locations { - var locf = uint16(fieldID) - if loc.Field != "" { - locf = uint16(s.getOrDefineField(loc.Field)) - } - var arrayposs []uint64 - if len(loc.ArrayPositions) > 0 { - arrayposs = loc.ArrayPositions - } - locs = append(locs, interimLoc{ - fieldID: locf, - pos: uint64(loc.Position), - start: uint64(loc.Start), - end: uint64(loc.End), - arrayposs: arrayposs, - }) - } - - s.Locs[pid] = locs - } - } - } -} - -func (s *interim) writeStoredFields() ( - storedIndexOffset uint64, err error) { - varBuf := make([]byte, binary.MaxVarintLen64) - metaEncode := func(val uint64) (int, error) { - wb := binary.PutUvarint(varBuf, val) - return s.metaBuf.Write(varBuf[:wb]) - } - - data, compressed := s.tmp0[:0], s.tmp1[:0] - defer func() { s.tmp0, s.tmp1 = data, compressed }() - - // keyed by docNum - docStoredOffsets := make([]uint64, len(s.results)) - - // keyed by fieldID, for the current doc in the loop - docStoredFields := map[uint16]interimStoredField{} - - for docNum, result := range s.results { - for fieldID := range docStoredFields { // reset for next doc - delete(docStoredFields, fieldID) - } - - for _, field := range result.Document.Fields { - fieldID := uint16(s.getOrDefineField(field.Name())) - - opts := field.Options() - - if opts.IsStored() { - isf := docStoredFields[fieldID] - isf.vals = append(isf.vals, field.Value()) - isf.typs = append(isf.typs, encodeFieldType(field)) - isf.arrayposs = append(isf.arrayposs, field.ArrayPositions()) - docStoredFields[fieldID] = isf - } - - if opts.IncludeDocValues() { - s.IncludeDocValues[fieldID] = true - } - - err := ValidateDocFields(field) - if err != nil { - return 0, err - } - } - - var curr int - - s.metaBuf.Reset() - data = data[:0] - - // _id field special case optimizes ExternalID() lookups - idFieldVal := docStoredFields[uint16(0)].vals[0] - _, err = metaEncode(uint64(len(idFieldVal))) - if err != nil { - return 0, err - } - - // handle non-"_id" fields - for fieldID := 1; fieldID < len(s.FieldsInv); fieldID++ { - isf, exists := docStoredFields[uint16(fieldID)] - if exists { - curr, data, err = persistStoredFieldValues( - fieldID, isf.vals, isf.typs, isf.arrayposs, - curr, metaEncode, data) - if err != nil { - return 0, err - } - } - } - - metaBytes := s.metaBuf.Bytes() - - compressed = snappy.Encode(compressed[:cap(compressed)], data) - - docStoredOffsets[docNum] = uint64(s.w.Count()) - - _, err := writeUvarints(s.w, - uint64(len(metaBytes)), - uint64(len(idFieldVal)+len(compressed))) - if err != nil { - return 0, err - } - - _, err = s.w.Write(metaBytes) - if err != nil { - return 0, err - } - - _, err = s.w.Write(idFieldVal) - if err != nil { - return 0, err - } - - _, err = s.w.Write(compressed) - if err != nil { - return 0, err - } - } - - storedIndexOffset = uint64(s.w.Count()) - - for _, docStoredOffset := range docStoredOffsets { - err = binary.Write(s.w, binary.BigEndian, docStoredOffset) - if err != nil { - return 0, err - } - } - - return storedIndexOffset, nil -} - -func (s *interim) writeDicts() (fdvIndexOffset uint64, dictOffsets []uint64, err error) { - dictOffsets = make([]uint64, len(s.FieldsInv)) - - fdvOffsetsStart := make([]uint64, len(s.FieldsInv)) - fdvOffsetsEnd := make([]uint64, len(s.FieldsInv)) - - buf := s.grabBuf(binary.MaxVarintLen64) - - // these int coders are initialized with chunk size 1024 - // however this will be reset to the correct chunk size - // while processing each individual field-term section - tfEncoder := newChunkedIntCoder(1024, uint64(len(s.results)-1)) - locEncoder := newChunkedIntCoder(1024, uint64(len(s.results)-1)) - - var docTermMap [][]byte - - if s.builder == nil { - s.builder, err = vellum.New(&s.builderBuf, nil) - if err != nil { - return 0, nil, err - } - } - - for fieldID, terms := range s.DictKeys { - if cap(docTermMap) < len(s.results) { - docTermMap = make([][]byte, len(s.results)) - } else { - docTermMap = docTermMap[0:len(s.results)] - for docNum := range docTermMap { // reset the docTermMap - docTermMap[docNum] = docTermMap[docNum][:0] - } - } - - dict := s.Dicts[fieldID] - - for _, term := range terms { // terms are already sorted - pid := dict[term] - 1 - - postingsBS := s.Postings[pid] - - freqNorms := s.FreqNorms[pid] - freqNormOffset := 0 - - locs := s.Locs[pid] - locOffset := 0 - - chunkSize, err := getChunkSize(s.chunkMode, postingsBS.GetCardinality(), uint64(len(s.results))) - if err != nil { - return 0, nil, err - } - tfEncoder.SetChunkSize(chunkSize, uint64(len(s.results)-1)) - locEncoder.SetChunkSize(chunkSize, uint64(len(s.results)-1)) - - postingsItr := postingsBS.Iterator() - for postingsItr.HasNext() { - docNum := uint64(postingsItr.Next()) - - freqNorm := freqNorms[freqNormOffset] - - err = tfEncoder.Add(docNum, - encodeFreqHasLocs(freqNorm.freq, freqNorm.numLocs > 0), - uint64(math.Float32bits(freqNorm.norm))) - if err != nil { - return 0, nil, err - } - - if freqNorm.numLocs > 0 { - numBytesLocs := 0 - for _, loc := range locs[locOffset : locOffset+freqNorm.numLocs] { - numBytesLocs += totalUvarintBytes( - uint64(loc.fieldID), loc.pos, loc.start, loc.end, - uint64(len(loc.arrayposs)), loc.arrayposs) - } - - err = locEncoder.Add(docNum, uint64(numBytesLocs)) - if err != nil { - return 0, nil, err - } - - for _, loc := range locs[locOffset : locOffset+freqNorm.numLocs] { - err = locEncoder.Add(docNum, - uint64(loc.fieldID), loc.pos, loc.start, loc.end, - uint64(len(loc.arrayposs))) - if err != nil { - return 0, nil, err - } - - err = locEncoder.Add(docNum, loc.arrayposs...) - if err != nil { - return 0, nil, err - } - } - - locOffset += freqNorm.numLocs - } - - freqNormOffset++ - - docTermMap[docNum] = append( - append(docTermMap[docNum], term...), - termSeparator) - } - - tfEncoder.Close() - locEncoder.Close() - - postingsOffset, err := - writePostings(postingsBS, tfEncoder, locEncoder, nil, s.w, buf) - if err != nil { - return 0, nil, err - } - - if postingsOffset > uint64(0) { - err = s.builder.Insert([]byte(term), postingsOffset) - if err != nil { - return 0, nil, err - } - } - - tfEncoder.Reset() - locEncoder.Reset() - } - - err = s.builder.Close() - if err != nil { - return 0, nil, err - } - - // record where this dictionary starts - dictOffsets[fieldID] = uint64(s.w.Count()) - - vellumData := s.builderBuf.Bytes() - - // write out the length of the vellum data - n := binary.PutUvarint(buf, uint64(len(vellumData))) - _, err = s.w.Write(buf[:n]) - if err != nil { - return 0, nil, err - } - - // write this vellum to disk - _, err = s.w.Write(vellumData) - if err != nil { - return 0, nil, err - } - - // reset vellum for reuse - s.builderBuf.Reset() - - err = s.builder.Reset(&s.builderBuf) - if err != nil { - return 0, nil, err - } - - // write the field doc values - // NOTE: doc values continue to use legacy chunk mode - chunkSize, err := getChunkSize(LegacyChunkMode, 0, 0) - if err != nil { - return 0, nil, err - } - fdvEncoder := newChunkedContentCoder(chunkSize, uint64(len(s.results)-1), s.w, false) - if s.IncludeDocValues[fieldID] { - for docNum, docTerms := range docTermMap { - if len(docTerms) > 0 { - err = fdvEncoder.Add(uint64(docNum), docTerms) - if err != nil { - return 0, nil, err - } - } - } - err = fdvEncoder.Close() - if err != nil { - return 0, nil, err - } - - fdvOffsetsStart[fieldID] = uint64(s.w.Count()) - - _, err = fdvEncoder.Write() - if err != nil { - return 0, nil, err - } - - fdvOffsetsEnd[fieldID] = uint64(s.w.Count()) - - fdvEncoder.Reset() - } else { - fdvOffsetsStart[fieldID] = fieldNotUninverted - fdvOffsetsEnd[fieldID] = fieldNotUninverted - } - } - - fdvIndexOffset = uint64(s.w.Count()) - - for i := 0; i < len(fdvOffsetsStart); i++ { - n := binary.PutUvarint(buf, fdvOffsetsStart[i]) - _, err := s.w.Write(buf[:n]) - if err != nil { - return 0, nil, err - } - n = binary.PutUvarint(buf, fdvOffsetsEnd[i]) - _, err = s.w.Write(buf[:n]) - if err != nil { - return 0, nil, err - } - } - - return fdvIndexOffset, dictOffsets, nil -} - -func encodeFieldType(f document.Field) byte { - fieldType := byte('x') - switch f.(type) { - case *document.TextField: - fieldType = 't' - case *document.NumericField: - fieldType = 'n' - case *document.DateTimeField: - fieldType = 'd' - case *document.BooleanField: - fieldType = 'b' - case *document.GeoPointField: - fieldType = 'g' - case *document.CompositeField: - fieldType = 'c' - } - return fieldType -} - -// returns the total # of bytes needed to encode the given uint64's -// into binary.PutUVarint() encoding -func totalUvarintBytes(a, b, c, d, e uint64, more []uint64) (n int) { - n = numUvarintBytes(a) - n += numUvarintBytes(b) - n += numUvarintBytes(c) - n += numUvarintBytes(d) - n += numUvarintBytes(e) - for _, v := range more { - n += numUvarintBytes(v) - } - return n -} - -// returns # of bytes needed to encode x in binary.PutUvarint() encoding -func numUvarintBytes(x uint64) (n int) { - for x >= 0x80 { - x >>= 7 - n++ - } - return n + 1 -} diff --git a/vendor/github.com/blevesearch/zap/v14/plugin.go b/vendor/github.com/blevesearch/zap/v14/plugin.go deleted file mode 100644 index 38a0638..0000000 --- a/vendor/github.com/blevesearch/zap/v14/plugin.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2020 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "github.com/blevesearch/bleve/index/scorch/segment" -) - -// ZapPlugin implements the Plugin interface of -// the blevesearch/bleve/index/scorch/segment pkg -type ZapPlugin struct{} - -func (*ZapPlugin) Type() string { - return Type -} - -func (*ZapPlugin) Version() uint32 { - return Version -} - -// Plugin returns an instance segment.Plugin for use -// by the Scorch indexing scheme -func Plugin() segment.Plugin { - return &ZapPlugin{} -} diff --git a/vendor/github.com/blevesearch/zap/v14/posting.go b/vendor/github.com/blevesearch/zap/v14/posting.go deleted file mode 100644 index 88b2b95..0000000 --- a/vendor/github.com/blevesearch/zap/v14/posting.go +++ /dev/null @@ -1,796 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "encoding/binary" - "fmt" - "math" - "reflect" - - "github.com/RoaringBitmap/roaring" - "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/blevesearch/bleve/size" -) - -var reflectStaticSizePostingsList int -var reflectStaticSizePostingsIterator int -var reflectStaticSizePosting int -var reflectStaticSizeLocation int - -func init() { - var pl PostingsList - reflectStaticSizePostingsList = int(reflect.TypeOf(pl).Size()) - var pi PostingsIterator - reflectStaticSizePostingsIterator = int(reflect.TypeOf(pi).Size()) - var p Posting - reflectStaticSizePosting = int(reflect.TypeOf(p).Size()) - var l Location - reflectStaticSizeLocation = int(reflect.TypeOf(l).Size()) -} - -// FST or vellum value (uint64) encoding is determined by the top two -// highest-order or most significant bits... -// -// encoding : MSB -// name : 63 62 61...to...bit #0 (LSB) -// ----------+---+---+--------------------------------------------------- -// general : 0 | 0 | 62-bits of postingsOffset. -// ~ : 0 | 1 | reserved for future. -// 1-hit : 1 | 0 | 31-bits of positive float31 norm | 31-bits docNum. -// ~ : 1 | 1 | reserved for future. -// -// Encoding "general" is able to handle all cases, where the -// postingsOffset points to more information about the postings for -// the term. -// -// Encoding "1-hit" is used to optimize a commonly seen case when a -// term has only a single hit. For example, a term in the _id field -// will have only 1 hit. The "1-hit" encoding is used for a term -// in a field when... -// -// - term vector info is disabled for that field; -// - and, the term appears in only a single doc for that field; -// - and, the term's freq is exactly 1 in that single doc for that field; -// - and, the docNum must fit into 31-bits; -// -// Otherwise, the "general" encoding is used instead. -// -// In the "1-hit" encoding, the field in that single doc may have -// other terms, which is supported in the "1-hit" encoding by the -// positive float31 norm. - -const FSTValEncodingMask = uint64(0xc000000000000000) -const FSTValEncodingGeneral = uint64(0x0000000000000000) -const FSTValEncoding1Hit = uint64(0x8000000000000000) - -func FSTValEncode1Hit(docNum uint64, normBits uint64) uint64 { - return FSTValEncoding1Hit | ((mask31Bits & normBits) << 31) | (mask31Bits & docNum) -} - -func FSTValDecode1Hit(v uint64) (docNum uint64, normBits uint64) { - return (mask31Bits & v), (mask31Bits & (v >> 31)) -} - -const mask31Bits = uint64(0x000000007fffffff) - -func under32Bits(x uint64) bool { - return x <= mask31Bits -} - -const DocNum1HitFinished = math.MaxUint64 - -var NormBits1Hit = uint64(math.Float32bits(float32(1))) - -// PostingsList is an in-memory representation of a postings list -type PostingsList struct { - sb *SegmentBase - postingsOffset uint64 - freqOffset uint64 - locOffset uint64 - postings *roaring.Bitmap - except *roaring.Bitmap - - // when normBits1Hit != 0, then this postings list came from a - // 1-hit encoding, and only the docNum1Hit & normBits1Hit apply - docNum1Hit uint64 - normBits1Hit uint64 - - chunkSize uint64 -} - -// represents an immutable, empty postings list -var emptyPostingsList = &PostingsList{} - -func (p *PostingsList) Size() int { - sizeInBytes := reflectStaticSizePostingsList + size.SizeOfPtr - - if p.except != nil { - sizeInBytes += int(p.except.GetSizeInBytes()) - } - - return sizeInBytes -} - -func (p *PostingsList) OrInto(receiver *roaring.Bitmap) { - if p.normBits1Hit != 0 { - receiver.Add(uint32(p.docNum1Hit)) - return - } - - if p.postings != nil { - receiver.Or(p.postings) - } -} - -// Iterator returns an iterator for this postings list -func (p *PostingsList) Iterator(includeFreq, includeNorm, includeLocs bool, - prealloc segment.PostingsIterator) segment.PostingsIterator { - if p.normBits1Hit == 0 && p.postings == nil { - return emptyPostingsIterator - } - - var preallocPI *PostingsIterator - pi, ok := prealloc.(*PostingsIterator) - if ok && pi != nil { - preallocPI = pi - } - if preallocPI == emptyPostingsIterator { - preallocPI = nil - } - - return p.iterator(includeFreq, includeNorm, includeLocs, preallocPI) -} - -func (p *PostingsList) iterator(includeFreq, includeNorm, includeLocs bool, - rv *PostingsIterator) *PostingsIterator { - if rv == nil { - rv = &PostingsIterator{} - } else { - freqNormReader := rv.freqNormReader - if freqNormReader != nil { - freqNormReader.reset() - } - - locReader := rv.locReader - if locReader != nil { - locReader.reset() - } - - nextLocs := rv.nextLocs[:0] - nextSegmentLocs := rv.nextSegmentLocs[:0] - - buf := rv.buf - - *rv = PostingsIterator{} // clear the struct - - rv.freqNormReader = freqNormReader - rv.locReader = locReader - - rv.nextLocs = nextLocs - rv.nextSegmentLocs = nextSegmentLocs - - rv.buf = buf - } - - rv.postings = p - rv.includeFreqNorm = includeFreq || includeNorm || includeLocs - rv.includeLocs = includeLocs - - if p.normBits1Hit != 0 { - // "1-hit" encoding - rv.docNum1Hit = p.docNum1Hit - rv.normBits1Hit = p.normBits1Hit - - if p.except != nil && p.except.Contains(uint32(rv.docNum1Hit)) { - rv.docNum1Hit = DocNum1HitFinished - } - - return rv - } - - // "general" encoding, check if empty - if p.postings == nil { - return rv - } - - // initialize freq chunk reader - if rv.includeFreqNorm { - rv.freqNormReader = newChunkedIntDecoder(p.sb.mem, p.freqOffset, rv.freqNormReader) - } - - // initialize the loc chunk reader - if rv.includeLocs { - rv.locReader = newChunkedIntDecoder(p.sb.mem, p.locOffset, rv.locReader) - } - - rv.all = p.postings.Iterator() - if p.except != nil { - rv.ActualBM = roaring.AndNot(p.postings, p.except) - rv.Actual = rv.ActualBM.Iterator() - } else { - rv.ActualBM = p.postings - rv.Actual = rv.all // Optimize to use same iterator for all & Actual. - } - - return rv -} - -// Count returns the number of items on this postings list -func (p *PostingsList) Count() uint64 { - var n, e uint64 - if p.normBits1Hit != 0 { - n = 1 - if p.except != nil && p.except.Contains(uint32(p.docNum1Hit)) { - e = 1 - } - } else if p.postings != nil { - n = p.postings.GetCardinality() - if p.except != nil { - e = p.postings.AndCardinality(p.except) - } - } - return n - e -} - -func (rv *PostingsList) read(postingsOffset uint64, d *Dictionary) error { - rv.postingsOffset = postingsOffset - - // handle "1-hit" encoding special case - if rv.postingsOffset&FSTValEncodingMask == FSTValEncoding1Hit { - return rv.init1Hit(postingsOffset) - } - - // read the location of the freq/norm details - var n uint64 - var read int - - rv.freqOffset, read = binary.Uvarint(d.sb.mem[postingsOffset+n : postingsOffset+binary.MaxVarintLen64]) - n += uint64(read) - - rv.locOffset, read = binary.Uvarint(d.sb.mem[postingsOffset+n : postingsOffset+n+binary.MaxVarintLen64]) - n += uint64(read) - - var postingsLen uint64 - postingsLen, read = binary.Uvarint(d.sb.mem[postingsOffset+n : postingsOffset+n+binary.MaxVarintLen64]) - n += uint64(read) - - roaringBytes := d.sb.mem[postingsOffset+n : postingsOffset+n+postingsLen] - - if rv.postings == nil { - rv.postings = roaring.NewBitmap() - } - _, err := rv.postings.FromBuffer(roaringBytes) - if err != nil { - return fmt.Errorf("error loading roaring bitmap: %v", err) - } - - rv.chunkSize, err = getChunkSize(d.sb.chunkMode, - rv.postings.GetCardinality(), d.sb.numDocs) - if err != nil { - return err - } - - return nil -} - -func (rv *PostingsList) init1Hit(fstVal uint64) error { - docNum, normBits := FSTValDecode1Hit(fstVal) - - rv.docNum1Hit = docNum - rv.normBits1Hit = normBits - - return nil -} - -// PostingsIterator provides a way to iterate through the postings list -type PostingsIterator struct { - postings *PostingsList - all roaring.IntPeekable - Actual roaring.IntPeekable - ActualBM *roaring.Bitmap - - currChunk uint32 - freqNormReader *chunkedIntDecoder - locReader *chunkedIntDecoder - - next Posting // reused across Next() calls - nextLocs []Location // reused across Next() calls - nextSegmentLocs []segment.Location // reused across Next() calls - - docNum1Hit uint64 - normBits1Hit uint64 - - buf []byte - - includeFreqNorm bool - includeLocs bool -} - -var emptyPostingsIterator = &PostingsIterator{} - -func (i *PostingsIterator) Size() int { - sizeInBytes := reflectStaticSizePostingsIterator + size.SizeOfPtr + - i.next.Size() - // account for freqNormReader, locReader if we start using this. - for _, entry := range i.nextLocs { - sizeInBytes += entry.Size() - } - - return sizeInBytes -} - -func (i *PostingsIterator) loadChunk(chunk int) error { - if i.includeFreqNorm { - err := i.freqNormReader.loadChunk(chunk) - if err != nil { - return err - } - } - - if i.includeLocs { - err := i.locReader.loadChunk(chunk) - if err != nil { - return err - } - } - - i.currChunk = uint32(chunk) - return nil -} - -func (i *PostingsIterator) readFreqNormHasLocs() (uint64, uint64, bool, error) { - if i.normBits1Hit != 0 { - return 1, i.normBits1Hit, false, nil - } - - freqHasLocs, err := i.freqNormReader.readUvarint() - if err != nil { - return 0, 0, false, fmt.Errorf("error reading frequency: %v", err) - } - - freq, hasLocs := decodeFreqHasLocs(freqHasLocs) - - normBits, err := i.freqNormReader.readUvarint() - if err != nil { - return 0, 0, false, fmt.Errorf("error reading norm: %v", err) - } - - return freq, normBits, hasLocs, nil -} - -func (i *PostingsIterator) skipFreqNormReadHasLocs() (bool, error) { - if i.normBits1Hit != 0 { - return false, nil - } - - freqHasLocs, err := i.freqNormReader.readUvarint() - if err != nil { - return false, fmt.Errorf("error reading freqHasLocs: %v", err) - } - - i.freqNormReader.SkipUvarint() // Skip normBits. - - return freqHasLocs&0x01 != 0, nil // See decodeFreqHasLocs() / hasLocs. -} - -func encodeFreqHasLocs(freq uint64, hasLocs bool) uint64 { - rv := freq << 1 - if hasLocs { - rv = rv | 0x01 // 0'th LSB encodes whether there are locations - } - return rv -} - -func decodeFreqHasLocs(freqHasLocs uint64) (uint64, bool) { - freq := freqHasLocs >> 1 - hasLocs := freqHasLocs&0x01 != 0 - return freq, hasLocs -} - -// readLocation processes all the integers on the stream representing a single -// location. -func (i *PostingsIterator) readLocation(l *Location) error { - // read off field - fieldID, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading location field: %v", err) - } - // read off pos - pos, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading location pos: %v", err) - } - // read off start - start, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading location start: %v", err) - } - // read off end - end, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading location end: %v", err) - } - // read off num array pos - numArrayPos, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading location num array pos: %v", err) - } - - l.field = i.postings.sb.fieldsInv[fieldID] - l.pos = pos - l.start = start - l.end = end - - if cap(l.ap) < int(numArrayPos) { - l.ap = make([]uint64, int(numArrayPos)) - } else { - l.ap = l.ap[:int(numArrayPos)] - } - - // read off array positions - for k := 0; k < int(numArrayPos); k++ { - ap, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading array position: %v", err) - } - - l.ap[k] = ap - } - - return nil -} - -// Next returns the next posting on the postings list, or nil at the end -func (i *PostingsIterator) Next() (segment.Posting, error) { - return i.nextAtOrAfter(0) -} - -// Advance returns the posting at the specified docNum or it is not present -// the next posting, or if the end is reached, nil -func (i *PostingsIterator) Advance(docNum uint64) (segment.Posting, error) { - return i.nextAtOrAfter(docNum) -} - -// Next returns the next posting on the postings list, or nil at the end -func (i *PostingsIterator) nextAtOrAfter(atOrAfter uint64) (segment.Posting, error) { - docNum, exists, err := i.nextDocNumAtOrAfter(atOrAfter) - if err != nil || !exists { - return nil, err - } - - i.next = Posting{} // clear the struct - rv := &i.next - rv.docNum = docNum - - if !i.includeFreqNorm { - return rv, nil - } - - var normBits uint64 - var hasLocs bool - - rv.freq, normBits, hasLocs, err = i.readFreqNormHasLocs() - if err != nil { - return nil, err - } - - rv.norm = math.Float32frombits(uint32(normBits)) - - if i.includeLocs && hasLocs { - // prepare locations into reused slices, where we assume - // rv.freq >= "number of locs", since in a composite field, - // some component fields might have their IncludeTermVector - // flags disabled while other component fields are enabled - if cap(i.nextLocs) >= int(rv.freq) { - i.nextLocs = i.nextLocs[0:rv.freq] - } else { - i.nextLocs = make([]Location, rv.freq, rv.freq*2) - } - if cap(i.nextSegmentLocs) < int(rv.freq) { - i.nextSegmentLocs = make([]segment.Location, rv.freq, rv.freq*2) - } - rv.locs = i.nextSegmentLocs[:0] - - numLocsBytes, err := i.locReader.readUvarint() - if err != nil { - return nil, fmt.Errorf("error reading location numLocsBytes: %v", err) - } - - j := 0 - startBytesRemaining := i.locReader.Len() // # bytes remaining in the locReader - for startBytesRemaining-i.locReader.Len() < int(numLocsBytes) { - err := i.readLocation(&i.nextLocs[j]) - if err != nil { - return nil, err - } - rv.locs = append(rv.locs, &i.nextLocs[j]) - j++ - } - } - - return rv, nil -} - -// nextDocNum returns the next docNum on the postings list, and also -// sets up the currChunk / loc related fields of the iterator. -func (i *PostingsIterator) nextDocNumAtOrAfter(atOrAfter uint64) (uint64, bool, error) { - if i.normBits1Hit != 0 { - if i.docNum1Hit == DocNum1HitFinished { - return 0, false, nil - } - if i.docNum1Hit < atOrAfter { - // advanced past our 1-hit - i.docNum1Hit = DocNum1HitFinished // consume our 1-hit docNum - return 0, false, nil - } - docNum := i.docNum1Hit - i.docNum1Hit = DocNum1HitFinished // consume our 1-hit docNum - return docNum, true, nil - } - - if i.Actual == nil || !i.Actual.HasNext() { - return 0, false, nil - } - - if i.postings == nil || i.postings.postings == i.ActualBM { - return i.nextDocNumAtOrAfterClean(atOrAfter) - } - - i.Actual.AdvanceIfNeeded(uint32(atOrAfter)) - - if !i.Actual.HasNext() { - // couldn't find anything - return 0, false, nil - } - - n := i.Actual.Next() - allN := i.all.Next() - nChunk := n / uint32(i.postings.chunkSize) - - // when allN becomes >= to here, then allN is in the same chunk as nChunk. - allNReachesNChunk := nChunk * uint32(i.postings.chunkSize) - - // n is the next actual hit (excluding some postings), and - // allN is the next hit in the full postings, and - // if they don't match, move 'all' forwards until they do - for allN != n { - // we've reached same chunk, so move the freq/norm/loc decoders forward - if i.includeFreqNorm && allN >= allNReachesNChunk { - err := i.currChunkNext(nChunk) - if err != nil { - return 0, false, err - } - } - - allN = i.all.Next() - } - - if i.includeFreqNorm && (i.currChunk != nChunk || i.freqNormReader.isNil()) { - err := i.loadChunk(int(nChunk)) - if err != nil { - return 0, false, fmt.Errorf("error loading chunk: %v", err) - } - } - - return uint64(n), true, nil -} - -// optimization when the postings list is "clean" (e.g., no updates & -// no deletions) where the all bitmap is the same as the actual bitmap -func (i *PostingsIterator) nextDocNumAtOrAfterClean( - atOrAfter uint64) (uint64, bool, error) { - - if !i.includeFreqNorm { - i.Actual.AdvanceIfNeeded(uint32(atOrAfter)) - - if !i.Actual.HasNext() { - return 0, false, nil // couldn't find anything - } - - return uint64(i.Actual.Next()), true, nil - } - - // freq-norm's needed, so maintain freq-norm chunk reader - sameChunkNexts := 0 // # of times we called Next() in the same chunk - n := i.Actual.Next() - nChunk := n / uint32(i.postings.chunkSize) - - for uint64(n) < atOrAfter && i.Actual.HasNext() { - n = i.Actual.Next() - - nChunkPrev := nChunk - nChunk = n / uint32(i.postings.chunkSize) - - if nChunk != nChunkPrev { - sameChunkNexts = 0 - } else { - sameChunkNexts += 1 - } - } - - if uint64(n) < atOrAfter { - // couldn't find anything - return 0, false, nil - } - - for j := 0; j < sameChunkNexts; j++ { - err := i.currChunkNext(nChunk) - if err != nil { - return 0, false, fmt.Errorf("error optimized currChunkNext: %v", err) - } - } - - if i.currChunk != nChunk || i.freqNormReader.isNil() { - err := i.loadChunk(int(nChunk)) - if err != nil { - return 0, false, fmt.Errorf("error loading chunk: %v", err) - } - } - - return uint64(n), true, nil -} - -func (i *PostingsIterator) currChunkNext(nChunk uint32) error { - if i.currChunk != nChunk || i.freqNormReader.isNil() { - err := i.loadChunk(int(nChunk)) - if err != nil { - return fmt.Errorf("error loading chunk: %v", err) - } - } - - // read off freq/offsets even though we don't care about them - hasLocs, err := i.skipFreqNormReadHasLocs() - if err != nil { - return err - } - - if i.includeLocs && hasLocs { - numLocsBytes, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading location numLocsBytes: %v", err) - } - - // skip over all the location bytes - i.locReader.SkipBytes(int(numLocsBytes)) - } - - return nil -} - -// DocNum1Hit returns the docNum and true if this is "1-hit" optimized -// and the docNum is available. -func (p *PostingsIterator) DocNum1Hit() (uint64, bool) { - if p.normBits1Hit != 0 && p.docNum1Hit != DocNum1HitFinished { - return p.docNum1Hit, true - } - return 0, false -} - -// ActualBitmap returns the underlying actual bitmap -// which can be used up the stack for optimizations -func (p *PostingsIterator) ActualBitmap() *roaring.Bitmap { - return p.ActualBM -} - -// ReplaceActual replaces the ActualBM with the provided -// bitmap -func (p *PostingsIterator) ReplaceActual(abm *roaring.Bitmap) { - p.ActualBM = abm - p.Actual = abm.Iterator() -} - -// PostingsIteratorFromBitmap constructs a PostingsIterator given an -// "actual" bitmap. -func PostingsIteratorFromBitmap(bm *roaring.Bitmap, - includeFreqNorm, includeLocs bool) (segment.PostingsIterator, error) { - return &PostingsIterator{ - ActualBM: bm, - Actual: bm.Iterator(), - includeFreqNorm: includeFreqNorm, - includeLocs: includeLocs, - }, nil -} - -// PostingsIteratorFrom1Hit constructs a PostingsIterator given a -// 1-hit docNum. -func PostingsIteratorFrom1Hit(docNum1Hit uint64, - includeFreqNorm, includeLocs bool) (segment.PostingsIterator, error) { - return &PostingsIterator{ - docNum1Hit: docNum1Hit, - normBits1Hit: NormBits1Hit, - includeFreqNorm: includeFreqNorm, - includeLocs: includeLocs, - }, nil -} - -// Posting is a single entry in a postings list -type Posting struct { - docNum uint64 - freq uint64 - norm float32 - locs []segment.Location -} - -func (p *Posting) Size() int { - sizeInBytes := reflectStaticSizePosting - - for _, entry := range p.locs { - sizeInBytes += entry.Size() - } - - return sizeInBytes -} - -// Number returns the document number of this posting in this segment -func (p *Posting) Number() uint64 { - return p.docNum -} - -// Frequency returns the frequencies of occurrence of this term in this doc/field -func (p *Posting) Frequency() uint64 { - return p.freq -} - -// Norm returns the normalization factor for this posting -func (p *Posting) Norm() float64 { - return float64(p.norm) -} - -// Locations returns the location information for each occurrence -func (p *Posting) Locations() []segment.Location { - return p.locs -} - -// Location represents the location of a single occurrence -type Location struct { - field string - pos uint64 - start uint64 - end uint64 - ap []uint64 -} - -func (l *Location) Size() int { - return reflectStaticSizeLocation + - len(l.field) + - len(l.ap)*size.SizeOfUint64 -} - -// Field returns the name of the field (useful in composite fields to know -// which original field the value came from) -func (l *Location) Field() string { - return l.field -} - -// Start returns the start byte offset of this occurrence -func (l *Location) Start() uint64 { - return l.start -} - -// End returns the end byte offset of this occurrence -func (l *Location) End() uint64 { - return l.end -} - -// Pos returns the 1-based phrase position of this occurrence -func (l *Location) Pos() uint64 { - return l.pos -} - -// ArrayPositions returns the array position vector associated with this occurrence -func (l *Location) ArrayPositions() []uint64 { - return l.ap -} diff --git a/vendor/github.com/blevesearch/zap/v14/read.go b/vendor/github.com/blevesearch/zap/v14/read.go deleted file mode 100644 index e47d4c6..0000000 --- a/vendor/github.com/blevesearch/zap/v14/read.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import "encoding/binary" - -func (s *SegmentBase) getDocStoredMetaAndCompressed(docNum uint64) ([]byte, []byte) { - _, storedOffset, n, metaLen, dataLen := s.getDocStoredOffsets(docNum) - - meta := s.mem[storedOffset+n : storedOffset+n+metaLen] - data := s.mem[storedOffset+n+metaLen : storedOffset+n+metaLen+dataLen] - - return meta, data -} - -func (s *SegmentBase) getDocStoredOffsets(docNum uint64) ( - uint64, uint64, uint64, uint64, uint64) { - indexOffset := s.storedIndexOffset + (8 * docNum) - - storedOffset := binary.BigEndian.Uint64(s.mem[indexOffset : indexOffset+8]) - - var n uint64 - - metaLen, read := binary.Uvarint(s.mem[storedOffset : storedOffset+binary.MaxVarintLen64]) - n += uint64(read) - - dataLen, read := binary.Uvarint(s.mem[storedOffset+n : storedOffset+n+binary.MaxVarintLen64]) - n += uint64(read) - - return indexOffset, storedOffset, n, metaLen, dataLen -} diff --git a/vendor/github.com/blevesearch/zap/v14/segment.go b/vendor/github.com/blevesearch/zap/v14/segment.go deleted file mode 100644 index e8b1f06..0000000 --- a/vendor/github.com/blevesearch/zap/v14/segment.go +++ /dev/null @@ -1,572 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "encoding/binary" - "fmt" - "io" - "os" - "sync" - "unsafe" - - "github.com/RoaringBitmap/roaring" - "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/blevesearch/bleve/size" - "github.com/couchbase/vellum" - mmap "github.com/blevesearch/mmap-go" - "github.com/golang/snappy" -) - -var reflectStaticSizeSegmentBase int - -func init() { - var sb SegmentBase - reflectStaticSizeSegmentBase = int(unsafe.Sizeof(sb)) -} - -// Open returns a zap impl of a segment -func (*ZapPlugin) Open(path string) (segment.Segment, error) { - f, err := os.Open(path) - if err != nil { - return nil, err - } - mm, err := mmap.Map(f, mmap.RDONLY, 0) - if err != nil { - // mmap failed, try to close the file - _ = f.Close() - return nil, err - } - - rv := &Segment{ - SegmentBase: SegmentBase{ - mem: mm[0 : len(mm)-FooterSize], - fieldsMap: make(map[string]uint16), - fieldDvReaders: make(map[uint16]*docValueReader), - fieldFSTs: make(map[uint16]*vellum.FST), - }, - f: f, - mm: mm, - path: path, - refs: 1, - } - rv.SegmentBase.updateSize() - - err = rv.loadConfig() - if err != nil { - _ = rv.Close() - return nil, err - } - - err = rv.loadFields() - if err != nil { - _ = rv.Close() - return nil, err - } - - err = rv.loadDvReaders() - if err != nil { - _ = rv.Close() - return nil, err - } - - return rv, nil -} - -// SegmentBase is a memory only, read-only implementation of the -// segment.Segment interface, using zap's data representation. -type SegmentBase struct { - mem []byte - memCRC uint32 - chunkMode uint32 - fieldsMap map[string]uint16 // fieldName -> fieldID+1 - fieldsInv []string // fieldID -> fieldName - numDocs uint64 - storedIndexOffset uint64 - fieldsIndexOffset uint64 - docValueOffset uint64 - dictLocs []uint64 - fieldDvReaders map[uint16]*docValueReader // naive chunk cache per field - fieldDvNames []string // field names cached in fieldDvReaders - size uint64 - - m sync.Mutex - fieldFSTs map[uint16]*vellum.FST -} - -func (sb *SegmentBase) Size() int { - return int(sb.size) -} - -func (sb *SegmentBase) updateSize() { - sizeInBytes := reflectStaticSizeSegmentBase + - cap(sb.mem) - - // fieldsMap - for k := range sb.fieldsMap { - sizeInBytes += (len(k) + size.SizeOfString) + size.SizeOfUint16 - } - - // fieldsInv, dictLocs - for _, entry := range sb.fieldsInv { - sizeInBytes += len(entry) + size.SizeOfString - } - sizeInBytes += len(sb.dictLocs) * size.SizeOfUint64 - - // fieldDvReaders - for _, v := range sb.fieldDvReaders { - sizeInBytes += size.SizeOfUint16 + size.SizeOfPtr - if v != nil { - sizeInBytes += v.size() - } - } - - sb.size = uint64(sizeInBytes) -} - -func (sb *SegmentBase) AddRef() {} -func (sb *SegmentBase) DecRef() (err error) { return nil } -func (sb *SegmentBase) Close() (err error) { return nil } - -// Segment implements a persisted segment.Segment interface, by -// embedding an mmap()'ed SegmentBase. -type Segment struct { - SegmentBase - - f *os.File - mm mmap.MMap - path string - version uint32 - crc uint32 - - m sync.Mutex // Protects the fields that follow. - refs int64 -} - -func (s *Segment) Size() int { - // 8 /* size of file pointer */ - // 4 /* size of version -> uint32 */ - // 4 /* size of crc -> uint32 */ - sizeOfUints := 16 - - sizeInBytes := (len(s.path) + size.SizeOfString) + sizeOfUints - - // mutex, refs -> int64 - sizeInBytes += 16 - - // do not include the mmap'ed part - return sizeInBytes + s.SegmentBase.Size() - cap(s.mem) -} - -func (s *Segment) AddRef() { - s.m.Lock() - s.refs++ - s.m.Unlock() -} - -func (s *Segment) DecRef() (err error) { - s.m.Lock() - s.refs-- - if s.refs == 0 { - err = s.closeActual() - } - s.m.Unlock() - return err -} - -func (s *Segment) loadConfig() error { - crcOffset := len(s.mm) - 4 - s.crc = binary.BigEndian.Uint32(s.mm[crcOffset : crcOffset+4]) - - verOffset := crcOffset - 4 - s.version = binary.BigEndian.Uint32(s.mm[verOffset : verOffset+4]) - if s.version != Version { - return fmt.Errorf("unsupported version %d", s.version) - } - - chunkOffset := verOffset - 4 - s.chunkMode = binary.BigEndian.Uint32(s.mm[chunkOffset : chunkOffset+4]) - - docValueOffset := chunkOffset - 8 - s.docValueOffset = binary.BigEndian.Uint64(s.mm[docValueOffset : docValueOffset+8]) - - fieldsIndexOffset := docValueOffset - 8 - s.fieldsIndexOffset = binary.BigEndian.Uint64(s.mm[fieldsIndexOffset : fieldsIndexOffset+8]) - - storedIndexOffset := fieldsIndexOffset - 8 - s.storedIndexOffset = binary.BigEndian.Uint64(s.mm[storedIndexOffset : storedIndexOffset+8]) - - numDocsOffset := storedIndexOffset - 8 - s.numDocs = binary.BigEndian.Uint64(s.mm[numDocsOffset : numDocsOffset+8]) - return nil -} - -func (s *SegmentBase) loadFields() error { - // NOTE for now we assume the fields index immediately precedes - // the footer, and if this changes, need to adjust accordingly (or - // store explicit length), where s.mem was sliced from s.mm in Open(). - fieldsIndexEnd := uint64(len(s.mem)) - - // iterate through fields index - var fieldID uint64 - for s.fieldsIndexOffset+(8*fieldID) < fieldsIndexEnd { - addr := binary.BigEndian.Uint64(s.mem[s.fieldsIndexOffset+(8*fieldID) : s.fieldsIndexOffset+(8*fieldID)+8]) - - dictLoc, read := binary.Uvarint(s.mem[addr:fieldsIndexEnd]) - n := uint64(read) - s.dictLocs = append(s.dictLocs, dictLoc) - - var nameLen uint64 - nameLen, read = binary.Uvarint(s.mem[addr+n : fieldsIndexEnd]) - n += uint64(read) - - name := string(s.mem[addr+n : addr+n+nameLen]) - s.fieldsInv = append(s.fieldsInv, name) - s.fieldsMap[name] = uint16(fieldID + 1) - - fieldID++ - } - return nil -} - -// Dictionary returns the term dictionary for the specified field -func (s *SegmentBase) Dictionary(field string) (segment.TermDictionary, error) { - dict, err := s.dictionary(field) - if err == nil && dict == nil { - return &segment.EmptyDictionary{}, nil - } - return dict, err -} - -func (sb *SegmentBase) dictionary(field string) (rv *Dictionary, err error) { - fieldIDPlus1 := sb.fieldsMap[field] - if fieldIDPlus1 > 0 { - rv = &Dictionary{ - sb: sb, - field: field, - fieldID: fieldIDPlus1 - 1, - } - - dictStart := sb.dictLocs[rv.fieldID] - if dictStart > 0 { - var ok bool - sb.m.Lock() - if rv.fst, ok = sb.fieldFSTs[rv.fieldID]; !ok { - // read the length of the vellum data - vellumLen, read := binary.Uvarint(sb.mem[dictStart : dictStart+binary.MaxVarintLen64]) - fstBytes := sb.mem[dictStart+uint64(read) : dictStart+uint64(read)+vellumLen] - rv.fst, err = vellum.Load(fstBytes) - if err != nil { - sb.m.Unlock() - return nil, fmt.Errorf("dictionary field %s vellum err: %v", field, err) - } - - sb.fieldFSTs[rv.fieldID] = rv.fst - } - - sb.m.Unlock() - rv.fstReader, err = rv.fst.Reader() - if err != nil { - return nil, fmt.Errorf("dictionary field %s vellum reader err: %v", field, err) - } - - } - } - - return rv, nil -} - -// visitDocumentCtx holds data structures that are reusable across -// multiple VisitDocument() calls to avoid memory allocations -type visitDocumentCtx struct { - buf []byte - reader bytes.Reader - arrayPos []uint64 -} - -var visitDocumentCtxPool = sync.Pool{ - New: func() interface{} { - reuse := &visitDocumentCtx{} - return reuse - }, -} - -// VisitDocument invokes the DocFieldValueVistor for each stored field -// for the specified doc number -func (s *SegmentBase) VisitDocument(num uint64, visitor segment.DocumentFieldValueVisitor) error { - vdc := visitDocumentCtxPool.Get().(*visitDocumentCtx) - defer visitDocumentCtxPool.Put(vdc) - return s.visitDocument(vdc, num, visitor) -} - -func (s *SegmentBase) visitDocument(vdc *visitDocumentCtx, num uint64, - visitor segment.DocumentFieldValueVisitor) error { - // first make sure this is a valid number in this segment - if num < s.numDocs { - meta, compressed := s.getDocStoredMetaAndCompressed(num) - - vdc.reader.Reset(meta) - - // handle _id field special case - idFieldValLen, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - idFieldVal := compressed[:idFieldValLen] - - keepGoing := visitor("_id", byte('t'), idFieldVal, nil) - if !keepGoing { - visitDocumentCtxPool.Put(vdc) - return nil - } - - // handle non-"_id" fields - compressed = compressed[idFieldValLen:] - - uncompressed, err := snappy.Decode(vdc.buf[:cap(vdc.buf)], compressed) - if err != nil { - return err - } - - for keepGoing { - field, err := binary.ReadUvarint(&vdc.reader) - if err == io.EOF { - break - } - if err != nil { - return err - } - typ, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - offset, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - l, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - numap, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - var arrayPos []uint64 - if numap > 0 { - if cap(vdc.arrayPos) < int(numap) { - vdc.arrayPos = make([]uint64, numap) - } - arrayPos = vdc.arrayPos[:numap] - for i := 0; i < int(numap); i++ { - ap, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - arrayPos[i] = ap - } - } - - value := uncompressed[offset : offset+l] - keepGoing = visitor(s.fieldsInv[field], byte(typ), value, arrayPos) - } - - vdc.buf = uncompressed - } - return nil -} - -// DocID returns the value of the _id field for the given docNum -func (s *SegmentBase) DocID(num uint64) ([]byte, error) { - if num >= s.numDocs { - return nil, nil - } - - vdc := visitDocumentCtxPool.Get().(*visitDocumentCtx) - - meta, compressed := s.getDocStoredMetaAndCompressed(num) - - vdc.reader.Reset(meta) - - // handle _id field special case - idFieldValLen, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return nil, err - } - idFieldVal := compressed[:idFieldValLen] - - visitDocumentCtxPool.Put(vdc) - - return idFieldVal, nil -} - -// Count returns the number of documents in this segment. -func (s *SegmentBase) Count() uint64 { - return s.numDocs -} - -// DocNumbers returns a bitset corresponding to the doc numbers of all the -// provided _id strings -func (s *SegmentBase) DocNumbers(ids []string) (*roaring.Bitmap, error) { - rv := roaring.New() - - if len(s.fieldsMap) > 0 { - idDict, err := s.dictionary("_id") - if err != nil { - return nil, err - } - - postingsList := emptyPostingsList - - sMax, err := idDict.fst.GetMaxKey() - if err != nil { - return nil, err - } - sMaxStr := string(sMax) - filteredIds := make([]string, 0, len(ids)) - for _, id := range ids { - if id <= sMaxStr { - filteredIds = append(filteredIds, id) - } - } - - for _, id := range filteredIds { - postingsList, err = idDict.postingsList([]byte(id), nil, postingsList) - if err != nil { - return nil, err - } - postingsList.OrInto(rv) - } - } - - return rv, nil -} - -// Fields returns the field names used in this segment -func (s *SegmentBase) Fields() []string { - return s.fieldsInv -} - -// Path returns the path of this segment on disk -func (s *Segment) Path() string { - return s.path -} - -// Close releases all resources associated with this segment -func (s *Segment) Close() (err error) { - return s.DecRef() -} - -func (s *Segment) closeActual() (err error) { - if s.mm != nil { - err = s.mm.Unmap() - } - // try to close file even if unmap failed - if s.f != nil { - err2 := s.f.Close() - if err == nil { - // try to return first error - err = err2 - } - } - return -} - -// some helpers i started adding for the command-line utility - -// Data returns the underlying mmaped data slice -func (s *Segment) Data() []byte { - return s.mm -} - -// CRC returns the CRC value stored in the file footer -func (s *Segment) CRC() uint32 { - return s.crc -} - -// Version returns the file version in the file footer -func (s *Segment) Version() uint32 { - return s.version -} - -// ChunkFactor returns the chunk factor in the file footer -func (s *Segment) ChunkMode() uint32 { - return s.chunkMode -} - -// FieldsIndexOffset returns the fields index offset in the file footer -func (s *Segment) FieldsIndexOffset() uint64 { - return s.fieldsIndexOffset -} - -// StoredIndexOffset returns the stored value index offset in the file footer -func (s *Segment) StoredIndexOffset() uint64 { - return s.storedIndexOffset -} - -// DocValueOffset returns the docValue offset in the file footer -func (s *Segment) DocValueOffset() uint64 { - return s.docValueOffset -} - -// NumDocs returns the number of documents in the file footer -func (s *Segment) NumDocs() uint64 { - return s.numDocs -} - -// DictAddr is a helper function to compute the file offset where the -// dictionary is stored for the specified field. -func (s *Segment) DictAddr(field string) (uint64, error) { - fieldIDPlus1, ok := s.fieldsMap[field] - if !ok { - return 0, fmt.Errorf("no such field '%s'", field) - } - - return s.dictLocs[fieldIDPlus1-1], nil -} - -func (s *SegmentBase) loadDvReaders() error { - if s.docValueOffset == fieldNotUninverted || s.numDocs == 0 { - return nil - } - - var read uint64 - for fieldID, field := range s.fieldsInv { - var fieldLocStart, fieldLocEnd uint64 - var n int - fieldLocStart, n = binary.Uvarint(s.mem[s.docValueOffset+read : s.docValueOffset+read+binary.MaxVarintLen64]) - if n <= 0 { - return fmt.Errorf("loadDvReaders: failed to read the docvalue offset start for field %d", fieldID) - } - read += uint64(n) - fieldLocEnd, n = binary.Uvarint(s.mem[s.docValueOffset+read : s.docValueOffset+read+binary.MaxVarintLen64]) - if n <= 0 { - return fmt.Errorf("loadDvReaders: failed to read the docvalue offset end for field %d", fieldID) - } - read += uint64(n) - - fieldDvReader, err := s.loadFieldDocValueReader(field, fieldLocStart, fieldLocEnd) - if err != nil { - return err - } - if fieldDvReader != nil { - s.fieldDvReaders[uint16(fieldID)] = fieldDvReader - s.fieldDvNames = append(s.fieldDvNames, field) - } - } - - return nil -} diff --git a/vendor/github.com/blevesearch/zap/v14/write.go b/vendor/github.com/blevesearch/zap/v14/write.go deleted file mode 100644 index 77aefdb..0000000 --- a/vendor/github.com/blevesearch/zap/v14/write.go +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "encoding/binary" - "io" - - "github.com/RoaringBitmap/roaring" -) - -// writes out the length of the roaring bitmap in bytes as varint -// then writes out the roaring bitmap itself -func writeRoaringWithLen(r *roaring.Bitmap, w io.Writer, - reuseBufVarint []byte) (int, error) { - buf, err := r.ToBytes() - if err != nil { - return 0, err - } - - var tw int - - // write out the length - n := binary.PutUvarint(reuseBufVarint, uint64(len(buf))) - nw, err := w.Write(reuseBufVarint[:n]) - tw += nw - if err != nil { - return tw, err - } - - // write out the roaring bytes - nw, err = w.Write(buf) - tw += nw - if err != nil { - return tw, err - } - - return tw, nil -} - -func persistFields(fieldsInv []string, w *CountHashWriter, dictLocs []uint64) (uint64, error) { - var rv uint64 - var fieldsOffsets []uint64 - - for fieldID, fieldName := range fieldsInv { - // record start of this field - fieldsOffsets = append(fieldsOffsets, uint64(w.Count())) - - // write out the dict location and field name length - _, err := writeUvarints(w, dictLocs[fieldID], uint64(len(fieldName))) - if err != nil { - return 0, err - } - - // write out the field name - _, err = w.Write([]byte(fieldName)) - if err != nil { - return 0, err - } - } - - // now write out the fields index - rv = uint64(w.Count()) - for fieldID := range fieldsInv { - err := binary.Write(w, binary.BigEndian, fieldsOffsets[fieldID]) - if err != nil { - return 0, err - } - } - - return rv, nil -} - -// FooterSize is the size of the footer record in bytes -// crc + ver + chunk + field offset + stored offset + num docs + docValueOffset -const FooterSize = 4 + 4 + 4 + 8 + 8 + 8 + 8 - -func persistFooter(numDocs, storedIndexOffset, fieldsIndexOffset, docValueOffset uint64, - chunkMode uint32, crcBeforeFooter uint32, writerIn io.Writer) error { - w := NewCountHashWriter(writerIn) - w.crc = crcBeforeFooter - - // write out the number of docs - err := binary.Write(w, binary.BigEndian, numDocs) - if err != nil { - return err - } - // write out the stored field index location: - err = binary.Write(w, binary.BigEndian, storedIndexOffset) - if err != nil { - return err - } - // write out the field index location - err = binary.Write(w, binary.BigEndian, fieldsIndexOffset) - if err != nil { - return err - } - // write out the fieldDocValue location - err = binary.Write(w, binary.BigEndian, docValueOffset) - if err != nil { - return err - } - // write out 32-bit chunk factor - err = binary.Write(w, binary.BigEndian, chunkMode) - if err != nil { - return err - } - // write out 32-bit version - err = binary.Write(w, binary.BigEndian, Version) - if err != nil { - return err - } - // write out CRC-32 of everything upto but not including this CRC - err = binary.Write(w, binary.BigEndian, w.crc) - if err != nil { - return err - } - return nil -} - -func writeUvarints(w io.Writer, vals ...uint64) (tw int, err error) { - buf := make([]byte, binary.MaxVarintLen64) - for _, val := range vals { - n := binary.PutUvarint(buf, val) - var nw int - nw, err = w.Write(buf[:n]) - tw += nw - if err != nil { - return tw, err - } - } - return tw, err -} diff --git a/vendor/github.com/blevesearch/zap/v14/zap.md b/vendor/github.com/blevesearch/zap/v14/zap.md deleted file mode 100644 index d74dc54..0000000 --- a/vendor/github.com/blevesearch/zap/v14/zap.md +++ /dev/null @@ -1,177 +0,0 @@ -# ZAP File Format - -## Legend - -### Sections - - |========| - | | section - |========| - -### Fixed-size fields - - |--------| |----| |--| |-| - | | uint64 | | uint32 | | uint16 | | uint8 - |--------| |----| |--| |-| - -### Varints - - |~~~~~~~~| - | | varint(up to uint64) - |~~~~~~~~| - -### Arbitrary-length fields - - |--------...---| - | | arbitrary-length field (string, vellum, roaring bitmap) - |--------...---| - -### Chunked data - - [--------] - [ ] - [--------] - -## Overview - -Footer section describes the configuration of particular ZAP file. The format of footer is version-dependent, so it is necessary to check `V` field before the parsing. - - |==================================================| - | Stored Fields | - |==================================================| - |-----> | Stored Fields Index | - | |==================================================| - | | Dictionaries + Postings + DocValues | - | |==================================================| - | |---> | DocValues Index | - | | |==================================================| - | | | Fields | - | | |==================================================| - | | |-> | Fields Index | - | | | |========|========|========|========|====|====|====| - | | | | D# | SF | F | FDV | CF | V | CC | (Footer) - | | | |========|====|===|====|===|====|===|====|====|====| - | | | | | | - |-+-+-----------------| | | - | |--------------------------| | - |-------------------------------------| - - D#. Number of Docs. - SF. Stored Fields Index Offset. - F. Field Index Offset. - FDV. Field DocValue Offset. - CF. Chunk Factor. - V. Version. - CC. CRC32. - -## Stored Fields - -Stored Fields Index is `D#` consecutive 64-bit unsigned integers - offsets, where relevant Stored Fields Data records are located. - - 0 [SF] [SF + D# * 8] - | Stored Fields | Stored Fields Index | - |================================|==================================| - | | | - | |--------------------| ||--------|--------|. . .|--------|| - | |-> | Stored Fields Data | || 0 | 1 | | D# - 1 || - | | |--------------------| ||--------|----|---|. . .|--------|| - | | | | | - |===|============================|==============|===================| - | | - |-------------------------------------------| - -Stored Fields Data is an arbitrary size record, which consists of metadata and [Snappy](https://github.com/golang/snappy)-compressed data. - - Stored Fields Data - |~~~~~~~~|~~~~~~~~|~~~~~~~~...~~~~~~~~|~~~~~~~~...~~~~~~~~| - | MDS | CDS | MD | CD | - |~~~~~~~~|~~~~~~~~|~~~~~~~~...~~~~~~~~|~~~~~~~~...~~~~~~~~| - - MDS. Metadata size. - CDS. Compressed data size. - MD. Metadata. - CD. Snappy-compressed data. - -## Fields - -Fields Index section located between addresses `F` and `len(file) - len(footer)` and consist of `uint64` values (`F1`, `F2`, ...) which are offsets to records in Fields section. We have `F# = (len(file) - len(footer) - F) / sizeof(uint64)` fields. - - - (...) [F] [F + F#] - | Fields | Fields Index. | - |================================|================================| - | | | - | |~~~~~~~~|~~~~~~~~|---...---|||--------|--------|...|--------|| - ||->| Dict | Length | Name ||| 0 | 1 | | F# - 1 || - || |~~~~~~~~|~~~~~~~~|---...---|||--------|----|---|...|--------|| - || | | | - ||===============================|==============|=================| - | | - |----------------------------------------------| - - -## Dictionaries + Postings - -Each of fields has its own dictionary, encoded in [Vellum](https://github.com/couchbase/vellum) format. Dictionary consists of pairs `(term, offset)`, where `offset` indicates the position of postings (list of documents) for this particular term. - - |================================================================|- Dictionaries + - | | Postings + - | | DocValues - | Freq/Norm (chunked) | - | [~~~~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~] | - | |->[ Freq | Norm (float32 under varint) ] | - | | [~~~~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~] | - | | | - | |------------------------------------------------------------| | - | Location Details (chunked) | | - | [~~~~~~|~~~~~|~~~~~~~|~~~~~|~~~~~~|~~~~~~~~|~~~~~] | | - | |->[ Size | Pos | Start | End | Arr# | ArrPos | ... ] | | - | | [~~~~~~|~~~~~|~~~~~~~|~~~~~|~~~~~~|~~~~~~~~|~~~~~] | | - | | | | - | |----------------------| | | - | Postings List | | | - | |~~~~~~~~|~~~~~|~~|~~~~~~~~|-----------...--| | | - | |->| F/N | LD | Length | ROARING BITMAP | | | - | | |~~~~~|~~|~~~~~~~~|~~~~~~~~|-----------...--| | | - | | |----------------------------------------------| | - | |--------------------------------------| | - | Dictionary | | - | |~~~~~~~~|--------------------------|-...-| | - | |->| Length | VELLUM DATA : (TERM -> OFFSET) | | - | | |~~~~~~~~|----------------------------...-| | - | | | - |======|=========================================================|- DocValues Index - | | | - |======|=========================================================|- Fields - | | | - | |~~~~|~~~|~~~~~~~~|---...---| | - | | Dict | Length | Name | | - | |~~~~~~~~|~~~~~~~~|---...---| | - | | - |================================================================| - -## DocValues - -DocValues Index is `F#` pairs of varints, one pair per field. Each pair of varints indicates start and end point of DocValues slice. - - |================================================================| - | |------...--| | - | |->| DocValues |<-| | - | | |------...--| | | - |==|=================|===========================================|- DocValues Index - ||~|~~~~~~~~~|~~~~~~~|~~| |~~~~~~~~~~~~~~|~~~~~~~~~~~~|| - || DV1 START | DV1 STOP | . . . . . | DV(F#) START | DV(F#) END || - ||~~~~~~~~~~~|~~~~~~~~~~| |~~~~~~~~~~~~~~|~~~~~~~~~~~~|| - |================================================================| - -DocValues is chunked Snappy-compressed values for each document and field. - - [~~~~~~~~~~~~~~~|~~~~~~|~~~~~~~~~|-...-|~~~~~~|~~~~~~~~~|--------------------...-] - [ Doc# in Chunk | Doc1 | Offset1 | ... | DocN | OffsetN | SNAPPY COMPRESSED DATA ] - [~~~~~~~~~~~~~~~|~~~~~~|~~~~~~~~~|-...-|~~~~~~|~~~~~~~~~|--------------------...-] - -Last 16 bytes are description of chunks. - - |~~~~~~~~~~~~...~|----------------|----------------| - | Chunk Sizes | Chunk Size Arr | Chunk# | - |~~~~~~~~~~~~...~|----------------|----------------| diff --git a/vendor/github.com/blevesearch/zap/v15/.gitignore b/vendor/github.com/blevesearch/zap/v15/.gitignore deleted file mode 100644 index 46d1cfa..0000000 --- a/vendor/github.com/blevesearch/zap/v15/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -#* -*.sublime-* -*~ -.#* -.project -.settings -**/.idea/ -**/*.iml -.DS_Store -/cmd/zap/zap -*.test -tags diff --git a/vendor/github.com/blevesearch/zap/v15/LICENSE b/vendor/github.com/blevesearch/zap/v15/LICENSE deleted file mode 100644 index 7a4a3ea..0000000 --- a/vendor/github.com/blevesearch/zap/v15/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/vendor/github.com/blevesearch/zap/v15/README.md b/vendor/github.com/blevesearch/zap/v15/README.md deleted file mode 100644 index 0facb66..0000000 --- a/vendor/github.com/blevesearch/zap/v15/README.md +++ /dev/null @@ -1,158 +0,0 @@ -# zap file format - -Advanced ZAP File Format Documentation is [here](zap.md). - -The file is written in the reverse order that we typically access data. This helps us write in one pass since later sections of the file require file offsets of things we've already written. - -Current usage: - -- mmap the entire file -- crc-32 bytes and version are in fixed position at end of the file -- reading remainder of footer could be version specific -- remainder of footer gives us: - - 3 important offsets (docValue , fields index and stored data index) - - 2 important values (number of docs and chunk factor) -- field data is processed once and memoized onto the heap so that we never have to go back to disk for it -- access to stored data by doc number means first navigating to the stored data index, then accessing a fixed position offset into that slice, which gives us the actual address of the data. the first bytes of that section tell us the size of data so that we know where it ends. -- access to all other indexed data follows the following pattern: - - first know the field name -> convert to id - - next navigate to term dictionary for that field - - some operations stop here and do dictionary ops - - next use dictionary to navigate to posting list for a specific term - - walk posting list - - if necessary, walk posting details as we go - - if location info is desired, consult location bitmap to see if it is there - -## stored fields section - -- for each document - - preparation phase: - - produce a slice of metadata bytes and data bytes - - produce these slices in field id order - - field value is appended to the data slice - - metadata slice is varint encoded with the following values for each field value - - field id (uint16) - - field type (byte) - - field value start offset in uncompressed data slice (uint64) - - field value length (uint64) - - field number of array positions (uint64) - - one additional value for each array position (uint64) - - compress the data slice using snappy - - file writing phase: - - remember the start offset for this document - - write out meta data length (varint uint64) - - write out compressed data length (varint uint64) - - write out the metadata bytes - - write out the compressed data bytes - -## stored fields idx - -- for each document - - write start offset (remembered from previous section) of stored data (big endian uint64) - -With this index and a known document number, we have direct access to all the stored field data. - -## posting details (freq/norm) section - -- for each posting list - - produce a slice containing multiple consecutive chunks (each chunk is varint stream) - - produce a slice remembering offsets of where each chunk starts - - preparation phase: - - for each hit in the posting list - - if this hit is in next chunk close out encoding of last chunk and record offset start of next - - encode term frequency (uint64) - - encode norm factor (float32) - - file writing phase: - - remember start position for this posting list details - - write out number of chunks that follow (varint uint64) - - write out length of each chunk (each a varint uint64) - - write out the byte slice containing all the chunk data - -If you know the doc number you're interested in, this format lets you jump to the correct chunk (docNum/chunkFactor) directly and then seek within that chunk until you find it. - -## posting details (location) section - -- for each posting list - - produce a slice containing multiple consecutive chunks (each chunk is varint stream) - - produce a slice remembering offsets of where each chunk starts - - preparation phase: - - for each hit in the posting list - - if this hit is in next chunk close out encoding of last chunk and record offset start of next - - encode field (uint16) - - encode field pos (uint64) - - encode field start (uint64) - - encode field end (uint64) - - encode number of array positions to follow (uint64) - - encode each array position (each uint64) - - file writing phase: - - remember start position for this posting list details - - write out number of chunks that follow (varint uint64) - - write out length of each chunk (each a varint uint64) - - write out the byte slice containing all the chunk data - -If you know the doc number you're interested in, this format lets you jump to the correct chunk (docNum/chunkFactor) directly and then seek within that chunk until you find it. - -## postings list section - -- for each posting list - - preparation phase: - - encode roaring bitmap posting list to bytes (so we know the length) - - file writing phase: - - remember the start position for this posting list - - write freq/norm details offset (remembered from previous, as varint uint64) - - write location details offset (remembered from previous, as varint uint64) - - write length of encoded roaring bitmap - - write the serialized roaring bitmap data - -## dictionary - -- for each field - - preparation phase: - - encode vellum FST with dictionary data pointing to file offset of posting list (remembered from previous) - - file writing phase: - - remember the start position of this persistDictionary - - write length of vellum data (varint uint64) - - write out vellum data - -## fields section - -- for each field - - file writing phase: - - remember start offset for each field - - write dictionary address (remembered from previous) (varint uint64) - - write length of field name (varint uint64) - - write field name bytes - -## fields idx - -- for each field - - file writing phase: - - write big endian uint64 of start offset for each field - -NOTE: currently we don't know or record the length of this fields index. Instead we rely on the fact that we know it immediately precedes a footer of known size. - -## fields DocValue - -- for each field - - preparation phase: - - produce a slice containing multiple consecutive chunks, where each chunk is composed of a meta section followed by compressed columnar field data - - produce a slice remembering the length of each chunk - - file writing phase: - - remember the start position of this first field DocValue offset in the footer - - write out number of chunks that follow (varint uint64) - - write out length of each chunk (each a varint uint64) - - write out the byte slice containing all the chunk data - -NOTE: currently the meta header inside each chunk gives clue to the location offsets and size of the data pertaining to a given docID and any -read operation leverage that meta information to extract the document specific data from the file. - -## footer - -- file writing phase - - write number of docs (big endian uint64) - - write stored field index location (big endian uint64) - - write field index location (big endian uint64) - - write field docValue location (big endian uint64) - - write out chunk factor (big endian uint32) - - write out version (big endian uint32) - - write out file CRC of everything preceding this (big endian uint32) diff --git a/vendor/github.com/blevesearch/zap/v15/build.go b/vendor/github.com/blevesearch/zap/v15/build.go deleted file mode 100644 index 1b73183..0000000 --- a/vendor/github.com/blevesearch/zap/v15/build.go +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bufio" - "math" - "os" - - "github.com/couchbase/vellum" -) - -const Version uint32 = 15 - -const Type string = "zap" - -const fieldNotUninverted = math.MaxUint64 - -func (sb *SegmentBase) Persist(path string) error { - return PersistSegmentBase(sb, path) -} - -// PersistSegmentBase persists SegmentBase in the zap file format. -func PersistSegmentBase(sb *SegmentBase, path string) error { - flag := os.O_RDWR | os.O_CREATE - - f, err := os.OpenFile(path, flag, 0600) - if err != nil { - return err - } - - cleanup := func() { - _ = f.Close() - _ = os.Remove(path) - } - - br := bufio.NewWriter(f) - - _, err = br.Write(sb.mem) - if err != nil { - cleanup() - return err - } - - err = persistFooter(sb.numDocs, sb.storedIndexOffset, sb.fieldsIndexOffset, sb.docValueOffset, - sb.chunkMode, sb.memCRC, br) - if err != nil { - cleanup() - return err - } - - err = br.Flush() - if err != nil { - cleanup() - return err - } - - err = f.Sync() - if err != nil { - cleanup() - return err - } - - err = f.Close() - if err != nil { - cleanup() - return err - } - - return nil -} - -func persistStoredFieldValues(fieldID int, - storedFieldValues [][]byte, stf []byte, spf [][]uint64, - curr int, metaEncode varintEncoder, data []byte) ( - int, []byte, error) { - for i := 0; i < len(storedFieldValues); i++ { - // encode field - _, err := metaEncode(uint64(fieldID)) - if err != nil { - return 0, nil, err - } - // encode type - _, err = metaEncode(uint64(stf[i])) - if err != nil { - return 0, nil, err - } - // encode start offset - _, err = metaEncode(uint64(curr)) - if err != nil { - return 0, nil, err - } - // end len - _, err = metaEncode(uint64(len(storedFieldValues[i]))) - if err != nil { - return 0, nil, err - } - // encode number of array pos - _, err = metaEncode(uint64(len(spf[i]))) - if err != nil { - return 0, nil, err - } - // encode all array positions - for _, pos := range spf[i] { - _, err = metaEncode(pos) - if err != nil { - return 0, nil, err - } - } - - data = append(data, storedFieldValues[i]...) - curr += len(storedFieldValues[i]) - } - - return curr, data, nil -} - -func InitSegmentBase(mem []byte, memCRC uint32, chunkMode uint32, - fieldsMap map[string]uint16, fieldsInv []string, numDocs uint64, - storedIndexOffset uint64, fieldsIndexOffset uint64, docValueOffset uint64, - dictLocs []uint64) (*SegmentBase, error) { - sb := &SegmentBase{ - mem: mem, - memCRC: memCRC, - chunkMode: chunkMode, - fieldsMap: fieldsMap, - fieldsInv: fieldsInv, - numDocs: numDocs, - storedIndexOffset: storedIndexOffset, - fieldsIndexOffset: fieldsIndexOffset, - docValueOffset: docValueOffset, - dictLocs: dictLocs, - fieldDvReaders: make(map[uint16]*docValueReader), - fieldFSTs: make(map[uint16]*vellum.FST), - } - sb.updateSize() - - err := sb.loadDvReaders() - if err != nil { - return nil, err - } - - return sb, nil -} diff --git a/vendor/github.com/blevesearch/zap/v15/chunk.go b/vendor/github.com/blevesearch/zap/v15/chunk.go deleted file mode 100644 index 4307d0e..0000000 --- a/vendor/github.com/blevesearch/zap/v15/chunk.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (c) 2019 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "fmt" -) - -// LegacyChunkMode was the original chunk mode (always chunk size 1024) -// this mode is still used for chunking doc values. -var LegacyChunkMode uint32 = 1024 - -// DefaultChunkMode is the most recent improvement to chunking and should -// be used by default. -var DefaultChunkMode uint32 = 1026 - -func getChunkSize(chunkMode uint32, cardinality uint64, maxDocs uint64) (uint64, error) { - switch { - // any chunkMode <= 1024 will always chunk with chunkSize=chunkMode - case chunkMode <= 1024: - // legacy chunk size - return uint64(chunkMode), nil - - case chunkMode == 1025: - // attempt at simple improvement - // theory - the point of chunking is to put a bound on the maximum number of - // calls to Next() needed to find a random document. ie, you should be able - // to do one jump to the correct chunk, and then walk through at most - // chunk-size items - // previously 1024 was chosen as the chunk size, but this is particularly - // wasteful for low cardinality terms. the observation is that if there - // are less than 1024 items, why not put them all in one chunk, - // this way you'll still achieve the same goal of visiting at most - // chunk-size items. - // no attempt is made to tweak any other case - if cardinality <= 1024 { - return maxDocs, nil - } - return 1024, nil - - case chunkMode == 1026: - // improve upon the ideas tested in chunkMode 1025 - // the observation that the fewest number of dense chunks is the most - // desirable layout, given the built-in assumptions of chunking - // (that we want to put an upper-bound on the number of items you must - // walk over without skipping, currently tuned to 1024) - // - // 1. compute the number of chunks needed (max 1024/chunk) - // 2. convert to chunkSize, dividing into maxDocs - numChunks := (cardinality / 1024) + 1 - chunkSize := maxDocs / numChunks - return chunkSize, nil - } - return 0, fmt.Errorf("unknown chunk mode %d", chunkMode) -} diff --git a/vendor/github.com/blevesearch/zap/v15/contentcoder.go b/vendor/github.com/blevesearch/zap/v15/contentcoder.go deleted file mode 100644 index c145b5a..0000000 --- a/vendor/github.com/blevesearch/zap/v15/contentcoder.go +++ /dev/null @@ -1,243 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "encoding/binary" - "io" - "reflect" - - "github.com/golang/snappy" -) - -var reflectStaticSizeMetaData int - -func init() { - var md MetaData - reflectStaticSizeMetaData = int(reflect.TypeOf(md).Size()) -} - -var termSeparator byte = 0xff -var termSeparatorSplitSlice = []byte{termSeparator} - -type chunkedContentCoder struct { - final []byte - chunkSize uint64 - currChunk uint64 - chunkLens []uint64 - - w io.Writer - progressiveWrite bool - - chunkMetaBuf bytes.Buffer - chunkBuf bytes.Buffer - - chunkMeta []MetaData - - compressed []byte // temp buf for snappy compression -} - -// MetaData represents the data information inside a -// chunk. -type MetaData struct { - DocNum uint64 // docNum of the data inside the chunk - DocDvOffset uint64 // offset of data inside the chunk for the given docid -} - -// newChunkedContentCoder returns a new chunk content coder which -// packs data into chunks based on the provided chunkSize -func newChunkedContentCoder(chunkSize uint64, maxDocNum uint64, - w io.Writer, progressiveWrite bool) *chunkedContentCoder { - total := maxDocNum/chunkSize + 1 - rv := &chunkedContentCoder{ - chunkSize: chunkSize, - chunkLens: make([]uint64, total), - chunkMeta: make([]MetaData, 0, total), - w: w, - progressiveWrite: progressiveWrite, - } - - return rv -} - -// Reset lets you reuse this chunked content coder. Buffers are reset -// and re used. You cannot change the chunk size. -func (c *chunkedContentCoder) Reset() { - c.currChunk = 0 - c.final = c.final[:0] - c.chunkBuf.Reset() - c.chunkMetaBuf.Reset() - for i := range c.chunkLens { - c.chunkLens[i] = 0 - } - c.chunkMeta = c.chunkMeta[:0] -} - -func (c *chunkedContentCoder) SetChunkSize(chunkSize uint64, maxDocNum uint64) { - total := int(maxDocNum/chunkSize + 1) - c.chunkSize = chunkSize - if cap(c.chunkLens) < total { - c.chunkLens = make([]uint64, total) - } else { - c.chunkLens = c.chunkLens[:total] - } - if cap(c.chunkMeta) < total { - c.chunkMeta = make([]MetaData, 0, total) - } -} - -// Close indicates you are done calling Add() this allows -// the final chunk to be encoded. -func (c *chunkedContentCoder) Close() error { - return c.flushContents() -} - -func (c *chunkedContentCoder) flushContents() error { - // flush the contents, with meta information at first - buf := make([]byte, binary.MaxVarintLen64) - n := binary.PutUvarint(buf, uint64(len(c.chunkMeta))) - _, err := c.chunkMetaBuf.Write(buf[:n]) - if err != nil { - return err - } - - // write out the metaData slice - for _, meta := range c.chunkMeta { - _, err := writeUvarints(&c.chunkMetaBuf, meta.DocNum, meta.DocDvOffset) - if err != nil { - return err - } - } - - // write the metadata to final data - metaData := c.chunkMetaBuf.Bytes() - c.final = append(c.final, c.chunkMetaBuf.Bytes()...) - // write the compressed data to the final data - c.compressed = snappy.Encode(c.compressed[:cap(c.compressed)], c.chunkBuf.Bytes()) - c.final = append(c.final, c.compressed...) - - c.chunkLens[c.currChunk] = uint64(len(c.compressed) + len(metaData)) - - if c.progressiveWrite { - _, err := c.w.Write(c.final) - if err != nil { - return err - } - c.final = c.final[:0] - } - - return nil -} - -// Add encodes the provided byte slice into the correct chunk for the provided -// doc num. You MUST call Add() with increasing docNums. -func (c *chunkedContentCoder) Add(docNum uint64, vals []byte) error { - chunk := docNum / c.chunkSize - if chunk != c.currChunk { - // flush out the previous chunk details - err := c.flushContents() - if err != nil { - return err - } - // clearing the chunk specific meta for next chunk - c.chunkBuf.Reset() - c.chunkMetaBuf.Reset() - c.chunkMeta = c.chunkMeta[:0] - c.currChunk = chunk - } - - // get the starting offset for this doc - dvOffset := c.chunkBuf.Len() - dvSize, err := c.chunkBuf.Write(vals) - if err != nil { - return err - } - - c.chunkMeta = append(c.chunkMeta, MetaData{ - DocNum: docNum, - DocDvOffset: uint64(dvOffset + dvSize), - }) - return nil -} - -// Write commits all the encoded chunked contents to the provided writer. -// -// | ..... data ..... | chunk offsets (varints) -// | position of chunk offsets (uint64) | number of offsets (uint64) | -// -func (c *chunkedContentCoder) Write() (int, error) { - var tw int - - if c.final != nil { - // write out the data section first - nw, err := c.w.Write(c.final) - tw += nw - if err != nil { - return tw, err - } - } - - chunkOffsetsStart := uint64(tw) - - if cap(c.final) < binary.MaxVarintLen64 { - c.final = make([]byte, binary.MaxVarintLen64) - } else { - c.final = c.final[0:binary.MaxVarintLen64] - } - chunkOffsets := modifyLengthsToEndOffsets(c.chunkLens) - // write out the chunk offsets - for _, chunkOffset := range chunkOffsets { - n := binary.PutUvarint(c.final, chunkOffset) - nw, err := c.w.Write(c.final[:n]) - tw += nw - if err != nil { - return tw, err - } - } - - chunkOffsetsLen := uint64(tw) - chunkOffsetsStart - - c.final = c.final[0:8] - // write out the length of chunk offsets - binary.BigEndian.PutUint64(c.final, chunkOffsetsLen) - nw, err := c.w.Write(c.final) - tw += nw - if err != nil { - return tw, err - } - - // write out the number of chunks - binary.BigEndian.PutUint64(c.final, uint64(len(c.chunkLens))) - nw, err = c.w.Write(c.final) - tw += nw - if err != nil { - return tw, err - } - - c.final = c.final[:0] - - return tw, nil -} - -// ReadDocValueBoundary elicits the start, end offsets from a -// metaData header slice -func ReadDocValueBoundary(chunk int, metaHeaders []MetaData) (uint64, uint64) { - var start uint64 - if chunk > 0 { - start = metaHeaders[chunk-1].DocDvOffset - } - return start, metaHeaders[chunk].DocDvOffset -} diff --git a/vendor/github.com/blevesearch/zap/v15/count.go b/vendor/github.com/blevesearch/zap/v15/count.go deleted file mode 100644 index 50290f8..0000000 --- a/vendor/github.com/blevesearch/zap/v15/count.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "hash/crc32" - "io" - - "github.com/blevesearch/bleve/index/scorch/segment" -) - -// CountHashWriter is a wrapper around a Writer which counts the number of -// bytes which have been written and computes a crc32 hash -type CountHashWriter struct { - w io.Writer - crc uint32 - n int - s segment.StatsReporter -} - -// NewCountHashWriter returns a CountHashWriter which wraps the provided Writer -func NewCountHashWriter(w io.Writer) *CountHashWriter { - return &CountHashWriter{w: w} -} - -func NewCountHashWriterWithStatsReporter(w io.Writer, s segment.StatsReporter) *CountHashWriter { - return &CountHashWriter{w: w, s: s} -} - -// Write writes the provided bytes to the wrapped writer and counts the bytes -func (c *CountHashWriter) Write(b []byte) (int, error) { - n, err := c.w.Write(b) - c.crc = crc32.Update(c.crc, crc32.IEEETable, b[:n]) - c.n += n - if c.s != nil { - c.s.ReportBytesWritten(uint64(n)) - } - return n, err -} - -// Count returns the number of bytes written -func (c *CountHashWriter) Count() int { - return c.n -} - -// Sum32 returns the CRC-32 hash of the content written to this writer -func (c *CountHashWriter) Sum32() uint32 { - return c.crc -} diff --git a/vendor/github.com/blevesearch/zap/v15/dict.go b/vendor/github.com/blevesearch/zap/v15/dict.go deleted file mode 100644 index ad4a8f8..0000000 --- a/vendor/github.com/blevesearch/zap/v15/dict.go +++ /dev/null @@ -1,263 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "fmt" - - "github.com/RoaringBitmap/roaring" - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/couchbase/vellum" -) - -// Dictionary is the zap representation of the term dictionary -type Dictionary struct { - sb *SegmentBase - field string - fieldID uint16 - fst *vellum.FST - fstReader *vellum.Reader -} - -// PostingsList returns the postings list for the specified term -func (d *Dictionary) PostingsList(term []byte, except *roaring.Bitmap, - prealloc segment.PostingsList) (segment.PostingsList, error) { - var preallocPL *PostingsList - pl, ok := prealloc.(*PostingsList) - if ok && pl != nil { - preallocPL = pl - } - return d.postingsList(term, except, preallocPL) -} - -func (d *Dictionary) postingsList(term []byte, except *roaring.Bitmap, rv *PostingsList) (*PostingsList, error) { - if d.fstReader == nil { - if rv == nil || rv == emptyPostingsList { - return emptyPostingsList, nil - } - return d.postingsListInit(rv, except), nil - } - - postingsOffset, exists, err := d.fstReader.Get(term) - if err != nil { - return nil, fmt.Errorf("vellum err: %v", err) - } - if !exists { - if rv == nil || rv == emptyPostingsList { - return emptyPostingsList, nil - } - return d.postingsListInit(rv, except), nil - } - - return d.postingsListFromOffset(postingsOffset, except, rv) -} - -func (d *Dictionary) postingsListFromOffset(postingsOffset uint64, except *roaring.Bitmap, rv *PostingsList) (*PostingsList, error) { - rv = d.postingsListInit(rv, except) - - err := rv.read(postingsOffset, d) - if err != nil { - return nil, err - } - - return rv, nil -} - -func (d *Dictionary) postingsListInit(rv *PostingsList, except *roaring.Bitmap) *PostingsList { - if rv == nil || rv == emptyPostingsList { - rv = &PostingsList{} - } else { - postings := rv.postings - if postings != nil { - postings.Clear() - } - - *rv = PostingsList{} // clear the struct - - rv.postings = postings - } - rv.sb = d.sb - rv.except = except - return rv -} - -func (d *Dictionary) Contains(key []byte) (bool, error) { - return d.fst.Contains(key) -} - -// Iterator returns an iterator for this dictionary -func (d *Dictionary) Iterator() segment.DictionaryIterator { - rv := &DictionaryIterator{ - d: d, - } - - if d.fst != nil { - itr, err := d.fst.Iterator(nil, nil) - if err == nil { - rv.itr = itr - } else if err != vellum.ErrIteratorDone { - rv.err = err - } - } - - return rv -} - -// PrefixIterator returns an iterator which only visits terms having the -// the specified prefix -func (d *Dictionary) PrefixIterator(prefix string) segment.DictionaryIterator { - rv := &DictionaryIterator{ - d: d, - } - - kBeg := []byte(prefix) - kEnd := segment.IncrementBytes(kBeg) - - if d.fst != nil { - itr, err := d.fst.Iterator(kBeg, kEnd) - if err == nil { - rv.itr = itr - } else if err != vellum.ErrIteratorDone { - rv.err = err - } - } - - return rv -} - -// RangeIterator returns an iterator which only visits terms between the -// start and end terms. NOTE: bleve.index API specifies the end is inclusive. -func (d *Dictionary) RangeIterator(start, end string) segment.DictionaryIterator { - rv := &DictionaryIterator{ - d: d, - } - - // need to increment the end position to be inclusive - var endBytes []byte - if len(end) > 0 { - endBytes = []byte(end) - if endBytes[len(endBytes)-1] < 0xff { - endBytes[len(endBytes)-1]++ - } else { - endBytes = append(endBytes, 0xff) - } - } - - if d.fst != nil { - itr, err := d.fst.Iterator([]byte(start), endBytes) - if err == nil { - rv.itr = itr - } else if err != vellum.ErrIteratorDone { - rv.err = err - } - } - - return rv -} - -// AutomatonIterator returns an iterator which only visits terms -// having the the vellum automaton and start/end key range -func (d *Dictionary) AutomatonIterator(a vellum.Automaton, - startKeyInclusive, endKeyExclusive []byte) segment.DictionaryIterator { - rv := &DictionaryIterator{ - d: d, - } - - if d.fst != nil { - itr, err := d.fst.Search(a, startKeyInclusive, endKeyExclusive) - if err == nil { - rv.itr = itr - } else if err != vellum.ErrIteratorDone { - rv.err = err - } - } - - return rv -} - -func (d *Dictionary) OnlyIterator(onlyTerms [][]byte, - includeCount bool) segment.DictionaryIterator { - - rv := &DictionaryIterator{ - d: d, - omitCount: !includeCount, - } - - var buf bytes.Buffer - builder, err := vellum.New(&buf, nil) - if err != nil { - rv.err = err - return rv - } - for _, term := range onlyTerms { - err = builder.Insert(term, 0) - if err != nil { - rv.err = err - return rv - } - } - err = builder.Close() - if err != nil { - rv.err = err - return rv - } - - onlyFST, err := vellum.Load(buf.Bytes()) - if err != nil { - rv.err = err - return rv - } - - itr, err := d.fst.Search(onlyFST, nil, nil) - if err == nil { - rv.itr = itr - } else if err != vellum.ErrIteratorDone { - rv.err = err - } - - return rv -} - -// DictionaryIterator is an iterator for term dictionary -type DictionaryIterator struct { - d *Dictionary - itr vellum.Iterator - err error - tmp PostingsList - entry index.DictEntry - omitCount bool -} - -// Next returns the next entry in the dictionary -func (i *DictionaryIterator) Next() (*index.DictEntry, error) { - if i.err != nil && i.err != vellum.ErrIteratorDone { - return nil, i.err - } else if i.itr == nil || i.err == vellum.ErrIteratorDone { - return nil, nil - } - term, postingsOffset := i.itr.Current() - i.entry.Term = string(term) - if !i.omitCount { - i.err = i.tmp.read(postingsOffset, i.d) - if i.err != nil { - return nil, i.err - } - i.entry.Count = i.tmp.Count() - } - i.err = i.itr.Next() - return &i.entry, nil -} diff --git a/vendor/github.com/blevesearch/zap/v15/docvalues.go b/vendor/github.com/blevesearch/zap/v15/docvalues.go deleted file mode 100644 index 793797b..0000000 --- a/vendor/github.com/blevesearch/zap/v15/docvalues.go +++ /dev/null @@ -1,312 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "encoding/binary" - "fmt" - "math" - "reflect" - "sort" - - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/blevesearch/bleve/size" - "github.com/golang/snappy" -) - -var reflectStaticSizedocValueReader int - -func init() { - var dvi docValueReader - reflectStaticSizedocValueReader = int(reflect.TypeOf(dvi).Size()) -} - -type docNumTermsVisitor func(docNum uint64, terms []byte) error - -type docVisitState struct { - dvrs map[uint16]*docValueReader - segment *SegmentBase -} - -type docValueReader struct { - field string - curChunkNum uint64 - chunkOffsets []uint64 - dvDataLoc uint64 - curChunkHeader []MetaData - curChunkData []byte // compressed data cache - uncompressed []byte // temp buf for snappy decompression -} - -func (di *docValueReader) size() int { - return reflectStaticSizedocValueReader + size.SizeOfPtr + - len(di.field) + - len(di.chunkOffsets)*size.SizeOfUint64 + - len(di.curChunkHeader)*reflectStaticSizeMetaData + - len(di.curChunkData) -} - -func (di *docValueReader) cloneInto(rv *docValueReader) *docValueReader { - if rv == nil { - rv = &docValueReader{} - } - - rv.field = di.field - rv.curChunkNum = math.MaxUint64 - rv.chunkOffsets = di.chunkOffsets // immutable, so it's sharable - rv.dvDataLoc = di.dvDataLoc - rv.curChunkHeader = rv.curChunkHeader[:0] - rv.curChunkData = nil - rv.uncompressed = rv.uncompressed[:0] - - return rv -} - -func (di *docValueReader) curChunkNumber() uint64 { - return di.curChunkNum -} - -func (s *SegmentBase) loadFieldDocValueReader(field string, - fieldDvLocStart, fieldDvLocEnd uint64) (*docValueReader, error) { - // get the docValue offset for the given fields - if fieldDvLocStart == fieldNotUninverted { - // no docValues found, nothing to do - return nil, nil - } - - // read the number of chunks, and chunk offsets position - var numChunks, chunkOffsetsPosition uint64 - - if fieldDvLocEnd-fieldDvLocStart > 16 { - numChunks = binary.BigEndian.Uint64(s.mem[fieldDvLocEnd-8 : fieldDvLocEnd]) - // read the length of chunk offsets - chunkOffsetsLen := binary.BigEndian.Uint64(s.mem[fieldDvLocEnd-16 : fieldDvLocEnd-8]) - // acquire position of chunk offsets - chunkOffsetsPosition = (fieldDvLocEnd - 16) - chunkOffsetsLen - } else { - return nil, fmt.Errorf("loadFieldDocValueReader: fieldDvLoc too small: %d-%d", fieldDvLocEnd, fieldDvLocStart) - } - - fdvIter := &docValueReader{ - curChunkNum: math.MaxUint64, - field: field, - chunkOffsets: make([]uint64, int(numChunks)), - } - - // read the chunk offsets - var offset uint64 - for i := 0; i < int(numChunks); i++ { - loc, read := binary.Uvarint(s.mem[chunkOffsetsPosition+offset : chunkOffsetsPosition+offset+binary.MaxVarintLen64]) - if read <= 0 { - return nil, fmt.Errorf("corrupted chunk offset during segment load") - } - fdvIter.chunkOffsets[i] = loc - offset += uint64(read) - } - - // set the data offset - fdvIter.dvDataLoc = fieldDvLocStart - - return fdvIter, nil -} - -func (di *docValueReader) loadDvChunk(chunkNumber uint64, s *SegmentBase) error { - // advance to the chunk where the docValues - // reside for the given docNum - destChunkDataLoc, curChunkEnd := di.dvDataLoc, di.dvDataLoc - start, end := readChunkBoundary(int(chunkNumber), di.chunkOffsets) - if start >= end { - di.curChunkHeader = di.curChunkHeader[:0] - di.curChunkData = nil - di.curChunkNum = chunkNumber - di.uncompressed = di.uncompressed[:0] - return nil - } - - destChunkDataLoc += start - curChunkEnd += end - - // read the number of docs reside in the chunk - numDocs, read := binary.Uvarint(s.mem[destChunkDataLoc : destChunkDataLoc+binary.MaxVarintLen64]) - if read <= 0 { - return fmt.Errorf("failed to read the chunk") - } - chunkMetaLoc := destChunkDataLoc + uint64(read) - - offset := uint64(0) - if cap(di.curChunkHeader) < int(numDocs) { - di.curChunkHeader = make([]MetaData, int(numDocs)) - } else { - di.curChunkHeader = di.curChunkHeader[:int(numDocs)] - } - for i := 0; i < int(numDocs); i++ { - di.curChunkHeader[i].DocNum, read = binary.Uvarint(s.mem[chunkMetaLoc+offset : chunkMetaLoc+offset+binary.MaxVarintLen64]) - offset += uint64(read) - di.curChunkHeader[i].DocDvOffset, read = binary.Uvarint(s.mem[chunkMetaLoc+offset : chunkMetaLoc+offset+binary.MaxVarintLen64]) - offset += uint64(read) - } - - compressedDataLoc := chunkMetaLoc + offset - dataLength := curChunkEnd - compressedDataLoc - di.curChunkData = s.mem[compressedDataLoc : compressedDataLoc+dataLength] - di.curChunkNum = chunkNumber - di.uncompressed = di.uncompressed[:0] - return nil -} - -func (di *docValueReader) iterateAllDocValues(s *SegmentBase, visitor docNumTermsVisitor) error { - for i := 0; i < len(di.chunkOffsets); i++ { - err := di.loadDvChunk(uint64(i), s) - if err != nil { - return err - } - if di.curChunkData == nil || len(di.curChunkHeader) == 0 { - continue - } - - // uncompress the already loaded data - uncompressed, err := snappy.Decode(di.uncompressed[:cap(di.uncompressed)], di.curChunkData) - if err != nil { - return err - } - di.uncompressed = uncompressed - - start := uint64(0) - for _, entry := range di.curChunkHeader { - err = visitor(entry.DocNum, uncompressed[start:entry.DocDvOffset]) - if err != nil { - return err - } - - start = entry.DocDvOffset - } - } - - return nil -} - -func (di *docValueReader) visitDocValues(docNum uint64, - visitor index.DocumentFieldTermVisitor) error { - // binary search the term locations for the docNum - start, end := di.getDocValueLocs(docNum) - if start == math.MaxUint64 || end == math.MaxUint64 || start == end { - return nil - } - - var uncompressed []byte - var err error - // use the uncompressed copy if available - if len(di.uncompressed) > 0 { - uncompressed = di.uncompressed - } else { - // uncompress the already loaded data - uncompressed, err = snappy.Decode(di.uncompressed[:cap(di.uncompressed)], di.curChunkData) - if err != nil { - return err - } - di.uncompressed = uncompressed - } - - // pick the terms for the given docNum - uncompressed = uncompressed[start:end] - for { - i := bytes.Index(uncompressed, termSeparatorSplitSlice) - if i < 0 { - break - } - - visitor(di.field, uncompressed[0:i]) - uncompressed = uncompressed[i+1:] - } - - return nil -} - -func (di *docValueReader) getDocValueLocs(docNum uint64) (uint64, uint64) { - i := sort.Search(len(di.curChunkHeader), func(i int) bool { - return di.curChunkHeader[i].DocNum >= docNum - }) - if i < len(di.curChunkHeader) && di.curChunkHeader[i].DocNum == docNum { - return ReadDocValueBoundary(i, di.curChunkHeader) - } - return math.MaxUint64, math.MaxUint64 -} - -// VisitDocumentFieldTerms is an implementation of the -// DocumentFieldTermVisitable interface -func (s *SegmentBase) VisitDocumentFieldTerms(localDocNum uint64, fields []string, - visitor index.DocumentFieldTermVisitor, dvsIn segment.DocVisitState) ( - segment.DocVisitState, error) { - dvs, ok := dvsIn.(*docVisitState) - if !ok || dvs == nil { - dvs = &docVisitState{} - } else { - if dvs.segment != s { - dvs.segment = s - dvs.dvrs = nil - } - } - - var fieldIDPlus1 uint16 - if dvs.dvrs == nil { - dvs.dvrs = make(map[uint16]*docValueReader, len(fields)) - for _, field := range fields { - if fieldIDPlus1, ok = s.fieldsMap[field]; !ok { - continue - } - fieldID := fieldIDPlus1 - 1 - if dvIter, exists := s.fieldDvReaders[fieldID]; exists && - dvIter != nil { - dvs.dvrs[fieldID] = dvIter.cloneInto(dvs.dvrs[fieldID]) - } - } - } - - // find the chunkNumber where the docValues are stored - // NOTE: doc values continue to use legacy chunk mode - chunkFactor, err := getChunkSize(LegacyChunkMode, 0, 0) - if err != nil { - return nil, err - } - docInChunk := localDocNum / chunkFactor - var dvr *docValueReader - for _, field := range fields { - if fieldIDPlus1, ok = s.fieldsMap[field]; !ok { - continue - } - fieldID := fieldIDPlus1 - 1 - if dvr, ok = dvs.dvrs[fieldID]; ok && dvr != nil { - // check if the chunk is already loaded - if docInChunk != dvr.curChunkNumber() { - err := dvr.loadDvChunk(docInChunk, s) - if err != nil { - return dvs, err - } - } - - _ = dvr.visitDocValues(localDocNum, visitor) - } - } - return dvs, nil -} - -// VisitableDocValueFields returns the list of fields with -// persisted doc value terms ready to be visitable using the -// VisitDocumentFieldTerms method. -func (s *SegmentBase) VisitableDocValueFields() ([]string, error) { - return s.fieldDvNames, nil -} diff --git a/vendor/github.com/blevesearch/zap/v15/enumerator.go b/vendor/github.com/blevesearch/zap/v15/enumerator.go deleted file mode 100644 index bc5b7e6..0000000 --- a/vendor/github.com/blevesearch/zap/v15/enumerator.go +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright (c) 2018 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - - "github.com/couchbase/vellum" -) - -// enumerator provides an ordered traversal of multiple vellum -// iterators. Like JOIN of iterators, the enumerator produces a -// sequence of (key, iteratorIndex, value) tuples, sorted by key ASC, -// then iteratorIndex ASC, where the same key might be seen or -// repeated across multiple child iterators. -type enumerator struct { - itrs []vellum.Iterator - currKs [][]byte - currVs []uint64 - - lowK []byte - lowIdxs []int - lowCurr int -} - -// newEnumerator returns a new enumerator over the vellum Iterators -func newEnumerator(itrs []vellum.Iterator) (*enumerator, error) { - rv := &enumerator{ - itrs: itrs, - currKs: make([][]byte, len(itrs)), - currVs: make([]uint64, len(itrs)), - lowIdxs: make([]int, 0, len(itrs)), - } - for i, itr := range rv.itrs { - rv.currKs[i], rv.currVs[i] = itr.Current() - } - rv.updateMatches(false) - if rv.lowK == nil && len(rv.lowIdxs) == 0 { - return rv, vellum.ErrIteratorDone - } - return rv, nil -} - -// updateMatches maintains the low key matches based on the currKs -func (m *enumerator) updateMatches(skipEmptyKey bool) { - m.lowK = nil - m.lowIdxs = m.lowIdxs[:0] - m.lowCurr = 0 - - for i, key := range m.currKs { - if (key == nil && m.currVs[i] == 0) || // in case of empty iterator - (len(key) == 0 && skipEmptyKey) { // skip empty keys - continue - } - - cmp := bytes.Compare(key, m.lowK) - if cmp < 0 || len(m.lowIdxs) == 0 { - // reached a new low - m.lowK = key - m.lowIdxs = m.lowIdxs[:0] - m.lowIdxs = append(m.lowIdxs, i) - } else if cmp == 0 { - m.lowIdxs = append(m.lowIdxs, i) - } - } -} - -// Current returns the enumerator's current key, iterator-index, and -// value. If the enumerator is not pointing at a valid value (because -// Next returned an error previously), Current will return nil,0,0. -func (m *enumerator) Current() ([]byte, int, uint64) { - var i int - var v uint64 - if m.lowCurr < len(m.lowIdxs) { - i = m.lowIdxs[m.lowCurr] - v = m.currVs[i] - } - return m.lowK, i, v -} - -// GetLowIdxsAndValues will return all of the iterator indices -// which point to the current key, and their corresponding -// values. This can be used by advanced caller which may need -// to peek into these other sets of data before processing. -func (m *enumerator) GetLowIdxsAndValues() ([]int, []uint64) { - values := make([]uint64, 0, len(m.lowIdxs)) - for _, idx := range m.lowIdxs { - values = append(values, m.currVs[idx]) - } - return m.lowIdxs, values -} - -// Next advances the enumerator to the next key/iterator/value result, -// else vellum.ErrIteratorDone is returned. -func (m *enumerator) Next() error { - m.lowCurr += 1 - if m.lowCurr >= len(m.lowIdxs) { - // move all the current low iterators forwards - for _, vi := range m.lowIdxs { - err := m.itrs[vi].Next() - if err != nil && err != vellum.ErrIteratorDone { - return err - } - m.currKs[vi], m.currVs[vi] = m.itrs[vi].Current() - } - // can skip any empty keys encountered at this point - m.updateMatches(true) - } - if m.lowK == nil && len(m.lowIdxs) == 0 { - return vellum.ErrIteratorDone - } - return nil -} - -// Close all the underlying Iterators. The first error, if any, will -// be returned. -func (m *enumerator) Close() error { - var rv error - for _, itr := range m.itrs { - err := itr.Close() - if rv == nil { - rv = err - } - } - return rv -} diff --git a/vendor/github.com/blevesearch/zap/v15/intDecoder.go b/vendor/github.com/blevesearch/zap/v15/intDecoder.go deleted file mode 100644 index ea8021d..0000000 --- a/vendor/github.com/blevesearch/zap/v15/intDecoder.go +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright (c) 2019 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "encoding/binary" - "fmt" - - "github.com/blevesearch/bleve/index/scorch/segment" -) - -type chunkedIntDecoder struct { - startOffset uint64 - dataStartOffset uint64 - chunkOffsets []uint64 - curChunkBytes []byte - data []byte - r *segment.MemUvarintReader -} - -// newChunkedIntDecoder expects an optional or reset chunkedIntDecoder for better reuse. -func newChunkedIntDecoder(buf []byte, offset uint64, rv *chunkedIntDecoder) *chunkedIntDecoder { - if rv == nil { - rv = &chunkedIntDecoder{startOffset: offset, data: buf} - } else { - rv.startOffset = offset - rv.data = buf - } - - var n, numChunks uint64 - var read int - if offset == termNotEncoded { - numChunks = 0 - } else { - numChunks, read = binary.Uvarint(buf[offset+n : offset+n+binary.MaxVarintLen64]) - } - - n += uint64(read) - if cap(rv.chunkOffsets) >= int(numChunks) { - rv.chunkOffsets = rv.chunkOffsets[:int(numChunks)] - } else { - rv.chunkOffsets = make([]uint64, int(numChunks)) - } - for i := 0; i < int(numChunks); i++ { - rv.chunkOffsets[i], read = binary.Uvarint(buf[offset+n : offset+n+binary.MaxVarintLen64]) - n += uint64(read) - } - rv.dataStartOffset = offset + n - return rv -} - -func (d *chunkedIntDecoder) loadChunk(chunk int) error { - if d.startOffset == termNotEncoded { - d.r = segment.NewMemUvarintReader([]byte(nil)) - return nil - } - - if chunk >= len(d.chunkOffsets) { - return fmt.Errorf("tried to load freq chunk that doesn't exist %d/(%d)", - chunk, len(d.chunkOffsets)) - } - - end, start := d.dataStartOffset, d.dataStartOffset - s, e := readChunkBoundary(chunk, d.chunkOffsets) - start += s - end += e - d.curChunkBytes = d.data[start:end] - if d.r == nil { - d.r = segment.NewMemUvarintReader(d.curChunkBytes) - } else { - d.r.Reset(d.curChunkBytes) - } - - return nil -} - -func (d *chunkedIntDecoder) reset() { - d.startOffset = 0 - d.dataStartOffset = 0 - d.chunkOffsets = d.chunkOffsets[:0] - d.curChunkBytes = d.curChunkBytes[:0] - d.data = d.data[:0] - if d.r != nil { - d.r.Reset([]byte(nil)) - } -} - -func (d *chunkedIntDecoder) isNil() bool { - return d.curChunkBytes == nil || len(d.curChunkBytes) == 0 -} - -func (d *chunkedIntDecoder) readUvarint() (uint64, error) { - return d.r.ReadUvarint() -} - -func (d *chunkedIntDecoder) readBytes(start, end int) []byte { - return d.curChunkBytes[start:end] -} - -func (d *chunkedIntDecoder) SkipUvarint() { - d.r.SkipUvarint() -} - -func (d *chunkedIntDecoder) SkipBytes(count int) { - d.r.SkipBytes(count) -} - -func (d *chunkedIntDecoder) Len() int { - return d.r.Len() -} - -func (d *chunkedIntDecoder) remainingLen() int { - return len(d.curChunkBytes) - d.r.Len() -} diff --git a/vendor/github.com/blevesearch/zap/v15/intcoder.go b/vendor/github.com/blevesearch/zap/v15/intcoder.go deleted file mode 100644 index c3c488f..0000000 --- a/vendor/github.com/blevesearch/zap/v15/intcoder.go +++ /dev/null @@ -1,206 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "encoding/binary" - "io" -) - -// We can safely use 0 to represent termNotEncoded since 0 -// could never be a valid address for term location information. -// (stored field index is always non-empty and earlier in the -// file) -const termNotEncoded = 0 - -type chunkedIntCoder struct { - final []byte - chunkSize uint64 - chunkBuf bytes.Buffer - chunkLens []uint64 - currChunk uint64 - - buf []byte -} - -// newChunkedIntCoder returns a new chunk int coder which packs data into -// chunks based on the provided chunkSize and supports up to the specified -// maxDocNum -func newChunkedIntCoder(chunkSize uint64, maxDocNum uint64) *chunkedIntCoder { - total := maxDocNum/chunkSize + 1 - rv := &chunkedIntCoder{ - chunkSize: chunkSize, - chunkLens: make([]uint64, total), - final: make([]byte, 0, 64), - } - - return rv -} - -// Reset lets you reuse this chunked int coder. buffers are reset and reused -// from previous use. you cannot change the chunk size or max doc num. -func (c *chunkedIntCoder) Reset() { - c.final = c.final[:0] - c.chunkBuf.Reset() - c.currChunk = 0 - for i := range c.chunkLens { - c.chunkLens[i] = 0 - } -} - -// SetChunkSize changes the chunk size. It is only valid to do so -// with a new chunkedIntCoder, or immediately after calling Reset() -func (c *chunkedIntCoder) SetChunkSize(chunkSize uint64, maxDocNum uint64) { - total := int(maxDocNum/chunkSize + 1) - c.chunkSize = chunkSize - if cap(c.chunkLens) < total { - c.chunkLens = make([]uint64, total) - } else { - c.chunkLens = c.chunkLens[:total] - } -} - -// Add encodes the provided integers into the correct chunk for the provided -// doc num. You MUST call Add() with increasing docNums. -func (c *chunkedIntCoder) Add(docNum uint64, vals ...uint64) error { - chunk := docNum / c.chunkSize - if chunk != c.currChunk { - // starting a new chunk - c.Close() - c.chunkBuf.Reset() - c.currChunk = chunk - } - - if len(c.buf) < binary.MaxVarintLen64 { - c.buf = make([]byte, binary.MaxVarintLen64) - } - - for _, val := range vals { - wb := binary.PutUvarint(c.buf, val) - _, err := c.chunkBuf.Write(c.buf[:wb]) - if err != nil { - return err - } - } - - return nil -} - -func (c *chunkedIntCoder) AddBytes(docNum uint64, buf []byte) error { - chunk := docNum / c.chunkSize - if chunk != c.currChunk { - // starting a new chunk - c.Close() - c.chunkBuf.Reset() - c.currChunk = chunk - } - - _, err := c.chunkBuf.Write(buf) - return err -} - -// Close indicates you are done calling Add() this allows the final chunk -// to be encoded. -func (c *chunkedIntCoder) Close() { - encodingBytes := c.chunkBuf.Bytes() - c.chunkLens[c.currChunk] = uint64(len(encodingBytes)) - c.final = append(c.final, encodingBytes...) - c.currChunk = uint64(cap(c.chunkLens)) // sentinel to detect double close -} - -// Write commits all the encoded chunked integers to the provided writer. -func (c *chunkedIntCoder) Write(w io.Writer) (int, error) { - bufNeeded := binary.MaxVarintLen64 * (1 + len(c.chunkLens)) - if len(c.buf) < bufNeeded { - c.buf = make([]byte, bufNeeded) - } - buf := c.buf - - // convert the chunk lengths into chunk offsets - chunkOffsets := modifyLengthsToEndOffsets(c.chunkLens) - - // write out the number of chunks & each chunk offsets - n := binary.PutUvarint(buf, uint64(len(chunkOffsets))) - for _, chunkOffset := range chunkOffsets { - n += binary.PutUvarint(buf[n:], chunkOffset) - } - - tw, err := w.Write(buf[:n]) - if err != nil { - return tw, err - } - - // write out the data - nw, err := w.Write(c.final) - tw += nw - if err != nil { - return tw, err - } - return tw, nil -} - -// writeAt commits all the encoded chunked integers to the provided writer -// and returns the starting offset, total bytes written and an error -func (c *chunkedIntCoder) writeAt(w io.Writer) (uint64, int, error) { - startOffset := uint64(termNotEncoded) - if len(c.final) <= 0 { - return startOffset, 0, nil - } - - if chw := w.(*CountHashWriter); chw != nil { - startOffset = uint64(chw.Count()) - } - - tw, err := c.Write(w) - return startOffset, tw, err -} - -func (c *chunkedIntCoder) FinalSize() int { - return len(c.final) -} - -// modifyLengthsToEndOffsets converts the chunk length array -// to a chunk offset array. The readChunkBoundary -// will figure out the start and end of every chunk from -// these offsets. Starting offset of i'th index is stored -// in i-1'th position except for 0'th index and ending offset -// is stored at i'th index position. -// For 0'th element, starting position is always zero. -// eg: -// Lens -> 5 5 5 5 => 5 10 15 20 -// Lens -> 0 5 0 5 => 0 5 5 10 -// Lens -> 0 0 0 5 => 0 0 0 5 -// Lens -> 5 0 0 0 => 5 5 5 5 -// Lens -> 0 5 0 0 => 0 5 5 5 -// Lens -> 0 0 5 0 => 0 0 5 5 -func modifyLengthsToEndOffsets(lengths []uint64) []uint64 { - var runningOffset uint64 - var index, i int - for i = 1; i <= len(lengths); i++ { - runningOffset += lengths[i-1] - lengths[index] = runningOffset - index++ - } - return lengths -} - -func readChunkBoundary(chunk int, offsets []uint64) (uint64, uint64) { - var start uint64 - if chunk > 0 { - start = offsets[chunk-1] - } - return start, offsets[chunk] -} diff --git a/vendor/github.com/blevesearch/zap/v15/merge.go b/vendor/github.com/blevesearch/zap/v15/merge.go deleted file mode 100644 index 0d73c1e..0000000 --- a/vendor/github.com/blevesearch/zap/v15/merge.go +++ /dev/null @@ -1,893 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bufio" - "bytes" - "encoding/binary" - "fmt" - "math" - "os" - "sort" - - "github.com/RoaringBitmap/roaring" - seg "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/couchbase/vellum" - "github.com/golang/snappy" -) - -var DefaultFileMergerBufferSize = 1024 * 1024 - -const docDropped = math.MaxUint64 // sentinel docNum to represent a deleted doc - -// Merge takes a slice of segments and bit masks describing which -// documents may be dropped, and creates a new segment containing the -// remaining data. This new segment is built at the specified path. -func (*ZapPlugin) Merge(segments []seg.Segment, drops []*roaring.Bitmap, path string, - closeCh chan struct{}, s seg.StatsReporter) ( - [][]uint64, uint64, error) { - - segmentBases := make([]*SegmentBase, len(segments)) - for segmenti, segment := range segments { - switch segmentx := segment.(type) { - case *Segment: - segmentBases[segmenti] = &segmentx.SegmentBase - case *SegmentBase: - segmentBases[segmenti] = segmentx - default: - panic(fmt.Sprintf("oops, unexpected segment type: %T", segment)) - } - } - return mergeSegmentBases(segmentBases, drops, path, DefaultChunkMode, closeCh, s) -} - -func mergeSegmentBases(segmentBases []*SegmentBase, drops []*roaring.Bitmap, path string, - chunkMode uint32, closeCh chan struct{}, s seg.StatsReporter) ( - [][]uint64, uint64, error) { - flag := os.O_RDWR | os.O_CREATE - - f, err := os.OpenFile(path, flag, 0600) - if err != nil { - return nil, 0, err - } - - cleanup := func() { - _ = f.Close() - _ = os.Remove(path) - } - - // buffer the output - br := bufio.NewWriterSize(f, DefaultFileMergerBufferSize) - - // wrap it for counting (tracking offsets) - cr := NewCountHashWriterWithStatsReporter(br, s) - - newDocNums, numDocs, storedIndexOffset, fieldsIndexOffset, docValueOffset, _, _, _, err := - MergeToWriter(segmentBases, drops, chunkMode, cr, closeCh) - if err != nil { - cleanup() - return nil, 0, err - } - - err = persistFooter(numDocs, storedIndexOffset, fieldsIndexOffset, - docValueOffset, chunkMode, cr.Sum32(), cr) - if err != nil { - cleanup() - return nil, 0, err - } - - err = br.Flush() - if err != nil { - cleanup() - return nil, 0, err - } - - err = f.Sync() - if err != nil { - cleanup() - return nil, 0, err - } - - err = f.Close() - if err != nil { - cleanup() - return nil, 0, err - } - - return newDocNums, uint64(cr.Count()), nil -} - -func MergeToWriter(segments []*SegmentBase, drops []*roaring.Bitmap, - chunkMode uint32, cr *CountHashWriter, closeCh chan struct{}) ( - newDocNums [][]uint64, - numDocs, storedIndexOffset, fieldsIndexOffset, docValueOffset uint64, - dictLocs []uint64, fieldsInv []string, fieldsMap map[string]uint16, - err error) { - docValueOffset = uint64(fieldNotUninverted) - - var fieldsSame bool - fieldsSame, fieldsInv = mergeFields(segments) - fieldsMap = mapFields(fieldsInv) - - numDocs = computeNewDocCount(segments, drops) - - if isClosed(closeCh) { - return nil, 0, 0, 0, 0, nil, nil, nil, seg.ErrClosed - } - - if numDocs > 0 { - storedIndexOffset, newDocNums, err = mergeStoredAndRemap(segments, drops, - fieldsMap, fieldsInv, fieldsSame, numDocs, cr, closeCh) - if err != nil { - return nil, 0, 0, 0, 0, nil, nil, nil, err - } - - dictLocs, docValueOffset, err = persistMergedRest(segments, drops, - fieldsInv, fieldsMap, fieldsSame, - newDocNums, numDocs, chunkMode, cr, closeCh) - if err != nil { - return nil, 0, 0, 0, 0, nil, nil, nil, err - } - } else { - dictLocs = make([]uint64, len(fieldsInv)) - } - - fieldsIndexOffset, err = persistFields(fieldsInv, cr, dictLocs) - if err != nil { - return nil, 0, 0, 0, 0, nil, nil, nil, err - } - - return newDocNums, numDocs, storedIndexOffset, fieldsIndexOffset, docValueOffset, dictLocs, fieldsInv, fieldsMap, nil -} - -// mapFields takes the fieldsInv list and returns a map of fieldName -// to fieldID+1 -func mapFields(fields []string) map[string]uint16 { - rv := make(map[string]uint16, len(fields)) - for i, fieldName := range fields { - rv[fieldName] = uint16(i) + 1 - } - return rv -} - -// computeNewDocCount determines how many documents will be in the newly -// merged segment when obsoleted docs are dropped -func computeNewDocCount(segments []*SegmentBase, drops []*roaring.Bitmap) uint64 { - var newDocCount uint64 - for segI, segment := range segments { - newDocCount += segment.numDocs - if drops[segI] != nil { - newDocCount -= drops[segI].GetCardinality() - } - } - return newDocCount -} - -func persistMergedRest(segments []*SegmentBase, dropsIn []*roaring.Bitmap, - fieldsInv []string, fieldsMap map[string]uint16, fieldsSame bool, - newDocNumsIn [][]uint64, newSegDocCount uint64, chunkMode uint32, - w *CountHashWriter, closeCh chan struct{}) ([]uint64, uint64, error) { - - var bufMaxVarintLen64 []byte = make([]byte, binary.MaxVarintLen64) - var bufLoc []uint64 - - var postings *PostingsList - var postItr *PostingsIterator - - rv := make([]uint64, len(fieldsInv)) - fieldDvLocsStart := make([]uint64, len(fieldsInv)) - fieldDvLocsEnd := make([]uint64, len(fieldsInv)) - - // these int coders are initialized with chunk size 1024 - // however this will be reset to the correct chunk size - // while processing each individual field-term section - tfEncoder := newChunkedIntCoder(1024, newSegDocCount-1) - locEncoder := newChunkedIntCoder(1024, newSegDocCount-1) - - var vellumBuf bytes.Buffer - newVellum, err := vellum.New(&vellumBuf, nil) - if err != nil { - return nil, 0, err - } - - newRoaring := roaring.NewBitmap() - - // for each field - for fieldID, fieldName := range fieldsInv { - - // collect FST iterators from all active segments for this field - var newDocNums [][]uint64 - var drops []*roaring.Bitmap - var dicts []*Dictionary - var itrs []vellum.Iterator - - var segmentsInFocus []*SegmentBase - - for segmentI, segment := range segments { - - // check for the closure in meantime - if isClosed(closeCh) { - return nil, 0, seg.ErrClosed - } - - dict, err2 := segment.dictionary(fieldName) - if err2 != nil { - return nil, 0, err2 - } - if dict != nil && dict.fst != nil { - itr, err2 := dict.fst.Iterator(nil, nil) - if err2 != nil && err2 != vellum.ErrIteratorDone { - return nil, 0, err2 - } - if itr != nil { - newDocNums = append(newDocNums, newDocNumsIn[segmentI]) - if dropsIn[segmentI] != nil && !dropsIn[segmentI].IsEmpty() { - drops = append(drops, dropsIn[segmentI]) - } else { - drops = append(drops, nil) - } - dicts = append(dicts, dict) - itrs = append(itrs, itr) - segmentsInFocus = append(segmentsInFocus, segment) - } - } - } - - var prevTerm []byte - - newRoaring.Clear() - - var lastDocNum, lastFreq, lastNorm uint64 - - // determines whether to use "1-hit" encoding optimization - // when a term appears in only 1 doc, with no loc info, - // has freq of 1, and the docNum fits into 31-bits - use1HitEncoding := func(termCardinality uint64) (bool, uint64, uint64) { - if termCardinality == uint64(1) && locEncoder.FinalSize() <= 0 { - docNum := uint64(newRoaring.Minimum()) - if under32Bits(docNum) && docNum == lastDocNum && lastFreq == 1 { - return true, docNum, lastNorm - } - } - return false, 0, 0 - } - - finishTerm := func(term []byte) error { - tfEncoder.Close() - locEncoder.Close() - - postingsOffset, err := writePostings(newRoaring, - tfEncoder, locEncoder, use1HitEncoding, w, bufMaxVarintLen64) - if err != nil { - return err - } - - if postingsOffset > 0 { - err = newVellum.Insert(term, postingsOffset) - if err != nil { - return err - } - } - - newRoaring.Clear() - - tfEncoder.Reset() - locEncoder.Reset() - - lastDocNum = 0 - lastFreq = 0 - lastNorm = 0 - - return nil - } - - enumerator, err := newEnumerator(itrs) - - for err == nil { - term, itrI, postingsOffset := enumerator.Current() - - if !bytes.Equal(prevTerm, term) { - // check for the closure in meantime - if isClosed(closeCh) { - return nil, 0, seg.ErrClosed - } - - // if the term changed, write out the info collected - // for the previous term - err = finishTerm(prevTerm) - if err != nil { - return nil, 0, err - } - } - if !bytes.Equal(prevTerm, term) || prevTerm == nil { - // compute cardinality of field-term in new seg - var newCard uint64 - lowItrIdxs, lowItrVals := enumerator.GetLowIdxsAndValues() - for i, idx := range lowItrIdxs { - pl, err := dicts[idx].postingsListFromOffset(lowItrVals[i], drops[idx], nil) - if err != nil { - return nil, 0, err - } - newCard += pl.Count() - } - // compute correct chunk size with this - chunkSize, err := getChunkSize(chunkMode, newCard, newSegDocCount) - if err != nil { - return nil, 0, err - } - // update encoders chunk - tfEncoder.SetChunkSize(chunkSize, newSegDocCount-1) - locEncoder.SetChunkSize(chunkSize, newSegDocCount-1) - } - - postings, err = dicts[itrI].postingsListFromOffset( - postingsOffset, drops[itrI], postings) - if err != nil { - return nil, 0, err - } - - postItr = postings.iterator(true, true, true, postItr) - - if fieldsSame { - // can optimize by copying freq/norm/loc bytes directly - lastDocNum, lastFreq, lastNorm, err = mergeTermFreqNormLocsByCopying( - term, postItr, newDocNums[itrI], newRoaring, - tfEncoder, locEncoder) - } else { - lastDocNum, lastFreq, lastNorm, bufLoc, err = mergeTermFreqNormLocs( - fieldsMap, term, postItr, newDocNums[itrI], newRoaring, - tfEncoder, locEncoder, bufLoc) - } - if err != nil { - return nil, 0, err - } - - prevTerm = prevTerm[:0] // copy to prevTerm in case Next() reuses term mem - prevTerm = append(prevTerm, term...) - - err = enumerator.Next() - } - if err != vellum.ErrIteratorDone { - return nil, 0, err - } - - err = finishTerm(prevTerm) - if err != nil { - return nil, 0, err - } - - dictOffset := uint64(w.Count()) - - err = newVellum.Close() - if err != nil { - return nil, 0, err - } - vellumData := vellumBuf.Bytes() - - // write out the length of the vellum data - n := binary.PutUvarint(bufMaxVarintLen64, uint64(len(vellumData))) - _, err = w.Write(bufMaxVarintLen64[:n]) - if err != nil { - return nil, 0, err - } - - // write this vellum to disk - _, err = w.Write(vellumData) - if err != nil { - return nil, 0, err - } - - rv[fieldID] = dictOffset - - // get the field doc value offset (start) - fieldDvLocsStart[fieldID] = uint64(w.Count()) - - // update the field doc values - // NOTE: doc values continue to use legacy chunk mode - chunkSize, err := getChunkSize(LegacyChunkMode, 0, 0) - if err != nil { - return nil, 0, err - } - fdvEncoder := newChunkedContentCoder(chunkSize, newSegDocCount-1, w, true) - - fdvReadersAvailable := false - var dvIterClone *docValueReader - for segmentI, segment := range segmentsInFocus { - // check for the closure in meantime - if isClosed(closeCh) { - return nil, 0, seg.ErrClosed - } - - fieldIDPlus1 := uint16(segment.fieldsMap[fieldName]) - if dvIter, exists := segment.fieldDvReaders[fieldIDPlus1-1]; exists && - dvIter != nil { - fdvReadersAvailable = true - dvIterClone = dvIter.cloneInto(dvIterClone) - err = dvIterClone.iterateAllDocValues(segment, func(docNum uint64, terms []byte) error { - if newDocNums[segmentI][docNum] == docDropped { - return nil - } - err := fdvEncoder.Add(newDocNums[segmentI][docNum], terms) - if err != nil { - return err - } - return nil - }) - if err != nil { - return nil, 0, err - } - } - } - - if fdvReadersAvailable { - err = fdvEncoder.Close() - if err != nil { - return nil, 0, err - } - - // persist the doc value details for this field - _, err = fdvEncoder.Write() - if err != nil { - return nil, 0, err - } - - // get the field doc value offset (end) - fieldDvLocsEnd[fieldID] = uint64(w.Count()) - } else { - fieldDvLocsStart[fieldID] = fieldNotUninverted - fieldDvLocsEnd[fieldID] = fieldNotUninverted - } - - // reset vellum buffer and vellum builder - vellumBuf.Reset() - err = newVellum.Reset(&vellumBuf) - if err != nil { - return nil, 0, err - } - } - - fieldDvLocsOffset := uint64(w.Count()) - - buf := bufMaxVarintLen64 - for i := 0; i < len(fieldDvLocsStart); i++ { - n := binary.PutUvarint(buf, fieldDvLocsStart[i]) - _, err := w.Write(buf[:n]) - if err != nil { - return nil, 0, err - } - n = binary.PutUvarint(buf, fieldDvLocsEnd[i]) - _, err = w.Write(buf[:n]) - if err != nil { - return nil, 0, err - } - } - - return rv, fieldDvLocsOffset, nil -} - -func mergeTermFreqNormLocsByCopying(term []byte, postItr *PostingsIterator, - newDocNums []uint64, newRoaring *roaring.Bitmap, - tfEncoder *chunkedIntCoder, locEncoder *chunkedIntCoder) ( - lastDocNum uint64, lastFreq uint64, lastNorm uint64, err error) { - nextDocNum, nextFreq, nextNorm, nextFreqNormBytes, nextLocBytes, err := - postItr.nextBytes() - for err == nil && len(nextFreqNormBytes) > 0 { - hitNewDocNum := newDocNums[nextDocNum] - if hitNewDocNum == docDropped { - return 0, 0, 0, fmt.Errorf("see hit with dropped doc num") - } - - newRoaring.Add(uint32(hitNewDocNum)) - err = tfEncoder.AddBytes(hitNewDocNum, nextFreqNormBytes) - if err != nil { - return 0, 0, 0, err - } - - if len(nextLocBytes) > 0 { - err = locEncoder.AddBytes(hitNewDocNum, nextLocBytes) - if err != nil { - return 0, 0, 0, err - } - } - - lastDocNum = hitNewDocNum - lastFreq = nextFreq - lastNorm = nextNorm - - nextDocNum, nextFreq, nextNorm, nextFreqNormBytes, nextLocBytes, err = - postItr.nextBytes() - } - - return lastDocNum, lastFreq, lastNorm, err -} - -func mergeTermFreqNormLocs(fieldsMap map[string]uint16, term []byte, postItr *PostingsIterator, - newDocNums []uint64, newRoaring *roaring.Bitmap, - tfEncoder *chunkedIntCoder, locEncoder *chunkedIntCoder, bufLoc []uint64) ( - lastDocNum uint64, lastFreq uint64, lastNorm uint64, bufLocOut []uint64, err error) { - next, err := postItr.Next() - for next != nil && err == nil { - hitNewDocNum := newDocNums[next.Number()] - if hitNewDocNum == docDropped { - return 0, 0, 0, nil, fmt.Errorf("see hit with dropped docNum") - } - - newRoaring.Add(uint32(hitNewDocNum)) - - nextFreq := next.Frequency() - var nextNorm uint64 - if pi, ok := next.(*Posting); ok { - nextNorm = pi.NormUint64() - } else { - return 0, 0, 0, nil, fmt.Errorf("unexpected posting type %T", next) - } - - locs := next.Locations() - - err = tfEncoder.Add(hitNewDocNum, - encodeFreqHasLocs(nextFreq, len(locs) > 0), nextNorm) - if err != nil { - return 0, 0, 0, nil, err - } - - if len(locs) > 0 { - numBytesLocs := 0 - for _, loc := range locs { - ap := loc.ArrayPositions() - numBytesLocs += totalUvarintBytes(uint64(fieldsMap[loc.Field()]-1), - loc.Pos(), loc.Start(), loc.End(), uint64(len(ap)), ap) - } - - err = locEncoder.Add(hitNewDocNum, uint64(numBytesLocs)) - if err != nil { - return 0, 0, 0, nil, err - } - - for _, loc := range locs { - ap := loc.ArrayPositions() - if cap(bufLoc) < 5+len(ap) { - bufLoc = make([]uint64, 0, 5+len(ap)) - } - args := bufLoc[0:5] - args[0] = uint64(fieldsMap[loc.Field()] - 1) - args[1] = loc.Pos() - args[2] = loc.Start() - args[3] = loc.End() - args[4] = uint64(len(ap)) - args = append(args, ap...) - err = locEncoder.Add(hitNewDocNum, args...) - if err != nil { - return 0, 0, 0, nil, err - } - } - } - - lastDocNum = hitNewDocNum - lastFreq = nextFreq - lastNorm = nextNorm - - next, err = postItr.Next() - } - - return lastDocNum, lastFreq, lastNorm, bufLoc, err -} - -func writePostings(postings *roaring.Bitmap, tfEncoder, locEncoder *chunkedIntCoder, - use1HitEncoding func(uint64) (bool, uint64, uint64), - w *CountHashWriter, bufMaxVarintLen64 []byte) ( - offset uint64, err error) { - termCardinality := postings.GetCardinality() - if termCardinality <= 0 { - return 0, nil - } - - if use1HitEncoding != nil { - encodeAs1Hit, docNum1Hit, normBits1Hit := use1HitEncoding(termCardinality) - if encodeAs1Hit { - return FSTValEncode1Hit(docNum1Hit, normBits1Hit), nil - } - } - - var tfOffset uint64 - tfOffset, _, err = tfEncoder.writeAt(w) - if err != nil { - return 0, err - } - - var locOffset uint64 - locOffset, _, err = locEncoder.writeAt(w) - if err != nil { - return 0, err - } - - postingsOffset := uint64(w.Count()) - - n := binary.PutUvarint(bufMaxVarintLen64, tfOffset) - _, err = w.Write(bufMaxVarintLen64[:n]) - if err != nil { - return 0, err - } - - n = binary.PutUvarint(bufMaxVarintLen64, locOffset) - _, err = w.Write(bufMaxVarintLen64[:n]) - if err != nil { - return 0, err - } - - _, err = writeRoaringWithLen(postings, w, bufMaxVarintLen64) - if err != nil { - return 0, err - } - - return postingsOffset, nil -} - -type varintEncoder func(uint64) (int, error) - -func mergeStoredAndRemap(segments []*SegmentBase, drops []*roaring.Bitmap, - fieldsMap map[string]uint16, fieldsInv []string, fieldsSame bool, newSegDocCount uint64, - w *CountHashWriter, closeCh chan struct{}) (uint64, [][]uint64, error) { - var rv [][]uint64 // The remapped or newDocNums for each segment. - - var newDocNum uint64 - - var curr int - var data, compressed []byte - var metaBuf bytes.Buffer - varBuf := make([]byte, binary.MaxVarintLen64) - metaEncode := func(val uint64) (int, error) { - wb := binary.PutUvarint(varBuf, val) - return metaBuf.Write(varBuf[:wb]) - } - - vals := make([][][]byte, len(fieldsInv)) - typs := make([][]byte, len(fieldsInv)) - poss := make([][][]uint64, len(fieldsInv)) - - var posBuf []uint64 - - docNumOffsets := make([]uint64, newSegDocCount) - - vdc := visitDocumentCtxPool.Get().(*visitDocumentCtx) - defer visitDocumentCtxPool.Put(vdc) - - // for each segment - for segI, segment := range segments { - // check for the closure in meantime - if isClosed(closeCh) { - return 0, nil, seg.ErrClosed - } - - segNewDocNums := make([]uint64, segment.numDocs) - - dropsI := drops[segI] - - // optimize when the field mapping is the same across all - // segments and there are no deletions, via byte-copying - // of stored docs bytes directly to the writer - if fieldsSame && (dropsI == nil || dropsI.GetCardinality() == 0) { - err := segment.copyStoredDocs(newDocNum, docNumOffsets, w) - if err != nil { - return 0, nil, err - } - - for i := uint64(0); i < segment.numDocs; i++ { - segNewDocNums[i] = newDocNum - newDocNum++ - } - rv = append(rv, segNewDocNums) - - continue - } - - // for each doc num - for docNum := uint64(0); docNum < segment.numDocs; docNum++ { - // TODO: roaring's API limits docNums to 32-bits? - if dropsI != nil && dropsI.Contains(uint32(docNum)) { - segNewDocNums[docNum] = docDropped - continue - } - - segNewDocNums[docNum] = newDocNum - - curr = 0 - metaBuf.Reset() - data = data[:0] - - posTemp := posBuf - - // collect all the data - for i := 0; i < len(fieldsInv); i++ { - vals[i] = vals[i][:0] - typs[i] = typs[i][:0] - poss[i] = poss[i][:0] - } - err := segment.visitDocument(vdc, docNum, func(field string, typ byte, value []byte, pos []uint64) bool { - fieldID := int(fieldsMap[field]) - 1 - vals[fieldID] = append(vals[fieldID], value) - typs[fieldID] = append(typs[fieldID], typ) - - // copy array positions to preserve them beyond the scope of this callback - var curPos []uint64 - if len(pos) > 0 { - if cap(posTemp) < len(pos) { - posBuf = make([]uint64, len(pos)*len(fieldsInv)) - posTemp = posBuf - } - curPos = posTemp[0:len(pos)] - copy(curPos, pos) - posTemp = posTemp[len(pos):] - } - poss[fieldID] = append(poss[fieldID], curPos) - - return true - }) - if err != nil { - return 0, nil, err - } - - // _id field special case optimizes ExternalID() lookups - idFieldVal := vals[uint16(0)][0] - _, err = metaEncode(uint64(len(idFieldVal))) - if err != nil { - return 0, nil, err - } - - // now walk the non-"_id" fields in order - for fieldID := 1; fieldID < len(fieldsInv); fieldID++ { - storedFieldValues := vals[fieldID] - - stf := typs[fieldID] - spf := poss[fieldID] - - var err2 error - curr, data, err2 = persistStoredFieldValues(fieldID, - storedFieldValues, stf, spf, curr, metaEncode, data) - if err2 != nil { - return 0, nil, err2 - } - } - - metaBytes := metaBuf.Bytes() - - compressed = snappy.Encode(compressed[:cap(compressed)], data) - - // record where we're about to start writing - docNumOffsets[newDocNum] = uint64(w.Count()) - - // write out the meta len and compressed data len - _, err = writeUvarints(w, - uint64(len(metaBytes)), - uint64(len(idFieldVal)+len(compressed))) - if err != nil { - return 0, nil, err - } - // now write the meta - _, err = w.Write(metaBytes) - if err != nil { - return 0, nil, err - } - // now write the _id field val (counted as part of the 'compressed' data) - _, err = w.Write(idFieldVal) - if err != nil { - return 0, nil, err - } - // now write the compressed data - _, err = w.Write(compressed) - if err != nil { - return 0, nil, err - } - - newDocNum++ - } - - rv = append(rv, segNewDocNums) - } - - // return value is the start of the stored index - storedIndexOffset := uint64(w.Count()) - - // now write out the stored doc index - for _, docNumOffset := range docNumOffsets { - err := binary.Write(w, binary.BigEndian, docNumOffset) - if err != nil { - return 0, nil, err - } - } - - return storedIndexOffset, rv, nil -} - -// copyStoredDocs writes out a segment's stored doc info, optimized by -// using a single Write() call for the entire set of bytes. The -// newDocNumOffsets is filled with the new offsets for each doc. -func (s *SegmentBase) copyStoredDocs(newDocNum uint64, newDocNumOffsets []uint64, - w *CountHashWriter) error { - if s.numDocs <= 0 { - return nil - } - - indexOffset0, storedOffset0, _, _, _ := - s.getDocStoredOffsets(0) // the segment's first doc - - indexOffsetN, storedOffsetN, readN, metaLenN, dataLenN := - s.getDocStoredOffsets(s.numDocs - 1) // the segment's last doc - - storedOffset0New := uint64(w.Count()) - - storedBytes := s.mem[storedOffset0 : storedOffsetN+readN+metaLenN+dataLenN] - _, err := w.Write(storedBytes) - if err != nil { - return err - } - - // remap the storedOffset's for the docs into new offsets relative - // to storedOffset0New, filling the given docNumOffsetsOut array - for indexOffset := indexOffset0; indexOffset <= indexOffsetN; indexOffset += 8 { - storedOffset := binary.BigEndian.Uint64(s.mem[indexOffset : indexOffset+8]) - storedOffsetNew := storedOffset - storedOffset0 + storedOffset0New - newDocNumOffsets[newDocNum] = storedOffsetNew - newDocNum += 1 - } - - return nil -} - -// mergeFields builds a unified list of fields used across all the -// input segments, and computes whether the fields are the same across -// segments (which depends on fields to be sorted in the same way -// across segments) -func mergeFields(segments []*SegmentBase) (bool, []string) { - fieldsSame := true - - var segment0Fields []string - if len(segments) > 0 { - segment0Fields = segments[0].Fields() - } - - fieldsExist := map[string]struct{}{} - for _, segment := range segments { - fields := segment.Fields() - for fieldi, field := range fields { - fieldsExist[field] = struct{}{} - if len(segment0Fields) != len(fields) || segment0Fields[fieldi] != field { - fieldsSame = false - } - } - } - - rv := make([]string, 0, len(fieldsExist)) - // ensure _id stays first - rv = append(rv, "_id") - for k := range fieldsExist { - if k != "_id" { - rv = append(rv, k) - } - } - - sort.Strings(rv[1:]) // leave _id as first - - return fieldsSame, rv -} - -func isClosed(closeCh chan struct{}) bool { - select { - case <-closeCh: - return true - default: - return false - } -} diff --git a/vendor/github.com/blevesearch/zap/v15/new.go b/vendor/github.com/blevesearch/zap/v15/new.go deleted file mode 100644 index c10a6a0..0000000 --- a/vendor/github.com/blevesearch/zap/v15/new.go +++ /dev/null @@ -1,860 +0,0 @@ -// Copyright (c) 2018 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "encoding/binary" - "math" - "sort" - "sync" - - "github.com/RoaringBitmap/roaring" - "github.com/blevesearch/bleve/analysis" - "github.com/blevesearch/bleve/document" - "github.com/blevesearch/bleve/index" - "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/couchbase/vellum" - "github.com/golang/snappy" -) - -var NewSegmentBufferNumResultsBump int = 100 -var NewSegmentBufferNumResultsFactor float64 = 1.0 -var NewSegmentBufferAvgBytesPerDocFactor float64 = 1.0 - -// ValidateDocFields can be set by applications to perform additional checks -// on fields in a document being added to a new segment, by default it does -// nothing. -// This API is experimental and may be removed at any time. -var ValidateDocFields = func(field document.Field) error { - return nil -} - -// AnalysisResultsToSegmentBase produces an in-memory zap-encoded -// SegmentBase from analysis results -func (z *ZapPlugin) New(results []*index.AnalysisResult) ( - segment.Segment, uint64, error) { - return z.newWithChunkMode(results, DefaultChunkMode) -} - -func (*ZapPlugin) newWithChunkMode(results []*index.AnalysisResult, - chunkMode uint32) (segment.Segment, uint64, error) { - s := interimPool.Get().(*interim) - - var br bytes.Buffer - if s.lastNumDocs > 0 { - // use previous results to initialize the buf with an estimate - // size, but note that the interim instance comes from a - // global interimPool, so multiple scorch instances indexing - // different docs can lead to low quality estimates - estimateAvgBytesPerDoc := int(float64(s.lastOutSize/s.lastNumDocs) * - NewSegmentBufferNumResultsFactor) - estimateNumResults := int(float64(len(results)+NewSegmentBufferNumResultsBump) * - NewSegmentBufferAvgBytesPerDocFactor) - br.Grow(estimateAvgBytesPerDoc * estimateNumResults) - } - - s.results = results - s.chunkMode = chunkMode - s.w = NewCountHashWriter(&br) - - storedIndexOffset, fieldsIndexOffset, fdvIndexOffset, dictOffsets, - err := s.convert() - if err != nil { - return nil, uint64(0), err - } - - sb, err := InitSegmentBase(br.Bytes(), s.w.Sum32(), chunkMode, - s.FieldsMap, s.FieldsInv, uint64(len(results)), - storedIndexOffset, fieldsIndexOffset, fdvIndexOffset, dictOffsets) - - if err == nil && s.reset() == nil { - s.lastNumDocs = len(results) - s.lastOutSize = len(br.Bytes()) - interimPool.Put(s) - } - - return sb, uint64(len(br.Bytes())), err -} - -var interimPool = sync.Pool{New: func() interface{} { return &interim{} }} - -// interim holds temporary working data used while converting from -// analysis results to a zap-encoded segment -type interim struct { - results []*index.AnalysisResult - - chunkMode uint32 - - w *CountHashWriter - - // FieldsMap adds 1 to field id to avoid zero value issues - // name -> field id + 1 - FieldsMap map[string]uint16 - - // FieldsInv is the inverse of FieldsMap - // field id -> name - FieldsInv []string - - // Term dictionaries for each field - // field id -> term -> postings list id + 1 - Dicts []map[string]uint64 - - // Terms for each field, where terms are sorted ascending - // field id -> []term - DictKeys [][]string - - // Fields whose IncludeDocValues is true - // field id -> bool - IncludeDocValues []bool - - // postings id -> bitmap of docNums - Postings []*roaring.Bitmap - - // postings id -> freq/norm's, one for each docNum in postings - FreqNorms [][]interimFreqNorm - freqNormsBacking []interimFreqNorm - - // postings id -> locs, one for each freq - Locs [][]interimLoc - locsBacking []interimLoc - - numTermsPerPostingsList []int // key is postings list id - numLocsPerPostingsList []int // key is postings list id - - builder *vellum.Builder - builderBuf bytes.Buffer - - metaBuf bytes.Buffer - - tmp0 []byte - tmp1 []byte - - lastNumDocs int - lastOutSize int -} - -func (s *interim) reset() (err error) { - s.results = nil - s.chunkMode = 0 - s.w = nil - s.FieldsMap = nil - s.FieldsInv = nil - for i := range s.Dicts { - s.Dicts[i] = nil - } - s.Dicts = s.Dicts[:0] - for i := range s.DictKeys { - s.DictKeys[i] = s.DictKeys[i][:0] - } - s.DictKeys = s.DictKeys[:0] - for i := range s.IncludeDocValues { - s.IncludeDocValues[i] = false - } - s.IncludeDocValues = s.IncludeDocValues[:0] - for _, idn := range s.Postings { - idn.Clear() - } - s.Postings = s.Postings[:0] - s.FreqNorms = s.FreqNorms[:0] - for i := range s.freqNormsBacking { - s.freqNormsBacking[i] = interimFreqNorm{} - } - s.freqNormsBacking = s.freqNormsBacking[:0] - s.Locs = s.Locs[:0] - for i := range s.locsBacking { - s.locsBacking[i] = interimLoc{} - } - s.locsBacking = s.locsBacking[:0] - s.numTermsPerPostingsList = s.numTermsPerPostingsList[:0] - s.numLocsPerPostingsList = s.numLocsPerPostingsList[:0] - s.builderBuf.Reset() - if s.builder != nil { - err = s.builder.Reset(&s.builderBuf) - } - s.metaBuf.Reset() - s.tmp0 = s.tmp0[:0] - s.tmp1 = s.tmp1[:0] - s.lastNumDocs = 0 - s.lastOutSize = 0 - - return err -} - -func (s *interim) grabBuf(size int) []byte { - buf := s.tmp0 - if cap(buf) < size { - buf = make([]byte, size) - s.tmp0 = buf - } - return buf[0:size] -} - -type interimStoredField struct { - vals [][]byte - typs []byte - arrayposs [][]uint64 // array positions -} - -type interimFreqNorm struct { - freq uint64 - norm float32 - numLocs int -} - -type interimLoc struct { - fieldID uint16 - pos uint64 - start uint64 - end uint64 - arrayposs []uint64 -} - -func (s *interim) convert() (uint64, uint64, uint64, []uint64, error) { - s.FieldsMap = map[string]uint16{} - - s.getOrDefineField("_id") // _id field is fieldID 0 - - for _, result := range s.results { - for _, field := range result.Document.CompositeFields { - s.getOrDefineField(field.Name()) - } - for _, field := range result.Document.Fields { - s.getOrDefineField(field.Name()) - } - } - - sort.Strings(s.FieldsInv[1:]) // keep _id as first field - - for fieldID, fieldName := range s.FieldsInv { - s.FieldsMap[fieldName] = uint16(fieldID + 1) - } - - if cap(s.IncludeDocValues) >= len(s.FieldsInv) { - s.IncludeDocValues = s.IncludeDocValues[:len(s.FieldsInv)] - } else { - s.IncludeDocValues = make([]bool, len(s.FieldsInv)) - } - - s.prepareDicts() - - for _, dict := range s.DictKeys { - sort.Strings(dict) - } - - s.processDocuments() - - storedIndexOffset, err := s.writeStoredFields() - if err != nil { - return 0, 0, 0, nil, err - } - - var fdvIndexOffset uint64 - var dictOffsets []uint64 - - if len(s.results) > 0 { - fdvIndexOffset, dictOffsets, err = s.writeDicts() - if err != nil { - return 0, 0, 0, nil, err - } - } else { - dictOffsets = make([]uint64, len(s.FieldsInv)) - } - - fieldsIndexOffset, err := persistFields(s.FieldsInv, s.w, dictOffsets) - if err != nil { - return 0, 0, 0, nil, err - } - - return storedIndexOffset, fieldsIndexOffset, fdvIndexOffset, dictOffsets, nil -} - -func (s *interim) getOrDefineField(fieldName string) int { - fieldIDPlus1, exists := s.FieldsMap[fieldName] - if !exists { - fieldIDPlus1 = uint16(len(s.FieldsInv) + 1) - s.FieldsMap[fieldName] = fieldIDPlus1 - s.FieldsInv = append(s.FieldsInv, fieldName) - - s.Dicts = append(s.Dicts, make(map[string]uint64)) - - n := len(s.DictKeys) - if n < cap(s.DictKeys) { - s.DictKeys = s.DictKeys[:n+1] - s.DictKeys[n] = s.DictKeys[n][:0] - } else { - s.DictKeys = append(s.DictKeys, []string(nil)) - } - } - - return int(fieldIDPlus1 - 1) -} - -// fill Dicts and DictKeys from analysis results -func (s *interim) prepareDicts() { - var pidNext int - - var totTFs int - var totLocs int - - visitField := func(fieldID uint16, tfs analysis.TokenFrequencies) { - dict := s.Dicts[fieldID] - dictKeys := s.DictKeys[fieldID] - - for term, tf := range tfs { - pidPlus1, exists := dict[term] - if !exists { - pidNext++ - pidPlus1 = uint64(pidNext) - - dict[term] = pidPlus1 - dictKeys = append(dictKeys, term) - - s.numTermsPerPostingsList = append(s.numTermsPerPostingsList, 0) - s.numLocsPerPostingsList = append(s.numLocsPerPostingsList, 0) - } - - pid := pidPlus1 - 1 - - s.numTermsPerPostingsList[pid] += 1 - s.numLocsPerPostingsList[pid] += len(tf.Locations) - - totLocs += len(tf.Locations) - } - - totTFs += len(tfs) - - s.DictKeys[fieldID] = dictKeys - } - - for _, result := range s.results { - // walk each composite field - for _, field := range result.Document.CompositeFields { - fieldID := uint16(s.getOrDefineField(field.Name())) - _, tf := field.Analyze() - visitField(fieldID, tf) - } - - // walk each field - for i, field := range result.Document.Fields { - fieldID := uint16(s.getOrDefineField(field.Name())) - tf := result.Analyzed[i] - visitField(fieldID, tf) - } - } - - numPostingsLists := pidNext - - if cap(s.Postings) >= numPostingsLists { - s.Postings = s.Postings[:numPostingsLists] - } else { - postings := make([]*roaring.Bitmap, numPostingsLists) - copy(postings, s.Postings[:cap(s.Postings)]) - for i := 0; i < numPostingsLists; i++ { - if postings[i] == nil { - postings[i] = roaring.New() - } - } - s.Postings = postings - } - - if cap(s.FreqNorms) >= numPostingsLists { - s.FreqNorms = s.FreqNorms[:numPostingsLists] - } else { - s.FreqNorms = make([][]interimFreqNorm, numPostingsLists) - } - - if cap(s.freqNormsBacking) >= totTFs { - s.freqNormsBacking = s.freqNormsBacking[:totTFs] - } else { - s.freqNormsBacking = make([]interimFreqNorm, totTFs) - } - - freqNormsBacking := s.freqNormsBacking - for pid, numTerms := range s.numTermsPerPostingsList { - s.FreqNorms[pid] = freqNormsBacking[0:0] - freqNormsBacking = freqNormsBacking[numTerms:] - } - - if cap(s.Locs) >= numPostingsLists { - s.Locs = s.Locs[:numPostingsLists] - } else { - s.Locs = make([][]interimLoc, numPostingsLists) - } - - if cap(s.locsBacking) >= totLocs { - s.locsBacking = s.locsBacking[:totLocs] - } else { - s.locsBacking = make([]interimLoc, totLocs) - } - - locsBacking := s.locsBacking - for pid, numLocs := range s.numLocsPerPostingsList { - s.Locs[pid] = locsBacking[0:0] - locsBacking = locsBacking[numLocs:] - } -} - -func (s *interim) processDocuments() { - numFields := len(s.FieldsInv) - reuseFieldLens := make([]int, numFields) - reuseFieldTFs := make([]analysis.TokenFrequencies, numFields) - - for docNum, result := range s.results { - for i := 0; i < numFields; i++ { // clear these for reuse - reuseFieldLens[i] = 0 - reuseFieldTFs[i] = nil - } - - s.processDocument(uint64(docNum), result, - reuseFieldLens, reuseFieldTFs) - } -} - -func (s *interim) processDocument(docNum uint64, - result *index.AnalysisResult, - fieldLens []int, fieldTFs []analysis.TokenFrequencies) { - visitField := func(fieldID uint16, fieldName string, - ln int, tf analysis.TokenFrequencies) { - fieldLens[fieldID] += ln - - existingFreqs := fieldTFs[fieldID] - if existingFreqs != nil { - existingFreqs.MergeAll(fieldName, tf) - } else { - fieldTFs[fieldID] = tf - } - } - - // walk each composite field - for _, field := range result.Document.CompositeFields { - fieldID := uint16(s.getOrDefineField(field.Name())) - ln, tf := field.Analyze() - visitField(fieldID, field.Name(), ln, tf) - } - - // walk each field - for i, field := range result.Document.Fields { - fieldID := uint16(s.getOrDefineField(field.Name())) - ln := result.Length[i] - tf := result.Analyzed[i] - visitField(fieldID, field.Name(), ln, tf) - } - - // now that it's been rolled up into fieldTFs, walk that - for fieldID, tfs := range fieldTFs { - dict := s.Dicts[fieldID] - norm := math.Float32frombits(uint32(fieldLens[fieldID])) - - for term, tf := range tfs { - pid := dict[term] - 1 - bs := s.Postings[pid] - bs.Add(uint32(docNum)) - - s.FreqNorms[pid] = append(s.FreqNorms[pid], - interimFreqNorm{ - freq: uint64(tf.Frequency()), - norm: norm, - numLocs: len(tf.Locations), - }) - - if len(tf.Locations) > 0 { - locs := s.Locs[pid] - - for _, loc := range tf.Locations { - var locf = uint16(fieldID) - if loc.Field != "" { - locf = uint16(s.getOrDefineField(loc.Field)) - } - var arrayposs []uint64 - if len(loc.ArrayPositions) > 0 { - arrayposs = loc.ArrayPositions - } - locs = append(locs, interimLoc{ - fieldID: locf, - pos: uint64(loc.Position), - start: uint64(loc.Start), - end: uint64(loc.End), - arrayposs: arrayposs, - }) - } - - s.Locs[pid] = locs - } - } - } -} - -func (s *interim) writeStoredFields() ( - storedIndexOffset uint64, err error) { - varBuf := make([]byte, binary.MaxVarintLen64) - metaEncode := func(val uint64) (int, error) { - wb := binary.PutUvarint(varBuf, val) - return s.metaBuf.Write(varBuf[:wb]) - } - - data, compressed := s.tmp0[:0], s.tmp1[:0] - defer func() { s.tmp0, s.tmp1 = data, compressed }() - - // keyed by docNum - docStoredOffsets := make([]uint64, len(s.results)) - - // keyed by fieldID, for the current doc in the loop - docStoredFields := map[uint16]interimStoredField{} - - for docNum, result := range s.results { - for fieldID := range docStoredFields { // reset for next doc - delete(docStoredFields, fieldID) - } - - for _, field := range result.Document.Fields { - fieldID := uint16(s.getOrDefineField(field.Name())) - - opts := field.Options() - - if opts.IsStored() { - isf := docStoredFields[fieldID] - isf.vals = append(isf.vals, field.Value()) - isf.typs = append(isf.typs, encodeFieldType(field)) - isf.arrayposs = append(isf.arrayposs, field.ArrayPositions()) - docStoredFields[fieldID] = isf - } - - if opts.IncludeDocValues() { - s.IncludeDocValues[fieldID] = true - } - - err := ValidateDocFields(field) - if err != nil { - return 0, err - } - } - - var curr int - - s.metaBuf.Reset() - data = data[:0] - - // _id field special case optimizes ExternalID() lookups - idFieldVal := docStoredFields[uint16(0)].vals[0] - _, err = metaEncode(uint64(len(idFieldVal))) - if err != nil { - return 0, err - } - - // handle non-"_id" fields - for fieldID := 1; fieldID < len(s.FieldsInv); fieldID++ { - isf, exists := docStoredFields[uint16(fieldID)] - if exists { - curr, data, err = persistStoredFieldValues( - fieldID, isf.vals, isf.typs, isf.arrayposs, - curr, metaEncode, data) - if err != nil { - return 0, err - } - } - } - - metaBytes := s.metaBuf.Bytes() - - compressed = snappy.Encode(compressed[:cap(compressed)], data) - - docStoredOffsets[docNum] = uint64(s.w.Count()) - - _, err := writeUvarints(s.w, - uint64(len(metaBytes)), - uint64(len(idFieldVal)+len(compressed))) - if err != nil { - return 0, err - } - - _, err = s.w.Write(metaBytes) - if err != nil { - return 0, err - } - - _, err = s.w.Write(idFieldVal) - if err != nil { - return 0, err - } - - _, err = s.w.Write(compressed) - if err != nil { - return 0, err - } - } - - storedIndexOffset = uint64(s.w.Count()) - - for _, docStoredOffset := range docStoredOffsets { - err = binary.Write(s.w, binary.BigEndian, docStoredOffset) - if err != nil { - return 0, err - } - } - - return storedIndexOffset, nil -} - -func (s *interim) writeDicts() (fdvIndexOffset uint64, dictOffsets []uint64, err error) { - dictOffsets = make([]uint64, len(s.FieldsInv)) - - fdvOffsetsStart := make([]uint64, len(s.FieldsInv)) - fdvOffsetsEnd := make([]uint64, len(s.FieldsInv)) - - buf := s.grabBuf(binary.MaxVarintLen64) - - // these int coders are initialized with chunk size 1024 - // however this will be reset to the correct chunk size - // while processing each individual field-term section - tfEncoder := newChunkedIntCoder(1024, uint64(len(s.results)-1)) - locEncoder := newChunkedIntCoder(1024, uint64(len(s.results)-1)) - - var docTermMap [][]byte - - if s.builder == nil { - s.builder, err = vellum.New(&s.builderBuf, nil) - if err != nil { - return 0, nil, err - } - } - - for fieldID, terms := range s.DictKeys { - if cap(docTermMap) < len(s.results) { - docTermMap = make([][]byte, len(s.results)) - } else { - docTermMap = docTermMap[0:len(s.results)] - for docNum := range docTermMap { // reset the docTermMap - docTermMap[docNum] = docTermMap[docNum][:0] - } - } - - dict := s.Dicts[fieldID] - - for _, term := range terms { // terms are already sorted - pid := dict[term] - 1 - - postingsBS := s.Postings[pid] - - freqNorms := s.FreqNorms[pid] - freqNormOffset := 0 - - locs := s.Locs[pid] - locOffset := 0 - - chunkSize, err := getChunkSize(s.chunkMode, postingsBS.GetCardinality(), uint64(len(s.results))) - if err != nil { - return 0, nil, err - } - tfEncoder.SetChunkSize(chunkSize, uint64(len(s.results)-1)) - locEncoder.SetChunkSize(chunkSize, uint64(len(s.results)-1)) - - postingsItr := postingsBS.Iterator() - for postingsItr.HasNext() { - docNum := uint64(postingsItr.Next()) - - freqNorm := freqNorms[freqNormOffset] - - err = tfEncoder.Add(docNum, - encodeFreqHasLocs(freqNorm.freq, freqNorm.numLocs > 0), - uint64(math.Float32bits(freqNorm.norm))) - if err != nil { - return 0, nil, err - } - - if freqNorm.numLocs > 0 { - numBytesLocs := 0 - for _, loc := range locs[locOffset : locOffset+freqNorm.numLocs] { - numBytesLocs += totalUvarintBytes( - uint64(loc.fieldID), loc.pos, loc.start, loc.end, - uint64(len(loc.arrayposs)), loc.arrayposs) - } - - err = locEncoder.Add(docNum, uint64(numBytesLocs)) - if err != nil { - return 0, nil, err - } - - for _, loc := range locs[locOffset : locOffset+freqNorm.numLocs] { - err = locEncoder.Add(docNum, - uint64(loc.fieldID), loc.pos, loc.start, loc.end, - uint64(len(loc.arrayposs))) - if err != nil { - return 0, nil, err - } - - err = locEncoder.Add(docNum, loc.arrayposs...) - if err != nil { - return 0, nil, err - } - } - - locOffset += freqNorm.numLocs - } - - freqNormOffset++ - - docTermMap[docNum] = append( - append(docTermMap[docNum], term...), - termSeparator) - } - - tfEncoder.Close() - locEncoder.Close() - - postingsOffset, err := - writePostings(postingsBS, tfEncoder, locEncoder, nil, s.w, buf) - if err != nil { - return 0, nil, err - } - - if postingsOffset > uint64(0) { - err = s.builder.Insert([]byte(term), postingsOffset) - if err != nil { - return 0, nil, err - } - } - - tfEncoder.Reset() - locEncoder.Reset() - } - - err = s.builder.Close() - if err != nil { - return 0, nil, err - } - - // record where this dictionary starts - dictOffsets[fieldID] = uint64(s.w.Count()) - - vellumData := s.builderBuf.Bytes() - - // write out the length of the vellum data - n := binary.PutUvarint(buf, uint64(len(vellumData))) - _, err = s.w.Write(buf[:n]) - if err != nil { - return 0, nil, err - } - - // write this vellum to disk - _, err = s.w.Write(vellumData) - if err != nil { - return 0, nil, err - } - - // reset vellum for reuse - s.builderBuf.Reset() - - err = s.builder.Reset(&s.builderBuf) - if err != nil { - return 0, nil, err - } - - // write the field doc values - // NOTE: doc values continue to use legacy chunk mode - chunkSize, err := getChunkSize(LegacyChunkMode, 0, 0) - if err != nil { - return 0, nil, err - } - fdvEncoder := newChunkedContentCoder(chunkSize, uint64(len(s.results)-1), s.w, false) - if s.IncludeDocValues[fieldID] { - for docNum, docTerms := range docTermMap { - if len(docTerms) > 0 { - err = fdvEncoder.Add(uint64(docNum), docTerms) - if err != nil { - return 0, nil, err - } - } - } - err = fdvEncoder.Close() - if err != nil { - return 0, nil, err - } - - fdvOffsetsStart[fieldID] = uint64(s.w.Count()) - - _, err = fdvEncoder.Write() - if err != nil { - return 0, nil, err - } - - fdvOffsetsEnd[fieldID] = uint64(s.w.Count()) - - fdvEncoder.Reset() - } else { - fdvOffsetsStart[fieldID] = fieldNotUninverted - fdvOffsetsEnd[fieldID] = fieldNotUninverted - } - } - - fdvIndexOffset = uint64(s.w.Count()) - - for i := 0; i < len(fdvOffsetsStart); i++ { - n := binary.PutUvarint(buf, fdvOffsetsStart[i]) - _, err := s.w.Write(buf[:n]) - if err != nil { - return 0, nil, err - } - n = binary.PutUvarint(buf, fdvOffsetsEnd[i]) - _, err = s.w.Write(buf[:n]) - if err != nil { - return 0, nil, err - } - } - - return fdvIndexOffset, dictOffsets, nil -} - -func encodeFieldType(f document.Field) byte { - fieldType := byte('x') - switch f.(type) { - case *document.TextField: - fieldType = 't' - case *document.NumericField: - fieldType = 'n' - case *document.DateTimeField: - fieldType = 'd' - case *document.BooleanField: - fieldType = 'b' - case *document.GeoPointField: - fieldType = 'g' - case *document.CompositeField: - fieldType = 'c' - } - return fieldType -} - -// returns the total # of bytes needed to encode the given uint64's -// into binary.PutUVarint() encoding -func totalUvarintBytes(a, b, c, d, e uint64, more []uint64) (n int) { - n = numUvarintBytes(a) - n += numUvarintBytes(b) - n += numUvarintBytes(c) - n += numUvarintBytes(d) - n += numUvarintBytes(e) - for _, v := range more { - n += numUvarintBytes(v) - } - return n -} - -// returns # of bytes needed to encode x in binary.PutUvarint() encoding -func numUvarintBytes(x uint64) (n int) { - for x >= 0x80 { - x >>= 7 - n++ - } - return n + 1 -} diff --git a/vendor/github.com/blevesearch/zap/v15/plugin.go b/vendor/github.com/blevesearch/zap/v15/plugin.go deleted file mode 100644 index 38a0638..0000000 --- a/vendor/github.com/blevesearch/zap/v15/plugin.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) 2020 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "github.com/blevesearch/bleve/index/scorch/segment" -) - -// ZapPlugin implements the Plugin interface of -// the blevesearch/bleve/index/scorch/segment pkg -type ZapPlugin struct{} - -func (*ZapPlugin) Type() string { - return Type -} - -func (*ZapPlugin) Version() uint32 { - return Version -} - -// Plugin returns an instance segment.Plugin for use -// by the Scorch indexing scheme -func Plugin() segment.Plugin { - return &ZapPlugin{} -} diff --git a/vendor/github.com/blevesearch/zap/v15/posting.go b/vendor/github.com/blevesearch/zap/v15/posting.go deleted file mode 100644 index 75faa5d..0000000 --- a/vendor/github.com/blevesearch/zap/v15/posting.go +++ /dev/null @@ -1,853 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "encoding/binary" - "fmt" - "math" - "reflect" - - "github.com/RoaringBitmap/roaring" - "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/blevesearch/bleve/size" -) - -var reflectStaticSizePostingsList int -var reflectStaticSizePostingsIterator int -var reflectStaticSizePosting int -var reflectStaticSizeLocation int - -func init() { - var pl PostingsList - reflectStaticSizePostingsList = int(reflect.TypeOf(pl).Size()) - var pi PostingsIterator - reflectStaticSizePostingsIterator = int(reflect.TypeOf(pi).Size()) - var p Posting - reflectStaticSizePosting = int(reflect.TypeOf(p).Size()) - var l Location - reflectStaticSizeLocation = int(reflect.TypeOf(l).Size()) -} - -// FST or vellum value (uint64) encoding is determined by the top two -// highest-order or most significant bits... -// -// encoding : MSB -// name : 63 62 61...to...bit #0 (LSB) -// ----------+---+---+--------------------------------------------------- -// general : 0 | 0 | 62-bits of postingsOffset. -// ~ : 0 | 1 | reserved for future. -// 1-hit : 1 | 0 | 31-bits of positive float31 norm | 31-bits docNum. -// ~ : 1 | 1 | reserved for future. -// -// Encoding "general" is able to handle all cases, where the -// postingsOffset points to more information about the postings for -// the term. -// -// Encoding "1-hit" is used to optimize a commonly seen case when a -// term has only a single hit. For example, a term in the _id field -// will have only 1 hit. The "1-hit" encoding is used for a term -// in a field when... -// -// - term vector info is disabled for that field; -// - and, the term appears in only a single doc for that field; -// - and, the term's freq is exactly 1 in that single doc for that field; -// - and, the docNum must fit into 31-bits; -// -// Otherwise, the "general" encoding is used instead. -// -// In the "1-hit" encoding, the field in that single doc may have -// other terms, which is supported in the "1-hit" encoding by the -// positive float31 norm. - -const FSTValEncodingMask = uint64(0xc000000000000000) -const FSTValEncodingGeneral = uint64(0x0000000000000000) -const FSTValEncoding1Hit = uint64(0x8000000000000000) - -func FSTValEncode1Hit(docNum uint64, normBits uint64) uint64 { - return FSTValEncoding1Hit | ((mask31Bits & normBits) << 31) | (mask31Bits & docNum) -} - -func FSTValDecode1Hit(v uint64) (docNum uint64, normBits uint64) { - return (mask31Bits & v), (mask31Bits & (v >> 31)) -} - -const mask31Bits = uint64(0x000000007fffffff) - -func under32Bits(x uint64) bool { - return x <= mask31Bits -} - -const DocNum1HitFinished = math.MaxUint64 - -var NormBits1Hit = uint64(1) - -// PostingsList is an in-memory representation of a postings list -type PostingsList struct { - sb *SegmentBase - postingsOffset uint64 - freqOffset uint64 - locOffset uint64 - postings *roaring.Bitmap - except *roaring.Bitmap - - // when normBits1Hit != 0, then this postings list came from a - // 1-hit encoding, and only the docNum1Hit & normBits1Hit apply - docNum1Hit uint64 - normBits1Hit uint64 - - chunkSize uint64 -} - -// represents an immutable, empty postings list -var emptyPostingsList = &PostingsList{} - -func (p *PostingsList) Size() int { - sizeInBytes := reflectStaticSizePostingsList + size.SizeOfPtr - - if p.except != nil { - sizeInBytes += int(p.except.GetSizeInBytes()) - } - - return sizeInBytes -} - -func (p *PostingsList) OrInto(receiver *roaring.Bitmap) { - if p.normBits1Hit != 0 { - receiver.Add(uint32(p.docNum1Hit)) - return - } - - if p.postings != nil { - receiver.Or(p.postings) - } -} - -// Iterator returns an iterator for this postings list -func (p *PostingsList) Iterator(includeFreq, includeNorm, includeLocs bool, - prealloc segment.PostingsIterator) segment.PostingsIterator { - if p.normBits1Hit == 0 && p.postings == nil { - return emptyPostingsIterator - } - - var preallocPI *PostingsIterator - pi, ok := prealloc.(*PostingsIterator) - if ok && pi != nil { - preallocPI = pi - } - if preallocPI == emptyPostingsIterator { - preallocPI = nil - } - - return p.iterator(includeFreq, includeNorm, includeLocs, preallocPI) -} - -func (p *PostingsList) iterator(includeFreq, includeNorm, includeLocs bool, - rv *PostingsIterator) *PostingsIterator { - if rv == nil { - rv = &PostingsIterator{} - } else { - freqNormReader := rv.freqNormReader - if freqNormReader != nil { - freqNormReader.reset() - } - - locReader := rv.locReader - if locReader != nil { - locReader.reset() - } - - nextLocs := rv.nextLocs[:0] - nextSegmentLocs := rv.nextSegmentLocs[:0] - - buf := rv.buf - - *rv = PostingsIterator{} // clear the struct - - rv.freqNormReader = freqNormReader - rv.locReader = locReader - - rv.nextLocs = nextLocs - rv.nextSegmentLocs = nextSegmentLocs - - rv.buf = buf - } - - rv.postings = p - rv.includeFreqNorm = includeFreq || includeNorm || includeLocs - rv.includeLocs = includeLocs - - if p.normBits1Hit != 0 { - // "1-hit" encoding - rv.docNum1Hit = p.docNum1Hit - rv.normBits1Hit = p.normBits1Hit - - if p.except != nil && p.except.Contains(uint32(rv.docNum1Hit)) { - rv.docNum1Hit = DocNum1HitFinished - } - - return rv - } - - // "general" encoding, check if empty - if p.postings == nil { - return rv - } - - // initialize freq chunk reader - if rv.includeFreqNorm { - rv.freqNormReader = newChunkedIntDecoder(p.sb.mem, p.freqOffset, rv.freqNormReader) - } - - // initialize the loc chunk reader - if rv.includeLocs { - rv.locReader = newChunkedIntDecoder(p.sb.mem, p.locOffset, rv.locReader) - } - - rv.all = p.postings.Iterator() - if p.except != nil { - rv.ActualBM = roaring.AndNot(p.postings, p.except) - rv.Actual = rv.ActualBM.Iterator() - } else { - rv.ActualBM = p.postings - rv.Actual = rv.all // Optimize to use same iterator for all & Actual. - } - - return rv -} - -// Count returns the number of items on this postings list -func (p *PostingsList) Count() uint64 { - var n, e uint64 - if p.normBits1Hit != 0 { - n = 1 - if p.except != nil && p.except.Contains(uint32(p.docNum1Hit)) { - e = 1 - } - } else if p.postings != nil { - n = p.postings.GetCardinality() - if p.except != nil { - e = p.postings.AndCardinality(p.except) - } - } - return n - e -} - -func (rv *PostingsList) read(postingsOffset uint64, d *Dictionary) error { - rv.postingsOffset = postingsOffset - - // handle "1-hit" encoding special case - if rv.postingsOffset&FSTValEncodingMask == FSTValEncoding1Hit { - return rv.init1Hit(postingsOffset) - } - - // read the location of the freq/norm details - var n uint64 - var read int - - rv.freqOffset, read = binary.Uvarint(d.sb.mem[postingsOffset+n : postingsOffset+binary.MaxVarintLen64]) - n += uint64(read) - - rv.locOffset, read = binary.Uvarint(d.sb.mem[postingsOffset+n : postingsOffset+n+binary.MaxVarintLen64]) - n += uint64(read) - - var postingsLen uint64 - postingsLen, read = binary.Uvarint(d.sb.mem[postingsOffset+n : postingsOffset+n+binary.MaxVarintLen64]) - n += uint64(read) - - roaringBytes := d.sb.mem[postingsOffset+n : postingsOffset+n+postingsLen] - - if rv.postings == nil { - rv.postings = roaring.NewBitmap() - } - _, err := rv.postings.FromBuffer(roaringBytes) - if err != nil { - return fmt.Errorf("error loading roaring bitmap: %v", err) - } - - rv.chunkSize, err = getChunkSize(d.sb.chunkMode, - rv.postings.GetCardinality(), d.sb.numDocs) - if err != nil { - return err - } - - return nil -} - -func (rv *PostingsList) init1Hit(fstVal uint64) error { - docNum, normBits := FSTValDecode1Hit(fstVal) - - rv.docNum1Hit = docNum - rv.normBits1Hit = normBits - - return nil -} - -// PostingsIterator provides a way to iterate through the postings list -type PostingsIterator struct { - postings *PostingsList - all roaring.IntPeekable - Actual roaring.IntPeekable - ActualBM *roaring.Bitmap - - currChunk uint32 - freqNormReader *chunkedIntDecoder - locReader *chunkedIntDecoder - - next Posting // reused across Next() calls - nextLocs []Location // reused across Next() calls - nextSegmentLocs []segment.Location // reused across Next() calls - - docNum1Hit uint64 - normBits1Hit uint64 - - buf []byte - - includeFreqNorm bool - includeLocs bool -} - -var emptyPostingsIterator = &PostingsIterator{} - -func (i *PostingsIterator) Size() int { - sizeInBytes := reflectStaticSizePostingsIterator + size.SizeOfPtr + - i.next.Size() - // account for freqNormReader, locReader if we start using this. - for _, entry := range i.nextLocs { - sizeInBytes += entry.Size() - } - - return sizeInBytes -} - -func (i *PostingsIterator) loadChunk(chunk int) error { - if i.includeFreqNorm { - err := i.freqNormReader.loadChunk(chunk) - if err != nil { - return err - } - } - - if i.includeLocs { - err := i.locReader.loadChunk(chunk) - if err != nil { - return err - } - } - - i.currChunk = uint32(chunk) - return nil -} - -func (i *PostingsIterator) readFreqNormHasLocs() (uint64, uint64, bool, error) { - if i.normBits1Hit != 0 { - return 1, i.normBits1Hit, false, nil - } - - freqHasLocs, err := i.freqNormReader.readUvarint() - if err != nil { - return 0, 0, false, fmt.Errorf("error reading frequency: %v", err) - } - - freq, hasLocs := decodeFreqHasLocs(freqHasLocs) - - normBits, err := i.freqNormReader.readUvarint() - if err != nil { - return 0, 0, false, fmt.Errorf("error reading norm: %v", err) - } - - return freq, normBits, hasLocs, nil -} - -func (i *PostingsIterator) skipFreqNormReadHasLocs() (bool, error) { - if i.normBits1Hit != 0 { - return false, nil - } - - freqHasLocs, err := i.freqNormReader.readUvarint() - if err != nil { - return false, fmt.Errorf("error reading freqHasLocs: %v", err) - } - - i.freqNormReader.SkipUvarint() // Skip normBits. - - return freqHasLocs&0x01 != 0, nil // See decodeFreqHasLocs() / hasLocs. -} - -func encodeFreqHasLocs(freq uint64, hasLocs bool) uint64 { - rv := freq << 1 - if hasLocs { - rv = rv | 0x01 // 0'th LSB encodes whether there are locations - } - return rv -} - -func decodeFreqHasLocs(freqHasLocs uint64) (uint64, bool) { - freq := freqHasLocs >> 1 - hasLocs := freqHasLocs&0x01 != 0 - return freq, hasLocs -} - -// readLocation processes all the integers on the stream representing a single -// location. -func (i *PostingsIterator) readLocation(l *Location) error { - // read off field - fieldID, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading location field: %v", err) - } - // read off pos - pos, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading location pos: %v", err) - } - // read off start - start, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading location start: %v", err) - } - // read off end - end, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading location end: %v", err) - } - // read off num array pos - numArrayPos, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading location num array pos: %v", err) - } - - l.field = i.postings.sb.fieldsInv[fieldID] - l.pos = pos - l.start = start - l.end = end - - if cap(l.ap) < int(numArrayPos) { - l.ap = make([]uint64, int(numArrayPos)) - } else { - l.ap = l.ap[:int(numArrayPos)] - } - - // read off array positions - for k := 0; k < int(numArrayPos); k++ { - ap, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading array position: %v", err) - } - - l.ap[k] = ap - } - - return nil -} - -// Next returns the next posting on the postings list, or nil at the end -func (i *PostingsIterator) Next() (segment.Posting, error) { - return i.nextAtOrAfter(0) -} - -// Advance returns the posting at the specified docNum or it is not present -// the next posting, or if the end is reached, nil -func (i *PostingsIterator) Advance(docNum uint64) (segment.Posting, error) { - return i.nextAtOrAfter(docNum) -} - -// Next returns the next posting on the postings list, or nil at the end -func (i *PostingsIterator) nextAtOrAfter(atOrAfter uint64) (segment.Posting, error) { - docNum, exists, err := i.nextDocNumAtOrAfter(atOrAfter) - if err != nil || !exists { - return nil, err - } - - i.next = Posting{} // clear the struct - rv := &i.next - rv.docNum = docNum - - if !i.includeFreqNorm { - return rv, nil - } - - var normBits uint64 - var hasLocs bool - - rv.freq, normBits, hasLocs, err = i.readFreqNormHasLocs() - if err != nil { - return nil, err - } - - rv.norm = math.Float32frombits(uint32(normBits)) - - if i.includeLocs && hasLocs { - // prepare locations into reused slices, where we assume - // rv.freq >= "number of locs", since in a composite field, - // some component fields might have their IncludeTermVector - // flags disabled while other component fields are enabled - if cap(i.nextLocs) >= int(rv.freq) { - i.nextLocs = i.nextLocs[0:rv.freq] - } else { - i.nextLocs = make([]Location, rv.freq, rv.freq*2) - } - if cap(i.nextSegmentLocs) < int(rv.freq) { - i.nextSegmentLocs = make([]segment.Location, rv.freq, rv.freq*2) - } - rv.locs = i.nextSegmentLocs[:0] - - numLocsBytes, err := i.locReader.readUvarint() - if err != nil { - return nil, fmt.Errorf("error reading location numLocsBytes: %v", err) - } - - j := 0 - startBytesRemaining := i.locReader.Len() // # bytes remaining in the locReader - for startBytesRemaining-i.locReader.Len() < int(numLocsBytes) { - err := i.readLocation(&i.nextLocs[j]) - if err != nil { - return nil, err - } - rv.locs = append(rv.locs, &i.nextLocs[j]) - j++ - } - } - - return rv, nil -} - -// nextDocNum returns the next docNum on the postings list, and also -// sets up the currChunk / loc related fields of the iterator. -func (i *PostingsIterator) nextDocNumAtOrAfter(atOrAfter uint64) (uint64, bool, error) { - if i.normBits1Hit != 0 { - if i.docNum1Hit == DocNum1HitFinished { - return 0, false, nil - } - if i.docNum1Hit < atOrAfter { - // advanced past our 1-hit - i.docNum1Hit = DocNum1HitFinished // consume our 1-hit docNum - return 0, false, nil - } - docNum := i.docNum1Hit - i.docNum1Hit = DocNum1HitFinished // consume our 1-hit docNum - return docNum, true, nil - } - - if i.Actual == nil || !i.Actual.HasNext() { - return 0, false, nil - } - - if i.postings == nil || i.postings.postings == i.ActualBM { - return i.nextDocNumAtOrAfterClean(atOrAfter) - } - - i.Actual.AdvanceIfNeeded(uint32(atOrAfter)) - - if !i.Actual.HasNext() { - // couldn't find anything - return 0, false, nil - } - - n := i.Actual.Next() - allN := i.all.Next() - nChunk := n / uint32(i.postings.chunkSize) - - // when allN becomes >= to here, then allN is in the same chunk as nChunk. - allNReachesNChunk := nChunk * uint32(i.postings.chunkSize) - - // n is the next actual hit (excluding some postings), and - // allN is the next hit in the full postings, and - // if they don't match, move 'all' forwards until they do - for allN != n { - // we've reached same chunk, so move the freq/norm/loc decoders forward - if i.includeFreqNorm && allN >= allNReachesNChunk { - err := i.currChunkNext(nChunk) - if err != nil { - return 0, false, err - } - } - - allN = i.all.Next() - } - - if i.includeFreqNorm && (i.currChunk != nChunk || i.freqNormReader.isNil()) { - err := i.loadChunk(int(nChunk)) - if err != nil { - return 0, false, fmt.Errorf("error loading chunk: %v", err) - } - } - - return uint64(n), true, nil -} - -var freqHasLocs1Hit = encodeFreqHasLocs(1, false) - -// nextBytes returns the docNum and the encoded freq & loc bytes for -// the next posting -func (i *PostingsIterator) nextBytes() ( - docNumOut uint64, freq uint64, normBits uint64, - bytesFreqNorm []byte, bytesLoc []byte, err error) { - docNum, exists, err := i.nextDocNumAtOrAfter(0) - if err != nil || !exists { - return 0, 0, 0, nil, nil, err - } - - if i.normBits1Hit != 0 { - if i.buf == nil { - i.buf = make([]byte, binary.MaxVarintLen64*2) - } - n := binary.PutUvarint(i.buf, freqHasLocs1Hit) - n += binary.PutUvarint(i.buf[n:], i.normBits1Hit) - return docNum, uint64(1), i.normBits1Hit, i.buf[:n], nil, nil - } - - startFreqNorm := i.freqNormReader.remainingLen() - - var hasLocs bool - - freq, normBits, hasLocs, err = i.readFreqNormHasLocs() - if err != nil { - return 0, 0, 0, nil, nil, err - } - - endFreqNorm := i.freqNormReader.remainingLen() - bytesFreqNorm = i.freqNormReader.readBytes(startFreqNorm, endFreqNorm) - - if hasLocs { - startLoc := i.locReader.remainingLen() - - numLocsBytes, err := i.locReader.readUvarint() - if err != nil { - return 0, 0, 0, nil, nil, - fmt.Errorf("error reading location nextBytes numLocs: %v", err) - } - - // skip over all the location bytes - i.locReader.SkipBytes(int(numLocsBytes)) - - endLoc := i.locReader.remainingLen() - bytesLoc = i.locReader.readBytes(startLoc, endLoc) - } - - return docNum, freq, normBits, bytesFreqNorm, bytesLoc, nil -} - -// optimization when the postings list is "clean" (e.g., no updates & -// no deletions) where the all bitmap is the same as the actual bitmap -func (i *PostingsIterator) nextDocNumAtOrAfterClean( - atOrAfter uint64) (uint64, bool, error) { - - if !i.includeFreqNorm { - i.Actual.AdvanceIfNeeded(uint32(atOrAfter)) - - if !i.Actual.HasNext() { - return 0, false, nil // couldn't find anything - } - - return uint64(i.Actual.Next()), true, nil - } - - // freq-norm's needed, so maintain freq-norm chunk reader - sameChunkNexts := 0 // # of times we called Next() in the same chunk - n := i.Actual.Next() - nChunk := n / uint32(i.postings.chunkSize) - - for uint64(n) < atOrAfter && i.Actual.HasNext() { - n = i.Actual.Next() - - nChunkPrev := nChunk - nChunk = n / uint32(i.postings.chunkSize) - - if nChunk != nChunkPrev { - sameChunkNexts = 0 - } else { - sameChunkNexts += 1 - } - } - - if uint64(n) < atOrAfter { - // couldn't find anything - return 0, false, nil - } - - for j := 0; j < sameChunkNexts; j++ { - err := i.currChunkNext(nChunk) - if err != nil { - return 0, false, fmt.Errorf("error optimized currChunkNext: %v", err) - } - } - - if i.currChunk != nChunk || i.freqNormReader.isNil() { - err := i.loadChunk(int(nChunk)) - if err != nil { - return 0, false, fmt.Errorf("error loading chunk: %v", err) - } - } - - return uint64(n), true, nil -} - -func (i *PostingsIterator) currChunkNext(nChunk uint32) error { - if i.currChunk != nChunk || i.freqNormReader.isNil() { - err := i.loadChunk(int(nChunk)) - if err != nil { - return fmt.Errorf("error loading chunk: %v", err) - } - } - - // read off freq/offsets even though we don't care about them - hasLocs, err := i.skipFreqNormReadHasLocs() - if err != nil { - return err - } - - if i.includeLocs && hasLocs { - numLocsBytes, err := i.locReader.readUvarint() - if err != nil { - return fmt.Errorf("error reading location numLocsBytes: %v", err) - } - - // skip over all the location bytes - i.locReader.SkipBytes(int(numLocsBytes)) - } - - return nil -} - -// DocNum1Hit returns the docNum and true if this is "1-hit" optimized -// and the docNum is available. -func (p *PostingsIterator) DocNum1Hit() (uint64, bool) { - if p.normBits1Hit != 0 && p.docNum1Hit != DocNum1HitFinished { - return p.docNum1Hit, true - } - return 0, false -} - -// ActualBitmap returns the underlying actual bitmap -// which can be used up the stack for optimizations -func (p *PostingsIterator) ActualBitmap() *roaring.Bitmap { - return p.ActualBM -} - -// ReplaceActual replaces the ActualBM with the provided -// bitmap -func (p *PostingsIterator) ReplaceActual(abm *roaring.Bitmap) { - p.ActualBM = abm - p.Actual = abm.Iterator() -} - -// PostingsIteratorFromBitmap constructs a PostingsIterator given an -// "actual" bitmap. -func PostingsIteratorFromBitmap(bm *roaring.Bitmap, - includeFreqNorm, includeLocs bool) (segment.PostingsIterator, error) { - return &PostingsIterator{ - ActualBM: bm, - Actual: bm.Iterator(), - includeFreqNorm: includeFreqNorm, - includeLocs: includeLocs, - }, nil -} - -// PostingsIteratorFrom1Hit constructs a PostingsIterator given a -// 1-hit docNum. -func PostingsIteratorFrom1Hit(docNum1Hit uint64, - includeFreqNorm, includeLocs bool) (segment.PostingsIterator, error) { - return &PostingsIterator{ - docNum1Hit: docNum1Hit, - normBits1Hit: NormBits1Hit, - includeFreqNorm: includeFreqNorm, - includeLocs: includeLocs, - }, nil -} - -// Posting is a single entry in a postings list -type Posting struct { - docNum uint64 - freq uint64 - norm float32 - locs []segment.Location -} - -func (p *Posting) Size() int { - sizeInBytes := reflectStaticSizePosting - - for _, entry := range p.locs { - sizeInBytes += entry.Size() - } - - return sizeInBytes -} - -// Number returns the document number of this posting in this segment -func (p *Posting) Number() uint64 { - return p.docNum -} - -// Frequency returns the frequencies of occurrence of this term in this doc/field -func (p *Posting) Frequency() uint64 { - return p.freq -} - -// Norm returns the normalization factor for this posting -func (p *Posting) Norm() float64 { - return float64(float32(1.0 / math.Sqrt(float64(math.Float32bits(p.norm))))) -} - -// Locations returns the location information for each occurrence -func (p *Posting) Locations() []segment.Location { - return p.locs -} - -// NormUint64 returns the norm value as uint64 -func (p *Posting) NormUint64() uint64 { - return uint64(math.Float32bits(p.norm)) -} - -// Location represents the location of a single occurrence -type Location struct { - field string - pos uint64 - start uint64 - end uint64 - ap []uint64 -} - -func (l *Location) Size() int { - return reflectStaticSizeLocation + - len(l.field) + - len(l.ap)*size.SizeOfUint64 -} - -// Field returns the name of the field (useful in composite fields to know -// which original field the value came from) -func (l *Location) Field() string { - return l.field -} - -// Start returns the start byte offset of this occurrence -func (l *Location) Start() uint64 { - return l.start -} - -// End returns the end byte offset of this occurrence -func (l *Location) End() uint64 { - return l.end -} - -// Pos returns the 1-based phrase position of this occurrence -func (l *Location) Pos() uint64 { - return l.pos -} - -// ArrayPositions returns the array position vector associated with this occurrence -func (l *Location) ArrayPositions() []uint64 { - return l.ap -} diff --git a/vendor/github.com/blevesearch/zap/v15/read.go b/vendor/github.com/blevesearch/zap/v15/read.go deleted file mode 100644 index e47d4c6..0000000 --- a/vendor/github.com/blevesearch/zap/v15/read.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import "encoding/binary" - -func (s *SegmentBase) getDocStoredMetaAndCompressed(docNum uint64) ([]byte, []byte) { - _, storedOffset, n, metaLen, dataLen := s.getDocStoredOffsets(docNum) - - meta := s.mem[storedOffset+n : storedOffset+n+metaLen] - data := s.mem[storedOffset+n+metaLen : storedOffset+n+metaLen+dataLen] - - return meta, data -} - -func (s *SegmentBase) getDocStoredOffsets(docNum uint64) ( - uint64, uint64, uint64, uint64, uint64) { - indexOffset := s.storedIndexOffset + (8 * docNum) - - storedOffset := binary.BigEndian.Uint64(s.mem[indexOffset : indexOffset+8]) - - var n uint64 - - metaLen, read := binary.Uvarint(s.mem[storedOffset : storedOffset+binary.MaxVarintLen64]) - n += uint64(read) - - dataLen, read := binary.Uvarint(s.mem[storedOffset+n : storedOffset+n+binary.MaxVarintLen64]) - n += uint64(read) - - return indexOffset, storedOffset, n, metaLen, dataLen -} diff --git a/vendor/github.com/blevesearch/zap/v15/segment.go b/vendor/github.com/blevesearch/zap/v15/segment.go deleted file mode 100644 index 2d158e8..0000000 --- a/vendor/github.com/blevesearch/zap/v15/segment.go +++ /dev/null @@ -1,572 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "bytes" - "encoding/binary" - "fmt" - "io" - "os" - "sync" - "unsafe" - - "github.com/RoaringBitmap/roaring" - "github.com/blevesearch/bleve/index/scorch/segment" - "github.com/blevesearch/bleve/size" - "github.com/couchbase/vellum" - mmap "github.com/blevesearch/mmap-go" - "github.com/golang/snappy" -) - -var reflectStaticSizeSegmentBase int - -func init() { - var sb SegmentBase - reflectStaticSizeSegmentBase = int(unsafe.Sizeof(sb)) -} - -// Open returns a zap impl of a segment -func (*ZapPlugin) Open(path string) (segment.Segment, error) { - f, err := os.Open(path) - if err != nil { - return nil, err - } - mm, err := mmap.Map(f, mmap.RDONLY, 0) - if err != nil { - // mmap failed, try to close the file - _ = f.Close() - return nil, err - } - - rv := &Segment{ - SegmentBase: SegmentBase{ - mem: mm[0 : len(mm)-FooterSize], - fieldsMap: make(map[string]uint16), - fieldDvReaders: make(map[uint16]*docValueReader), - fieldFSTs: make(map[uint16]*vellum.FST), - }, - f: f, - mm: mm, - path: path, - refs: 1, - } - rv.SegmentBase.updateSize() - - err = rv.loadConfig() - if err != nil { - _ = rv.Close() - return nil, err - } - - err = rv.loadFields() - if err != nil { - _ = rv.Close() - return nil, err - } - - err = rv.loadDvReaders() - if err != nil { - _ = rv.Close() - return nil, err - } - - return rv, nil -} - -// SegmentBase is a memory only, read-only implementation of the -// segment.Segment interface, using zap's data representation. -type SegmentBase struct { - mem []byte - memCRC uint32 - chunkMode uint32 - fieldsMap map[string]uint16 // fieldName -> fieldID+1 - fieldsInv []string // fieldID -> fieldName - numDocs uint64 - storedIndexOffset uint64 - fieldsIndexOffset uint64 - docValueOffset uint64 - dictLocs []uint64 - fieldDvReaders map[uint16]*docValueReader // naive chunk cache per field - fieldDvNames []string // field names cached in fieldDvReaders - size uint64 - - m sync.Mutex - fieldFSTs map[uint16]*vellum.FST -} - -func (sb *SegmentBase) Size() int { - return int(sb.size) -} - -func (sb *SegmentBase) updateSize() { - sizeInBytes := reflectStaticSizeSegmentBase + - cap(sb.mem) - - // fieldsMap - for k := range sb.fieldsMap { - sizeInBytes += (len(k) + size.SizeOfString) + size.SizeOfUint16 - } - - // fieldsInv, dictLocs - for _, entry := range sb.fieldsInv { - sizeInBytes += len(entry) + size.SizeOfString - } - sizeInBytes += len(sb.dictLocs) * size.SizeOfUint64 - - // fieldDvReaders - for _, v := range sb.fieldDvReaders { - sizeInBytes += size.SizeOfUint16 + size.SizeOfPtr - if v != nil { - sizeInBytes += v.size() - } - } - - sb.size = uint64(sizeInBytes) -} - -func (sb *SegmentBase) AddRef() {} -func (sb *SegmentBase) DecRef() (err error) { return nil } -func (sb *SegmentBase) Close() (err error) { return nil } - -// Segment implements a persisted segment.Segment interface, by -// embedding an mmap()'ed SegmentBase. -type Segment struct { - SegmentBase - - f *os.File - mm mmap.MMap - path string - version uint32 - crc uint32 - - m sync.Mutex // Protects the fields that follow. - refs int64 -} - -func (s *Segment) Size() int { - // 8 /* size of file pointer */ - // 4 /* size of version -> uint32 */ - // 4 /* size of crc -> uint32 */ - sizeOfUints := 16 - - sizeInBytes := (len(s.path) + size.SizeOfString) + sizeOfUints - - // mutex, refs -> int64 - sizeInBytes += 16 - - // do not include the mmap'ed part - return sizeInBytes + s.SegmentBase.Size() - cap(s.mem) -} - -func (s *Segment) AddRef() { - s.m.Lock() - s.refs++ - s.m.Unlock() -} - -func (s *Segment) DecRef() (err error) { - s.m.Lock() - s.refs-- - if s.refs == 0 { - err = s.closeActual() - } - s.m.Unlock() - return err -} - -func (s *Segment) loadConfig() error { - crcOffset := len(s.mm) - 4 - s.crc = binary.BigEndian.Uint32(s.mm[crcOffset : crcOffset+4]) - - verOffset := crcOffset - 4 - s.version = binary.BigEndian.Uint32(s.mm[verOffset : verOffset+4]) - if s.version != Version { - return fmt.Errorf("unsupported version %d != %d", s.version, Version) - } - - chunkOffset := verOffset - 4 - s.chunkMode = binary.BigEndian.Uint32(s.mm[chunkOffset : chunkOffset+4]) - - docValueOffset := chunkOffset - 8 - s.docValueOffset = binary.BigEndian.Uint64(s.mm[docValueOffset : docValueOffset+8]) - - fieldsIndexOffset := docValueOffset - 8 - s.fieldsIndexOffset = binary.BigEndian.Uint64(s.mm[fieldsIndexOffset : fieldsIndexOffset+8]) - - storedIndexOffset := fieldsIndexOffset - 8 - s.storedIndexOffset = binary.BigEndian.Uint64(s.mm[storedIndexOffset : storedIndexOffset+8]) - - numDocsOffset := storedIndexOffset - 8 - s.numDocs = binary.BigEndian.Uint64(s.mm[numDocsOffset : numDocsOffset+8]) - return nil -} - -func (s *SegmentBase) loadFields() error { - // NOTE for now we assume the fields index immediately precedes - // the footer, and if this changes, need to adjust accordingly (or - // store explicit length), where s.mem was sliced from s.mm in Open(). - fieldsIndexEnd := uint64(len(s.mem)) - - // iterate through fields index - var fieldID uint64 - for s.fieldsIndexOffset+(8*fieldID) < fieldsIndexEnd { - addr := binary.BigEndian.Uint64(s.mem[s.fieldsIndexOffset+(8*fieldID) : s.fieldsIndexOffset+(8*fieldID)+8]) - - dictLoc, read := binary.Uvarint(s.mem[addr:fieldsIndexEnd]) - n := uint64(read) - s.dictLocs = append(s.dictLocs, dictLoc) - - var nameLen uint64 - nameLen, read = binary.Uvarint(s.mem[addr+n : fieldsIndexEnd]) - n += uint64(read) - - name := string(s.mem[addr+n : addr+n+nameLen]) - s.fieldsInv = append(s.fieldsInv, name) - s.fieldsMap[name] = uint16(fieldID + 1) - - fieldID++ - } - return nil -} - -// Dictionary returns the term dictionary for the specified field -func (s *SegmentBase) Dictionary(field string) (segment.TermDictionary, error) { - dict, err := s.dictionary(field) - if err == nil && dict == nil { - return &segment.EmptyDictionary{}, nil - } - return dict, err -} - -func (sb *SegmentBase) dictionary(field string) (rv *Dictionary, err error) { - fieldIDPlus1 := sb.fieldsMap[field] - if fieldIDPlus1 > 0 { - rv = &Dictionary{ - sb: sb, - field: field, - fieldID: fieldIDPlus1 - 1, - } - - dictStart := sb.dictLocs[rv.fieldID] - if dictStart > 0 { - var ok bool - sb.m.Lock() - if rv.fst, ok = sb.fieldFSTs[rv.fieldID]; !ok { - // read the length of the vellum data - vellumLen, read := binary.Uvarint(sb.mem[dictStart : dictStart+binary.MaxVarintLen64]) - fstBytes := sb.mem[dictStart+uint64(read) : dictStart+uint64(read)+vellumLen] - rv.fst, err = vellum.Load(fstBytes) - if err != nil { - sb.m.Unlock() - return nil, fmt.Errorf("dictionary field %s vellum err: %v", field, err) - } - - sb.fieldFSTs[rv.fieldID] = rv.fst - } - - sb.m.Unlock() - rv.fstReader, err = rv.fst.Reader() - if err != nil { - return nil, fmt.Errorf("dictionary field %s vellum reader err: %v", field, err) - } - - } - } - - return rv, nil -} - -// visitDocumentCtx holds data structures that are reusable across -// multiple VisitDocument() calls to avoid memory allocations -type visitDocumentCtx struct { - buf []byte - reader bytes.Reader - arrayPos []uint64 -} - -var visitDocumentCtxPool = sync.Pool{ - New: func() interface{} { - reuse := &visitDocumentCtx{} - return reuse - }, -} - -// VisitDocument invokes the DocFieldValueVistor for each stored field -// for the specified doc number -func (s *SegmentBase) VisitDocument(num uint64, visitor segment.DocumentFieldValueVisitor) error { - vdc := visitDocumentCtxPool.Get().(*visitDocumentCtx) - defer visitDocumentCtxPool.Put(vdc) - return s.visitDocument(vdc, num, visitor) -} - -func (s *SegmentBase) visitDocument(vdc *visitDocumentCtx, num uint64, - visitor segment.DocumentFieldValueVisitor) error { - // first make sure this is a valid number in this segment - if num < s.numDocs { - meta, compressed := s.getDocStoredMetaAndCompressed(num) - - vdc.reader.Reset(meta) - - // handle _id field special case - idFieldValLen, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - idFieldVal := compressed[:idFieldValLen] - - keepGoing := visitor("_id", byte('t'), idFieldVal, nil) - if !keepGoing { - visitDocumentCtxPool.Put(vdc) - return nil - } - - // handle non-"_id" fields - compressed = compressed[idFieldValLen:] - - uncompressed, err := snappy.Decode(vdc.buf[:cap(vdc.buf)], compressed) - if err != nil { - return err - } - - for keepGoing { - field, err := binary.ReadUvarint(&vdc.reader) - if err == io.EOF { - break - } - if err != nil { - return err - } - typ, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - offset, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - l, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - numap, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - var arrayPos []uint64 - if numap > 0 { - if cap(vdc.arrayPos) < int(numap) { - vdc.arrayPos = make([]uint64, numap) - } - arrayPos = vdc.arrayPos[:numap] - for i := 0; i < int(numap); i++ { - ap, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return err - } - arrayPos[i] = ap - } - } - - value := uncompressed[offset : offset+l] - keepGoing = visitor(s.fieldsInv[field], byte(typ), value, arrayPos) - } - - vdc.buf = uncompressed - } - return nil -} - -// DocID returns the value of the _id field for the given docNum -func (s *SegmentBase) DocID(num uint64) ([]byte, error) { - if num >= s.numDocs { - return nil, nil - } - - vdc := visitDocumentCtxPool.Get().(*visitDocumentCtx) - - meta, compressed := s.getDocStoredMetaAndCompressed(num) - - vdc.reader.Reset(meta) - - // handle _id field special case - idFieldValLen, err := binary.ReadUvarint(&vdc.reader) - if err != nil { - return nil, err - } - idFieldVal := compressed[:idFieldValLen] - - visitDocumentCtxPool.Put(vdc) - - return idFieldVal, nil -} - -// Count returns the number of documents in this segment. -func (s *SegmentBase) Count() uint64 { - return s.numDocs -} - -// DocNumbers returns a bitset corresponding to the doc numbers of all the -// provided _id strings -func (s *SegmentBase) DocNumbers(ids []string) (*roaring.Bitmap, error) { - rv := roaring.New() - - if len(s.fieldsMap) > 0 { - idDict, err := s.dictionary("_id") - if err != nil { - return nil, err - } - - postingsList := emptyPostingsList - - sMax, err := idDict.fst.GetMaxKey() - if err != nil { - return nil, err - } - sMaxStr := string(sMax) - filteredIds := make([]string, 0, len(ids)) - for _, id := range ids { - if id <= sMaxStr { - filteredIds = append(filteredIds, id) - } - } - - for _, id := range filteredIds { - postingsList, err = idDict.postingsList([]byte(id), nil, postingsList) - if err != nil { - return nil, err - } - postingsList.OrInto(rv) - } - } - - return rv, nil -} - -// Fields returns the field names used in this segment -func (s *SegmentBase) Fields() []string { - return s.fieldsInv -} - -// Path returns the path of this segment on disk -func (s *Segment) Path() string { - return s.path -} - -// Close releases all resources associated with this segment -func (s *Segment) Close() (err error) { - return s.DecRef() -} - -func (s *Segment) closeActual() (err error) { - if s.mm != nil { - err = s.mm.Unmap() - } - // try to close file even if unmap failed - if s.f != nil { - err2 := s.f.Close() - if err == nil { - // try to return first error - err = err2 - } - } - return -} - -// some helpers i started adding for the command-line utility - -// Data returns the underlying mmaped data slice -func (s *Segment) Data() []byte { - return s.mm -} - -// CRC returns the CRC value stored in the file footer -func (s *Segment) CRC() uint32 { - return s.crc -} - -// Version returns the file version in the file footer -func (s *Segment) Version() uint32 { - return s.version -} - -// ChunkFactor returns the chunk factor in the file footer -func (s *Segment) ChunkMode() uint32 { - return s.chunkMode -} - -// FieldsIndexOffset returns the fields index offset in the file footer -func (s *Segment) FieldsIndexOffset() uint64 { - return s.fieldsIndexOffset -} - -// StoredIndexOffset returns the stored value index offset in the file footer -func (s *Segment) StoredIndexOffset() uint64 { - return s.storedIndexOffset -} - -// DocValueOffset returns the docValue offset in the file footer -func (s *Segment) DocValueOffset() uint64 { - return s.docValueOffset -} - -// NumDocs returns the number of documents in the file footer -func (s *Segment) NumDocs() uint64 { - return s.numDocs -} - -// DictAddr is a helper function to compute the file offset where the -// dictionary is stored for the specified field. -func (s *Segment) DictAddr(field string) (uint64, error) { - fieldIDPlus1, ok := s.fieldsMap[field] - if !ok { - return 0, fmt.Errorf("no such field '%s'", field) - } - - return s.dictLocs[fieldIDPlus1-1], nil -} - -func (s *SegmentBase) loadDvReaders() error { - if s.docValueOffset == fieldNotUninverted || s.numDocs == 0 { - return nil - } - - var read uint64 - for fieldID, field := range s.fieldsInv { - var fieldLocStart, fieldLocEnd uint64 - var n int - fieldLocStart, n = binary.Uvarint(s.mem[s.docValueOffset+read : s.docValueOffset+read+binary.MaxVarintLen64]) - if n <= 0 { - return fmt.Errorf("loadDvReaders: failed to read the docvalue offset start for field %d", fieldID) - } - read += uint64(n) - fieldLocEnd, n = binary.Uvarint(s.mem[s.docValueOffset+read : s.docValueOffset+read+binary.MaxVarintLen64]) - if n <= 0 { - return fmt.Errorf("loadDvReaders: failed to read the docvalue offset end for field %d", fieldID) - } - read += uint64(n) - - fieldDvReader, err := s.loadFieldDocValueReader(field, fieldLocStart, fieldLocEnd) - if err != nil { - return err - } - if fieldDvReader != nil { - s.fieldDvReaders[uint16(fieldID)] = fieldDvReader - s.fieldDvNames = append(s.fieldDvNames, field) - } - } - - return nil -} diff --git a/vendor/github.com/blevesearch/zap/v15/write.go b/vendor/github.com/blevesearch/zap/v15/write.go deleted file mode 100644 index 77aefdb..0000000 --- a/vendor/github.com/blevesearch/zap/v15/write.go +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package zap - -import ( - "encoding/binary" - "io" - - "github.com/RoaringBitmap/roaring" -) - -// writes out the length of the roaring bitmap in bytes as varint -// then writes out the roaring bitmap itself -func writeRoaringWithLen(r *roaring.Bitmap, w io.Writer, - reuseBufVarint []byte) (int, error) { - buf, err := r.ToBytes() - if err != nil { - return 0, err - } - - var tw int - - // write out the length - n := binary.PutUvarint(reuseBufVarint, uint64(len(buf))) - nw, err := w.Write(reuseBufVarint[:n]) - tw += nw - if err != nil { - return tw, err - } - - // write out the roaring bytes - nw, err = w.Write(buf) - tw += nw - if err != nil { - return tw, err - } - - return tw, nil -} - -func persistFields(fieldsInv []string, w *CountHashWriter, dictLocs []uint64) (uint64, error) { - var rv uint64 - var fieldsOffsets []uint64 - - for fieldID, fieldName := range fieldsInv { - // record start of this field - fieldsOffsets = append(fieldsOffsets, uint64(w.Count())) - - // write out the dict location and field name length - _, err := writeUvarints(w, dictLocs[fieldID], uint64(len(fieldName))) - if err != nil { - return 0, err - } - - // write out the field name - _, err = w.Write([]byte(fieldName)) - if err != nil { - return 0, err - } - } - - // now write out the fields index - rv = uint64(w.Count()) - for fieldID := range fieldsInv { - err := binary.Write(w, binary.BigEndian, fieldsOffsets[fieldID]) - if err != nil { - return 0, err - } - } - - return rv, nil -} - -// FooterSize is the size of the footer record in bytes -// crc + ver + chunk + field offset + stored offset + num docs + docValueOffset -const FooterSize = 4 + 4 + 4 + 8 + 8 + 8 + 8 - -func persistFooter(numDocs, storedIndexOffset, fieldsIndexOffset, docValueOffset uint64, - chunkMode uint32, crcBeforeFooter uint32, writerIn io.Writer) error { - w := NewCountHashWriter(writerIn) - w.crc = crcBeforeFooter - - // write out the number of docs - err := binary.Write(w, binary.BigEndian, numDocs) - if err != nil { - return err - } - // write out the stored field index location: - err = binary.Write(w, binary.BigEndian, storedIndexOffset) - if err != nil { - return err - } - // write out the field index location - err = binary.Write(w, binary.BigEndian, fieldsIndexOffset) - if err != nil { - return err - } - // write out the fieldDocValue location - err = binary.Write(w, binary.BigEndian, docValueOffset) - if err != nil { - return err - } - // write out 32-bit chunk factor - err = binary.Write(w, binary.BigEndian, chunkMode) - if err != nil { - return err - } - // write out 32-bit version - err = binary.Write(w, binary.BigEndian, Version) - if err != nil { - return err - } - // write out CRC-32 of everything upto but not including this CRC - err = binary.Write(w, binary.BigEndian, w.crc) - if err != nil { - return err - } - return nil -} - -func writeUvarints(w io.Writer, vals ...uint64) (tw int, err error) { - buf := make([]byte, binary.MaxVarintLen64) - for _, val := range vals { - n := binary.PutUvarint(buf, val) - var nw int - nw, err = w.Write(buf[:n]) - tw += nw - if err != nil { - return tw, err - } - } - return tw, err -} diff --git a/vendor/github.com/blevesearch/zap/v15/zap.md b/vendor/github.com/blevesearch/zap/v15/zap.md deleted file mode 100644 index d74dc54..0000000 --- a/vendor/github.com/blevesearch/zap/v15/zap.md +++ /dev/null @@ -1,177 +0,0 @@ -# ZAP File Format - -## Legend - -### Sections - - |========| - | | section - |========| - -### Fixed-size fields - - |--------| |----| |--| |-| - | | uint64 | | uint32 | | uint16 | | uint8 - |--------| |----| |--| |-| - -### Varints - - |~~~~~~~~| - | | varint(up to uint64) - |~~~~~~~~| - -### Arbitrary-length fields - - |--------...---| - | | arbitrary-length field (string, vellum, roaring bitmap) - |--------...---| - -### Chunked data - - [--------] - [ ] - [--------] - -## Overview - -Footer section describes the configuration of particular ZAP file. The format of footer is version-dependent, so it is necessary to check `V` field before the parsing. - - |==================================================| - | Stored Fields | - |==================================================| - |-----> | Stored Fields Index | - | |==================================================| - | | Dictionaries + Postings + DocValues | - | |==================================================| - | |---> | DocValues Index | - | | |==================================================| - | | | Fields | - | | |==================================================| - | | |-> | Fields Index | - | | | |========|========|========|========|====|====|====| - | | | | D# | SF | F | FDV | CF | V | CC | (Footer) - | | | |========|====|===|====|===|====|===|====|====|====| - | | | | | | - |-+-+-----------------| | | - | |--------------------------| | - |-------------------------------------| - - D#. Number of Docs. - SF. Stored Fields Index Offset. - F. Field Index Offset. - FDV. Field DocValue Offset. - CF. Chunk Factor. - V. Version. - CC. CRC32. - -## Stored Fields - -Stored Fields Index is `D#` consecutive 64-bit unsigned integers - offsets, where relevant Stored Fields Data records are located. - - 0 [SF] [SF + D# * 8] - | Stored Fields | Stored Fields Index | - |================================|==================================| - | | | - | |--------------------| ||--------|--------|. . .|--------|| - | |-> | Stored Fields Data | || 0 | 1 | | D# - 1 || - | | |--------------------| ||--------|----|---|. . .|--------|| - | | | | | - |===|============================|==============|===================| - | | - |-------------------------------------------| - -Stored Fields Data is an arbitrary size record, which consists of metadata and [Snappy](https://github.com/golang/snappy)-compressed data. - - Stored Fields Data - |~~~~~~~~|~~~~~~~~|~~~~~~~~...~~~~~~~~|~~~~~~~~...~~~~~~~~| - | MDS | CDS | MD | CD | - |~~~~~~~~|~~~~~~~~|~~~~~~~~...~~~~~~~~|~~~~~~~~...~~~~~~~~| - - MDS. Metadata size. - CDS. Compressed data size. - MD. Metadata. - CD. Snappy-compressed data. - -## Fields - -Fields Index section located between addresses `F` and `len(file) - len(footer)` and consist of `uint64` values (`F1`, `F2`, ...) which are offsets to records in Fields section. We have `F# = (len(file) - len(footer) - F) / sizeof(uint64)` fields. - - - (...) [F] [F + F#] - | Fields | Fields Index. | - |================================|================================| - | | | - | |~~~~~~~~|~~~~~~~~|---...---|||--------|--------|...|--------|| - ||->| Dict | Length | Name ||| 0 | 1 | | F# - 1 || - || |~~~~~~~~|~~~~~~~~|---...---|||--------|----|---|...|--------|| - || | | | - ||===============================|==============|=================| - | | - |----------------------------------------------| - - -## Dictionaries + Postings - -Each of fields has its own dictionary, encoded in [Vellum](https://github.com/couchbase/vellum) format. Dictionary consists of pairs `(term, offset)`, where `offset` indicates the position of postings (list of documents) for this particular term. - - |================================================================|- Dictionaries + - | | Postings + - | | DocValues - | Freq/Norm (chunked) | - | [~~~~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~] | - | |->[ Freq | Norm (float32 under varint) ] | - | | [~~~~~~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~] | - | | | - | |------------------------------------------------------------| | - | Location Details (chunked) | | - | [~~~~~~|~~~~~|~~~~~~~|~~~~~|~~~~~~|~~~~~~~~|~~~~~] | | - | |->[ Size | Pos | Start | End | Arr# | ArrPos | ... ] | | - | | [~~~~~~|~~~~~|~~~~~~~|~~~~~|~~~~~~|~~~~~~~~|~~~~~] | | - | | | | - | |----------------------| | | - | Postings List | | | - | |~~~~~~~~|~~~~~|~~|~~~~~~~~|-----------...--| | | - | |->| F/N | LD | Length | ROARING BITMAP | | | - | | |~~~~~|~~|~~~~~~~~|~~~~~~~~|-----------...--| | | - | | |----------------------------------------------| | - | |--------------------------------------| | - | Dictionary | | - | |~~~~~~~~|--------------------------|-...-| | - | |->| Length | VELLUM DATA : (TERM -> OFFSET) | | - | | |~~~~~~~~|----------------------------...-| | - | | | - |======|=========================================================|- DocValues Index - | | | - |======|=========================================================|- Fields - | | | - | |~~~~|~~~|~~~~~~~~|---...---| | - | | Dict | Length | Name | | - | |~~~~~~~~|~~~~~~~~|---...---| | - | | - |================================================================| - -## DocValues - -DocValues Index is `F#` pairs of varints, one pair per field. Each pair of varints indicates start and end point of DocValues slice. - - |================================================================| - | |------...--| | - | |->| DocValues |<-| | - | | |------...--| | | - |==|=================|===========================================|- DocValues Index - ||~|~~~~~~~~~|~~~~~~~|~~| |~~~~~~~~~~~~~~|~~~~~~~~~~~~|| - || DV1 START | DV1 STOP | . . . . . | DV(F#) START | DV(F#) END || - ||~~~~~~~~~~~|~~~~~~~~~~| |~~~~~~~~~~~~~~|~~~~~~~~~~~~|| - |================================================================| - -DocValues is chunked Snappy-compressed values for each document and field. - - [~~~~~~~~~~~~~~~|~~~~~~|~~~~~~~~~|-...-|~~~~~~|~~~~~~~~~|--------------------...-] - [ Doc# in Chunk | Doc1 | Offset1 | ... | DocN | OffsetN | SNAPPY COMPRESSED DATA ] - [~~~~~~~~~~~~~~~|~~~~~~|~~~~~~~~~|-...-|~~~~~~|~~~~~~~~~|--------------------...-] - -Last 16 bytes are description of chunks. - - |~~~~~~~~~~~~...~|----------------|----------------| - | Chunk Sizes | Chunk Size Arr | Chunk# | - |~~~~~~~~~~~~...~|----------------|----------------| diff --git a/vendor/github.com/boltdb/bolt/.gitignore b/vendor/github.com/boltdb/bolt/.gitignore new file mode 100644 index 0000000..c7bd2b7 --- /dev/null +++ b/vendor/github.com/boltdb/bolt/.gitignore @@ -0,0 +1,4 @@ +*.prof +*.test +*.swp +/bin/ diff --git a/vendor/go.etcd.io/bbolt/LICENSE b/vendor/github.com/boltdb/bolt/LICENSE similarity index 100% rename from vendor/go.etcd.io/bbolt/LICENSE rename to vendor/github.com/boltdb/bolt/LICENSE diff --git a/vendor/github.com/boltdb/bolt/Makefile b/vendor/github.com/boltdb/bolt/Makefile new file mode 100644 index 0000000..e035e63 --- /dev/null +++ b/vendor/github.com/boltdb/bolt/Makefile @@ -0,0 +1,18 @@ +BRANCH=`git rev-parse --abbrev-ref HEAD` +COMMIT=`git rev-parse --short HEAD` +GOLDFLAGS="-X main.branch $(BRANCH) -X main.commit $(COMMIT)" + +default: build + +race: + @go test -v -race -test.run="TestSimulate_(100op|1000op)" + +# go get github.com/kisielk/errcheck +errcheck: + @errcheck -ignorepkg=bytes -ignore=os:Remove github.com/boltdb/bolt + +test: + @go test -v -cover . + @go test -v ./cmd/bolt + +.PHONY: fmt test diff --git a/vendor/go.etcd.io/bbolt/README.md b/vendor/github.com/boltdb/bolt/README.md similarity index 71% rename from vendor/go.etcd.io/bbolt/README.md rename to vendor/github.com/boltdb/bolt/README.md index f365e51..8523e33 100644 --- a/vendor/go.etcd.io/bbolt/README.md +++ b/vendor/github.com/boltdb/bolt/README.md @@ -1,16 +1,5 @@ -bbolt -===== - -[](https://goreportcard.com/report/go.etcd.io/bbolt) -[](https://pkg.go.dev/go.etcd.io/bbolt) -[](https://github.com/etcd-io/bbolt/releases) -[](https://github.com/etcd-io/bbolt/blob/master/LICENSE) - -bbolt is a fork of [Ben Johnson's][gh_ben] [Bolt][bolt] key/value -store. The purpose of this fork is to provide the Go community with an active -maintenance and development target for Bolt; the goal is improved reliability -and stability. bbolt includes bug fixes, performance enhancements, and features -not found in Bolt while preserving backwards compatibility with the Bolt API. +Bolt [](https://coveralls.io/r/boltdb/bolt?branch=master) [](https://godoc.org/github.com/boltdb/bolt)  +==== Bolt is a pure Go key/value store inspired by [Howard Chu's][hyc_symas] [LMDB project][lmdb]. The goal of the project is to provide a simple, @@ -21,93 +10,60 @@ Since Bolt is meant to be used as such a low-level piece of functionality, simplicity is key. The API will be small and only focus on getting values and setting values. That's it. -[gh_ben]: https://github.com/benbjohnson -[bolt]: https://github.com/boltdb/bolt [hyc_symas]: https://twitter.com/hyc_symas -[lmdb]: https://www.symas.com/symas-embedded-database-lmdb +[lmdb]: http://symas.com/mdb/ ## Project Status -Bolt is stable, the API is fixed, and the file format is fixed. Full unit -test coverage and randomized black box testing are used to ensure database -consistency and thread safety. Bolt is currently used in high-load production -environments serving databases as large as 1TB. Many companies such as -Shopify and Heroku use Bolt-backed services every day. - -## Project versioning - -bbolt uses [semantic versioning](http://semver.org). -API should not change between patch and minor releases. -New minor versions may add additional features to the API. +Bolt is stable and the API is fixed. Full unit test coverage and randomized +black box testing are used to ensure database consistency and thread safety. +Bolt is currently in high-load production environments serving databases as +large as 1TB. Many companies such as Shopify and Heroku use Bolt-backed +services every day. ## Table of Contents - - [Getting Started](#getting-started) - - [Installing](#installing) - - [Opening a database](#opening-a-database) - - [Transactions](#transactions) - - [Read-write transactions](#read-write-transactions) - - [Read-only transactions](#read-only-transactions) - - [Batch read-write transactions](#batch-read-write-transactions) - - [Managing transactions manually](#managing-transactions-manually) - - [Using buckets](#using-buckets) - - [Using key/value pairs](#using-keyvalue-pairs) - - [Autoincrementing integer for the bucket](#autoincrementing-integer-for-the-bucket) - - [Iterating over keys](#iterating-over-keys) - - [Prefix scans](#prefix-scans) - - [Range scans](#range-scans) - - [ForEach()](#foreach) - - [Nested buckets](#nested-buckets) - - [Database backups](#database-backups) - - [Statistics](#statistics) - - [Read-Only Mode](#read-only-mode) - - [Mobile Use (iOS/Android)](#mobile-use-iosandroid) - - [Resources](#resources) - - [Comparison with other databases](#comparison-with-other-databases) - - [Postgres, MySQL, & other relational databases](#postgres-mysql--other-relational-databases) - - [LevelDB, RocksDB](#leveldb-rocksdb) - - [LMDB](#lmdb) - - [Caveats & Limitations](#caveats--limitations) - - [Reading the Source](#reading-the-source) - - [Known Issues](#known-issues) - - [Other Projects Using Bolt](#other-projects-using-bolt) +- [Getting Started](#getting-started) + - [Installing](#installing) + - [Opening a database](#opening-a-database) + - [Transactions](#transactions) + - [Read-write transactions](#read-write-transactions) + - [Read-only transactions](#read-only-transactions) + - [Batch read-write transactions](#batch-read-write-transactions) + - [Managing transactions manually](#managing-transactions-manually) + - [Using buckets](#using-buckets) + - [Using key/value pairs](#using-keyvalue-pairs) + - [Autoincrementing integer for the bucket](#autoincrementing-integer-for-the-bucket) + - [Iterating over keys](#iterating-over-keys) + - [Prefix scans](#prefix-scans) + - [Range scans](#range-scans) + - [ForEach()](#foreach) + - [Nested buckets](#nested-buckets) + - [Database backups](#database-backups) + - [Statistics](#statistics) + - [Read-Only Mode](#read-only-mode) + - [Mobile Use (iOS/Android)](#mobile-use-iosandroid) +- [Resources](#resources) +- [Comparison with other databases](#comparison-with-other-databases) + - [Postgres, MySQL, & other relational databases](#postgres-mysql--other-relational-databases) + - [LevelDB, RocksDB](#leveldb-rocksdb) + - [LMDB](#lmdb) +- [Caveats & Limitations](#caveats--limitations) +- [Reading the Source](#reading-the-source) +- [Other Projects Using Bolt](#other-projects-using-bolt) ## Getting Started ### Installing -To start using `bbolt`, install Go and run `go get`: +To start using Bolt, install Go and run `go get`: + ```sh -$ go get go.etcd.io/bbolt@latest +$ go get github.com/boltdb/bolt/... ``` -This will retrieve the library and update your `go.mod` and `go.sum` files. - -To run the command line utility, execute: -```sh -$ go run go.etcd.io/bbolt/cmd/bbolt@latest -``` - -Run `go install` to install the `bbolt` command line utility into -your `$GOBIN` path, which defaults to `$GOPATH/bin` or `$HOME/go/bin` if the -`GOPATH` environment variable is not set. -```sh -$ go install go.etcd.io/bbolt/cmd/bbolt@latest -``` - -### Importing bbolt - -To use bbolt as an embedded key-value store, import as: - -```go -import bolt "go.etcd.io/bbolt" - -db, err := bolt.Open(path, 0600, nil) -if err != nil { - return err -} -defer db.Close() -``` +This will retrieve the library and install the `bolt` command line utility into +your `$GOBIN` path. ### Opening a database @@ -123,7 +79,7 @@ package main import ( "log" - bolt "go.etcd.io/bbolt" + "github.com/boltdb/bolt" ) func main() { @@ -160,12 +116,11 @@ are not thread safe. To work with data in multiple goroutines you must start a transaction for each one or use locking to ensure only one goroutine accesses a transaction at a time. Creating transaction from the `DB` is thread safe. -Transactions should not depend on one another and generally shouldn't be opened -simultaneously in the same goroutine. This can cause a deadlock as the read-write -transaction needs to periodically re-map the data file but it cannot do so while -any read-only transaction is open. Even a nested read-only transaction can cause -a deadlock, as the child transaction can block the parent transaction from releasing -its resources. +Read-only transactions and read-write transactions should not depend on one +another and generally shouldn't be opened simultaneously in the same goroutine. +This can cause a deadlock as the read-write transaction needs to periodically +re-map the data file but it cannot do so while a read-only transaction is open. + #### Read-write transactions @@ -254,7 +209,7 @@ and then safely close your transaction if an error is returned. This is the recommended way to use Bolt transactions. However, sometimes you may want to manually start and end your transactions. -You can use the `DB.Begin()` function directly but **please** be sure to close +You can use the `Tx.Begin()` function directly but **please** be sure to close the transaction. ```go @@ -284,7 +239,7 @@ should be writable. ### Using buckets Buckets are collections of key/value pairs within the database. All keys in a -bucket must be unique. You can create a bucket using the `Tx.CreateBucket()` +bucket must be unique. You can create a bucket using the `DB.CreateBucket()` function: ```go @@ -297,17 +252,6 @@ db.Update(func(tx *bolt.Tx) error { }) ``` -You can retrieve an existing bucket using the `Tx.Bucket()` function: -```go -db.Update(func(tx *bolt.Tx) error { - b := tx.Bucket([]byte("MyBucket")) - if b == nil { - return errors.New("bucket does not exist") - } - return nil -}) -``` - You can also create a bucket only if it doesn't exist by using the `Tx.CreateBucketIfNotExists()` function. It's a common pattern to call this function for all your top-level buckets after you open your database so you can @@ -315,17 +259,6 @@ guarantee that they exist for future transactions. To delete a bucket, simply call the `Tx.DeleteBucket()` function. -You can also iterate over all existing top-level buckets with `Tx.ForEach()`: - -```go -db.View(func(tx *bolt.Tx) error { - tx.ForEach(func(name []byte, b *bolt.Bucket) error { - fmt.Println(string(name)) - return nil - }) - return nil -}) -``` ### Using key/value pairs @@ -357,17 +290,7 @@ exists then it will return its byte slice value. If it doesn't exist then it will return `nil`. It's important to note that you can have a zero-length value set to a key which is different than the key not existing. -Use the `Bucket.Delete()` function to delete a key from the bucket: - -```go -db.Update(func (tx *bolt.Tx) error { - b := tx.Bucket([]byte("MyBucket")) - err := b.Delete([]byte("answer")) - return err -}) -``` - -This will delete the key `answers` from the bucket `MyBucket`. +Use the `Bucket.Delete()` function to delete a key from the bucket. Please note that values returned from `Get()` are only valid while the transaction is open. If you need to use a value outside of the transaction @@ -452,19 +375,10 @@ Prev() Move to the previous key. ``` Each of those functions has a return signature of `(key []byte, value []byte)`. -You must seek to a position using `First()`, `Last()`, or `Seek()` before calling -`Next()` or `Prev()`. If you do not seek to a position then these functions will -return a `nil` key. - -When you have iterated to the end of the cursor, then `Next()` will return a -`nil` key and the cursor still points to the last element if present. When you -have iterated to the beginning of the cursor, then `Prev()` will return a `nil` -key and the cursor still points to the first element if present. - -If you remove key/value pairs during iteration, the cursor may automatically -move to the next position if present in current node each time removing a key. -When you call `c.Next()` after removing a key, it may skip one key/value pair. -Refer to [pull/611](https://github.com/etcd-io/bbolt/pull/611) to get more detailed info. +When you have iterated to the end of the cursor then `Next()` will return a +`nil` key. You must seek to a position using `First()`, `Last()`, or `Seek()` +before calling `Next()` or `Prev()`. If you do not seek to a position then +these functions will return a `nil` key. During iteration, if the key is non-`nil` but the value is `nil`, that means the key refers to a bucket rather than a value. Use `Bucket.Bucket()` to @@ -481,7 +395,7 @@ db.View(func(tx *bolt.Tx) error { c := tx.Bucket([]byte("MyBucket")).Cursor() prefix := []byte("1234") - for k, v := c.Seek(prefix); k != nil && bytes.HasPrefix(k, prefix); k, v = c.Next() { + for k, v := c.Seek(prefix); bytes.HasPrefix(k, prefix); k, v = c.Next() { fmt.Printf("key=%s, value=%s\n", k, v) } @@ -534,10 +448,6 @@ db.View(func(tx *bolt.Tx) error { }) ``` -Please note that keys and values in `ForEach()` are only valid while -the transaction is open. If you need to use a key or value outside of -the transaction, you must use `copy()` to copy it to another byte -slice. ### Nested buckets @@ -550,55 +460,6 @@ func (*Bucket) CreateBucketIfNotExists(key []byte) (*Bucket, error) func (*Bucket) DeleteBucket(key []byte) error ``` -Say you had a multi-tenant application where the root level bucket was the account bucket. Inside of this bucket was a sequence of accounts which themselves are buckets. And inside the sequence bucket you could have many buckets pertaining to the Account itself (Users, Notes, etc) isolating the information into logical groupings. - -```go - -// createUser creates a new user in the given account. -func createUser(accountID int, u *User) error { - // Start the transaction. - tx, err := db.Begin(true) - if err != nil { - return err - } - defer tx.Rollback() - - // Retrieve the root bucket for the account. - // Assume this has already been created when the account was set up. - root := tx.Bucket([]byte(strconv.FormatUint(accountID, 10))) - - // Setup the users bucket. - bkt, err := root.CreateBucketIfNotExists([]byte("USERS")) - if err != nil { - return err - } - - // Generate an ID for the new user. - userID, err := bkt.NextSequence() - if err != nil { - return err - } - u.ID = userID - - // Marshal and save the encoded user. - if buf, err := json.Marshal(u); err != nil { - return err - } else if err := bkt.Put([]byte(strconv.FormatUint(u.ID, 10)), buf); err != nil { - return err - } - - // Commit the transaction. - if err := tx.Commit(); err != nil { - return err - } - - return nil -} - -``` - - - ### Database backups @@ -608,7 +469,7 @@ this from a read-only transaction, it will perform a hot backup and not block your other database reads and writes. By default, it will use a regular file handle which will utilize the operating -system's page cache. See the [`Tx`](https://godoc.org/go.etcd.io/bbolt#Tx) +system's page cache. See the [`Tx`](https://godoc.org/github.com/boltdb/bolt#Tx) documentation for information about optimizing for larger-than-RAM datasets. One common use case is to backup over HTTP so you can use tools like `cURL` to @@ -685,7 +546,7 @@ uses a shared lock to allow multiple processes to read from the database but it will block any processes from opening the database in read-write mode. ```go -db, err := bolt.Open("my.db", 0600, &bolt.Options{ReadOnly: true}) +db, err := bolt.Open("my.db", 0666, &bolt.Options{ReadOnly: true}) if err != nil { log.Fatal(err) } @@ -854,9 +715,6 @@ Here are a few things to note when evaluating and using Bolt: can be reused by a new page or can be unmapped from virtual memory and you'll see an `unexpected fault address` panic when accessing it. -* Bolt uses an exclusive write lock on the database file so it cannot be - shared by multiple processes. - * Be careful when using `Bucket.FillPercent`. Setting a high fill percent for buckets that have random inserts will cause your database to have very poor page utilization. @@ -890,12 +748,6 @@ Here are a few things to note when evaluating and using Bolt: to grow. However, it's important to note that deleting large chunks of data will not allow you to reclaim that space on disk. -* Removing key/values pairs in a bucket during iteration on the bucket using - cursor may not work properly. Each time when removing a key/value pair, the - cursor may automatically move to the next position if present. When users - call `c.Next()` after removing a key, it may skip one key/value pair. - Refer to https://github.com/etcd-io/bbolt/pull/611 for more detailed info. - For more information on page allocation, [see this comment][page-allocation]. [page-allocation]: https://github.com/boltdb/bolt/issues/308#issuecomment-74811638 @@ -903,7 +755,7 @@ Here are a few things to note when evaluating and using Bolt: ## Reading the Source -Bolt is a relatively small code base (<5KLOC) for an embedded, serializable, +Bolt is a relatively small code base (<3KLOC) for an embedded, serializable, transactional key/value database so it can be a good starting point for people interested in how databases work. @@ -921,7 +773,7 @@ The best places to start are the main entry points into Bolt: - `Bucket.Put()` - Writes a key/value pair into a bucket. After validating the arguments, a cursor is used to traverse the B+tree to the page and position - where the key & value will be written. Once the position is found, the bucket + where they key & value will be written. Once the position is found, the bucket materializes the underlying page and the page's parent pages into memory as "nodes". These nodes are where mutations occur during read-write transactions. These changes get flushed to disk during commit. @@ -950,83 +802,51 @@ The best places to start are the main entry points into Bolt: If you have additional notes that could be helpful for others, please submit them via pull request. -## Known Issues - -- bbolt might run into data corruption issue on Linux when the feature - [ext4: fast commit](https://lwn.net/Articles/842385/), which was introduced in - linux kernel version v5.10, is enabled. The fixes to the issue were included in - linux kernel version v5.17, please refer to links below, - - * [ext4: fast commit may miss tracking unwritten range during ftruncate](https://lore.kernel.org/linux-ext4/20211223032337.5198-3-yinxin.x@bytedance.com/) - * [ext4: fast commit may not fallback for ineligible commit](https://lore.kernel.org/lkml/202201091544.W5HHEXAp-lkp@intel.com/T/#ma0768815e4b5f671e9e451d578256ef9a76fe30e) - * [ext4 updates for 5.17](https://lore.kernel.org/lkml/YdyxjTFaLWif6BCM@mit.edu/) - - Please also refer to the discussion in https://github.com/etcd-io/bbolt/issues/562. - -- Writing a value with a length of 0 will always result in reading back an empty `[]byte{}` value. - Please refer to [issues/726#issuecomment-2061694802](https://github.com/etcd-io/bbolt/issues/726#issuecomment-2061694802). ## Other Projects Using Bolt Below is a list of public, open source projects that use Bolt: -* [Algernon](https://github.com/xyproto/algernon) - A HTTP/2 web server with built-in support for Lua. Uses BoltDB as the default database backend. -* [Bazil](https://bazil.org/) - A file system that lets your data reside where it is most convenient for it to reside. -* [bolter](https://github.com/hasit/bolter) - Command-line app for viewing BoltDB file in your terminal. -* [boltcli](https://github.com/spacewander/boltcli) - the redis-cli for boltdb with Lua script support. -* [BoltHold](https://github.com/timshannon/bolthold) - An embeddable NoSQL store for Go types built on BoltDB -* [BoltStore](https://github.com/yosssi/boltstore) - Session store using Bolt. -* [Boltdb Boilerplate](https://github.com/bobintornado/boltdb-boilerplate) - Boilerplate wrapper around bolt aiming to make simple calls one-liners. * [BoltDbWeb](https://github.com/evnix/boltdbweb) - A web based GUI for BoltDB files. -* [BoltDB Viewer](https://github.com/zc310/rich_boltdb) - A BoltDB Viewer Can run on Windows、Linux、Android system. -* [bleve](http://www.blevesearch.com/) - A pure Go search engine similar to ElasticSearch that uses Bolt as the default storage backend. -* [bstore](https://github.com/mjl-/bstore) - Database library storing Go values, with referential/unique/nonzero constraints, indices, automatic schema management with struct tags, and a query API. -* [btcwallet](https://github.com/btcsuite/btcwallet) - A bitcoin wallet. -* [buckets](https://github.com/joyrexus/buckets) - a bolt wrapper streamlining - simple tx and key scans. -* [Buildkit](https://github.com/moby/buildkit) - concurrent, cache-efficient, and Dockerfile-agnostic builder toolkit -* [cayley](https://github.com/google/cayley) - Cayley is an open-source graph database using Bolt as optional backend. -* [ChainStore](https://github.com/pressly/chainstore) - Simple key-value interface to a variety of storage engines organized as a chain of operations. -* [🌰 Chestnut](https://github.com/jrapoport/chestnut) - Chestnut is encrypted storage for Go. -* [Consul](https://github.com/hashicorp/consul) - Consul is service discovery and configuration made easy. Distributed, highly available, and datacenter-aware. -* [Containerd](https://github.com/containerd/containerd) - An open and reliable container runtime +* [Operation Go: A Routine Mission](http://gocode.io) - An online programming game for Golang using Bolt for user accounts and a leaderboard. +* [Bazil](https://bazil.org/) - A file system that lets your data reside where it is most convenient for it to reside. * [DVID](https://github.com/janelia-flyem/dvid) - Added Bolt as optional storage engine and testing it against Basho-tuned leveldb. -* [dcrwallet](https://github.com/decred/dcrwallet) - A wallet for the Decred cryptocurrency. -* [drive](https://github.com/odeke-em/drive) - drive is an unofficial Google Drive command line client for \*NIX operating systems. -* [event-shuttle](https://github.com/sclasen/event-shuttle) - A Unix system service to collect and reliably deliver messages to Kafka. -* [Freehold](http://tshannon.bitbucket.org/freehold/) - An open, secure, and lightweight platform for your files and data. -* [Go Report Card](https://goreportcard.com/) - Go code quality report cards as a (free and open source) service. -* [GoWebApp](https://github.com/josephspurrier/gowebapp) - A basic MVC web application in Go using BoltDB. -* [GoShort](https://github.com/pankajkhairnar/goShort) - GoShort is a URL shortener written in Golang and BoltDB for persistent key/value storage and for routing it's using high performent HTTPRouter. -* [gopherpit](https://github.com/gopherpit/gopherpit) - A web service to manage Go remote import paths with custom domains -* [gokv](https://github.com/philippgille/gokv) - Simple key-value store abstraction and implementations for Go (Redis, Consul, etcd, bbolt, BadgerDB, LevelDB, Memcached, DynamoDB, S3, PostgreSQL, MongoDB, CockroachDB and many more) -* [Gitchain](https://github.com/gitchain/gitchain) - Decentralized, peer-to-peer Git repositories aka "Git meets Bitcoin". -* [InfluxDB](https://influxdata.com) - Scalable datastore for metrics, events, and real-time analytics. -* [ipLocator](https://github.com/AndreasBriese/ipLocator) - A fast ip-geo-location-server using bolt with bloom filters. -* [ipxed](https://github.com/kelseyhightower/ipxed) - Web interface and api for ipxed. -* [Ironsmith](https://github.com/timshannon/ironsmith) - A simple, script-driven continuous integration (build - > test -> release) tool, with no external dependencies -* [Kala](https://github.com/ajvb/kala) - Kala is a modern job scheduler optimized to run on a single node. It is persistent, JSON over HTTP API, ISO 8601 duration notation, and dependent jobs. -* [Key Value Access Language (KVAL)](https://github.com/kval-access-language) - A proposed grammar for key-value datastores offering a bbolt binding. -* [LedisDB](https://github.com/siddontang/ledisdb) - A high performance NoSQL, using Bolt as optional storage. -* [lru](https://github.com/crowdriff/lru) - Easy to use Bolt-backed Least-Recently-Used (LRU) read-through cache with chainable remote stores. -* [mbuckets](https://github.com/abhigupta912/mbuckets) - A Bolt wrapper that allows easy operations on multi level (nested) buckets. -* [MetricBase](https://github.com/msiebuhr/MetricBase) - Single-binary version of Graphite. -* [MuLiFS](https://github.com/dankomiocevic/mulifs) - Music Library Filesystem creates a filesystem to organise your music files. -* [NATS](https://github.com/nats-io/nats-streaming-server) - NATS Streaming uses bbolt for message and metadata storage. -* [Portainer](https://github.com/portainer/portainer) - A lightweight service delivery platform for containerized applications that can be used to manage Docker, Swarm, Kubernetes and ACI environments. -* [Prometheus Annotation Server](https://github.com/oliver006/prom_annotation_server) - Annotation server for PromDash & Prometheus service monitoring system. -* [Rain](https://github.com/cenkalti/rain) - BitTorrent client and library. -* [reef-pi](https://github.com/reef-pi/reef-pi) - reef-pi is an award winning, modular, DIY reef tank controller using easy to learn electronics based on a Raspberry Pi. -* [Request Baskets](https://github.com/darklynx/request-baskets) - A web service to collect arbitrary HTTP requests and inspect them via REST API or simple web UI, similar to [RequestBin](http://requestb.in/) service -* [Seaweed File System](https://github.com/chrislusf/seaweedfs) - Highly scalable distributed key~file system with O(1) disk read. -* [stow](https://github.com/djherbis/stow) - a persistence manager for objects - backed by boltdb. -* [Storm](https://github.com/asdine/storm) - Simple and powerful ORM for BoltDB. -* [SimpleBolt](https://github.com/xyproto/simplebolt) - A simple way to use BoltDB. Deals mainly with strings. * [Skybox Analytics](https://github.com/skybox/skybox) - A standalone funnel analysis tool for web analytics. * [Scuttlebutt](https://github.com/benbjohnson/scuttlebutt) - Uses Bolt to store and process all Twitter mentions of GitHub projects. -* [tentacool](https://github.com/optiflows/tentacool) - REST api server to manage system stuff (IP, DNS, Gateway...) on a linux server. -* [torrent](https://github.com/anacrolix/torrent) - Full-featured BitTorrent client package and utilities in Go. BoltDB is a storage backend in development. * [Wiki](https://github.com/peterhellberg/wiki) - A tiny wiki using Goji, BoltDB and Blackfriday. +* [ChainStore](https://github.com/pressly/chainstore) - Simple key-value interface to a variety of storage engines organized as a chain of operations. +* [MetricBase](https://github.com/msiebuhr/MetricBase) - Single-binary version of Graphite. +* [Gitchain](https://github.com/gitchain/gitchain) - Decentralized, peer-to-peer Git repositories aka "Git meets Bitcoin". +* [event-shuttle](https://github.com/sclasen/event-shuttle) - A Unix system service to collect and reliably deliver messages to Kafka. +* [ipxed](https://github.com/kelseyhightower/ipxed) - Web interface and api for ipxed. +* [BoltStore](https://github.com/yosssi/boltstore) - Session store using Bolt. +* [photosite/session](https://godoc.org/bitbucket.org/kardianos/photosite/session) - Sessions for a photo viewing site. +* [LedisDB](https://github.com/siddontang/ledisdb) - A high performance NoSQL, using Bolt as optional storage. +* [ipLocator](https://github.com/AndreasBriese/ipLocator) - A fast ip-geo-location-server using bolt with bloom filters. +* [cayley](https://github.com/google/cayley) - Cayley is an open-source graph database using Bolt as optional backend. +* [bleve](http://www.blevesearch.com/) - A pure Go search engine similar to ElasticSearch that uses Bolt as the default storage backend. +* [tentacool](https://github.com/optiflows/tentacool) - REST api server to manage system stuff (IP, DNS, Gateway...) on a linux server. +* [Seaweed File System](https://github.com/chrislusf/seaweedfs) - Highly scalable distributed key~file system with O(1) disk read. +* [InfluxDB](https://influxdata.com) - Scalable datastore for metrics, events, and real-time analytics. +* [Freehold](http://tshannon.bitbucket.org/freehold/) - An open, secure, and lightweight platform for your files and data. +* [Prometheus Annotation Server](https://github.com/oliver006/prom_annotation_server) - Annotation server for PromDash & Prometheus service monitoring system. +* [Consul](https://github.com/hashicorp/consul) - Consul is service discovery and configuration made easy. Distributed, highly available, and datacenter-aware. +* [Kala](https://github.com/ajvb/kala) - Kala is a modern job scheduler optimized to run on a single node. It is persistent, JSON over HTTP API, ISO 8601 duration notation, and dependent jobs. +* [drive](https://github.com/odeke-em/drive) - drive is an unofficial Google Drive command line client for \*NIX operating systems. +* [stow](https://github.com/djherbis/stow) - a persistence manager for objects + backed by boltdb. +* [buckets](https://github.com/joyrexus/buckets) - a bolt wrapper streamlining + simple tx and key scans. +* [mbuckets](https://github.com/abhigupta912/mbuckets) - A Bolt wrapper that allows easy operations on multi level (nested) buckets. +* [Request Baskets](https://github.com/darklynx/request-baskets) - A web service to collect arbitrary HTTP requests and inspect them via REST API or simple web UI, similar to [RequestBin](http://requestb.in/) service +* [Go Report Card](https://goreportcard.com/) - Go code quality report cards as a (free and open source) service. +* [Boltdb Boilerplate](https://github.com/bobintornado/boltdb-boilerplate) - Boilerplate wrapper around bolt aiming to make simple calls one-liners. +* [lru](https://github.com/crowdriff/lru) - Easy to use Bolt-backed Least-Recently-Used (LRU) read-through cache with chainable remote stores. +* [Storm](https://github.com/asdine/storm) - Simple and powerful ORM for BoltDB. +* [GoWebApp](https://github.com/josephspurrier/gowebapp) - A basic MVC web application in Go using BoltDB. +* [SimpleBolt](https://github.com/xyproto/simplebolt) - A simple way to use BoltDB. Deals mainly with strings. +* [Algernon](https://github.com/xyproto/algernon) - A HTTP/2 web server with built-in support for Lua. Uses BoltDB as the default database backend. +* [MuLiFS](https://github.com/dankomiocevic/mulifs) - Music Library Filesystem creates a filesystem to organise your music files. +* [GoShort](https://github.com/pankajkhairnar/goShort) - GoShort is a URL shortener written in Golang and BoltDB for persistent key/value storage and for routing it's using high performent HTTPRouter. If you are using Bolt in a project please send a pull request to add it to the list. diff --git a/vendor/github.com/boltdb/bolt/appveyor.yml b/vendor/github.com/boltdb/bolt/appveyor.yml new file mode 100644 index 0000000..6e26e94 --- /dev/null +++ b/vendor/github.com/boltdb/bolt/appveyor.yml @@ -0,0 +1,18 @@ +version: "{build}" + +os: Windows Server 2012 R2 + +clone_folder: c:\gopath\src\github.com\boltdb\bolt + +environment: + GOPATH: c:\gopath + +install: + - echo %PATH% + - echo %GOPATH% + - go version + - go env + - go get -v -t ./... + +build_script: + - go test -v ./... diff --git a/vendor/github.com/boltdb/bolt/bolt_386.go b/vendor/github.com/boltdb/bolt/bolt_386.go new file mode 100644 index 0000000..e659bfb --- /dev/null +++ b/vendor/github.com/boltdb/bolt/bolt_386.go @@ -0,0 +1,7 @@ +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0x7FFFFFFF // 2GB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0xFFFFFFF diff --git a/vendor/github.com/boltdb/bolt/bolt_amd64.go b/vendor/github.com/boltdb/bolt/bolt_amd64.go new file mode 100644 index 0000000..cca6b7e --- /dev/null +++ b/vendor/github.com/boltdb/bolt/bolt_amd64.go @@ -0,0 +1,7 @@ +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0xFFFFFFFFFFFF // 256TB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0x7FFFFFFF diff --git a/vendor/github.com/boltdb/bolt/bolt_arm.go b/vendor/github.com/boltdb/bolt/bolt_arm.go new file mode 100644 index 0000000..e659bfb --- /dev/null +++ b/vendor/github.com/boltdb/bolt/bolt_arm.go @@ -0,0 +1,7 @@ +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0x7FFFFFFF // 2GB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0xFFFFFFF diff --git a/vendor/github.com/boltdb/bolt/bolt_arm64.go b/vendor/github.com/boltdb/bolt/bolt_arm64.go new file mode 100644 index 0000000..6d23093 --- /dev/null +++ b/vendor/github.com/boltdb/bolt/bolt_arm64.go @@ -0,0 +1,9 @@ +// +build arm64 + +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0xFFFFFFFFFFFF // 256TB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0x7FFFFFFF diff --git a/vendor/go.etcd.io/bbolt/bolt_linux.go b/vendor/github.com/boltdb/bolt/bolt_linux.go similarity index 91% rename from vendor/go.etcd.io/bbolt/bolt_linux.go rename to vendor/github.com/boltdb/bolt/bolt_linux.go index 7707bca..2b67666 100644 --- a/vendor/go.etcd.io/bbolt/bolt_linux.go +++ b/vendor/github.com/boltdb/bolt/bolt_linux.go @@ -1,4 +1,4 @@ -package bbolt +package bolt import ( "syscall" diff --git a/vendor/github.com/boltdb/bolt/bolt_openbsd.go b/vendor/github.com/boltdb/bolt/bolt_openbsd.go new file mode 100644 index 0000000..7058c3d --- /dev/null +++ b/vendor/github.com/boltdb/bolt/bolt_openbsd.go @@ -0,0 +1,27 @@ +package bolt + +import ( + "syscall" + "unsafe" +) + +const ( + msAsync = 1 << iota // perform asynchronous writes + msSync // perform synchronous writes + msInvalidate // invalidate cached data +) + +func msync(db *DB) error { + _, _, errno := syscall.Syscall(syscall.SYS_MSYNC, uintptr(unsafe.Pointer(db.data)), uintptr(db.datasz), msInvalidate) + if errno != 0 { + return errno + } + return nil +} + +func fdatasync(db *DB) error { + if db.data != nil { + return msync(db) + } + return db.file.Sync() +} diff --git a/vendor/github.com/boltdb/bolt/bolt_ppc.go b/vendor/github.com/boltdb/bolt/bolt_ppc.go new file mode 100644 index 0000000..645ddc3 --- /dev/null +++ b/vendor/github.com/boltdb/bolt/bolt_ppc.go @@ -0,0 +1,9 @@ +// +build ppc + +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0x7FFFFFFF // 2GB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0xFFFFFFF diff --git a/vendor/github.com/boltdb/bolt/bolt_ppc64.go b/vendor/github.com/boltdb/bolt/bolt_ppc64.go new file mode 100644 index 0000000..2dc6be0 --- /dev/null +++ b/vendor/github.com/boltdb/bolt/bolt_ppc64.go @@ -0,0 +1,9 @@ +// +build ppc64 + +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0xFFFFFFFFFFFF // 256TB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0x7FFFFFFF diff --git a/vendor/github.com/boltdb/bolt/bolt_ppc64le.go b/vendor/github.com/boltdb/bolt/bolt_ppc64le.go new file mode 100644 index 0000000..8351e12 --- /dev/null +++ b/vendor/github.com/boltdb/bolt/bolt_ppc64le.go @@ -0,0 +1,9 @@ +// +build ppc64le + +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0xFFFFFFFFFFFF // 256TB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0x7FFFFFFF diff --git a/vendor/github.com/boltdb/bolt/bolt_s390x.go b/vendor/github.com/boltdb/bolt/bolt_s390x.go new file mode 100644 index 0000000..f4dd26b --- /dev/null +++ b/vendor/github.com/boltdb/bolt/bolt_s390x.go @@ -0,0 +1,9 @@ +// +build s390x + +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0xFFFFFFFFFFFF // 256TB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0x7FFFFFFF diff --git a/vendor/github.com/boltdb/bolt/bolt_unix.go b/vendor/github.com/boltdb/bolt/bolt_unix.go new file mode 100644 index 0000000..cad62dd --- /dev/null +++ b/vendor/github.com/boltdb/bolt/bolt_unix.go @@ -0,0 +1,89 @@ +// +build !windows,!plan9,!solaris + +package bolt + +import ( + "fmt" + "os" + "syscall" + "time" + "unsafe" +) + +// flock acquires an advisory lock on a file descriptor. +func flock(db *DB, mode os.FileMode, exclusive bool, timeout time.Duration) error { + var t time.Time + for { + // If we're beyond our timeout then return an error. + // This can only occur after we've attempted a flock once. + if t.IsZero() { + t = time.Now() + } else if timeout > 0 && time.Since(t) > timeout { + return ErrTimeout + } + flag := syscall.LOCK_SH + if exclusive { + flag = syscall.LOCK_EX + } + + // Otherwise attempt to obtain an exclusive lock. + err := syscall.Flock(int(db.file.Fd()), flag|syscall.LOCK_NB) + if err == nil { + return nil + } else if err != syscall.EWOULDBLOCK { + return err + } + + // Wait for a bit and try again. + time.Sleep(50 * time.Millisecond) + } +} + +// funlock releases an advisory lock on a file descriptor. +func funlock(db *DB) error { + return syscall.Flock(int(db.file.Fd()), syscall.LOCK_UN) +} + +// mmap memory maps a DB's data file. +func mmap(db *DB, sz int) error { + // Map the data file to memory. + b, err := syscall.Mmap(int(db.file.Fd()), 0, sz, syscall.PROT_READ, syscall.MAP_SHARED|db.MmapFlags) + if err != nil { + return err + } + + // Advise the kernel that the mmap is accessed randomly. + if err := madvise(b, syscall.MADV_RANDOM); err != nil { + return fmt.Errorf("madvise: %s", err) + } + + // Save the original byte slice and convert to a byte array pointer. + db.dataref = b + db.data = (*[maxMapSize]byte)(unsafe.Pointer(&b[0])) + db.datasz = sz + return nil +} + +// munmap unmaps a DB's data file from memory. +func munmap(db *DB) error { + // Ignore the unmap if we have no mapped data. + if db.dataref == nil { + return nil + } + + // Unmap using the original byte slice. + err := syscall.Munmap(db.dataref) + db.dataref = nil + db.data = nil + db.datasz = 0 + return err +} + +// NOTE: This function is copied from stdlib because it is not available on darwin. +func madvise(b []byte, advice int) (err error) { + _, _, e1 := syscall.Syscall(syscall.SYS_MADVISE, uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = e1 + } + return +} diff --git a/vendor/go.etcd.io/bbolt/bolt_solaris.go b/vendor/github.com/boltdb/bolt/bolt_unix_solaris.go similarity index 67% rename from vendor/go.etcd.io/bbolt/bolt_solaris.go rename to vendor/github.com/boltdb/bolt/bolt_unix_solaris.go index 56b2cca..307bf2b 100644 --- a/vendor/go.etcd.io/bbolt/bolt_solaris.go +++ b/vendor/github.com/boltdb/bolt/bolt_unix_solaris.go @@ -1,46 +1,46 @@ -package bbolt +package bolt import ( "fmt" + "os" "syscall" "time" "unsafe" "golang.org/x/sys/unix" - - "go.etcd.io/bbolt/internal/common" ) // flock acquires an advisory lock on a file descriptor. -func flock(db *DB, exclusive bool, timeout time.Duration) error { +func flock(db *DB, mode os.FileMode, exclusive bool, timeout time.Duration) error { var t time.Time - if timeout != 0 { - t = time.Now() - } - fd := db.file.Fd() - var lockType int16 - if exclusive { - lockType = syscall.F_WRLCK - } else { - lockType = syscall.F_RDLCK - } for { - // Attempt to obtain an exclusive lock. - lock := syscall.Flock_t{Type: lockType} - err := syscall.FcntlFlock(fd, syscall.F_SETLK, &lock) + // If we're beyond our timeout then return an error. + // This can only occur after we've attempted a flock once. + if t.IsZero() { + t = time.Now() + } else if timeout > 0 && time.Since(t) > timeout { + return ErrTimeout + } + var lock syscall.Flock_t + lock.Start = 0 + lock.Len = 0 + lock.Pid = 0 + lock.Whence = 0 + lock.Pid = 0 + if exclusive { + lock.Type = syscall.F_WRLCK + } else { + lock.Type = syscall.F_RDLCK + } + err := syscall.FcntlFlock(db.file.Fd(), syscall.F_SETLK, &lock) if err == nil { return nil } else if err != syscall.EAGAIN { return err } - // If we timed out then return an error. - if timeout != 0 && time.Since(t) > timeout-flockRetryTimeout { - return ErrTimeout - } - // Wait for a bit and try again. - time.Sleep(flockRetryTimeout) + time.Sleep(50 * time.Millisecond) } } @@ -69,7 +69,7 @@ func mmap(db *DB, sz int) error { // Save the original byte slice and convert to a byte array pointer. db.dataref = b - db.data = (*[common.MaxMapSize]byte)(unsafe.Pointer(&b[0])) + db.data = (*[maxMapSize]byte)(unsafe.Pointer(&b[0])) db.datasz = sz return nil } diff --git a/vendor/github.com/boltdb/bolt/bolt_windows.go b/vendor/github.com/boltdb/bolt/bolt_windows.go new file mode 100644 index 0000000..b00fb07 --- /dev/null +++ b/vendor/github.com/boltdb/bolt/bolt_windows.go @@ -0,0 +1,144 @@ +package bolt + +import ( + "fmt" + "os" + "syscall" + "time" + "unsafe" +) + +// LockFileEx code derived from golang build filemutex_windows.go @ v1.5.1 +var ( + modkernel32 = syscall.NewLazyDLL("kernel32.dll") + procLockFileEx = modkernel32.NewProc("LockFileEx") + procUnlockFileEx = modkernel32.NewProc("UnlockFileEx") +) + +const ( + lockExt = ".lock" + + // see https://msdn.microsoft.com/en-us/library/windows/desktop/aa365203(v=vs.85).aspx + flagLockExclusive = 2 + flagLockFailImmediately = 1 + + // see https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx + errLockViolation syscall.Errno = 0x21 +) + +func lockFileEx(h syscall.Handle, flags, reserved, locklow, lockhigh uint32, ol *syscall.Overlapped) (err error) { + r, _, err := procLockFileEx.Call(uintptr(h), uintptr(flags), uintptr(reserved), uintptr(locklow), uintptr(lockhigh), uintptr(unsafe.Pointer(ol))) + if r == 0 { + return err + } + return nil +} + +func unlockFileEx(h syscall.Handle, reserved, locklow, lockhigh uint32, ol *syscall.Overlapped) (err error) { + r, _, err := procUnlockFileEx.Call(uintptr(h), uintptr(reserved), uintptr(locklow), uintptr(lockhigh), uintptr(unsafe.Pointer(ol)), 0) + if r == 0 { + return err + } + return nil +} + +// fdatasync flushes written data to a file descriptor. +func fdatasync(db *DB) error { + return db.file.Sync() +} + +// flock acquires an advisory lock on a file descriptor. +func flock(db *DB, mode os.FileMode, exclusive bool, timeout time.Duration) error { + // Create a separate lock file on windows because a process + // cannot share an exclusive lock on the same file. This is + // needed during Tx.WriteTo(). + f, err := os.OpenFile(db.path+lockExt, os.O_CREATE, mode) + if err != nil { + return err + } + db.lockfile = f + + var t time.Time + for { + // If we're beyond our timeout then return an error. + // This can only occur after we've attempted a flock once. + if t.IsZero() { + t = time.Now() + } else if timeout > 0 && time.Since(t) > timeout { + return ErrTimeout + } + + var flag uint32 = flagLockFailImmediately + if exclusive { + flag |= flagLockExclusive + } + + err := lockFileEx(syscall.Handle(db.lockfile.Fd()), flag, 0, 1, 0, &syscall.Overlapped{}) + if err == nil { + return nil + } else if err != errLockViolation { + return err + } + + // Wait for a bit and try again. + time.Sleep(50 * time.Millisecond) + } +} + +// funlock releases an advisory lock on a file descriptor. +func funlock(db *DB) error { + err := unlockFileEx(syscall.Handle(db.lockfile.Fd()), 0, 1, 0, &syscall.Overlapped{}) + db.lockfile.Close() + os.Remove(db.path + lockExt) + return err +} + +// mmap memory maps a DB's data file. +// Based on: https://github.com/edsrzf/mmap-go +func mmap(db *DB, sz int) error { + if !db.readOnly { + // Truncate the database to the size of the mmap. + if err := db.file.Truncate(int64(sz)); err != nil { + return fmt.Errorf("truncate: %s", err) + } + } + + // Open a file mapping handle. + sizelo := uint32(sz >> 32) + sizehi := uint32(sz) & 0xffffffff + h, errno := syscall.CreateFileMapping(syscall.Handle(db.file.Fd()), nil, syscall.PAGE_READONLY, sizelo, sizehi, nil) + if h == 0 { + return os.NewSyscallError("CreateFileMapping", errno) + } + + // Create the memory map. + addr, errno := syscall.MapViewOfFile(h, syscall.FILE_MAP_READ, 0, 0, uintptr(sz)) + if addr == 0 { + return os.NewSyscallError("MapViewOfFile", errno) + } + + // Close mapping handle. + if err := syscall.CloseHandle(syscall.Handle(h)); err != nil { + return os.NewSyscallError("CloseHandle", err) + } + + // Convert to a byte array. + db.data = ((*[maxMapSize]byte)(unsafe.Pointer(addr))) + db.datasz = sz + + return nil +} + +// munmap unmaps a pointer from a file. +// Based on: https://github.com/edsrzf/mmap-go +func munmap(db *DB) error { + if db.data == nil { + return nil + } + + addr := (uintptr)(unsafe.Pointer(&db.data[0])) + if err := syscall.UnmapViewOfFile(addr); err != nil { + return os.NewSyscallError("UnmapViewOfFile", err) + } + return nil +} diff --git a/vendor/go.etcd.io/bbolt/boltsync_unix.go b/vendor/github.com/boltdb/bolt/boltsync_unix.go similarity index 63% rename from vendor/go.etcd.io/bbolt/boltsync_unix.go rename to vendor/github.com/boltdb/bolt/boltsync_unix.go index 27face7..f504425 100644 --- a/vendor/go.etcd.io/bbolt/boltsync_unix.go +++ b/vendor/github.com/boltdb/bolt/boltsync_unix.go @@ -1,6 +1,6 @@ -//go:build !windows && !plan9 && !linux && !openbsd +// +build !windows,!plan9,!linux,!openbsd -package bbolt +package bolt // fdatasync flushes written data to a file descriptor. func fdatasync(db *DB) error { diff --git a/vendor/go.etcd.io/bbolt/bucket.go b/vendor/github.com/boltdb/bolt/bucket.go similarity index 50% rename from vendor/go.etcd.io/bbolt/bucket.go rename to vendor/github.com/boltdb/bolt/bucket.go index 6371ace..d2f8c52 100644 --- a/vendor/go.etcd.io/bbolt/bucket.go +++ b/vendor/github.com/boltdb/bolt/bucket.go @@ -1,12 +1,9 @@ -package bbolt +package bolt import ( "bytes" "fmt" "unsafe" - - "go.etcd.io/bbolt/errors" - "go.etcd.io/bbolt/internal/common" ) const ( @@ -17,6 +14,15 @@ const ( MaxValueSize = (1 << 31) - 2 ) +const ( + maxUint = ^uint(0) + minUint = 0 + maxInt = int(^uint(0) >> 1) + minInt = -maxInt - 1 +) + +const bucketHeaderSize = int(unsafe.Sizeof(bucket{})) + const ( minFillPercent = 0.1 maxFillPercent = 1.0 @@ -28,12 +34,12 @@ const DefaultFillPercent = 0.5 // Bucket represents a collection of key/value pairs inside the database. type Bucket struct { - *common.InBucket - tx *Tx // the associated transaction - buckets map[string]*Bucket // subbucket cache - page *common.Page // inline page reference - rootNode *node // materialized node for the root page. - nodes map[common.Pgid]*node // node cache + *bucket + tx *Tx // the associated transaction + buckets map[string]*Bucket // subbucket cache + page *page // inline page reference + rootNode *node // materialized node for the root page. + nodes map[pgid]*node // node cache // Sets the threshold for filling nodes when they split. By default, // the bucket will fill to 50% but it can be useful to increase this @@ -43,12 +49,21 @@ type Bucket struct { FillPercent float64 } +// bucket represents the on-file representation of a bucket. +// This is stored as the "value" of a bucket key. If the bucket is small enough, +// then its root page can be stored inline in the "value", after the bucket +// header. In the case of inline buckets, the "root" will be 0. +type bucket struct { + root pgid // page id of the bucket's root-level page + sequence uint64 // monotonically incrementing, used by NextSequence() +} + // newBucket returns a new bucket associated with a transaction. func newBucket(tx *Tx) Bucket { var b = Bucket{tx: tx, FillPercent: DefaultFillPercent} if tx.writable { b.buckets = make(map[string]*Bucket) - b.nodes = make(map[common.Pgid]*node) + b.nodes = make(map[pgid]*node) } return b } @@ -59,8 +74,8 @@ func (b *Bucket) Tx() *Tx { } // Root returns the root of the bucket. -func (b *Bucket) Root() common.Pgid { - return b.RootPage() +func (b *Bucket) Root() pgid { + return b.root } // Writable returns whether the bucket is writable. @@ -73,7 +88,7 @@ func (b *Bucket) Writable() bool { // Do not use a cursor after the transaction is closed. func (b *Bucket) Cursor() *Cursor { // Update transaction statistics. - b.tx.stats.IncCursorCount(1) + b.tx.stats.CursorCount++ // Allocate and return a cursor. return &Cursor{ @@ -97,7 +112,7 @@ func (b *Bucket) Bucket(name []byte) *Bucket { k, v, flags := c.seek(name) // Return nil if the key doesn't exist or it is not a bucket. - if !bytes.Equal(name, k) || (flags&common.BucketLeafFlag) == 0 { + if !bytes.Equal(name, k) || (flags&bucketLeafFlag) == 0 { return nil } @@ -115,28 +130,18 @@ func (b *Bucket) Bucket(name []byte) *Bucket { func (b *Bucket) openBucket(value []byte) *Bucket { var child = newBucket(b.tx) - // Unaligned access requires a copy to be made. - const unalignedMask = unsafe.Alignof(struct { - common.InBucket - common.Page - }{}) - 1 - unaligned := uintptr(unsafe.Pointer(&value[0]))&unalignedMask != 0 - if unaligned { - value = cloneBytes(value) - } - // If this is a writable transaction then we need to copy the bucket entry. // Read-only transactions can point directly at the mmap entry. - if b.tx.writable && !unaligned { - child.InBucket = &common.InBucket{} - *child.InBucket = *(*common.InBucket)(unsafe.Pointer(&value[0])) + if b.tx.writable { + child.bucket = &bucket{} + *child.bucket = *(*bucket)(unsafe.Pointer(&value[0])) } else { - child.InBucket = (*common.InBucket)(unsafe.Pointer(&value[0])) + child.bucket = (*bucket)(unsafe.Pointer(&value[0])) } // Save a reference to the inline page if the bucket is inline. - if child.RootPage() == 0 { - child.page = (*common.Page)(unsafe.Pointer(&value[common.BucketHeaderSize])) + if child.root == 0 { + child.page = (*page)(unsafe.Pointer(&value[bucketHeaderSize])) } return &child @@ -145,167 +150,88 @@ func (b *Bucket) openBucket(value []byte) *Bucket { // CreateBucket creates a new bucket at the given key and returns the new bucket. // Returns an error if the key already exists, if the bucket name is blank, or if the bucket name is too long. // The bucket instance is only valid for the lifetime of the transaction. -func (b *Bucket) CreateBucket(key []byte) (rb *Bucket, err error) { - if lg := b.tx.db.Logger(); lg != discardLogger { - lg.Debugf("Creating bucket %q", key) - defer func() { - if err != nil { - lg.Errorf("Creating bucket %q failed: %v", key, err) - } else { - lg.Debugf("Creating bucket %q successfully", key) - } - }() - } +func (b *Bucket) CreateBucket(key []byte) (*Bucket, error) { if b.tx.db == nil { - return nil, errors.ErrTxClosed + return nil, ErrTxClosed } else if !b.tx.writable { - return nil, errors.ErrTxNotWritable + return nil, ErrTxNotWritable } else if len(key) == 0 { - return nil, errors.ErrBucketNameRequired + return nil, ErrBucketNameRequired } - // Insert into node. - // Tip: Use a new variable `newKey` instead of reusing the existing `key` to prevent - // it from being marked as leaking, and accordingly cannot be allocated on stack. - newKey := cloneBytes(key) - // Move cursor to correct position. c := b.Cursor() - k, _, flags := c.seek(newKey) + k, _, flags := c.seek(key) // Return an error if there is an existing key. - if bytes.Equal(newKey, k) { - if (flags & common.BucketLeafFlag) != 0 { - return nil, errors.ErrBucketExists + if bytes.Equal(key, k) { + if (flags & bucketLeafFlag) != 0 { + return nil, ErrBucketExists + } else { + return nil, ErrIncompatibleValue } - return nil, errors.ErrIncompatibleValue } // Create empty, inline bucket. var bucket = Bucket{ - InBucket: &common.InBucket{}, + bucket: &bucket{}, rootNode: &node{isLeaf: true}, FillPercent: DefaultFillPercent, } var value = bucket.write() - c.node().put(newKey, newKey, value, 0, common.BucketLeafFlag) + // Insert into node. + key = cloneBytes(key) + c.node().put(key, key, value, 0, bucketLeafFlag) // Since subbuckets are not allowed on inline buckets, we need to // dereference the inline page, if it exists. This will cause the bucket // to be treated as a regular, non-inline bucket for the rest of the tx. b.page = nil - return b.Bucket(newKey), nil + return b.Bucket(key), nil } // CreateBucketIfNotExists creates a new bucket if it doesn't already exist and returns a reference to it. // Returns an error if the bucket name is blank, or if the bucket name is too long. // The bucket instance is only valid for the lifetime of the transaction. -func (b *Bucket) CreateBucketIfNotExists(key []byte) (rb *Bucket, err error) { - if lg := b.tx.db.Logger(); lg != discardLogger { - lg.Debugf("Creating bucket if not exist %q", key) - defer func() { - if err != nil { - lg.Errorf("Creating bucket if not exist %q failed: %v", key, err) - } else { - lg.Debugf("Creating bucket if not exist %q successfully", key) - } - }() +func (b *Bucket) CreateBucketIfNotExists(key []byte) (*Bucket, error) { + child, err := b.CreateBucket(key) + if err == ErrBucketExists { + return b.Bucket(key), nil + } else if err != nil { + return nil, err } - - if b.tx.db == nil { - return nil, errors.ErrTxClosed - } else if !b.tx.writable { - return nil, errors.ErrTxNotWritable - } else if len(key) == 0 { - return nil, errors.ErrBucketNameRequired - } - - // Insert into node. - // Tip: Use a new variable `newKey` instead of reusing the existing `key` to prevent - // it from being marked as leaking, and accordingly cannot be allocated on stack. - newKey := cloneBytes(key) - - if b.buckets != nil { - if child := b.buckets[string(newKey)]; child != nil { - return child, nil - } - } - - // Move cursor to correct position. - c := b.Cursor() - k, v, flags := c.seek(newKey) - - // Return an error if there is an existing non-bucket key. - if bytes.Equal(newKey, k) { - if (flags & common.BucketLeafFlag) != 0 { - var child = b.openBucket(v) - if b.buckets != nil { - b.buckets[string(newKey)] = child - } - - return child, nil - } - return nil, errors.ErrIncompatibleValue - } - - // Create empty, inline bucket. - var bucket = Bucket{ - InBucket: &common.InBucket{}, - rootNode: &node{isLeaf: true}, - FillPercent: DefaultFillPercent, - } - var value = bucket.write() - - c.node().put(newKey, newKey, value, 0, common.BucketLeafFlag) - - // Since subbuckets are not allowed on inline buckets, we need to - // dereference the inline page, if it exists. This will cause the bucket - // to be treated as a regular, non-inline bucket for the rest of the tx. - b.page = nil - - return b.Bucket(newKey), nil + return child, nil } // DeleteBucket deletes a bucket at the given key. -// Returns an error if the bucket does not exist, or if the key represents a non-bucket value. -func (b *Bucket) DeleteBucket(key []byte) (err error) { - if lg := b.tx.db.Logger(); lg != discardLogger { - lg.Debugf("Deleting bucket %q", key) - defer func() { - if err != nil { - lg.Errorf("Deleting bucket %q failed: %v", key, err) - } else { - lg.Debugf("Deleting bucket %q successfully", key) - } - }() - } - +// Returns an error if the bucket does not exists, or if the key represents a non-bucket value. +func (b *Bucket) DeleteBucket(key []byte) error { if b.tx.db == nil { - return errors.ErrTxClosed + return ErrTxClosed } else if !b.Writable() { - return errors.ErrTxNotWritable + return ErrTxNotWritable } - newKey := cloneBytes(key) - // Move cursor to correct position. c := b.Cursor() - k, _, flags := c.seek(newKey) + k, _, flags := c.seek(key) // Return an error if bucket doesn't exist or is not a bucket. - if !bytes.Equal(newKey, k) { - return errors.ErrBucketNotFound - } else if (flags & common.BucketLeafFlag) == 0 { - return errors.ErrIncompatibleValue + if !bytes.Equal(key, k) { + return ErrBucketNotFound + } else if (flags & bucketLeafFlag) == 0 { + return ErrIncompatibleValue } // Recursively delete all child buckets. - child := b.Bucket(newKey) - err = child.ForEachBucket(func(k []byte) error { - if err := child.DeleteBucket(k); err != nil { - return fmt.Errorf("delete bucket: %s", err) + child := b.Bucket(key) + err := child.ForEach(func(k, v []byte) error { + if v == nil { + if err := child.DeleteBucket(k); err != nil { + return fmt.Errorf("delete bucket: %s", err) + } } return nil }) @@ -314,7 +240,7 @@ func (b *Bucket) DeleteBucket(key []byte) (err error) { } // Remove cached copy. - delete(b.buckets, string(newKey)) + delete(b.buckets, string(key)) // Release all bucket pages to freelist. child.nodes = nil @@ -322,119 +248,19 @@ func (b *Bucket) DeleteBucket(key []byte) (err error) { child.free() // Delete the node if we have a matching key. - c.node().del(newKey) + c.node().del(key) return nil } -// MoveBucket moves a sub-bucket from the source bucket to the destination bucket. -// Returns an error if -// 1. the sub-bucket cannot be found in the source bucket; -// 2. or the key already exists in the destination bucket; -// 3. or the key represents a non-bucket value; -// 4. the source and destination buckets are the same. -func (b *Bucket) MoveBucket(key []byte, dstBucket *Bucket) (err error) { - lg := b.tx.db.Logger() - if lg != discardLogger { - lg.Debugf("Moving bucket %q", key) - defer func() { - if err != nil { - lg.Errorf("Moving bucket %q failed: %v", key, err) - } else { - lg.Debugf("Moving bucket %q successfully", key) - } - }() - } - - if b.tx.db == nil || dstBucket.tx.db == nil { - return errors.ErrTxClosed - } else if !b.Writable() || !dstBucket.Writable() { - return errors.ErrTxNotWritable - } - - if b.tx.db.Path() != dstBucket.tx.db.Path() || b.tx != dstBucket.tx { - lg.Errorf("The source and target buckets are not in the same db file, source bucket in %s and target bucket in %s", b.tx.db.Path(), dstBucket.tx.db.Path()) - return errors.ErrDifferentDB - } - - newKey := cloneBytes(key) - - // Move cursor to correct position. - c := b.Cursor() - k, v, flags := c.seek(newKey) - - // Return an error if bucket doesn't exist or is not a bucket. - if !bytes.Equal(newKey, k) { - return errors.ErrBucketNotFound - } else if (flags & common.BucketLeafFlag) == 0 { - lg.Errorf("An incompatible key %s exists in the source bucket", newKey) - return errors.ErrIncompatibleValue - } - - // Do nothing (return true directly) if the source bucket and the - // destination bucket are actually the same bucket. - if b == dstBucket || (b.RootPage() == dstBucket.RootPage() && b.RootPage() != 0) { - lg.Errorf("The source bucket (%s) and the target bucket (%s) are the same bucket", b, dstBucket) - return errors.ErrSameBuckets - } - - // check whether the key already exists in the destination bucket - curDst := dstBucket.Cursor() - k, _, flags = curDst.seek(newKey) - - // Return an error if there is an existing key in the destination bucket. - if bytes.Equal(newKey, k) { - if (flags & common.BucketLeafFlag) != 0 { - return errors.ErrBucketExists - } - lg.Errorf("An incompatible key %s exists in the target bucket", newKey) - return errors.ErrIncompatibleValue - } - - // remove the sub-bucket from the source bucket - delete(b.buckets, string(newKey)) - c.node().del(newKey) - - // add te sub-bucket to the destination bucket - newValue := cloneBytes(v) - curDst.node().put(newKey, newKey, newValue, 0, common.BucketLeafFlag) - - return nil -} - -// Inspect returns the structure of the bucket. -func (b *Bucket) Inspect() BucketStructure { - return b.recursivelyInspect([]byte("root")) -} - -func (b *Bucket) recursivelyInspect(name []byte) BucketStructure { - bs := BucketStructure{Name: string(name)} - - keyN := 0 - c := b.Cursor() - for k, _, flags := c.first(); k != nil; k, _, flags = c.next() { - if flags&common.BucketLeafFlag != 0 { - childBucket := b.Bucket(k) - childBS := childBucket.recursivelyInspect(k) - bs.Children = append(bs.Children, childBS) - } else { - keyN++ - } - } - bs.KeyN = keyN - - return bs -} - // Get retrieves the value for a key in the bucket. // Returns a nil value if the key does not exist or if the key is a nested bucket. // The returned value is only valid for the life of the transaction. -// The returned memory is owned by bbolt and must never be modified; writing to this memory might corrupt the database. func (b *Bucket) Get(key []byte) []byte { k, v, flags := b.Cursor().seek(key) // Return nil if this is a bucket. - if (flags & common.BucketLeafFlag) != 0 { + if (flags & bucketLeafFlag) != 0 { return nil } @@ -449,46 +275,31 @@ func (b *Bucket) Get(key []byte) []byte { // If the key exist then its previous value will be overwritten. // Supplied value must remain valid for the life of the transaction. // Returns an error if the bucket was created from a read-only transaction, if the key is blank, if the key is too large, or if the value is too large. -func (b *Bucket) Put(key []byte, value []byte) (err error) { - if lg := b.tx.db.Logger(); lg != discardLogger { - lg.Debugf("Putting key %q", key) - defer func() { - if err != nil { - lg.Errorf("Putting key %q failed: %v", key, err) - } else { - lg.Debugf("Putting key %q successfully", key) - } - }() - } +func (b *Bucket) Put(key []byte, value []byte) error { if b.tx.db == nil { - return errors.ErrTxClosed + return ErrTxClosed } else if !b.Writable() { - return errors.ErrTxNotWritable + return ErrTxNotWritable } else if len(key) == 0 { - return errors.ErrKeyRequired + return ErrKeyRequired } else if len(key) > MaxKeySize { - return errors.ErrKeyTooLarge + return ErrKeyTooLarge } else if int64(len(value)) > MaxValueSize { - return errors.ErrValueTooLarge + return ErrValueTooLarge } - // Insert into node. - // Tip: Use a new variable `newKey` instead of reusing the existing `key` to prevent - // it from being marked as leaking, and accordingly cannot be allocated on stack. - newKey := cloneBytes(key) - // Move cursor to correct position. c := b.Cursor() - k, _, flags := c.seek(newKey) + k, _, flags := c.seek(key) // Return an error if there is an existing key with a bucket value. - if bytes.Equal(newKey, k) && (flags&common.BucketLeafFlag) != 0 { - return errors.ErrIncompatibleValue + if bytes.Equal(key, k) && (flags&bucketLeafFlag) != 0 { + return ErrIncompatibleValue } - // gofail: var beforeBucketPut struct{} - - c.node().put(newKey, newKey, value, 0, 0) + // Insert into node. + key = cloneBytes(key) + c.node().put(key, key, value, 0, 0) return nil } @@ -496,36 +307,20 @@ func (b *Bucket) Put(key []byte, value []byte) (err error) { // Delete removes a key from the bucket. // If the key does not exist then nothing is done and a nil error is returned. // Returns an error if the bucket was created from a read-only transaction. -func (b *Bucket) Delete(key []byte) (err error) { - if lg := b.tx.db.Logger(); lg != discardLogger { - lg.Debugf("Deleting key %q", key) - defer func() { - if err != nil { - lg.Errorf("Deleting key %q failed: %v", key, err) - } else { - lg.Debugf("Deleting key %q successfully", key) - } - }() - } - +func (b *Bucket) Delete(key []byte) error { if b.tx.db == nil { - return errors.ErrTxClosed + return ErrTxClosed } else if !b.Writable() { - return errors.ErrTxNotWritable + return ErrTxNotWritable } // Move cursor to correct position. c := b.Cursor() - k, _, flags := c.seek(key) - - // Return nil if the key doesn't exist. - if !bytes.Equal(key, k) { - return nil - } + _, _, flags := c.seek(key) // Return an error if there is already existing bucket value. - if (flags & common.BucketLeafFlag) != 0 { - return errors.ErrIncompatibleValue + if (flags & bucketLeafFlag) != 0 { + return ErrIncompatibleValue } // Delete the node if we have a matching key. @@ -534,57 +329,32 @@ func (b *Bucket) Delete(key []byte) (err error) { return nil } -// Sequence returns the current integer for the bucket without incrementing it. -func (b *Bucket) Sequence() uint64 { - return b.InSequence() -} - -// SetSequence updates the sequence number for the bucket. -func (b *Bucket) SetSequence(v uint64) error { - if b.tx.db == nil { - return errors.ErrTxClosed - } else if !b.Writable() { - return errors.ErrTxNotWritable - } - - // Materialize the root node if it hasn't been already so that the - // bucket will be saved during commit. - if b.rootNode == nil { - _ = b.node(b.RootPage(), nil) - } - - // Set the sequence. - b.SetInSequence(v) - return nil -} - // NextSequence returns an autoincrementing integer for the bucket. func (b *Bucket) NextSequence() (uint64, error) { if b.tx.db == nil { - return 0, errors.ErrTxClosed + return 0, ErrTxClosed } else if !b.Writable() { - return 0, errors.ErrTxNotWritable + return 0, ErrTxNotWritable } // Materialize the root node if it hasn't been already so that the // bucket will be saved during commit. if b.rootNode == nil { - _ = b.node(b.RootPage(), nil) + _ = b.node(b.root, nil) } // Increment and return the sequence. - b.IncSequence() - return b.Sequence(), nil + b.bucket.sequence++ + return b.bucket.sequence, nil } // ForEach executes a function for each key/value pair in a bucket. -// Because ForEach uses a Cursor, the iteration over keys is in lexicographical order. // If the provided function returns an error then the iteration is stopped and // the error is returned to the caller. The provided function must not modify // the bucket; this will result in undefined behavior. func (b *Bucket) ForEach(fn func(k, v []byte) error) error { if b.tx.db == nil { - return errors.ErrTxClosed + return ErrTxClosed } c := b.Cursor() for k, v := c.First(); k != nil; k, v = c.Next() { @@ -595,89 +365,74 @@ func (b *Bucket) ForEach(fn func(k, v []byte) error) error { return nil } -func (b *Bucket) ForEachBucket(fn func(k []byte) error) error { - if b.tx.db == nil { - return errors.ErrTxClosed - } - c := b.Cursor() - for k, _, flags := c.first(); k != nil; k, _, flags = c.next() { - if flags&common.BucketLeafFlag != 0 { - if err := fn(k); err != nil { - return err - } - } - } - return nil -} - -// Stats returns stats on a bucket. +// Stat returns stats on a bucket. func (b *Bucket) Stats() BucketStats { var s, subStats BucketStats pageSize := b.tx.db.pageSize s.BucketN += 1 - if b.RootPage() == 0 { + if b.root == 0 { s.InlineBucketN += 1 } - b.forEachPage(func(p *common.Page, depth int, pgstack []common.Pgid) { - if p.IsLeafPage() { - s.KeyN += int(p.Count()) + b.forEachPage(func(p *page, depth int) { + if (p.flags & leafPageFlag) != 0 { + s.KeyN += int(p.count) // used totals the used bytes for the page - used := common.PageHeaderSize + used := pageHeaderSize - if p.Count() != 0 { + if p.count != 0 { // If page has any elements, add all element headers. - used += common.LeafPageElementSize * uintptr(p.Count()-1) + used += leafPageElementSize * int(p.count-1) // Add all element key, value sizes. // The computation takes advantage of the fact that the position // of the last element's key/value equals to the total of the sizes // of all previous elements' keys and values. // It also includes the last element's header. - lastElement := p.LeafPageElement(p.Count() - 1) - used += uintptr(lastElement.Pos() + lastElement.Ksize() + lastElement.Vsize()) + lastElement := p.leafPageElement(p.count - 1) + used += int(lastElement.pos + lastElement.ksize + lastElement.vsize) } - if b.RootPage() == 0 { + if b.root == 0 { // For inlined bucket just update the inline stats - s.InlineBucketInuse += int(used) + s.InlineBucketInuse += used } else { // For non-inlined bucket update all the leaf stats s.LeafPageN++ - s.LeafInuse += int(used) - s.LeafOverflowN += int(p.Overflow()) + s.LeafInuse += used + s.LeafOverflowN += int(p.overflow) // Collect stats from sub-buckets. // Do that by iterating over all element headers // looking for the ones with the bucketLeafFlag. - for i := uint16(0); i < p.Count(); i++ { - e := p.LeafPageElement(i) - if (e.Flags() & common.BucketLeafFlag) != 0 { + for i := uint16(0); i < p.count; i++ { + e := p.leafPageElement(i) + if (e.flags & bucketLeafFlag) != 0 { // For any bucket element, open the element value // and recursively call Stats on the contained bucket. - subStats.Add(b.openBucket(e.Value()).Stats()) + subStats.Add(b.openBucket(e.value()).Stats()) } } } - } else if p.IsBranchPage() { + } else if (p.flags & branchPageFlag) != 0 { s.BranchPageN++ - lastElement := p.BranchPageElement(p.Count() - 1) + lastElement := p.branchPageElement(p.count - 1) // used totals the used bytes for the page // Add header and all element headers. - used := common.PageHeaderSize + (common.BranchPageElementSize * uintptr(p.Count()-1)) + used := pageHeaderSize + (branchPageElementSize * int(p.count-1)) // Add size of all keys and values. // Again, use the fact that last element's position equals to // the total of key, value sizes of all previous elements. - used += uintptr(lastElement.Pos() + lastElement.Ksize()) - s.BranchInuse += int(used) - s.BranchOverflowN += int(p.Overflow()) + used += int(lastElement.pos + lastElement.ksize) + s.BranchInuse += used + s.BranchOverflowN += int(p.overflow) } // Keep track of maximum page depth. if depth+1 > s.Depth { - s.Depth = depth + 1 + s.Depth = (depth + 1) } }) @@ -693,46 +448,46 @@ func (b *Bucket) Stats() BucketStats { } // forEachPage iterates over every page in a bucket, including inline pages. -func (b *Bucket) forEachPage(fn func(*common.Page, int, []common.Pgid)) { +func (b *Bucket) forEachPage(fn func(*page, int)) { // If we have an inline page then just use that. if b.page != nil { - fn(b.page, 0, []common.Pgid{b.RootPage()}) + fn(b.page, 0) return } // Otherwise traverse the page hierarchy. - b.tx.forEachPage(b.RootPage(), fn) + b.tx.forEachPage(b.root, 0, fn) } // forEachPageNode iterates over every page (or node) in a bucket. // This also includes inline pages. -func (b *Bucket) forEachPageNode(fn func(*common.Page, *node, int)) { +func (b *Bucket) forEachPageNode(fn func(*page, *node, int)) { // If we have an inline page or root node then just use that. if b.page != nil { fn(b.page, nil, 0) return } - b._forEachPageNode(b.RootPage(), 0, fn) + b._forEachPageNode(b.root, 0, fn) } -func (b *Bucket) _forEachPageNode(pgId common.Pgid, depth int, fn func(*common.Page, *node, int)) { - var p, n = b.pageNode(pgId) +func (b *Bucket) _forEachPageNode(pgid pgid, depth int, fn func(*page, *node, int)) { + var p, n = b.pageNode(pgid) // Execute function. fn(p, n, depth) // Recursively loop over children. if p != nil { - if p.IsBranchPage() { - for i := 0; i < int(p.Count()); i++ { - elem := p.BranchPageElement(uint16(i)) - b._forEachPageNode(elem.Pgid(), depth+1, fn) + if (p.flags & branchPageFlag) != 0 { + for i := 0; i < int(p.count); i++ { + elem := p.branchPageElement(uint16(i)) + b._forEachPageNode(elem.pgid, depth+1, fn) } } } else { if !n.isLeaf { for _, inode := range n.inodes { - b._forEachPageNode(inode.Pgid(), depth+1, fn) + b._forEachPageNode(inode.pgid, depth+1, fn) } } } @@ -755,9 +510,9 @@ func (b *Bucket) spill() error { } // Update the child bucket header in this bucket. - value = make([]byte, unsafe.Sizeof(common.InBucket{})) - var bucket = (*common.InBucket)(unsafe.Pointer(&value[0])) - *bucket = *child.InBucket + value = make([]byte, unsafe.Sizeof(bucket{})) + var bucket = (*bucket)(unsafe.Pointer(&value[0])) + *bucket = *child.bucket } // Skip writing the bucket if there are no materialized nodes. @@ -771,10 +526,10 @@ func (b *Bucket) spill() error { if !bytes.Equal([]byte(name), k) { panic(fmt.Sprintf("misplaced bucket header: %x -> %x", []byte(name), k)) } - if flags&common.BucketLeafFlag == 0 { + if flags&bucketLeafFlag == 0 { panic(fmt.Sprintf("unexpected bucket header flag: %x", flags)) } - c.node().put([]byte(name), []byte(name), value, 0, common.BucketLeafFlag) + c.node().put([]byte(name), []byte(name), value, 0, bucketLeafFlag) } // Ignore if there's not a materialized root node. @@ -789,16 +544,16 @@ func (b *Bucket) spill() error { b.rootNode = b.rootNode.root() // Update the root node for this bucket. - if b.rootNode.pgid >= b.tx.meta.Pgid() { - panic(fmt.Sprintf("pgid (%d) above high water mark (%d)", b.rootNode.pgid, b.tx.meta.Pgid())) + if b.rootNode.pgid >= b.tx.meta.pgid { + panic(fmt.Sprintf("pgid (%d) above high water mark (%d)", b.rootNode.pgid, b.tx.meta.pgid)) } - b.SetRootPage(b.rootNode.pgid) + b.root = b.rootNode.pgid return nil } // inlineable returns true if a bucket is small enough to be written inline -// and if it contains no subbuckets. Otherwise, returns false. +// and if it contains no subbuckets. Otherwise returns false. func (b *Bucket) inlineable() bool { var n = b.rootNode @@ -809,11 +564,11 @@ func (b *Bucket) inlineable() bool { // Bucket is not inlineable if it contains subbuckets or if it goes beyond // our threshold for inline bucket size. - var size = common.PageHeaderSize + var size = pageHeaderSize for _, inode := range n.inodes { - size += common.LeafPageElementSize + uintptr(len(inode.Key())) + uintptr(len(inode.Value())) + size += leafPageElementSize + len(inode.key) + len(inode.value) - if inode.Flags()&common.BucketLeafFlag != 0 { + if inode.flags&bucketLeafFlag != 0 { return false } else if size > b.maxInlineBucketSize() { return false @@ -824,22 +579,22 @@ func (b *Bucket) inlineable() bool { } // Returns the maximum total size of a bucket to make it a candidate for inlining. -func (b *Bucket) maxInlineBucketSize() uintptr { - return uintptr(b.tx.db.pageSize / 4) +func (b *Bucket) maxInlineBucketSize() int { + return b.tx.db.pageSize / 4 } // write allocates and writes a bucket to a byte slice. func (b *Bucket) write() []byte { // Allocate the appropriate size. var n = b.rootNode - var value = make([]byte, common.BucketHeaderSize+n.size()) + var value = make([]byte, bucketHeaderSize+n.size()) // Write a bucket header. - var bucket = (*common.InBucket)(unsafe.Pointer(&value[0])) - *bucket = *b.InBucket + var bucket = (*bucket)(unsafe.Pointer(&value[0])) + *bucket = *b.bucket // Convert byte slice to a fake page and write the root node. - var p = (*common.Page)(unsafe.Pointer(&value[common.BucketHeaderSize])) + var p = (*page)(unsafe.Pointer(&value[bucketHeaderSize])) n.write(p) return value @@ -856,11 +611,11 @@ func (b *Bucket) rebalance() { } // node creates a node from a page and associates it with a given parent. -func (b *Bucket) node(pgId common.Pgid, parent *node) *node { - common.Assert(b.nodes != nil, "nodes map expected") +func (b *Bucket) node(pgid pgid, parent *node) *node { + _assert(b.nodes != nil, "nodes map expected") // Retrieve node if it's already been created. - if n := b.nodes[pgId]; n != nil { + if n := b.nodes[pgid]; n != nil { return n } @@ -875,40 +630,34 @@ func (b *Bucket) node(pgId common.Pgid, parent *node) *node { // Use the inline page if this is an inline bucket. var p = b.page if p == nil { - p = b.tx.page(pgId) - } else { - // if p isn't nil, then it's an inline bucket. - // The pgId must be 0 in this case. - common.Verify(func() { - common.Assert(pgId == 0, "The page ID (%d) isn't 0 for an inline bucket", pgId) - }) + p = b.tx.page(pgid) } // Read the page into the node and cache it. n.read(p) - b.nodes[pgId] = n + b.nodes[pgid] = n // Update statistics. - b.tx.stats.IncNodeCount(1) + b.tx.stats.NodeCount++ return n } // free recursively frees all pages in the bucket. func (b *Bucket) free() { - if b.RootPage() == 0 { + if b.root == 0 { return } var tx = b.tx - b.forEachPageNode(func(p *common.Page, n *node, _ int) { + b.forEachPageNode(func(p *page, n *node, _ int) { if p != nil { - tx.db.freelist.Free(tx.meta.Txid(), p) + tx.db.freelist.free(tx.meta.txid, p) } else { n.free() } }) - b.SetRootPage(0) + b.root = 0 } // dereference removes all references to the old mmap. @@ -923,11 +672,11 @@ func (b *Bucket) dereference() { } // pageNode returns the in-memory node, if it exists. -// Otherwise, returns the underlying page. -func (b *Bucket) pageNode(id common.Pgid) (*common.Page, *node) { +// Otherwise returns the underlying page. +func (b *Bucket) pageNode(id pgid) (*page, *node) { // Inline buckets have a fake page embedded in their value so treat them // differently. We'll return the rootNode (if available) or the fake page. - if b.RootPage() == 0 { + if b.root == 0 { if id != 0 { panic(fmt.Sprintf("inline bucket non-zero page access(2): %d != 0", id)) } @@ -997,9 +746,3 @@ func cloneBytes(v []byte) []byte { copy(clone, v) return clone } - -type BucketStructure struct { - Name string `json:"name"` // name of the bucket - KeyN int `json:"keyN"` // number of key/value pairs - Children []BucketStructure `json:"buckets,omitempty"` // child buckets -} diff --git a/vendor/go.etcd.io/bbolt/cursor.go b/vendor/github.com/boltdb/bolt/cursor.go similarity index 70% rename from vendor/go.etcd.io/bbolt/cursor.go rename to vendor/github.com/boltdb/bolt/cursor.go index 0c1e28c..1be9f35 100644 --- a/vendor/go.etcd.io/bbolt/cursor.go +++ b/vendor/github.com/boltdb/bolt/cursor.go @@ -1,16 +1,12 @@ -package bbolt +package bolt import ( "bytes" "fmt" "sort" - - "go.etcd.io/bbolt/errors" - "go.etcd.io/bbolt/internal/common" ) -// Cursor represents an iterator that can traverse over all key/value pairs in a bucket -// in lexicographical order. +// Cursor represents an iterator that can traverse over all key/value pairs in a bucket in sorted order. // Cursors see nested buckets with value == nil. // Cursors can be obtained from a transaction and are valid as long as the transaction is open. // @@ -33,19 +29,11 @@ func (c *Cursor) Bucket() *Bucket { // If the bucket is empty then a nil key and value are returned. // The returned key and value are only valid for the life of the transaction. func (c *Cursor) First() (key []byte, value []byte) { - common.Assert(c.bucket.tx.db != nil, "tx closed") - k, v, flags := c.first() - if (flags & uint32(common.BucketLeafFlag)) != 0 { - return k, nil - } - return k, v -} - -func (c *Cursor) first() (key []byte, value []byte, flags uint32) { + _assert(c.bucket.tx.db != nil, "tx closed") c.stack = c.stack[:0] - p, n := c.bucket.pageNode(c.bucket.RootPage()) + p, n := c.bucket.pageNode(c.bucket.root) c.stack = append(c.stack, elemRef{page: p, node: n, index: 0}) - c.goToFirstElementOnTheStack() + c.first() // If we land on an empty page then move to the next value. // https://github.com/boltdb/bolt/issues/450 @@ -54,36 +42,26 @@ func (c *Cursor) first() (key []byte, value []byte, flags uint32) { } k, v, flags := c.keyValue() - if (flags & uint32(common.BucketLeafFlag)) != 0 { - return k, nil, flags + if (flags & uint32(bucketLeafFlag)) != 0 { + return k, nil } - return k, v, flags + return k, v + } // Last moves the cursor to the last item in the bucket and returns its key and value. // If the bucket is empty then a nil key and value are returned. // The returned key and value are only valid for the life of the transaction. func (c *Cursor) Last() (key []byte, value []byte) { - common.Assert(c.bucket.tx.db != nil, "tx closed") + _assert(c.bucket.tx.db != nil, "tx closed") c.stack = c.stack[:0] - p, n := c.bucket.pageNode(c.bucket.RootPage()) + p, n := c.bucket.pageNode(c.bucket.root) ref := elemRef{page: p, node: n} ref.index = ref.count() - 1 c.stack = append(c.stack, ref) c.last() - - // If this is an empty page (calling Delete may result in empty pages) - // we call prev to find the last page that is not empty - for len(c.stack) > 1 && c.stack[len(c.stack)-1].count() == 0 { - c.prev() - } - - if len(c.stack) == 0 { - return nil, nil - } - k, v, flags := c.keyValue() - if (flags & uint32(common.BucketLeafFlag)) != 0 { + if (flags & uint32(bucketLeafFlag)) != 0 { return k, nil } return k, v @@ -93,9 +71,9 @@ func (c *Cursor) Last() (key []byte, value []byte) { // If the cursor is at the end of the bucket then a nil key and value are returned. // The returned key and value are only valid for the life of the transaction. func (c *Cursor) Next() (key []byte, value []byte) { - common.Assert(c.bucket.tx.db != nil, "tx closed") + _assert(c.bucket.tx.db != nil, "tx closed") k, v, flags := c.next() - if (flags & uint32(common.BucketLeafFlag)) != 0 { + if (flags & uint32(bucketLeafFlag)) != 0 { return k, nil } return k, v @@ -105,21 +83,38 @@ func (c *Cursor) Next() (key []byte, value []byte) { // If the cursor is at the beginning of the bucket then a nil key and value are returned. // The returned key and value are only valid for the life of the transaction. func (c *Cursor) Prev() (key []byte, value []byte) { - common.Assert(c.bucket.tx.db != nil, "tx closed") - k, v, flags := c.prev() - if (flags & uint32(common.BucketLeafFlag)) != 0 { + _assert(c.bucket.tx.db != nil, "tx closed") + + // Attempt to move back one element until we're successful. + // Move up the stack as we hit the beginning of each page in our stack. + for i := len(c.stack) - 1; i >= 0; i-- { + elem := &c.stack[i] + if elem.index > 0 { + elem.index-- + break + } + c.stack = c.stack[:i] + } + + // If we've hit the end then return nil. + if len(c.stack) == 0 { + return nil, nil + } + + // Move down the stack to find the last element of the last leaf under this branch. + c.last() + k, v, flags := c.keyValue() + if (flags & uint32(bucketLeafFlag)) != 0 { return k, nil } return k, v } -// Seek moves the cursor to a given key using a b-tree search and returns it. +// Seek moves the cursor to a given key and returns it. // If the key does not exist then the next key is used. If no keys // follow, a nil key is returned. // The returned key and value are only valid for the life of the transaction. func (c *Cursor) Seek(seek []byte) (key []byte, value []byte) { - common.Assert(c.bucket.tx.db != nil, "tx closed") - k, v, flags := c.seek(seek) // If we ended up after the last element of a page then move to the next one. @@ -129,7 +124,7 @@ func (c *Cursor) Seek(seek []byte) (key []byte, value []byte) { if k == nil { return nil, nil - } else if (flags & uint32(common.BucketLeafFlag)) != 0 { + } else if (flags & uint32(bucketLeafFlag)) != 0 { return k, nil } return k, v @@ -139,15 +134,15 @@ func (c *Cursor) Seek(seek []byte) (key []byte, value []byte) { // Delete fails if current key/value is a bucket or if the transaction is not writable. func (c *Cursor) Delete() error { if c.bucket.tx.db == nil { - return errors.ErrTxClosed + return ErrTxClosed } else if !c.bucket.Writable() { - return errors.ErrTxNotWritable + return ErrTxNotWritable } key, _, flags := c.keyValue() // Return an error if current value is a bucket. - if (flags & common.BucketLeafFlag) != 0 { - return errors.ErrIncompatibleValue + if (flags & bucketLeafFlag) != 0 { + return ErrIncompatibleValue } c.node().del(key) @@ -157,16 +152,24 @@ func (c *Cursor) Delete() error { // seek moves the cursor to a given key and returns it. // If the key does not exist then the next key is used. func (c *Cursor) seek(seek []byte) (key []byte, value []byte, flags uint32) { + _assert(c.bucket.tx.db != nil, "tx closed") + // Start from root page/node and traverse to correct page. c.stack = c.stack[:0] - c.search(seek, c.bucket.RootPage()) + c.search(seek, c.bucket.root) + ref := &c.stack[len(c.stack)-1] + + // If the cursor is pointing to the end of page/node then return nil. + if ref.index >= ref.count() { + return nil, nil, 0 + } // If this is a bucket then return a nil value. return c.keyValue() } // first moves the cursor to the first leaf element under the last page in the stack. -func (c *Cursor) goToFirstElementOnTheStack() { +func (c *Cursor) first() { for { // Exit when we hit a leaf page. var ref = &c.stack[len(c.stack)-1] @@ -175,13 +178,13 @@ func (c *Cursor) goToFirstElementOnTheStack() { } // Keep adding pages pointing to the first element to the stack. - var pgId common.Pgid + var pgid pgid if ref.node != nil { - pgId = ref.node.inodes[ref.index].Pgid() + pgid = ref.node.inodes[ref.index].pgid } else { - pgId = ref.page.BranchPageElement(uint16(ref.index)).Pgid() + pgid = ref.page.branchPageElement(uint16(ref.index)).pgid } - p, n := c.bucket.pageNode(pgId) + p, n := c.bucket.pageNode(pgid) c.stack = append(c.stack, elemRef{page: p, node: n, index: 0}) } } @@ -196,13 +199,13 @@ func (c *Cursor) last() { } // Keep adding pages pointing to the last element in the stack. - var pgId common.Pgid + var pgid pgid if ref.node != nil { - pgId = ref.node.inodes[ref.index].Pgid() + pgid = ref.node.inodes[ref.index].pgid } else { - pgId = ref.page.BranchPageElement(uint16(ref.index)).Pgid() + pgid = ref.page.branchPageElement(uint16(ref.index)).pgid } - p, n := c.bucket.pageNode(pgId) + p, n := c.bucket.pageNode(pgid) var nextRef = elemRef{page: p, node: n} nextRef.index = nextRef.count() - 1 @@ -234,7 +237,7 @@ func (c *Cursor) next() (key []byte, value []byte, flags uint32) { // Otherwise start from where we left off in the stack and find the // first element of the first leaf page. c.stack = c.stack[:i+1] - c.goToFirstElementOnTheStack() + c.first() // If this is an empty page then restart and move back up the stack. // https://github.com/boltdb/bolt/issues/450 @@ -246,44 +249,11 @@ func (c *Cursor) next() (key []byte, value []byte, flags uint32) { } } -// prev moves the cursor to the previous item in the bucket and returns its key and value. -// If the cursor is at the beginning of the bucket then a nil key and value are returned. -func (c *Cursor) prev() (key []byte, value []byte, flags uint32) { - // Attempt to move back one element until we're successful. - // Move up the stack as we hit the beginning of each page in our stack. - for i := len(c.stack) - 1; i >= 0; i-- { - elem := &c.stack[i] - if elem.index > 0 { - elem.index-- - break - } - // If we've hit the beginning, we should stop moving the cursor, - // and stay at the first element, so that users can continue to - // iterate over the elements in reverse direction by calling `Next`. - // We should return nil in such case. - // Refer to https://github.com/etcd-io/bbolt/issues/733 - if len(c.stack) == 1 { - c.first() - return nil, nil, 0 - } - c.stack = c.stack[:i] - } - - // If we've hit the end then return nil. - if len(c.stack) == 0 { - return nil, nil, 0 - } - - // Move down the stack to find the last element of the last leaf under this branch. - c.last() - return c.keyValue() -} - // search recursively performs a binary search against a given page/node until it finds a given key. -func (c *Cursor) search(key []byte, pgId common.Pgid) { - p, n := c.bucket.pageNode(pgId) - if p != nil && !p.IsBranchPage() && !p.IsLeafPage() { - panic(fmt.Sprintf("invalid page type: %d: %x", p.Id(), p.Flags())) +func (c *Cursor) search(key []byte, pgid pgid) { + p, n := c.bucket.pageNode(pgid) + if p != nil && (p.flags&(branchPageFlag|leafPageFlag)) == 0 { + panic(fmt.Sprintf("invalid page type: %d: %x", p.id, p.flags)) } e := elemRef{page: p, node: n} c.stack = append(c.stack, e) @@ -306,7 +276,7 @@ func (c *Cursor) searchNode(key []byte, n *node) { index := sort.Search(len(n.inodes), func(i int) bool { // TODO(benbjohnson): Optimize this range search. It's a bit hacky right now. // sort.Search() finds the lowest index where f() != -1 but we need the highest index. - ret := bytes.Compare(n.inodes[i].Key(), key) + ret := bytes.Compare(n.inodes[i].key, key) if ret == 0 { exact = true } @@ -318,18 +288,18 @@ func (c *Cursor) searchNode(key []byte, n *node) { c.stack[len(c.stack)-1].index = index // Recursively search to the next page. - c.search(key, n.inodes[index].Pgid()) + c.search(key, n.inodes[index].pgid) } -func (c *Cursor) searchPage(key []byte, p *common.Page) { +func (c *Cursor) searchPage(key []byte, p *page) { // Binary search for the correct range. - inodes := p.BranchPageElements() + inodes := p.branchPageElements() var exact bool - index := sort.Search(int(p.Count()), func(i int) bool { + index := sort.Search(int(p.count), func(i int) bool { // TODO(benbjohnson): Optimize this range search. It's a bit hacky right now. // sort.Search() finds the lowest index where f() != -1 but we need the highest index. - ret := bytes.Compare(inodes[i].Key(), key) + ret := bytes.Compare(inodes[i].key(), key) if ret == 0 { exact = true } @@ -341,7 +311,7 @@ func (c *Cursor) searchPage(key []byte, p *common.Page) { c.stack[len(c.stack)-1].index = index // Recursively search to the next page. - c.search(key, inodes[index].Pgid()) + c.search(key, inodes[index].pgid) } // nsearch searches the leaf node on the top of the stack for a key. @@ -352,16 +322,16 @@ func (c *Cursor) nsearch(key []byte) { // If we have a node then search its inodes. if n != nil { index := sort.Search(len(n.inodes), func(i int) bool { - return bytes.Compare(n.inodes[i].Key(), key) != -1 + return bytes.Compare(n.inodes[i].key, key) != -1 }) e.index = index return } // If we have a page then search its leaf elements. - inodes := p.LeafPageElements() - index := sort.Search(int(p.Count()), func(i int) bool { - return bytes.Compare(inodes[i].Key(), key) != -1 + inodes := p.leafPageElements() + index := sort.Search(int(p.count), func(i int) bool { + return bytes.Compare(inodes[i].key(), key) != -1 }) e.index = index } @@ -369,8 +339,6 @@ func (c *Cursor) nsearch(key []byte) { // keyValue returns the key and value of the current leaf element. func (c *Cursor) keyValue() ([]byte, []byte, uint32) { ref := &c.stack[len(c.stack)-1] - - // If the cursor is pointing to the end of page/node then return nil. if ref.count() == 0 || ref.index >= ref.count() { return nil, nil, 0 } @@ -378,17 +346,17 @@ func (c *Cursor) keyValue() ([]byte, []byte, uint32) { // Retrieve value from node. if ref.node != nil { inode := &ref.node.inodes[ref.index] - return inode.Key(), inode.Value(), inode.Flags() + return inode.key, inode.value, inode.flags } // Or retrieve value from page. - elem := ref.page.LeafPageElement(uint16(ref.index)) - return elem.Key(), elem.Value(), elem.Flags() + elem := ref.page.leafPageElement(uint16(ref.index)) + return elem.key(), elem.value(), elem.flags } // node returns the node that the cursor is currently positioned on. func (c *Cursor) node() *node { - common.Assert(len(c.stack) > 0, "accessing a node with a zero-length cursor stack") + _assert(len(c.stack) > 0, "accessing a node with a zero-length cursor stack") // If the top of the stack is a leaf node then just return it. if ref := &c.stack[len(c.stack)-1]; ref.node != nil && ref.isLeaf() { @@ -398,19 +366,19 @@ func (c *Cursor) node() *node { // Start from root and traverse down the hierarchy. var n = c.stack[0].node if n == nil { - n = c.bucket.node(c.stack[0].page.Id(), nil) + n = c.bucket.node(c.stack[0].page.id, nil) } for _, ref := range c.stack[:len(c.stack)-1] { - common.Assert(!n.isLeaf, "expected branch node") - n = n.childAt(ref.index) + _assert(!n.isLeaf, "expected branch node") + n = n.childAt(int(ref.index)) } - common.Assert(n.isLeaf, "expected leaf node") + _assert(n.isLeaf, "expected leaf node") return n } // elemRef represents a reference to an element on a given page/node. type elemRef struct { - page *common.Page + page *page node *node index int } @@ -420,7 +388,7 @@ func (r *elemRef) isLeaf() bool { if r.node != nil { return r.node.isLeaf } - return r.page.IsLeafPage() + return (r.page.flags & leafPageFlag) != 0 } // count returns the number of inodes or page elements. @@ -428,5 +396,5 @@ func (r *elemRef) count() int { if r.node != nil { return len(r.node.inodes) } - return int(r.page.Count()) + return int(r.page.count) } diff --git a/vendor/go.etcd.io/bbolt/db.go b/vendor/github.com/boltdb/bolt/db.go similarity index 51% rename from vendor/go.etcd.io/bbolt/db.go rename to vendor/github.com/boltdb/bolt/db.go index 622947d..1223493 100644 --- a/vendor/go.etcd.io/bbolt/db.go +++ b/vendor/github.com/boltdb/bolt/db.go @@ -1,47 +1,48 @@ -package bbolt +package bolt import ( "errors" "fmt" - "io" + "hash/fnv" + "log" "os" "runtime" + "runtime/debug" + "strings" "sync" "time" "unsafe" - - berrors "go.etcd.io/bbolt/errors" - "go.etcd.io/bbolt/internal/common" - fl "go.etcd.io/bbolt/internal/freelist" ) -// The time elapsed between consecutive file locking attempts. -const flockRetryTimeout = 50 * time.Millisecond +// The largest step that can be taken when remapping the mmap. +const maxMmapStep = 1 << 30 // 1GB -// FreelistType is the type of the freelist backend -type FreelistType string +// The data file format version. +const version = 2 -// TODO(ahrtr): eventually we should (step by step) -// 1. default to `FreelistMapType`; -// 2. remove the `FreelistArrayType`, do not export `FreelistMapType` -// and remove field `FreelistType' from both `DB` and `Options`; +// Represents a marker value to indicate that a file is a Bolt DB. +const magic uint32 = 0xED0CDAED + +// IgnoreNoSync specifies whether the NoSync field of a DB is ignored when +// syncing changes to a file. This is required as some operating systems, +// such as OpenBSD, do not have a unified buffer cache (UBC) and writes +// must be synchronized using the msync(2) syscall. +const IgnoreNoSync = runtime.GOOS == "openbsd" + +// Default values if not set in a DB instance. const ( - // FreelistArrayType indicates backend freelist type is array - FreelistArrayType = FreelistType("array") - // FreelistMapType indicates backend freelist type is hashmap - FreelistMapType = FreelistType("hashmap") + DefaultMaxBatchSize int = 1000 + DefaultMaxBatchDelay = 10 * time.Millisecond + DefaultAllocSize = 16 * 1024 * 1024 ) +// default page size for db is set to the OS page size. +var defaultPageSize = os.Getpagesize() + // DB represents a collection of buckets persisted to a file on disk. // All data access is performed through transactions which can be obtained through the DB. // All the functions on DB will return a ErrDatabaseNotOpen if accessed before Open() is called. type DB struct { - // Put `stats` at the first field to ensure it's 64-bit aligned. Note that - // the first word in an allocated struct can be relied upon to be 64-bit - // aligned. Refer to https://pkg.go.dev/sync/atomic#pkg-note-BUG. Also - // refer to discussion in https://github.com/etcd-io/bbolt/issues/577. - stats Stats - // When enabled, the database will perform a Check() after every commit. // A panic is issued if the database is in an inconsistent state. This // flag has a large performance impact so it should only be used for @@ -60,18 +61,6 @@ type DB struct { // THIS IS UNSAFE. PLEASE USE WITH CAUTION. NoSync bool - // When true, skips syncing freelist to disk. This improves the database - // write performance under normal operation, but requires a full database - // re-sync during recovery. - NoFreelistSync bool - - // FreelistType sets the backend freelist type. There are two options. Array which is simple but endures - // dramatic performance degradation if database is large and fragmentation in freelist is common. - // The alternative one is using hashmap, it is faster in almost all circumstances - // but it doesn't guarantee that it offers the smallest page id available. In normal case it is safe. - // The default type is array - FreelistType FreelistType - // When true, skips the truncate call when growing the database. // Setting this to true is only safe on non-ext3/ext4 systems. // Skipping truncation avoids preallocation of hard drive space and @@ -80,11 +69,6 @@ type DB struct { // https://github.com/boltdb/bolt/issues/284 NoGrowSync bool - // When `true`, bbolt will always load the free pages when opening the DB. - // When opening db in write mode, this flag will always automatically - // set to `true`. - PreLoadFreelist bool - // If you want to read the entire database fast, you can set MmapFlag to // syscall.MAP_POPULATE on Linux 2.6.23+ for sequential read-ahead. MmapFlags int @@ -110,32 +94,21 @@ type DB struct { // of truncate() and fsync() when growing the data file. AllocSize int - // Mlock locks database file in memory when set to true. - // It prevents major page faults, however used memory can't be reclaimed. - // - // Supported only on Unix via mlock/munlock syscalls. - Mlock bool - - logger Logger - path string - openFile func(string, int, os.FileMode) (*os.File, error) file *os.File - // `dataref` isn't used at all on Windows, and the golangci-lint - // always fails on Windows platform. - //nolint - dataref []byte // mmap'ed readonly, write throws SEGV - data *[common.MaxMapSize]byte + lockfile *os.File // windows only + dataref []byte // mmap'ed readonly, write throws SEGV + data *[maxMapSize]byte datasz int - meta0 *common.Meta - meta1 *common.Meta + filesz int // current on disk file size + meta0 *meta + meta1 *meta pageSize int opened bool rwtx *Tx txs []*Tx - - freelist fl.Interface - freelistLoad sync.Once + freelist *freelist + stats Stats pagePool sync.Pool @@ -171,72 +144,37 @@ func (db *DB) String() string { return fmt.Sprintf("DB<%q>", db.path) } -// Open creates and opens a database at the given path with a given file mode. -// If the file does not exist then it will be created automatically with a given file mode. +// Open creates and opens a database at the given path. +// If the file does not exist then it will be created automatically. // Passing in nil options will cause Bolt to open the database with the default options. -// Note: For read/write transactions, ensure the owner has write permission on the created/opened database file, e.g. 0600 -func Open(path string, mode os.FileMode, options *Options) (db *DB, err error) { - db = &DB{ - opened: true, - } +func Open(path string, mode os.FileMode, options *Options) (*DB, error) { + var db = &DB{opened: true} // Set default options if no options are provided. if options == nil { options = DefaultOptions } - db.NoSync = options.NoSync db.NoGrowSync = options.NoGrowSync db.MmapFlags = options.MmapFlags - db.NoFreelistSync = options.NoFreelistSync - db.PreLoadFreelist = options.PreLoadFreelist - db.FreelistType = options.FreelistType - db.Mlock = options.Mlock // Set default values for later DB operations. - db.MaxBatchSize = common.DefaultMaxBatchSize - db.MaxBatchDelay = common.DefaultMaxBatchDelay - db.AllocSize = common.DefaultAllocSize - - if options.Logger == nil { - db.logger = getDiscardLogger() - } else { - db.logger = options.Logger - } - - lg := db.Logger() - if lg != discardLogger { - lg.Infof("Opening db file (%s) with mode %s and with options: %s", path, mode, options) - defer func() { - if err != nil { - lg.Errorf("Opening bbolt db (%s) failed: %v", path, err) - } else { - lg.Infof("Opening bbolt db (%s) successfully", path) - } - }() - } + db.MaxBatchSize = DefaultMaxBatchSize + db.MaxBatchDelay = DefaultMaxBatchDelay + db.AllocSize = DefaultAllocSize flag := os.O_RDWR if options.ReadOnly { flag = os.O_RDONLY db.readOnly = true - } else { - // always load free pages in write mode - db.PreLoadFreelist = true - flag |= os.O_CREATE - } - - db.openFile = options.OpenFile - if db.openFile == nil { - db.openFile = os.OpenFile } // Open data file and separate sync handler for metadata writes. - if db.file, err = db.openFile(path, flag, mode); err != nil { + db.path = path + var err error + if db.file, err = os.OpenFile(db.path, flag|os.O_CREATE, mode); err != nil { _ = db.close() - lg.Errorf("failed to open db file (%s): %v", path, err) return nil, err } - db.path = db.file.Name() // Lock file so that other processes using Bolt in read-write mode cannot // use the database at the same time. This would cause corruption since @@ -245,39 +183,39 @@ func Open(path string, mode os.FileMode, options *Options) (db *DB, err error) { // if !options.ReadOnly. // The database file is locked using the shared lock (more than one process may // hold a lock at the same time) otherwise (options.ReadOnly is set). - if err = flock(db, !db.readOnly, options.Timeout); err != nil { + if err := flock(db, mode, !db.readOnly, options.Timeout); err != nil { _ = db.close() - lg.Errorf("failed to lock db file (%s), readonly: %t, error: %v", path, db.readOnly, err) return nil, err } // Default values for test hooks db.ops.writeAt = db.file.WriteAt - if db.pageSize = options.PageSize; db.pageSize == 0 { - // Set the default page size to the OS page size. - db.pageSize = common.DefaultPageSize - } - // Initialize the database if it doesn't exist. - if info, statErr := db.file.Stat(); statErr != nil { - _ = db.close() - lg.Errorf("failed to get db file's stats (%s): %v", path, err) - return nil, statErr + if info, err := db.file.Stat(); err != nil { + return nil, err } else if info.Size() == 0 { // Initialize new files with meta pages. - if err = db.init(); err != nil { - // clean up file descriptor on initialization fail - _ = db.close() - lg.Errorf("failed to initialize db file (%s): %v", path, err) + if err := db.init(); err != nil { return nil, err } } else { - // try to get the page size from the metadata pages - if db.pageSize, err = db.getPageSize(); err != nil { - _ = db.close() - lg.Errorf("failed to get page size from db file (%s): %v", path, err) - return nil, err + // Read the first meta page to determine the page size. + var buf [0x1000]byte + if _, err := db.file.ReadAt(buf[:], 0); err == nil { + m := db.pageInBuffer(buf[:], 0).meta() + if err := m.validate(); err != nil { + // If we can't read the page size, we can assume it's the same + // as the OS -- since that's how the page size was chosen in the + // first place. + // + // If the first page is invalid and this OS uses a different + // page size than what the database was created with then we + // are out of luck and cannot access the database. + db.pageSize = os.Getpagesize() + } else { + db.pageSize = int(m.pageSize) + } } } @@ -289,265 +227,78 @@ func Open(path string, mode os.FileMode, options *Options) (db *DB, err error) { } // Memory map the data file. - if err = db.mmap(options.InitialMmapSize); err != nil { + if err := db.mmap(options.InitialMmapSize); err != nil { _ = db.close() - lg.Errorf("failed to map db file (%s): %v", path, err) return nil, err } - if db.PreLoadFreelist { - db.loadFreelist() - } - - if db.readOnly { - return db, nil - } - - // Flush freelist when transitioning from no sync to sync so - // NoFreelistSync unaware boltdb can open the db later. - if !db.NoFreelistSync && !db.hasSyncedFreelist() { - tx, txErr := db.Begin(true) - if tx != nil { - txErr = tx.Commit() - } - if txErr != nil { - lg.Errorf("starting readwrite transaction failed: %v", txErr) - _ = db.close() - return nil, txErr - } - } + // Read in the freelist. + db.freelist = newFreelist() + db.freelist.read(db.page(db.meta().freelist)) // Mark the database as opened and return. return db, nil } -// getPageSize reads the pageSize from the meta pages. It tries -// to read the first meta page firstly. If the first page is invalid, -// then it tries to read the second page using the default page size. -func (db *DB) getPageSize() (int, error) { - var ( - meta0CanRead, meta1CanRead bool - ) - - // Read the first meta page to determine the page size. - if pgSize, canRead, err := db.getPageSizeFromFirstMeta(); err != nil { - // We cannot read the page size from page 0, but can read page 0. - meta0CanRead = canRead - } else { - return pgSize, nil - } - - // Read the second meta page to determine the page size. - if pgSize, canRead, err := db.getPageSizeFromSecondMeta(); err != nil { - // We cannot read the page size from page 1, but can read page 1. - meta1CanRead = canRead - } else { - return pgSize, nil - } - - // If we can't read the page size from both pages, but can read - // either page, then we assume it's the same as the OS or the one - // given, since that's how the page size was chosen in the first place. - // - // If both pages are invalid, and (this OS uses a different page size - // from what the database was created with or the given page size is - // different from what the database was created with), then we are out - // of luck and cannot access the database. - if meta0CanRead || meta1CanRead { - return db.pageSize, nil - } - - return 0, berrors.ErrInvalid -} - -// getPageSizeFromFirstMeta reads the pageSize from the first meta page -func (db *DB) getPageSizeFromFirstMeta() (int, bool, error) { - var buf [0x1000]byte - var metaCanRead bool - if bw, err := db.file.ReadAt(buf[:], 0); err == nil && bw == len(buf) { - metaCanRead = true - if m := db.pageInBuffer(buf[:], 0).Meta(); m.Validate() == nil { - return int(m.PageSize()), metaCanRead, nil - } - } - return 0, metaCanRead, berrors.ErrInvalid -} - -// getPageSizeFromSecondMeta reads the pageSize from the second meta page -func (db *DB) getPageSizeFromSecondMeta() (int, bool, error) { - var ( - fileSize int64 - metaCanRead bool - ) - - // get the db file size - if info, err := db.file.Stat(); err != nil { - return 0, metaCanRead, err - } else { - fileSize = info.Size() - } - - // We need to read the second meta page, so we should skip the first page; - // but we don't know the exact page size yet, it's chicken & egg problem. - // The solution is to try all the possible page sizes, which starts from 1KB - // and until 16MB (1024<<14) or the end of the db file - // - // TODO: should we support larger page size? - for i := 0; i <= 14; i++ { - var buf [0x1000]byte - var pos int64 = 1024 << uint(i) - if pos >= fileSize-1024 { - break - } - bw, err := db.file.ReadAt(buf[:], pos) - if (err == nil && bw == len(buf)) || (err == io.EOF && int64(bw) == (fileSize-pos)) { - metaCanRead = true - if m := db.pageInBuffer(buf[:], 0).Meta(); m.Validate() == nil { - return int(m.PageSize()), metaCanRead, nil - } - } - } - - return 0, metaCanRead, berrors.ErrInvalid -} - -// loadFreelist reads the freelist if it is synced, or reconstructs it -// by scanning the DB if it is not synced. It assumes there are no -// concurrent accesses being made to the freelist. -func (db *DB) loadFreelist() { - db.freelistLoad.Do(func() { - db.freelist = newFreelist(db.FreelistType) - if !db.hasSyncedFreelist() { - // Reconstruct free list by scanning the DB. - db.freelist.Init(db.freepages()) - } else { - // Read free list from freelist page. - db.freelist.Read(db.page(db.meta().Freelist())) - } - db.stats.FreePageN = db.freelist.FreeCount() - }) -} - -func (db *DB) hasSyncedFreelist() bool { - return db.meta().Freelist() != common.PgidNoFreelist -} - -func (db *DB) fileSize() (int, error) { - info, err := db.file.Stat() - if err != nil { - return 0, fmt.Errorf("file stat error: %w", err) - } - sz := int(info.Size()) - if sz < db.pageSize*2 { - return 0, fmt.Errorf("file size too small %d", sz) - } - return sz, nil -} - // mmap opens the underlying memory-mapped file and initializes the meta references. // minsz is the minimum size that the new mmap can be. -func (db *DB) mmap(minsz int) (err error) { +func (db *DB) mmap(minsz int) error { db.mmaplock.Lock() defer db.mmaplock.Unlock() - lg := db.Logger() + info, err := db.file.Stat() + if err != nil { + return fmt.Errorf("mmap stat error: %s", err) + } else if int(info.Size()) < db.pageSize*2 { + return fmt.Errorf("file size too small") + } // Ensure the size is at least the minimum size. - var fileSize int - fileSize, err = db.fileSize() - if err != nil { - lg.Errorf("getting file size failed: %w", err) - return err - } - var size = fileSize + var size = int(info.Size()) if size < minsz { size = minsz } size, err = db.mmapSize(size) if err != nil { - lg.Errorf("getting map size failed: %w", err) return err } - if db.Mlock { - // Unlock db memory - if err := db.munlock(fileSize); err != nil { - return err - } - } - // Dereference all mmap references before unmapping. if db.rwtx != nil { db.rwtx.root.dereference() } // Unmap existing data before continuing. - if err = db.munmap(); err != nil { + if err := db.munmap(); err != nil { return err } // Memory-map the data file as a byte slice. - // gofail: var mapError string - // return errors.New(mapError) - if err = mmap(db, size); err != nil { - lg.Errorf("[GOOS: %s, GOARCH: %s] mmap failed, size: %d, error: %v", runtime.GOOS, runtime.GOARCH, size, err) + if err := mmap(db, size); err != nil { return err } - // Perform unmmap on any error to reset all data fields: - // dataref, data, datasz, meta0 and meta1. - defer func() { - if err != nil { - if unmapErr := db.munmap(); unmapErr != nil { - err = fmt.Errorf("%w; rollback unmap also failed: %v", err, unmapErr) - } - } - }() - - if db.Mlock { - // Don't allow swapping of data file - if err := db.mlock(fileSize); err != nil { - return err - } - } - // Save references to the meta pages. - db.meta0 = db.page(0).Meta() - db.meta1 = db.page(1).Meta() + db.meta0 = db.page(0).meta() + db.meta1 = db.page(1).meta() // Validate the meta pages. We only return an error if both meta pages fail // validation, since meta0 failing validation means that it wasn't saved // properly -- but we can recover using meta1. And vice-versa. - err0 := db.meta0.Validate() - err1 := db.meta1.Validate() + err0 := db.meta0.validate() + err1 := db.meta1.validate() if err0 != nil && err1 != nil { - lg.Errorf("both meta pages are invalid, meta0: %v, meta1: %v", err0, err1) return err0 } return nil } -func (db *DB) invalidate() { - db.dataref = nil - db.data = nil - db.datasz = 0 - - db.meta0 = nil - db.meta1 = nil -} - // munmap unmaps the data file from memory. func (db *DB) munmap() error { - defer db.invalidate() - - // gofail: var unmapError string - // return errors.New(unmapError) if err := munmap(db); err != nil { - db.Logger().Errorf("[GOOS: %s, GOARCH: %s] munmap failed, db.datasz: %d, error: %v", runtime.GOOS, runtime.GOARCH, db.datasz, err) - return fmt.Errorf("unmap error: %v", err.Error()) + return fmt.Errorf("unmap error: " + err.Error()) } - return nil } @@ -563,14 +314,14 @@ func (db *DB) mmapSize(size int) (int, error) { } // Verify the requested size is not above the maximum allowed. - if size > common.MaxMapSize { - return 0, errors.New("mmap too large") + if size > maxMapSize { + return 0, fmt.Errorf("mmap too large") } // If larger than 1GB then grow by 1GB at a time. sz := int64(size) - if remainder := sz % int64(common.MaxMmapStep); remainder > 0 { - sz += int64(common.MaxMmapStep) - remainder + if remainder := sz % int64(maxMmapStep); remainder > 0 { + sz += int64(maxMmapStep) - remainder } // Ensure that the mmap size is a multiple of the page size. @@ -581,83 +332,54 @@ func (db *DB) mmapSize(size int) (int, error) { } // If we've exceeded the max size then only grow up to the max size. - if sz > common.MaxMapSize { - sz = common.MaxMapSize + if sz > maxMapSize { + sz = maxMapSize } return int(sz), nil } -func (db *DB) munlock(fileSize int) error { - // gofail: var munlockError string - // return errors.New(munlockError) - if err := munlock(db, fileSize); err != nil { - db.Logger().Errorf("[GOOS: %s, GOARCH: %s] munlock failed, fileSize: %d, db.datasz: %d, error: %v", runtime.GOOS, runtime.GOARCH, fileSize, db.datasz, err) - return fmt.Errorf("munlock error: %v", err.Error()) - } - return nil -} - -func (db *DB) mlock(fileSize int) error { - // gofail: var mlockError string - // return errors.New(mlockError) - if err := mlock(db, fileSize); err != nil { - db.Logger().Errorf("[GOOS: %s, GOARCH: %s] mlock failed, fileSize: %d, db.datasz: %d, error: %v", runtime.GOOS, runtime.GOARCH, fileSize, db.datasz, err) - return fmt.Errorf("mlock error: %v", err.Error()) - } - return nil -} - -func (db *DB) mrelock(fileSizeFrom, fileSizeTo int) error { - if err := db.munlock(fileSizeFrom); err != nil { - return err - } - if err := db.mlock(fileSizeTo); err != nil { - return err - } - return nil -} - // init creates a new database file and initializes its meta pages. func (db *DB) init() error { + // Set the page size to the OS page size. + db.pageSize = os.Getpagesize() + // Create two meta pages on a buffer. buf := make([]byte, db.pageSize*4) for i := 0; i < 2; i++ { - p := db.pageInBuffer(buf, common.Pgid(i)) - p.SetId(common.Pgid(i)) - p.SetFlags(common.MetaPageFlag) + p := db.pageInBuffer(buf[:], pgid(i)) + p.id = pgid(i) + p.flags = metaPageFlag // Initialize the meta page. - m := p.Meta() - m.SetMagic(common.Magic) - m.SetVersion(common.Version) - m.SetPageSize(uint32(db.pageSize)) - m.SetFreelist(2) - m.SetRootBucket(common.NewInBucket(3, 0)) - m.SetPgid(4) - m.SetTxid(common.Txid(i)) - m.SetChecksum(m.Sum64()) + m := p.meta() + m.magic = magic + m.version = version + m.pageSize = uint32(db.pageSize) + m.freelist = 2 + m.root = bucket{root: 3} + m.pgid = 4 + m.txid = txid(i) + m.checksum = m.sum64() } // Write an empty freelist at page 3. - p := db.pageInBuffer(buf, common.Pgid(2)) - p.SetId(2) - p.SetFlags(common.FreelistPageFlag) - p.SetCount(0) + p := db.pageInBuffer(buf[:], pgid(2)) + p.id = pgid(2) + p.flags = freelistPageFlag + p.count = 0 // Write an empty leaf page at page 4. - p = db.pageInBuffer(buf, common.Pgid(3)) - p.SetId(3) - p.SetFlags(common.LeafPageFlag) - p.SetCount(0) + p = db.pageInBuffer(buf[:], pgid(3)) + p.id = pgid(3) + p.flags = leafPageFlag + p.count = 0 // Write the buffer to our data file. if _, err := db.ops.writeAt(buf, 0); err != nil { - db.Logger().Errorf("writeAt failed: %w", err) return err } if err := fdatasync(db); err != nil { - db.Logger().Errorf("[GOOS: %s, GOARCH: %s] fdatasync failed: %w", runtime.GOOS, runtime.GOARCH, err) return err } @@ -665,8 +387,7 @@ func (db *DB) init() error { } // Close releases all database resources. -// It will block waiting for any open transactions to finish -// before closing the database and returning. +// All transactions must be closed before closing the database. func (db *DB) Close() error { db.rwlock.Lock() defer db.rwlock.Unlock() @@ -674,8 +395,8 @@ func (db *DB) Close() error { db.metalock.Lock() defer db.metalock.Unlock() - db.mmaplock.Lock() - defer db.mmaplock.Unlock() + db.mmaplock.RLock() + defer db.mmaplock.RUnlock() return db.close() } @@ -692,10 +413,9 @@ func (db *DB) close() error { // Clear ops. db.ops.writeAt = nil - var errs []error // Close the mmap. if err := db.munmap(); err != nil { - errs = append(errs, err) + return err } // Close file handles. @@ -704,22 +424,18 @@ func (db *DB) close() error { if !db.readOnly { // Unlock the file. if err := funlock(db); err != nil { - errs = append(errs, fmt.Errorf("bolt.Close(): funlock error: %w", err)) + log.Printf("bolt.Close(): funlock error: %s", err) } } // Close the file descriptor. if err := db.file.Close(); err != nil { - errs = append(errs, fmt.Errorf("db file close: %w", err)) + return fmt.Errorf("db file close: %s", err) } db.file = nil } db.path = "" - - if len(errs) > 0 { - return errs[0] - } return nil } @@ -740,31 +456,13 @@ func (db *DB) close() error { // // IMPORTANT: You must close read-only transactions after you are finished or // else the database will not reclaim old pages. -func (db *DB) Begin(writable bool) (t *Tx, err error) { - if lg := db.Logger(); lg != discardLogger { - lg.Debugf("Starting a new transaction [writable: %t]", writable) - defer func() { - if err != nil { - lg.Errorf("Starting a new transaction [writable: %t] failed: %v", writable, err) - } else { - lg.Debugf("Starting a new transaction [writable: %t] successfully", writable) - } - }() - } - +func (db *DB) Begin(writable bool) (*Tx, error) { if writable { return db.beginRWTx() } return db.beginTx() } -func (db *DB) Logger() Logger { - if db == nil || db.logger == nil { - return getDiscardLogger() - } - return db.logger -} - func (db *DB) beginTx() (*Tx, error) { // Lock the meta pages while we initialize the transaction. We obtain // the meta lock before the mmap lock because that's the order that the @@ -780,14 +478,7 @@ func (db *DB) beginTx() (*Tx, error) { if !db.opened { db.mmaplock.RUnlock() db.metalock.Unlock() - return nil, berrors.ErrDatabaseNotOpen - } - - // Exit if the database is not correctly mapped. - if db.data == nil { - db.mmaplock.RUnlock() - db.metalock.Unlock() - return nil, berrors.ErrInvalidMapping + return nil, ErrDatabaseNotOpen } // Create a transaction associated with the database. @@ -797,9 +488,6 @@ func (db *DB) beginTx() (*Tx, error) { // Keep track of transaction until it closes. db.txs = append(db.txs, t) n := len(db.txs) - if db.freelist != nil { - db.freelist.AddReadonlyTXID(t.meta.Txid()) - } // Unlock the meta pages. db.metalock.Unlock() @@ -816,7 +504,7 @@ func (db *DB) beginTx() (*Tx, error) { func (db *DB) beginRWTx() (*Tx, error) { // If the database was opened with Options.ReadOnly, return an error. if db.readOnly { - return nil, berrors.ErrDatabaseReadOnly + return nil, ErrDatabaseReadOnly } // Obtain writer lock. This is released by the transaction when it closes. @@ -831,20 +519,25 @@ func (db *DB) beginRWTx() (*Tx, error) { // Exit if the database is not open yet. if !db.opened { db.rwlock.Unlock() - return nil, berrors.ErrDatabaseNotOpen - } - - // Exit if the database is not correctly mapped. - if db.data == nil { - db.rwlock.Unlock() - return nil, berrors.ErrInvalidMapping + return nil, ErrDatabaseNotOpen } // Create a transaction associated with the database. t := &Tx{writable: true} t.init(db) db.rwtx = t - db.freelist.ReleasePendingPages() + + // Free any pages associated with closed read-only transactions. + var minid txid = 0xFFFFFFFFFFFFFFFF + for _, t := range db.txs { + if t.meta.txid < minid { + minid = t.meta.txid + } + } + if minid > 0 { + db.freelist.release(minid - 1) + } + return t, nil } @@ -859,17 +552,11 @@ func (db *DB) removeTx(tx *Tx) { // Remove the transaction. for i, t := range db.txs { if t == tx { - last := len(db.txs) - 1 - db.txs[i] = db.txs[last] - db.txs[last] = nil - db.txs = db.txs[:last] + db.txs = append(db.txs[:i], db.txs[i+1:]...) break } } n := len(db.txs) - if db.freelist != nil { - db.freelist.RemoveReadonlyTXID(tx.meta.Txid()) - } // Unlock the meta pages. db.metalock.Unlock() @@ -943,7 +630,11 @@ func (db *DB) View(fn func(*Tx) error) error { return err } - return t.Rollback() + if err := t.Rollback(); err != nil { + return err + } + + return nil } // Batch calls fn as part of a batch. It behaves similar to Update, @@ -1043,7 +734,9 @@ retry: // pass success, or bolt internal errors, to all callers for _, c := range b.calls { - c.err <- err + if c.err != nil { + c.err <- err + } } break retry } @@ -1078,20 +771,7 @@ func safelyCall(fn func(*Tx) error, tx *Tx) (err error) { // // This is not necessary under normal operation, however, if you use NoSync // then it allows you to force the database file to sync against the disk. -func (db *DB) Sync() (err error) { - if lg := db.Logger(); lg != discardLogger { - lg.Debugf("Syncing bbolt db (%s)", db.path) - defer func() { - if err != nil { - lg.Errorf("[GOOS: %s, GOARCH: %s] syncing bbolt db (%s) failed: %v", runtime.GOOS, runtime.GOARCH, db.path, err) - } else { - lg.Debugf("Syncing bbolt db (%s) successfully", db.path) - } - }() - } - - return fdatasync(db) -} +func (db *DB) Sync() error { return fdatasync(db) } // Stats retrieves ongoing performance stats for the database. // This is only updated when a transaction closes. @@ -1104,37 +784,36 @@ func (db *DB) Stats() Stats { // This is for internal access to the raw data bytes from the C cursor, use // carefully, or not at all. func (db *DB) Info() *Info { - common.Assert(db.data != nil, "database file isn't correctly mapped") return &Info{uintptr(unsafe.Pointer(&db.data[0])), db.pageSize} } // page retrieves a page reference from the mmap based on the current page size. -func (db *DB) page(id common.Pgid) *common.Page { - pos := id * common.Pgid(db.pageSize) - return (*common.Page)(unsafe.Pointer(&db.data[pos])) +func (db *DB) page(id pgid) *page { + pos := id * pgid(db.pageSize) + return (*page)(unsafe.Pointer(&db.data[pos])) } // pageInBuffer retrieves a page reference from a given byte array based on the current page size. -func (db *DB) pageInBuffer(b []byte, id common.Pgid) *common.Page { - return (*common.Page)(unsafe.Pointer(&b[id*common.Pgid(db.pageSize)])) +func (db *DB) pageInBuffer(b []byte, id pgid) *page { + return (*page)(unsafe.Pointer(&b[id*pgid(db.pageSize)])) } // meta retrieves the current meta page reference. -func (db *DB) meta() *common.Meta { +func (db *DB) meta() *meta { // We have to return the meta with the highest txid which doesn't fail // validation. Otherwise, we can cause errors when in fact the database is // in a consistent state. metaA is the one with the higher txid. metaA := db.meta0 metaB := db.meta1 - if db.meta1.Txid() > db.meta0.Txid() { + if db.meta1.txid > db.meta0.txid { metaA = db.meta1 metaB = db.meta0 } - // Use higher meta page if valid. Otherwise, fallback to previous, if valid. - if err := metaA.Validate(); err == nil { + // Use higher meta page if valid. Otherwise fallback to previous, if valid. + if err := metaA.validate(); err == nil { return metaA - } else if err := metaB.Validate(); err == nil { + } else if err := metaB.validate(); err == nil { return metaB } @@ -1144,7 +823,7 @@ func (db *DB) meta() *common.Meta { } // allocate returns a contiguous block of memory starting at a given page. -func (db *DB) allocate(txid common.Txid, count int) (*common.Page, error) { +func (db *DB) allocate(count int) (*page, error) { // Allocate a temporary buffer for the page. var buf []byte if count == 1 { @@ -1152,18 +831,17 @@ func (db *DB) allocate(txid common.Txid, count int) (*common.Page, error) { } else { buf = make([]byte, count*db.pageSize) } - p := (*common.Page)(unsafe.Pointer(&buf[0])) - p.SetOverflow(uint32(count - 1)) + p := (*page)(unsafe.Pointer(&buf[0])) + p.overflow = uint32(count - 1) // Use pages from the freelist if they are available. - p.SetId(db.freelist.Allocate(txid, count)) - if p.Id() != 0 { + if p.id = db.freelist.allocate(count); p.id != 0 { return p, nil } // Resize mmap() if we're at the end. - p.SetId(db.rwtx.meta.Pgid()) - var minsz = int((p.Id()+common.Pgid(count))+1) * db.pageSize + p.id = db.rwtx.meta.pgid + var minsz = int((p.id+pgid(count))+1) * db.pageSize if minsz >= db.datasz { if err := db.mmap(minsz); err != nil { return nil, fmt.Errorf("mmap allocate error: %s", err) @@ -1171,8 +849,7 @@ func (db *DB) allocate(txid common.Txid, count int) (*common.Page, error) { } // Move the page id high water mark. - curPgid := db.rwtx.meta.Pgid() - db.rwtx.meta.SetPgid(curPgid + common.Pgid(count)) + db.rwtx.meta.pgid += pgid(count) return p, nil } @@ -1180,19 +857,13 @@ func (db *DB) allocate(txid common.Txid, count int) (*common.Page, error) { // grow grows the size of the database to the given sz. func (db *DB) grow(sz int) error { // Ignore if the new size is less than available file size. - lg := db.Logger() - fileSize, err := db.fileSize() - if err != nil { - lg.Errorf("getting file size failed: %w", err) - return err - } - if sz <= fileSize { + if sz <= db.filesz { return nil } // If the data is smaller than the alloc size then only allocate what's needed. // Once it goes over the allocation size then allocate in chunks. - if db.datasz <= db.AllocSize { + if db.datasz < db.AllocSize { sz = db.datasz } else { sz += db.AllocSize @@ -1202,25 +873,16 @@ func (db *DB) grow(sz int) error { // https://github.com/boltdb/bolt/issues/284 if !db.NoGrowSync && !db.readOnly { if runtime.GOOS != "windows" { - // gofail: var resizeFileError string - // return errors.New(resizeFileError) if err := db.file.Truncate(int64(sz)); err != nil { - lg.Errorf("[GOOS: %s, GOARCH: %s] truncating file failed, size: %d, db.datasz: %d, error: %v", runtime.GOOS, runtime.GOARCH, sz, db.datasz, err) return fmt.Errorf("file resize error: %s", err) } } if err := db.file.Sync(); err != nil { - lg.Errorf("[GOOS: %s, GOARCH: %s] syncing file failed, db.datasz: %d, error: %v", runtime.GOOS, runtime.GOARCH, db.datasz, err) return fmt.Errorf("file sync error: %s", err) } - if db.Mlock { - // unlock old file and lock new one - if err := db.mrelock(fileSize, sz); err != nil { - return fmt.Errorf("mlock/munlock error: %s", err) - } - } } + db.filesz = sz return nil } @@ -1228,72 +890,16 @@ func (db *DB) IsReadOnly() bool { return db.readOnly } -func (db *DB) freepages() []common.Pgid { - tx, err := db.beginTx() - defer func() { - err = tx.Rollback() - if err != nil { - panic("freepages: failed to rollback tx") - } - }() - if err != nil { - panic("freepages: failed to open read only tx") - } - - reachable := make(map[common.Pgid]*common.Page) - nofreed := make(map[common.Pgid]bool) - ech := make(chan error) - go func() { - for e := range ech { - panic(fmt.Sprintf("freepages: failed to get all reachable pages (%v)", e)) - } - }() - tx.recursivelyCheckBucket(&tx.root, reachable, nofreed, HexKVStringer(), ech) - close(ech) - - // TODO: If check bucket reported any corruptions (ech) we shouldn't proceed to freeing the pages. - - var fids []common.Pgid - for i := common.Pgid(2); i < db.meta().Pgid(); i++ { - if _, ok := reachable[i]; !ok { - fids = append(fids, i) - } - } - return fids -} - -func newFreelist(freelistType FreelistType) fl.Interface { - if freelistType == FreelistMapType { - return fl.NewHashMapFreelist() - } - return fl.NewArrayFreelist() -} - // Options represents the options that can be set when opening a database. type Options struct { // Timeout is the amount of time to wait to obtain a file lock. - // When set to zero it will wait indefinitely. + // When set to zero it will wait indefinitely. This option is only + // available on Darwin and Linux. Timeout time.Duration // Sets the DB.NoGrowSync flag before memory mapping the file. NoGrowSync bool - // Do not sync freelist to disk. This improves the database write performance - // under normal operation, but requires a full database re-sync during recovery. - NoFreelistSync bool - - // PreLoadFreelist sets whether to load the free pages when opening - // the db file. Note when opening db in write mode, bbolt will always - // load the free pages. - PreLoadFreelist bool - - // FreelistType sets the backend freelist type. There are two options. Array which is simple but endures - // dramatic performance degradation if database is large and fragmentation in freelist is common. - // The alternative one is using hashmap, it is faster in almost all circumstances - // but it doesn't guarantee that it offers the smallest page id available. In normal case it is safe. - // The default type is array - FreelistType FreelistType - // Open database in read-only mode. Uses flock(..., LOCK_SH |LOCK_NB) to // grab a shared lock (UNIX). ReadOnly bool @@ -1309,61 +915,18 @@ type Options struct { // If <=0, the initial map size is 0. // If initialMmapSize is smaller than the previous database size, // it takes no effect. - // - // Note: On Windows, due to platform limitations, the database file size - // will be immediately resized to match `InitialMmapSize` (aligned to page size) - // when the DB is opened. On non-Windows platforms, the file size will grow - // dynamically based on the actual amount of written data, regardless of `InitialMmapSize`. - // Refer to https://github.com/etcd-io/bbolt/issues/378#issuecomment-1378121966. InitialMmapSize int - - // PageSize overrides the default OS page size. - PageSize int - - // NoSync sets the initial value of DB.NoSync. Normally this can just be - // set directly on the DB itself when returned from Open(), but this option - // is useful in APIs which expose Options but not the underlying DB. - NoSync bool - - // OpenFile is used to open files. It defaults to os.OpenFile. This option - // is useful for writing hermetic tests. - OpenFile func(string, int, os.FileMode) (*os.File, error) - - // Mlock locks database file in memory when set to true. - // It prevents potential page faults, however - // used memory can't be reclaimed. (UNIX only) - Mlock bool - - // Logger is the logger used for bbolt. - Logger Logger -} - -func (o *Options) String() string { - if o == nil { - return "{}" - } - - return fmt.Sprintf("{Timeout: %s, NoGrowSync: %t, NoFreelistSync: %t, PreLoadFreelist: %t, FreelistType: %s, ReadOnly: %t, MmapFlags: %x, InitialMmapSize: %d, PageSize: %d, NoSync: %t, OpenFile: %p, Mlock: %t, Logger: %p}", - o.Timeout, o.NoGrowSync, o.NoFreelistSync, o.PreLoadFreelist, o.FreelistType, o.ReadOnly, o.MmapFlags, o.InitialMmapSize, o.PageSize, o.NoSync, o.OpenFile, o.Mlock, o.Logger) - } // DefaultOptions represent the options used if nil options are passed into Open(). // No timeout is used which will cause Bolt to wait indefinitely for a lock. var DefaultOptions = &Options{ - Timeout: 0, - NoGrowSync: false, - FreelistType: FreelistArrayType, + Timeout: 0, + NoGrowSync: false, } // Stats represents statistics about the database. type Stats struct { - // Put `TxStats` at the first field to ensure it's 64-bit aligned. Note - // that the first word in an allocated struct can be relied upon to be - // 64-bit aligned. Refer to https://pkg.go.dev/sync/atomic#pkg-note-BUG. - // Also refer to discussion in https://github.com/etcd-io/bbolt/issues/577. - TxStats TxStats // global, ongoing stats. - // Freelist stats FreePageN int // total number of free pages on the freelist PendingPageN int // total number of pending pages on the freelist @@ -1373,6 +936,8 @@ type Stats struct { // Transaction stats TxN int // total number of started read transactions OpenTxN int // number of currently open read transactions + + TxStats TxStats // global, ongoing stats. } // Sub calculates and returns the difference between two sets of database stats. @@ -1387,12 +952,85 @@ func (s *Stats) Sub(other *Stats) Stats { diff.PendingPageN = s.PendingPageN diff.FreeAlloc = s.FreeAlloc diff.FreelistInuse = s.FreelistInuse - diff.TxN = s.TxN - other.TxN + diff.TxN = other.TxN - s.TxN diff.TxStats = s.TxStats.Sub(&other.TxStats) return diff } +func (s *Stats) add(other *Stats) { + s.TxStats.add(&other.TxStats) +} + type Info struct { Data uintptr PageSize int } + +type meta struct { + magic uint32 + version uint32 + pageSize uint32 + flags uint32 + root bucket + freelist pgid + pgid pgid + txid txid + checksum uint64 +} + +// validate checks the marker bytes and version of the meta page to ensure it matches this binary. +func (m *meta) validate() error { + if m.magic != magic { + return ErrInvalid + } else if m.version != version { + return ErrVersionMismatch + } else if m.checksum != 0 && m.checksum != m.sum64() { + return ErrChecksum + } + return nil +} + +// copy copies one meta object to another. +func (m *meta) copy(dest *meta) { + *dest = *m +} + +// write writes the meta onto a page. +func (m *meta) write(p *page) { + if m.root.root >= m.pgid { + panic(fmt.Sprintf("root bucket pgid (%d) above high water mark (%d)", m.root.root, m.pgid)) + } else if m.freelist >= m.pgid { + panic(fmt.Sprintf("freelist pgid (%d) above high water mark (%d)", m.freelist, m.pgid)) + } + + // Page id is either going to be 0 or 1 which we can determine by the transaction ID. + p.id = pgid(m.txid % 2) + p.flags |= metaPageFlag + + // Calculate the checksum. + m.checksum = m.sum64() + + m.copy(p.meta()) +} + +// generates the checksum for the meta. +func (m *meta) sum64() uint64 { + var h = fnv.New64a() + _, _ = h.Write((*[unsafe.Offsetof(meta{}.checksum)]byte)(unsafe.Pointer(m))[:]) + return h.Sum64() +} + +// _assert will panic with a given formatted message if the given condition is false. +func _assert(condition bool, msg string, v ...interface{}) { + if !condition { + panic(fmt.Sprintf("assertion failed: "+msg, v...)) + } +} + +func warn(v ...interface{}) { fmt.Fprintln(os.Stderr, v...) } +func warnf(msg string, v ...interface{}) { fmt.Fprintf(os.Stderr, msg+"\n", v...) } + +func printstack() { + stack := strings.Join(strings.Split(string(debug.Stack()), "\n")[2:], "\n") + fmt.Fprintln(os.Stderr, stack) +} diff --git a/vendor/go.etcd.io/bbolt/doc.go b/vendor/github.com/boltdb/bolt/doc.go similarity index 93% rename from vendor/go.etcd.io/bbolt/doc.go rename to vendor/github.com/boltdb/bolt/doc.go index d1007e4..cc93784 100644 --- a/vendor/go.etcd.io/bbolt/doc.go +++ b/vendor/github.com/boltdb/bolt/doc.go @@ -1,5 +1,5 @@ /* -package bbolt implements a low-level key/value store in pure Go. It supports +Package bolt implements a low-level key/value store in pure Go. It supports fully serializable transactions, ACID semantics, and lock-free MVCC with multiple readers and a single writer. Bolt can be used for projects that want a simple data store without the need to add large dependencies such as @@ -14,7 +14,8 @@ The design of Bolt is based on Howard Chu's LMDB database project. Bolt currently works on Windows, Mac OS X, and Linux. -# Basics + +Basics There are only a few types in Bolt: DB, Bucket, Tx, and Cursor. The DB is a collection of buckets and is represented by a single file on disk. A bucket is @@ -26,7 +27,8 @@ iterate over the dataset sequentially. Read-write transactions can create and delete buckets and can insert and remove keys. Only one read-write transaction is allowed at a time. -# Caveats + +Caveats The database uses a read-only, memory-mapped data file to ensure that applications cannot corrupt the database, however, this means that keys and @@ -36,5 +38,7 @@ will cause Go to panic. Keys and values retrieved from the database are only valid for the life of the transaction. When used outside the transaction, these byte slices can point to different data or can point to invalid memory which will cause a panic. + + */ -package bbolt +package bolt diff --git a/vendor/go.etcd.io/bbolt/errors/errors.go b/vendor/github.com/boltdb/bolt/errors.go similarity index 68% rename from vendor/go.etcd.io/bbolt/errors/errors.go rename to vendor/github.com/boltdb/bolt/errors.go index c115289..a3620a3 100644 --- a/vendor/go.etcd.io/bbolt/errors/errors.go +++ b/vendor/github.com/boltdb/bolt/errors.go @@ -1,6 +1,4 @@ -// Package errors defines the error variables that may be returned -// during bbolt operations. -package errors +package bolt import "errors" @@ -10,18 +8,19 @@ var ( // is opened or after it is closed. ErrDatabaseNotOpen = errors.New("database not open") + // ErrDatabaseOpen is returned when opening a database that is + // already open. + ErrDatabaseOpen = errors.New("database already open") + // ErrInvalid is returned when both meta pages on a database are invalid. // This typically occurs when a file is not a bolt database. ErrInvalid = errors.New("invalid database") - // ErrInvalidMapping is returned when the database file fails to get mapped. - ErrInvalidMapping = errors.New("database isn't correctly mapped") - // ErrVersionMismatch is returned when the data file was created with a // different version of Bolt. ErrVersionMismatch = errors.New("version mismatch") - // ErrChecksum is returned when a checksum mismatch occurs on either of the two meta pages. + // ErrChecksum is returned when either meta page checksum does not match. ErrChecksum = errors.New("checksum error") // ErrTimeout is returned when a database cannot obtain an exclusive lock @@ -42,10 +41,6 @@ var ( // ErrDatabaseReadOnly is returned when a mutating transaction is started on a // read-only database. ErrDatabaseReadOnly = errors.New("database is in read-only mode") - - // ErrFreePagesNotLoaded is returned when a readonly transaction without - // preloading the free pages is trying to access the free pages. - ErrFreePagesNotLoaded = errors.New("free pages are not pre-loaded") ) // These errors can occur when putting or deleting a value or a bucket. @@ -69,16 +64,8 @@ var ( // ErrValueTooLarge is returned when inserting a value that is larger than MaxValueSize. ErrValueTooLarge = errors.New("value too large") - // ErrIncompatibleValue is returned when trying to create or delete a bucket + // ErrIncompatibleValue is returned when trying create or delete a bucket // on an existing non-bucket key or when trying to create or delete a // non-bucket key on an existing bucket key. ErrIncompatibleValue = errors.New("incompatible value") - - // ErrSameBuckets is returned when trying to move a sub-bucket between - // source and target buckets, while source and target buckets are the same. - ErrSameBuckets = errors.New("the source and target are the same bucket") - - // ErrDifferentDB is returned when trying to move a sub-bucket between - // source and target buckets, while source and target buckets are in different database files. - ErrDifferentDB = errors.New("the source and target buckets are in different database files") ) diff --git a/vendor/github.com/boltdb/bolt/freelist.go b/vendor/github.com/boltdb/bolt/freelist.go new file mode 100644 index 0000000..1b7ba91 --- /dev/null +++ b/vendor/github.com/boltdb/bolt/freelist.go @@ -0,0 +1,248 @@ +package bolt + +import ( + "fmt" + "sort" + "unsafe" +) + +// freelist represents a list of all pages that are available for allocation. +// It also tracks pages that have been freed but are still in use by open transactions. +type freelist struct { + ids []pgid // all free and available free page ids. + pending map[txid][]pgid // mapping of soon-to-be free page ids by tx. + cache map[pgid]bool // fast lookup of all free and pending page ids. +} + +// newFreelist returns an empty, initialized freelist. +func newFreelist() *freelist { + return &freelist{ + pending: make(map[txid][]pgid), + cache: make(map[pgid]bool), + } +} + +// size returns the size of the page after serialization. +func (f *freelist) size() int { + return pageHeaderSize + (int(unsafe.Sizeof(pgid(0))) * f.count()) +} + +// count returns count of pages on the freelist +func (f *freelist) count() int { + return f.free_count() + f.pending_count() +} + +// free_count returns count of free pages +func (f *freelist) free_count() int { + return len(f.ids) +} + +// pending_count returns count of pending pages +func (f *freelist) pending_count() int { + var count int + for _, list := range f.pending { + count += len(list) + } + return count +} + +// all returns a list of all free ids and all pending ids in one sorted list. +func (f *freelist) all() []pgid { + m := make(pgids, 0) + + for _, list := range f.pending { + m = append(m, list...) + } + + sort.Sort(m) + return pgids(f.ids).merge(m) +} + +// allocate returns the starting page id of a contiguous list of pages of a given size. +// If a contiguous block cannot be found then 0 is returned. +func (f *freelist) allocate(n int) pgid { + if len(f.ids) == 0 { + return 0 + } + + var initial, previd pgid + for i, id := range f.ids { + if id <= 1 { + panic(fmt.Sprintf("invalid page allocation: %d", id)) + } + + // Reset initial page if this is not contiguous. + if previd == 0 || id-previd != 1 { + initial = id + } + + // If we found a contiguous block then remove it and return it. + if (id-initial)+1 == pgid(n) { + // If we're allocating off the beginning then take the fast path + // and just adjust the existing slice. This will use extra memory + // temporarily but the append() in free() will realloc the slice + // as is necessary. + if (i + 1) == n { + f.ids = f.ids[i+1:] + } else { + copy(f.ids[i-n+1:], f.ids[i+1:]) + f.ids = f.ids[:len(f.ids)-n] + } + + // Remove from the free cache. + for i := pgid(0); i < pgid(n); i++ { + delete(f.cache, initial+i) + } + + return initial + } + + previd = id + } + return 0 +} + +// free releases a page and its overflow for a given transaction id. +// If the page is already free then a panic will occur. +func (f *freelist) free(txid txid, p *page) { + if p.id <= 1 { + panic(fmt.Sprintf("cannot free page 0 or 1: %d", p.id)) + } + + // Free page and all its overflow pages. + var ids = f.pending[txid] + for id := p.id; id <= p.id+pgid(p.overflow); id++ { + // Verify that page is not already free. + if f.cache[id] { + panic(fmt.Sprintf("page %d already freed", id)) + } + + // Add to the freelist and cache. + ids = append(ids, id) + f.cache[id] = true + } + f.pending[txid] = ids +} + +// release moves all page ids for a transaction id (or older) to the freelist. +func (f *freelist) release(txid txid) { + m := make(pgids, 0) + for tid, ids := range f.pending { + if tid <= txid { + // Move transaction's pending pages to the available freelist. + // Don't remove from the cache since the page is still free. + m = append(m, ids...) + delete(f.pending, tid) + } + } + sort.Sort(m) + f.ids = pgids(f.ids).merge(m) +} + +// rollback removes the pages from a given pending tx. +func (f *freelist) rollback(txid txid) { + // Remove page ids from cache. + for _, id := range f.pending[txid] { + delete(f.cache, id) + } + + // Remove pages from pending list. + delete(f.pending, txid) +} + +// freed returns whether a given page is in the free list. +func (f *freelist) freed(pgid pgid) bool { + return f.cache[pgid] +} + +// read initializes the freelist from a freelist page. +func (f *freelist) read(p *page) { + // If the page.count is at the max uint16 value (64k) then it's considered + // an overflow and the size of the freelist is stored as the first element. + idx, count := 0, int(p.count) + if count == 0xFFFF { + idx = 1 + count = int(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[0]) + } + + // Copy the list of page ids from the freelist. + if count == 0 { + f.ids = nil + } else { + ids := ((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[idx:count] + f.ids = make([]pgid, len(ids)) + copy(f.ids, ids) + + // Make sure they're sorted. + sort.Sort(pgids(f.ids)) + } + + // Rebuild the page cache. + f.reindex() +} + +// write writes the page ids onto a freelist page. All free and pending ids are +// saved to disk since in the event of a program crash, all pending ids will +// become free. +func (f *freelist) write(p *page) error { + // Combine the old free pgids and pgids waiting on an open transaction. + ids := f.all() + + // Update the header flag. + p.flags |= freelistPageFlag + + // The page.count can only hold up to 64k elements so if we overflow that + // number then we handle it by putting the size in the first element. + if len(ids) == 0 { + p.count = uint16(len(ids)) + } else if len(ids) < 0xFFFF { + p.count = uint16(len(ids)) + copy(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[:], ids) + } else { + p.count = 0xFFFF + ((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[0] = pgid(len(ids)) + copy(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[1:], ids) + } + + return nil +} + +// reload reads the freelist from a page and filters out pending items. +func (f *freelist) reload(p *page) { + f.read(p) + + // Build a cache of only pending pages. + pcache := make(map[pgid]bool) + for _, pendingIDs := range f.pending { + for _, pendingID := range pendingIDs { + pcache[pendingID] = true + } + } + + // Check each page in the freelist and build a new available freelist + // with any pages not in the pending lists. + var a []pgid + for _, id := range f.ids { + if !pcache[id] { + a = append(a, id) + } + } + f.ids = a + + // Once the available list is rebuilt then rebuild the free cache so that + // it includes the available and pending free pages. + f.reindex() +} + +// reindex rebuilds the free cache based on available and pending free lists. +func (f *freelist) reindex() { + f.cache = make(map[pgid]bool) + for _, id := range f.ids { + f.cache[id] = true + } + for _, pendingIDs := range f.pending { + for _, pendingID := range pendingIDs { + f.cache[pendingID] = true + } + } +} diff --git a/vendor/go.etcd.io/bbolt/node.go b/vendor/github.com/boltdb/bolt/node.go similarity index 58% rename from vendor/go.etcd.io/bbolt/node.go rename to vendor/github.com/boltdb/bolt/node.go index 022b100..159318b 100644 --- a/vendor/go.etcd.io/bbolt/node.go +++ b/vendor/github.com/boltdb/bolt/node.go @@ -1,11 +1,10 @@ -package bbolt +package bolt import ( "bytes" "fmt" "sort" - - "go.etcd.io/bbolt/internal/common" + "unsafe" ) // node represents an in-memory, deserialized page. @@ -15,10 +14,10 @@ type node struct { unbalanced bool spilled bool key []byte - pgid common.Pgid + pgid pgid parent *node children nodes - inodes common.Inodes + inodes inodes } // root returns the top-level node this node is attached to. @@ -39,22 +38,22 @@ func (n *node) minKeys() int { // size returns the size of the node after serialization. func (n *node) size() int { - sz, elsz := common.PageHeaderSize, n.pageElementSize() + sz, elsz := pageHeaderSize, n.pageElementSize() for i := 0; i < len(n.inodes); i++ { item := &n.inodes[i] - sz += elsz + uintptr(len(item.Key())) + uintptr(len(item.Value())) + sz += elsz + len(item.key) + len(item.value) } - return int(sz) + return sz } // sizeLessThan returns true if the node is less than a given size. // This is an optimization to avoid calculating a large node when we only need // to know if it fits inside a certain page size. -func (n *node) sizeLessThan(v uintptr) bool { - sz, elsz := common.PageHeaderSize, n.pageElementSize() +func (n *node) sizeLessThan(v int) bool { + sz, elsz := pageHeaderSize, n.pageElementSize() for i := 0; i < len(n.inodes); i++ { item := &n.inodes[i] - sz += elsz + uintptr(len(item.Key())) + uintptr(len(item.Value())) + sz += elsz + len(item.key) + len(item.value) if sz >= v { return false } @@ -63,11 +62,11 @@ func (n *node) sizeLessThan(v uintptr) bool { } // pageElementSize returns the size of each page element based on the type of node. -func (n *node) pageElementSize() uintptr { +func (n *node) pageElementSize() int { if n.isLeaf { - return common.LeafPageElementSize + return leafPageElementSize } - return common.BranchPageElementSize + return branchPageElementSize } // childAt returns the child node at a given index. @@ -75,12 +74,12 @@ func (n *node) childAt(index int) *node { if n.isLeaf { panic(fmt.Sprintf("invalid childAt(%d) on a leaf node", index)) } - return n.bucket.node(n.inodes[index].Pgid(), n) + return n.bucket.node(n.inodes[index].pgid, n) } // childIndex returns the index of a given child node. func (n *node) childIndex(child *node) int { - index := sort.Search(len(n.inodes), func(i int) bool { return bytes.Compare(n.inodes[i].Key(), child.key) != -1 }) + index := sort.Search(len(n.inodes), func(i int) bool { return bytes.Compare(n.inodes[i].key, child.key) != -1 }) return index } @@ -114,9 +113,9 @@ func (n *node) prevSibling() *node { } // put inserts a key/value. -func (n *node) put(oldKey, newKey, value []byte, pgId common.Pgid, flags uint32) { - if pgId >= n.bucket.tx.meta.Pgid() { - panic(fmt.Sprintf("pgId (%d) above high water mark (%d)", pgId, n.bucket.tx.meta.Pgid())) +func (n *node) put(oldKey, newKey, value []byte, pgid pgid, flags uint32) { + if pgid >= n.bucket.tx.meta.pgid { + panic(fmt.Sprintf("pgid (%d) above high water mark (%d)", pgid, n.bucket.tx.meta.pgid)) } else if len(oldKey) <= 0 { panic("put: zero-length old key") } else if len(newKey) <= 0 { @@ -124,30 +123,30 @@ func (n *node) put(oldKey, newKey, value []byte, pgId common.Pgid, flags uint32) } // Find insertion index. - index := sort.Search(len(n.inodes), func(i int) bool { return bytes.Compare(n.inodes[i].Key(), oldKey) != -1 }) + index := sort.Search(len(n.inodes), func(i int) bool { return bytes.Compare(n.inodes[i].key, oldKey) != -1 }) // Add capacity and shift nodes if we don't have an exact match and need to insert. - exact := len(n.inodes) > 0 && index < len(n.inodes) && bytes.Equal(n.inodes[index].Key(), oldKey) + exact := (len(n.inodes) > 0 && index < len(n.inodes) && bytes.Equal(n.inodes[index].key, oldKey)) if !exact { - n.inodes = append(n.inodes, common.Inode{}) + n.inodes = append(n.inodes, inode{}) copy(n.inodes[index+1:], n.inodes[index:]) } inode := &n.inodes[index] - inode.SetFlags(flags) - inode.SetKey(newKey) - inode.SetValue(value) - inode.SetPgid(pgId) - common.Assert(len(inode.Key()) > 0, "put: zero-length inode key") + inode.flags = flags + inode.key = newKey + inode.value = value + inode.pgid = pgid + _assert(len(inode.key) > 0, "put: zero-length inode key") } // del removes a key from the node. func (n *node) del(key []byte) { // Find index of key. - index := sort.Search(len(n.inodes), func(i int) bool { return bytes.Compare(n.inodes[i].Key(), key) != -1 }) + index := sort.Search(len(n.inodes), func(i int) bool { return bytes.Compare(n.inodes[i].key, key) != -1 }) // Exit if the key isn't found. - if index >= len(n.inodes) || !bytes.Equal(n.inodes[index].Key(), key) { + if index >= len(n.inodes) || !bytes.Equal(n.inodes[index].key, key) { return } @@ -159,51 +158,96 @@ func (n *node) del(key []byte) { } // read initializes the node from a page. -func (n *node) read(p *common.Page) { - n.pgid = p.Id() - n.isLeaf = p.IsLeafPage() - n.inodes = common.ReadInodeFromPage(p) +func (n *node) read(p *page) { + n.pgid = p.id + n.isLeaf = ((p.flags & leafPageFlag) != 0) + n.inodes = make(inodes, int(p.count)) - // Save first key, so we can find the node in the parent when we spill. + for i := 0; i < int(p.count); i++ { + inode := &n.inodes[i] + if n.isLeaf { + elem := p.leafPageElement(uint16(i)) + inode.flags = elem.flags + inode.key = elem.key() + inode.value = elem.value() + } else { + elem := p.branchPageElement(uint16(i)) + inode.pgid = elem.pgid + inode.key = elem.key() + } + _assert(len(inode.key) > 0, "read: zero-length inode key") + } + + // Save first key so we can find the node in the parent when we spill. if len(n.inodes) > 0 { - n.key = n.inodes[0].Key() - common.Assert(len(n.key) > 0, "read: zero-length node key") + n.key = n.inodes[0].key + _assert(len(n.key) > 0, "read: zero-length node key") } else { n.key = nil } } // write writes the items onto one or more pages. -// The page should have p.id (might be 0 for meta or bucket-inline page) and p.overflow set -// and the rest should be zeroed. -func (n *node) write(p *common.Page) { - common.Assert(p.Count() == 0 && p.Flags() == 0, "node cannot be written into a not empty page") - +func (n *node) write(p *page) { // Initialize page. if n.isLeaf { - p.SetFlags(common.LeafPageFlag) + p.flags |= leafPageFlag } else { - p.SetFlags(common.BranchPageFlag) + p.flags |= branchPageFlag } if len(n.inodes) >= 0xFFFF { - panic(fmt.Sprintf("inode overflow: %d (pgid=%d)", len(n.inodes), p.Id())) + panic(fmt.Sprintf("inode overflow: %d (pgid=%d)", len(n.inodes), p.id)) } - p.SetCount(uint16(len(n.inodes))) + p.count = uint16(len(n.inodes)) // Stop here if there are no items to write. - if p.Count() == 0 { + if p.count == 0 { return } - common.WriteInodeToPage(n.inodes, p) + // Loop over each item and write it to the page. + b := (*[maxAllocSize]byte)(unsafe.Pointer(&p.ptr))[n.pageElementSize()*len(n.inodes):] + for i, item := range n.inodes { + _assert(len(item.key) > 0, "write: zero-length inode key") + + // Write the page element. + if n.isLeaf { + elem := p.leafPageElement(uint16(i)) + elem.pos = uint32(uintptr(unsafe.Pointer(&b[0])) - uintptr(unsafe.Pointer(elem))) + elem.flags = item.flags + elem.ksize = uint32(len(item.key)) + elem.vsize = uint32(len(item.value)) + } else { + elem := p.branchPageElement(uint16(i)) + elem.pos = uint32(uintptr(unsafe.Pointer(&b[0])) - uintptr(unsafe.Pointer(elem))) + elem.ksize = uint32(len(item.key)) + elem.pgid = item.pgid + _assert(elem.pgid != p.id, "write: circular dependency occurred") + } + + // If the length of key+value is larger than the max allocation size + // then we need to reallocate the byte array pointer. + // + // See: https://github.com/boltdb/bolt/pull/335 + klen, vlen := len(item.key), len(item.value) + if len(b) < klen+vlen { + b = (*[maxAllocSize]byte)(unsafe.Pointer(&b[0]))[:] + } + + // Write data for the element to the end of the page. + copy(b[0:], item.key) + b = b[klen:] + copy(b[0:], item.value) + b = b[vlen:] + } // DEBUG ONLY: n.dump() } // split breaks up a node into multiple smaller nodes, if appropriate. // This should only be called from the spill() function. -func (n *node) split(pageSize uintptr) []*node { +func (n *node) split(pageSize int) []*node { var nodes []*node node := n @@ -226,10 +270,10 @@ func (n *node) split(pageSize uintptr) []*node { // splitTwo breaks up a node into two smaller nodes, if appropriate. // This should only be called from the split() function. -func (n *node) splitTwo(pageSize uintptr) (*node, *node) { +func (n *node) splitTwo(pageSize int) (*node, *node) { // Ignore the split if the page doesn't have at least enough nodes for // two pages or if the nodes can fit in a single page. - if len(n.inodes) <= (common.MinKeysPerPage*2) || n.sizeLessThan(pageSize) { + if len(n.inodes) <= (minKeysPerPage*2) || n.sizeLessThan(pageSize) { return n, nil } @@ -260,7 +304,7 @@ func (n *node) splitTwo(pageSize uintptr) (*node, *node) { n.inodes = n.inodes[:splitIndex] // Update the statistics. - n.bucket.tx.stats.IncSplit(1) + n.bucket.tx.stats.Split++ return n, next } @@ -268,18 +312,18 @@ func (n *node) splitTwo(pageSize uintptr) (*node, *node) { // splitIndex finds the position where a page will fill a given threshold. // It returns the index as well as the size of the first page. // This is only be called from split(). -func (n *node) splitIndex(threshold int) (index, sz uintptr) { - sz = common.PageHeaderSize +func (n *node) splitIndex(threshold int) (index, sz int) { + sz = pageHeaderSize // Loop until we only have the minimum number of keys required for the second page. - for i := 0; i < len(n.inodes)-common.MinKeysPerPage; i++ { - index = uintptr(i) + for i := 0; i < len(n.inodes)-minKeysPerPage; i++ { + index = i inode := n.inodes[i] - elsize := n.pageElementSize() + uintptr(len(inode.Key())) + uintptr(len(inode.Value())) + elsize := n.pageElementSize() + len(inode.key) + len(inode.value) // If we have at least the minimum number of keys and adding another // node would put us over the threshold then exit and return. - if index >= common.MinKeysPerPage && sz+elsize > uintptr(threshold) { + if i >= minKeysPerPage && sz+elsize > threshold { break } @@ -312,25 +356,25 @@ func (n *node) spill() error { n.children = nil // Split nodes into appropriate sizes. The first node will always be n. - var nodes = n.split(uintptr(tx.db.pageSize)) + var nodes = n.split(tx.db.pageSize) for _, node := range nodes { // Add node's page to the freelist if it's not new. if node.pgid > 0 { - tx.db.freelist.Free(tx.meta.Txid(), tx.page(node.pgid)) + tx.db.freelist.free(tx.meta.txid, tx.page(node.pgid)) node.pgid = 0 } // Allocate contiguous space for the node. - p, err := tx.allocate((node.size() + tx.db.pageSize - 1) / tx.db.pageSize) + p, err := tx.allocate((node.size() / tx.db.pageSize) + 1) if err != nil { return err } // Write the node. - if p.Id() >= tx.meta.Pgid() { - panic(fmt.Sprintf("pgid (%d) above high water mark (%d)", p.Id(), tx.meta.Pgid())) + if p.id >= tx.meta.pgid { + panic(fmt.Sprintf("pgid (%d) above high water mark (%d)", p.id, tx.meta.pgid)) } - node.pgid = p.Id() + node.pgid = p.id node.write(p) node.spilled = true @@ -338,16 +382,16 @@ func (n *node) spill() error { if node.parent != nil { var key = node.key if key == nil { - key = node.inodes[0].Key() + key = node.inodes[0].key } - node.parent.put(key, node.inodes[0].Key(), nil, node.pgid, 0) - node.key = node.inodes[0].Key() - common.Assert(len(node.key) > 0, "spill: zero-length node key") + node.parent.put(key, node.inodes[0].key, nil, node.pgid, 0) + node.key = node.inodes[0].key + _assert(len(node.key) > 0, "spill: zero-length node key") } // Update the statistics. - tx.stats.IncSpill(1) + tx.stats.Spill++ } // If the root node split and created a new root then we need to spill that @@ -369,10 +413,10 @@ func (n *node) rebalance() { n.unbalanced = false // Update statistics. - n.bucket.tx.stats.IncRebalance(1) + n.bucket.tx.stats.Rebalance++ - // Ignore if node is above threshold (25% when FillPercent is set to DefaultFillPercent) and has enough keys. - var threshold = int(float64(n.bucket.tx.db.pageSize)*n.bucket.FillPercent) / 2 + // Ignore if node is above threshold (25%) and has enough keys. + var threshold = n.bucket.tx.db.pageSize / 4 if n.size() > threshold && len(n.inodes) > n.minKeys() { return } @@ -382,14 +426,14 @@ func (n *node) rebalance() { // If root node is a branch and only has one node then collapse it. if !n.isLeaf && len(n.inodes) == 1 { // Move root's child up. - child := n.bucket.node(n.inodes[0].Pgid(), n) + child := n.bucket.node(n.inodes[0].pgid, n) n.isLeaf = child.isLeaf n.inodes = child.inodes[:] n.children = child.children // Reparent all child nodes being moved. for _, inode := range n.inodes { - if child, ok := n.bucket.nodes[inode.Pgid()]; ok { + if child, ok := n.bucket.nodes[inode.pgid]; ok { child.parent = n } } @@ -413,37 +457,53 @@ func (n *node) rebalance() { return } - common.Assert(n.parent.numChildren() > 1, "parent must have at least 2 children") + _assert(n.parent.numChildren() > 1, "parent must have at least 2 children") - // Merge with right sibling if idx == 0, otherwise left sibling. - var leftNode, rightNode *node - var useNextSibling = n.parent.childIndex(n) == 0 + // Destination node is right sibling if idx == 0, otherwise left sibling. + var target *node + var useNextSibling = (n.parent.childIndex(n) == 0) if useNextSibling { - leftNode = n - rightNode = n.nextSibling() + target = n.nextSibling() } else { - leftNode = n.prevSibling() - rightNode = n + target = n.prevSibling() } - // If both nodes are too small then merge them. - // Reparent all child nodes being moved. - for _, inode := range rightNode.inodes { - if child, ok := n.bucket.nodes[inode.Pgid()]; ok { - child.parent.removeChild(child) - child.parent = leftNode - child.parent.children = append(child.parent.children, child) + // If both this node and the target node are too small then merge them. + if useNextSibling { + // Reparent all child nodes being moved. + for _, inode := range target.inodes { + if child, ok := n.bucket.nodes[inode.pgid]; ok { + child.parent.removeChild(child) + child.parent = n + child.parent.children = append(child.parent.children, child) + } } + + // Copy over inodes from target and remove target. + n.inodes = append(n.inodes, target.inodes...) + n.parent.del(target.key) + n.parent.removeChild(target) + delete(n.bucket.nodes, target.pgid) + target.free() + } else { + // Reparent all child nodes being moved. + for _, inode := range n.inodes { + if child, ok := n.bucket.nodes[inode.pgid]; ok { + child.parent.removeChild(child) + child.parent = target + child.parent.children = append(child.parent.children, child) + } + } + + // Copy over inodes to target and remove node. + target.inodes = append(target.inodes, n.inodes...) + n.parent.del(n.key) + n.parent.removeChild(n) + delete(n.bucket.nodes, n.pgid) + n.free() } - // Copy over inodes from right node to left node and remove right node. - leftNode.inodes = append(leftNode.inodes, rightNode.inodes...) - n.parent.del(rightNode.key) - n.parent.removeChild(rightNode) - delete(n.bucket.nodes, rightNode.pgid) - rightNode.free() - - // Either this node or the sibling node was deleted from the parent so rebalance it. + // Either this node or the target node was deleted from the parent so rebalance it. n.parent.rebalance() } @@ -465,20 +525,20 @@ func (n *node) dereference() { key := make([]byte, len(n.key)) copy(key, n.key) n.key = key - common.Assert(n.pgid == 0 || len(n.key) > 0, "dereference: zero-length node key on existing node") + _assert(n.pgid == 0 || len(n.key) > 0, "dereference: zero-length node key on existing node") } for i := range n.inodes { inode := &n.inodes[i] - key := make([]byte, len(inode.Key())) - copy(key, inode.Key()) - inode.SetKey(key) - common.Assert(len(inode.Key()) > 0, "dereference: zero-length inode key") + key := make([]byte, len(inode.key)) + copy(key, inode.key) + inode.key = key + _assert(len(inode.key) > 0, "dereference: zero-length inode key") - value := make([]byte, len(inode.Value())) - copy(value, inode.Value()) - inode.SetValue(value) + value := make([]byte, len(inode.value)) + copy(value, inode.value) + inode.value = value } // Recursively dereference children. @@ -487,13 +547,13 @@ func (n *node) dereference() { } // Update statistics. - n.bucket.tx.stats.IncNodeDeref(1) + n.bucket.tx.stats.NodeDeref++ } // free adds the node's underlying page to the freelist. func (n *node) free() { if n.pgid != 0 { - n.bucket.tx.db.freelist.Free(n.bucket.tx.meta.Txid(), n.bucket.tx.page(n.pgid)) + n.bucket.tx.db.freelist.free(n.bucket.tx.meta.txid, n.bucket.tx.page(n.pgid)) n.pgid = 0 } } @@ -525,14 +585,20 @@ func (n *node) dump() { } */ -func compareKeys(left, right []byte) int { - return bytes.Compare(left, right) -} - type nodes []*node -func (s nodes) Len() int { return len(s) } -func (s nodes) Swap(i, j int) { s[i], s[j] = s[j], s[i] } -func (s nodes) Less(i, j int) bool { - return bytes.Compare(s[i].inodes[0].Key(), s[j].inodes[0].Key()) == -1 +func (s nodes) Len() int { return len(s) } +func (s nodes) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s nodes) Less(i, j int) bool { return bytes.Compare(s[i].inodes[0].key, s[j].inodes[0].key) == -1 } + +// inode represents an internal node inside of a node. +// It can be used to point to elements in a page or point +// to an element which hasn't been added to a page yet. +type inode struct { + flags uint32 + pgid pgid + key []byte + value []byte } + +type inodes []inode diff --git a/vendor/github.com/boltdb/bolt/page.go b/vendor/github.com/boltdb/bolt/page.go new file mode 100644 index 0000000..7651a6b --- /dev/null +++ b/vendor/github.com/boltdb/bolt/page.go @@ -0,0 +1,178 @@ +package bolt + +import ( + "fmt" + "os" + "sort" + "unsafe" +) + +const pageHeaderSize = int(unsafe.Offsetof(((*page)(nil)).ptr)) + +const minKeysPerPage = 2 + +const branchPageElementSize = int(unsafe.Sizeof(branchPageElement{})) +const leafPageElementSize = int(unsafe.Sizeof(leafPageElement{})) + +const ( + branchPageFlag = 0x01 + leafPageFlag = 0x02 + metaPageFlag = 0x04 + freelistPageFlag = 0x10 +) + +const ( + bucketLeafFlag = 0x01 +) + +type pgid uint64 + +type page struct { + id pgid + flags uint16 + count uint16 + overflow uint32 + ptr uintptr +} + +// typ returns a human readable page type string used for debugging. +func (p *page) typ() string { + if (p.flags & branchPageFlag) != 0 { + return "branch" + } else if (p.flags & leafPageFlag) != 0 { + return "leaf" + } else if (p.flags & metaPageFlag) != 0 { + return "meta" + } else if (p.flags & freelistPageFlag) != 0 { + return "freelist" + } + return fmt.Sprintf("unknown<%02x>", p.flags) +} + +// meta returns a pointer to the metadata section of the page. +func (p *page) meta() *meta { + return (*meta)(unsafe.Pointer(&p.ptr)) +} + +// leafPageElement retrieves the leaf node by index +func (p *page) leafPageElement(index uint16) *leafPageElement { + n := &((*[0x7FFFFFF]leafPageElement)(unsafe.Pointer(&p.ptr)))[index] + return n +} + +// leafPageElements retrieves a list of leaf nodes. +func (p *page) leafPageElements() []leafPageElement { + if p.count == 0 { + return nil + } + return ((*[0x7FFFFFF]leafPageElement)(unsafe.Pointer(&p.ptr)))[:] +} + +// branchPageElement retrieves the branch node by index +func (p *page) branchPageElement(index uint16) *branchPageElement { + return &((*[0x7FFFFFF]branchPageElement)(unsafe.Pointer(&p.ptr)))[index] +} + +// branchPageElements retrieves a list of branch nodes. +func (p *page) branchPageElements() []branchPageElement { + if p.count == 0 { + return nil + } + return ((*[0x7FFFFFF]branchPageElement)(unsafe.Pointer(&p.ptr)))[:] +} + +// dump writes n bytes of the page to STDERR as hex output. +func (p *page) hexdump(n int) { + buf := (*[maxAllocSize]byte)(unsafe.Pointer(p))[:n] + fmt.Fprintf(os.Stderr, "%x\n", buf) +} + +type pages []*page + +func (s pages) Len() int { return len(s) } +func (s pages) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s pages) Less(i, j int) bool { return s[i].id < s[j].id } + +// branchPageElement represents a node on a branch page. +type branchPageElement struct { + pos uint32 + ksize uint32 + pgid pgid +} + +// key returns a byte slice of the node key. +func (n *branchPageElement) key() []byte { + buf := (*[maxAllocSize]byte)(unsafe.Pointer(n)) + return (*[maxAllocSize]byte)(unsafe.Pointer(&buf[n.pos]))[:n.ksize] +} + +// leafPageElement represents a node on a leaf page. +type leafPageElement struct { + flags uint32 + pos uint32 + ksize uint32 + vsize uint32 +} + +// key returns a byte slice of the node key. +func (n *leafPageElement) key() []byte { + buf := (*[maxAllocSize]byte)(unsafe.Pointer(n)) + return (*[maxAllocSize]byte)(unsafe.Pointer(&buf[n.pos]))[:n.ksize:n.ksize] +} + +// value returns a byte slice of the node value. +func (n *leafPageElement) value() []byte { + buf := (*[maxAllocSize]byte)(unsafe.Pointer(n)) + return (*[maxAllocSize]byte)(unsafe.Pointer(&buf[n.pos+n.ksize]))[:n.vsize:n.vsize] +} + +// PageInfo represents human readable information about a page. +type PageInfo struct { + ID int + Type string + Count int + OverflowCount int +} + +type pgids []pgid + +func (s pgids) Len() int { return len(s) } +func (s pgids) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s pgids) Less(i, j int) bool { return s[i] < s[j] } + +// merge returns the sorted union of a and b. +func (a pgids) merge(b pgids) pgids { + // Return the opposite slice if one is nil. + if len(a) == 0 { + return b + } else if len(b) == 0 { + return a + } + + // Create a list to hold all elements from both lists. + merged := make(pgids, 0, len(a)+len(b)) + + // Assign lead to the slice with a lower starting value, follow to the higher value. + lead, follow := a, b + if b[0] < a[0] { + lead, follow = b, a + } + + // Continue while there are elements in the lead. + for len(lead) > 0 { + // Merge largest prefix of lead that is ahead of follow[0]. + n := sort.Search(len(lead), func(i int) bool { return lead[i] > follow[0] }) + merged = append(merged, lead[:n]...) + if n >= len(lead) { + break + } + + // Swap lead and follow. + lead, follow = follow, lead[n:] + } + + // Append what's left in follow. + merged = append(merged, follow...) + + return merged +} diff --git a/vendor/github.com/boltdb/bolt/tx.go b/vendor/github.com/boltdb/bolt/tx.go new file mode 100644 index 0000000..1cfb4cd --- /dev/null +++ b/vendor/github.com/boltdb/bolt/tx.go @@ -0,0 +1,682 @@ +package bolt + +import ( + "fmt" + "io" + "os" + "sort" + "strings" + "time" + "unsafe" +) + +// txid represents the internal transaction identifier. +type txid uint64 + +// Tx represents a read-only or read/write transaction on the database. +// Read-only transactions can be used for retrieving values for keys and creating cursors. +// Read/write transactions can create and remove buckets and create and remove keys. +// +// IMPORTANT: You must commit or rollback transactions when you are done with +// them. Pages can not be reclaimed by the writer until no more transactions +// are using them. A long running read transaction can cause the database to +// quickly grow. +type Tx struct { + writable bool + managed bool + db *DB + meta *meta + root Bucket + pages map[pgid]*page + stats TxStats + commitHandlers []func() + + // WriteFlag specifies the flag for write-related methods like WriteTo(). + // Tx opens the database file with the specified flag to copy the data. + // + // By default, the flag is unset, which works well for mostly in-memory + // workloads. For databases that are much larger than available RAM, + // set the flag to syscall.O_DIRECT to avoid trashing the page cache. + WriteFlag int +} + +// init initializes the transaction. +func (tx *Tx) init(db *DB) { + tx.db = db + tx.pages = nil + + // Copy the meta page since it can be changed by the writer. + tx.meta = &meta{} + db.meta().copy(tx.meta) + + // Copy over the root bucket. + tx.root = newBucket(tx) + tx.root.bucket = &bucket{} + *tx.root.bucket = tx.meta.root + + // Increment the transaction id and add a page cache for writable transactions. + if tx.writable { + tx.pages = make(map[pgid]*page) + tx.meta.txid += txid(1) + } +} + +// ID returns the transaction id. +func (tx *Tx) ID() int { + return int(tx.meta.txid) +} + +// DB returns a reference to the database that created the transaction. +func (tx *Tx) DB() *DB { + return tx.db +} + +// Size returns current database size in bytes as seen by this transaction. +func (tx *Tx) Size() int64 { + return int64(tx.meta.pgid) * int64(tx.db.pageSize) +} + +// Writable returns whether the transaction can perform write operations. +func (tx *Tx) Writable() bool { + return tx.writable +} + +// Cursor creates a cursor associated with the root bucket. +// All items in the cursor will return a nil value because all root bucket keys point to buckets. +// The cursor is only valid as long as the transaction is open. +// Do not use a cursor after the transaction is closed. +func (tx *Tx) Cursor() *Cursor { + return tx.root.Cursor() +} + +// Stats retrieves a copy of the current transaction statistics. +func (tx *Tx) Stats() TxStats { + return tx.stats +} + +// Bucket retrieves a bucket by name. +// Returns nil if the bucket does not exist. +// The bucket instance is only valid for the lifetime of the transaction. +func (tx *Tx) Bucket(name []byte) *Bucket { + return tx.root.Bucket(name) +} + +// CreateBucket creates a new bucket. +// Returns an error if the bucket already exists, if the bucket name is blank, or if the bucket name is too long. +// The bucket instance is only valid for the lifetime of the transaction. +func (tx *Tx) CreateBucket(name []byte) (*Bucket, error) { + return tx.root.CreateBucket(name) +} + +// CreateBucketIfNotExists creates a new bucket if it doesn't already exist. +// Returns an error if the bucket name is blank, or if the bucket name is too long. +// The bucket instance is only valid for the lifetime of the transaction. +func (tx *Tx) CreateBucketIfNotExists(name []byte) (*Bucket, error) { + return tx.root.CreateBucketIfNotExists(name) +} + +// DeleteBucket deletes a bucket. +// Returns an error if the bucket cannot be found or if the key represents a non-bucket value. +func (tx *Tx) DeleteBucket(name []byte) error { + return tx.root.DeleteBucket(name) +} + +// ForEach executes a function for each bucket in the root. +// If the provided function returns an error then the iteration is stopped and +// the error is returned to the caller. +func (tx *Tx) ForEach(fn func(name []byte, b *Bucket) error) error { + return tx.root.ForEach(func(k, v []byte) error { + if err := fn(k, tx.root.Bucket(k)); err != nil { + return err + } + return nil + }) +} + +// OnCommit adds a handler function to be executed after the transaction successfully commits. +func (tx *Tx) OnCommit(fn func()) { + tx.commitHandlers = append(tx.commitHandlers, fn) +} + +// Commit writes all changes to disk and updates the meta page. +// Returns an error if a disk write error occurs, or if Commit is +// called on a read-only transaction. +func (tx *Tx) Commit() error { + _assert(!tx.managed, "managed tx commit not allowed") + if tx.db == nil { + return ErrTxClosed + } else if !tx.writable { + return ErrTxNotWritable + } + + // TODO(benbjohnson): Use vectorized I/O to write out dirty pages. + + // Rebalance nodes which have had deletions. + var startTime = time.Now() + tx.root.rebalance() + if tx.stats.Rebalance > 0 { + tx.stats.RebalanceTime += time.Since(startTime) + } + + // spill data onto dirty pages. + startTime = time.Now() + if err := tx.root.spill(); err != nil { + tx.rollback() + return err + } + tx.stats.SpillTime += time.Since(startTime) + + // Free the old root bucket. + tx.meta.root.root = tx.root.root + + opgid := tx.meta.pgid + + // Free the freelist and allocate new pages for it. This will overestimate + // the size of the freelist but not underestimate the size (which would be bad). + tx.db.freelist.free(tx.meta.txid, tx.db.page(tx.meta.freelist)) + p, err := tx.allocate((tx.db.freelist.size() / tx.db.pageSize) + 1) + if err != nil { + tx.rollback() + return err + } + if err := tx.db.freelist.write(p); err != nil { + tx.rollback() + return err + } + tx.meta.freelist = p.id + + // If the high water mark has moved up then attempt to grow the database. + if tx.meta.pgid > opgid { + if err := tx.db.grow(int(tx.meta.pgid+1) * tx.db.pageSize); err != nil { + tx.rollback() + return err + } + } + + // Write dirty pages to disk. + startTime = time.Now() + if err := tx.write(); err != nil { + tx.rollback() + return err + } + + // If strict mode is enabled then perform a consistency check. + // Only the first consistency error is reported in the panic. + if tx.db.StrictMode { + ch := tx.Check() + var errs []string + for { + err, ok := <-ch + if !ok { + break + } + errs = append(errs, err.Error()) + } + if len(errs) > 0 { + panic("check fail: " + strings.Join(errs, "\n")) + } + } + + // Write meta to disk. + if err := tx.writeMeta(); err != nil { + tx.rollback() + return err + } + tx.stats.WriteTime += time.Since(startTime) + + // Finalize the transaction. + tx.close() + + // Execute commit handlers now that the locks have been removed. + for _, fn := range tx.commitHandlers { + fn() + } + + return nil +} + +// Rollback closes the transaction and ignores all previous updates. Read-only +// transactions must be rolled back and not committed. +func (tx *Tx) Rollback() error { + _assert(!tx.managed, "managed tx rollback not allowed") + if tx.db == nil { + return ErrTxClosed + } + tx.rollback() + return nil +} + +func (tx *Tx) rollback() { + if tx.db == nil { + return + } + if tx.writable { + tx.db.freelist.rollback(tx.meta.txid) + tx.db.freelist.reload(tx.db.page(tx.db.meta().freelist)) + } + tx.close() +} + +func (tx *Tx) close() { + if tx.db == nil { + return + } + if tx.writable { + // Grab freelist stats. + var freelistFreeN = tx.db.freelist.free_count() + var freelistPendingN = tx.db.freelist.pending_count() + var freelistAlloc = tx.db.freelist.size() + + // Remove transaction ref & writer lock. + tx.db.rwtx = nil + tx.db.rwlock.Unlock() + + // Merge statistics. + tx.db.statlock.Lock() + tx.db.stats.FreePageN = freelistFreeN + tx.db.stats.PendingPageN = freelistPendingN + tx.db.stats.FreeAlloc = (freelistFreeN + freelistPendingN) * tx.db.pageSize + tx.db.stats.FreelistInuse = freelistAlloc + tx.db.stats.TxStats.add(&tx.stats) + tx.db.statlock.Unlock() + } else { + tx.db.removeTx(tx) + } + + // Clear all references. + tx.db = nil + tx.meta = nil + tx.root = Bucket{tx: tx} + tx.pages = nil +} + +// Copy writes the entire database to a writer. +// This function exists for backwards compatibility. Use WriteTo() instead. +func (tx *Tx) Copy(w io.Writer) error { + _, err := tx.WriteTo(w) + return err +} + +// WriteTo writes the entire database to a writer. +// If err == nil then exactly tx.Size() bytes will be written into the writer. +func (tx *Tx) WriteTo(w io.Writer) (n int64, err error) { + // Attempt to open reader with WriteFlag + f, err := os.OpenFile(tx.db.path, os.O_RDONLY|tx.WriteFlag, 0) + if err != nil { + return 0, err + } + defer func() { _ = f.Close() }() + + // Generate a meta page. We use the same page data for both meta pages. + buf := make([]byte, tx.db.pageSize) + page := (*page)(unsafe.Pointer(&buf[0])) + page.flags = metaPageFlag + *page.meta() = *tx.meta + + // Write meta 0. + page.id = 0 + page.meta().checksum = page.meta().sum64() + nn, err := w.Write(buf) + n += int64(nn) + if err != nil { + return n, fmt.Errorf("meta 0 copy: %s", err) + } + + // Write meta 1 with a lower transaction id. + page.id = 1 + page.meta().txid -= 1 + page.meta().checksum = page.meta().sum64() + nn, err = w.Write(buf) + n += int64(nn) + if err != nil { + return n, fmt.Errorf("meta 1 copy: %s", err) + } + + // Move past the meta pages in the file. + if _, err := f.Seek(int64(tx.db.pageSize*2), os.SEEK_SET); err != nil { + return n, fmt.Errorf("seek: %s", err) + } + + // Copy data pages. + wn, err := io.CopyN(w, f, tx.Size()-int64(tx.db.pageSize*2)) + n += wn + if err != nil { + return n, err + } + + return n, f.Close() +} + +// CopyFile copies the entire database to file at the given path. +// A reader transaction is maintained during the copy so it is safe to continue +// using the database while a copy is in progress. +func (tx *Tx) CopyFile(path string, mode os.FileMode) error { + f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, mode) + if err != nil { + return err + } + + err = tx.Copy(f) + if err != nil { + _ = f.Close() + return err + } + return f.Close() +} + +// Check performs several consistency checks on the database for this transaction. +// An error is returned if any inconsistency is found. +// +// It can be safely run concurrently on a writable transaction. However, this +// incurs a high cost for large databases and databases with a lot of subbuckets +// because of caching. This overhead can be removed if running on a read-only +// transaction, however, it is not safe to execute other writer transactions at +// the same time. +func (tx *Tx) Check() <-chan error { + ch := make(chan error) + go tx.check(ch) + return ch +} + +func (tx *Tx) check(ch chan error) { + // Check if any pages are double freed. + freed := make(map[pgid]bool) + for _, id := range tx.db.freelist.all() { + if freed[id] { + ch <- fmt.Errorf("page %d: already freed", id) + } + freed[id] = true + } + + // Track every reachable page. + reachable := make(map[pgid]*page) + reachable[0] = tx.page(0) // meta0 + reachable[1] = tx.page(1) // meta1 + for i := uint32(0); i <= tx.page(tx.meta.freelist).overflow; i++ { + reachable[tx.meta.freelist+pgid(i)] = tx.page(tx.meta.freelist) + } + + // Recursively check buckets. + tx.checkBucket(&tx.root, reachable, freed, ch) + + // Ensure all pages below high water mark are either reachable or freed. + for i := pgid(0); i < tx.meta.pgid; i++ { + _, isReachable := reachable[i] + if !isReachable && !freed[i] { + ch <- fmt.Errorf("page %d: unreachable unfreed", int(i)) + } + } + + // Close the channel to signal completion. + close(ch) +} + +func (tx *Tx) checkBucket(b *Bucket, reachable map[pgid]*page, freed map[pgid]bool, ch chan error) { + // Ignore inline buckets. + if b.root == 0 { + return + } + + // Check every page used by this bucket. + b.tx.forEachPage(b.root, 0, func(p *page, _ int) { + if p.id > tx.meta.pgid { + ch <- fmt.Errorf("page %d: out of bounds: %d", int(p.id), int(b.tx.meta.pgid)) + } + + // Ensure each page is only referenced once. + for i := pgid(0); i <= pgid(p.overflow); i++ { + var id = p.id + i + if _, ok := reachable[id]; ok { + ch <- fmt.Errorf("page %d: multiple references", int(id)) + } + reachable[id] = p + } + + // We should only encounter un-freed leaf and branch pages. + if freed[p.id] { + ch <- fmt.Errorf("page %d: reachable freed", int(p.id)) + } else if (p.flags&branchPageFlag) == 0 && (p.flags&leafPageFlag) == 0 { + ch <- fmt.Errorf("page %d: invalid type: %s", int(p.id), p.typ()) + } + }) + + // Check each bucket within this bucket. + _ = b.ForEach(func(k, v []byte) error { + if child := b.Bucket(k); child != nil { + tx.checkBucket(child, reachable, freed, ch) + } + return nil + }) +} + +// allocate returns a contiguous block of memory starting at a given page. +func (tx *Tx) allocate(count int) (*page, error) { + p, err := tx.db.allocate(count) + if err != nil { + return nil, err + } + + // Save to our page cache. + tx.pages[p.id] = p + + // Update statistics. + tx.stats.PageCount++ + tx.stats.PageAlloc += count * tx.db.pageSize + + return p, nil +} + +// write writes any dirty pages to disk. +func (tx *Tx) write() error { + // Sort pages by id. + pages := make(pages, 0, len(tx.pages)) + for _, p := range tx.pages { + pages = append(pages, p) + } + // Clear out page cache early. + tx.pages = make(map[pgid]*page) + sort.Sort(pages) + + // Write pages to disk in order. + for _, p := range pages { + size := (int(p.overflow) + 1) * tx.db.pageSize + offset := int64(p.id) * int64(tx.db.pageSize) + + // Write out page in "max allocation" sized chunks. + ptr := (*[maxAllocSize]byte)(unsafe.Pointer(p)) + for { + // Limit our write to our max allocation size. + sz := size + if sz > maxAllocSize-1 { + sz = maxAllocSize - 1 + } + + // Write chunk to disk. + buf := ptr[:sz] + if _, err := tx.db.ops.writeAt(buf, offset); err != nil { + return err + } + + // Update statistics. + tx.stats.Write++ + + // Exit inner for loop if we've written all the chunks. + size -= sz + if size == 0 { + break + } + + // Otherwise move offset forward and move pointer to next chunk. + offset += int64(sz) + ptr = (*[maxAllocSize]byte)(unsafe.Pointer(&ptr[sz])) + } + } + + // Ignore file sync if flag is set on DB. + if !tx.db.NoSync || IgnoreNoSync { + if err := fdatasync(tx.db); err != nil { + return err + } + } + + // Put small pages back to page pool. + for _, p := range pages { + // Ignore page sizes over 1 page. + // These are allocated using make() instead of the page pool. + if int(p.overflow) != 0 { + continue + } + + buf := (*[maxAllocSize]byte)(unsafe.Pointer(p))[:tx.db.pageSize] + + // See https://go.googlesource.com/go/+/f03c9202c43e0abb130669852082117ca50aa9b1 + for i := range buf { + buf[i] = 0 + } + tx.db.pagePool.Put(buf) + } + + return nil +} + +// writeMeta writes the meta to the disk. +func (tx *Tx) writeMeta() error { + // Create a temporary buffer for the meta page. + buf := make([]byte, tx.db.pageSize) + p := tx.db.pageInBuffer(buf, 0) + tx.meta.write(p) + + // Write the meta page to file. + if _, err := tx.db.ops.writeAt(buf, int64(p.id)*int64(tx.db.pageSize)); err != nil { + return err + } + if !tx.db.NoSync || IgnoreNoSync { + if err := fdatasync(tx.db); err != nil { + return err + } + } + + // Update statistics. + tx.stats.Write++ + + return nil +} + +// page returns a reference to the page with a given id. +// If page has been written to then a temporary buffered page is returned. +func (tx *Tx) page(id pgid) *page { + // Check the dirty pages first. + if tx.pages != nil { + if p, ok := tx.pages[id]; ok { + return p + } + } + + // Otherwise return directly from the mmap. + return tx.db.page(id) +} + +// forEachPage iterates over every page within a given page and executes a function. +func (tx *Tx) forEachPage(pgid pgid, depth int, fn func(*page, int)) { + p := tx.page(pgid) + + // Execute function. + fn(p, depth) + + // Recursively loop over children. + if (p.flags & branchPageFlag) != 0 { + for i := 0; i < int(p.count); i++ { + elem := p.branchPageElement(uint16(i)) + tx.forEachPage(elem.pgid, depth+1, fn) + } + } +} + +// Page returns page information for a given page number. +// This is only safe for concurrent use when used by a writable transaction. +func (tx *Tx) Page(id int) (*PageInfo, error) { + if tx.db == nil { + return nil, ErrTxClosed + } else if pgid(id) >= tx.meta.pgid { + return nil, nil + } + + // Build the page info. + p := tx.db.page(pgid(id)) + info := &PageInfo{ + ID: id, + Count: int(p.count), + OverflowCount: int(p.overflow), + } + + // Determine the type (or if it's free). + if tx.db.freelist.freed(pgid(id)) { + info.Type = "free" + } else { + info.Type = p.typ() + } + + return info, nil +} + +// TxStats represents statistics about the actions performed by the transaction. +type TxStats struct { + // Page statistics. + PageCount int // number of page allocations + PageAlloc int // total bytes allocated + + // Cursor statistics. + CursorCount int // number of cursors created + + // Node statistics + NodeCount int // number of node allocations + NodeDeref int // number of node dereferences + + // Rebalance statistics. + Rebalance int // number of node rebalances + RebalanceTime time.Duration // total time spent rebalancing + + // Split/Spill statistics. + Split int // number of nodes split + Spill int // number of nodes spilled + SpillTime time.Duration // total time spent spilling + + // Write statistics. + Write int // number of writes performed + WriteTime time.Duration // total time spent writing to disk +} + +func (s *TxStats) add(other *TxStats) { + s.PageCount += other.PageCount + s.PageAlloc += other.PageAlloc + s.CursorCount += other.CursorCount + s.NodeCount += other.NodeCount + s.NodeDeref += other.NodeDeref + s.Rebalance += other.Rebalance + s.RebalanceTime += other.RebalanceTime + s.Split += other.Split + s.Spill += other.Spill + s.SpillTime += other.SpillTime + s.Write += other.Write + s.WriteTime += other.WriteTime +} + +// Sub calculates and returns the difference between two sets of transaction stats. +// This is useful when obtaining stats at two different points and time and +// you need the performance counters that occurred within that time span. +func (s *TxStats) Sub(other *TxStats) TxStats { + var diff TxStats + diff.PageCount = s.PageCount - other.PageCount + diff.PageAlloc = s.PageAlloc - other.PageAlloc + diff.CursorCount = s.CursorCount - other.CursorCount + diff.NodeCount = s.NodeCount - other.NodeCount + diff.NodeDeref = s.NodeDeref - other.NodeDeref + diff.Rebalance = s.Rebalance - other.Rebalance + diff.RebalanceTime = s.RebalanceTime - other.RebalanceTime + diff.Split = s.Split - other.Split + diff.Spill = s.Spill - other.Spill + diff.SpillTime = s.SpillTime - other.SpillTime + diff.Write = s.Write - other.Write + diff.WriteTime = s.WriteTime - other.WriteTime + return diff +} diff --git a/vendor/github.com/boombuler/barcode/.gitignore b/vendor/github.com/boombuler/barcode/.gitignore deleted file mode 100644 index 1d74e21..0000000 --- a/vendor/github.com/boombuler/barcode/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.vscode/ diff --git a/vendor/github.com/boombuler/barcode/LICENSE b/vendor/github.com/boombuler/barcode/LICENSE deleted file mode 100644 index 862b0dd..0000000 --- a/vendor/github.com/boombuler/barcode/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Florian Sundermann - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/github.com/boombuler/barcode/README.md b/vendor/github.com/boombuler/barcode/README.md deleted file mode 100644 index 2a988db..0000000 --- a/vendor/github.com/boombuler/barcode/README.md +++ /dev/null @@ -1,53 +0,0 @@ -[](https://gitter.im/golang-barcode/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) - -## Introduction ## - -This is a package for GO which can be used to create different types of barcodes. - -## Supported Barcode Types ## -* 2 of 5 -* Aztec Code -* Codabar -* Code 128 -* Code 39 -* Code 93 -* Datamatrix -* EAN 13 -* EAN 8 -* PDF 417 -* QR Code - -## Example ## - -This is a simple example on how to create a QR-Code and write it to a png-file -```go -package main - -import ( - "image/png" - "os" - - "github.com/boombuler/barcode" - "github.com/boombuler/barcode/qr" -) - -func main() { - // Create the barcode - qrCode, _ := qr.Encode("Hello World", qr.M, qr.Auto) - - // Scale the barcode to 200x200 pixels - qrCode, _ = barcode.Scale(qrCode, 200, 200) - - // create the output file - file, _ := os.Create("qrcode.png") - defer file.Close() - - // encode the barcode as png - png.Encode(file, qrCode) -} -``` - -## Documentation ## -See [GoDoc](https://godoc.org/github.com/boombuler/barcode) - -To create a barcode use the Encode function from one of the subpackages. diff --git a/vendor/github.com/boombuler/barcode/barcode.go b/vendor/github.com/boombuler/barcode/barcode.go deleted file mode 100644 index 9d23881..0000000 --- a/vendor/github.com/boombuler/barcode/barcode.go +++ /dev/null @@ -1,48 +0,0 @@ -package barcode - -import ( - "image" -) - -const ( - TypeAztec = "Aztec" - TypeCodabar = "Codabar" - TypeCode128 = "Code 128" - TypeCode39 = "Code 39" - TypeCode93 = "Code 93" - TypeDataMatrix = "DataMatrix" - TypeEAN8 = "EAN 8" - TypeEAN13 = "EAN 13" - TypePDF = "PDF417" - TypeQR = "QR Code" - Type2of5 = "2 of 5" - Type2of5Interleaved = "2 of 5 (interleaved)" -) - -// Contains some meta information about a barcode -type Metadata struct { - // the name of the barcode kind - CodeKind string - // contains 1 for 1D barcodes or 2 for 2D barcodes - Dimensions byte -} - -// a rendered and encoded barcode -type Barcode interface { - image.Image - // returns some meta information about the barcode - Metadata() Metadata - // the data that was encoded in this barcode - Content() string -} - -// Additional interface that some barcodes might implement to provide -// the value of its checksum. -type BarcodeIntCS interface { - Barcode - CheckSum() int -} - -type BarcodeColor interface { - ColorScheme() ColorScheme -} diff --git a/vendor/github.com/boombuler/barcode/color_scheme.go b/vendor/github.com/boombuler/barcode/color_scheme.go deleted file mode 100644 index e8ccc7a..0000000 --- a/vendor/github.com/boombuler/barcode/color_scheme.go +++ /dev/null @@ -1,39 +0,0 @@ -package barcode - -import "image/color" - -// ColorScheme defines a structure for color schemes used in barcode rendering. -// It includes the color model, background color, and foreground color. -type ColorScheme struct { - Model color.Model // Color model to be used (e.g., grayscale, RGB, RGBA) - Background color.Color // Color of the background - Foreground color.Color // Color of the foreground (e.g., bars in a barcode) -} - -// ColorScheme8 represents a color scheme with 8-bit grayscale colors. -var ColorScheme8 = ColorScheme{ - Model: color.GrayModel, - Background: color.Gray{Y: 255}, - Foreground: color.Gray{Y: 0}, -} - -// ColorScheme16 represents a color scheme with 16-bit grayscale colors. -var ColorScheme16 = ColorScheme{ - Model: color.Gray16Model, - Background: color.White, - Foreground: color.Black, -} - -// ColorScheme24 represents a color scheme with 24-bit RGB colors. -var ColorScheme24 = ColorScheme{ - Model: color.RGBAModel, - Background: color.RGBA{255, 255, 255, 255}, - Foreground: color.RGBA{0, 0, 0, 255}, -} - -// ColorScheme32 represents a color scheme with 32-bit RGBA colors, which is similar to ColorScheme24 but typically includes alpha for transparency. -var ColorScheme32 = ColorScheme{ - Model: color.RGBAModel, - Background: color.RGBA{255, 255, 255, 255}, - Foreground: color.RGBA{0, 0, 0, 255}, -} diff --git a/vendor/github.com/boombuler/barcode/qr/alphanumeric.go b/vendor/github.com/boombuler/barcode/qr/alphanumeric.go deleted file mode 100644 index 4ded7c8..0000000 --- a/vendor/github.com/boombuler/barcode/qr/alphanumeric.go +++ /dev/null @@ -1,66 +0,0 @@ -package qr - -import ( - "errors" - "fmt" - "strings" - - "github.com/boombuler/barcode/utils" -) - -const charSet string = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:" - -func stringToAlphaIdx(content string) <-chan int { - result := make(chan int) - go func() { - for _, r := range content { - idx := strings.IndexRune(charSet, r) - result <- idx - if idx < 0 { - break - } - } - close(result) - }() - - return result -} - -func encodeAlphaNumeric(content string, ecl ErrorCorrectionLevel) (*utils.BitList, *versionInfo, error) { - - contentLenIsOdd := len(content)%2 == 1 - contentBitCount := (len(content) / 2) * 11 - if contentLenIsOdd { - contentBitCount += 6 - } - vi := findSmallestVersionInfo(ecl, alphaNumericMode, contentBitCount) - if vi == nil { - return nil, nil, errors.New("To much data to encode") - } - - res := new(utils.BitList) - res.AddBits(int(alphaNumericMode), 4) - res.AddBits(len(content), vi.charCountBits(alphaNumericMode)) - - encoder := stringToAlphaIdx(content) - - for idx := 0; idx < len(content)/2; idx++ { - c1 := <-encoder - c2 := <-encoder - if c1 < 0 || c2 < 0 { - return nil, nil, fmt.Errorf("\"%s\" can not be encoded as %s", content, AlphaNumeric) - } - res.AddBits(c1*45+c2, 11) - } - if contentLenIsOdd { - c := <-encoder - if c < 0 { - return nil, nil, fmt.Errorf("\"%s\" can not be encoded as %s", content, AlphaNumeric) - } - res.AddBits(c, 6) - } - - addPaddingAndTerminator(res, vi) - - return res, vi, nil -} diff --git a/vendor/github.com/boombuler/barcode/qr/automatic.go b/vendor/github.com/boombuler/barcode/qr/automatic.go deleted file mode 100644 index e7c5601..0000000 --- a/vendor/github.com/boombuler/barcode/qr/automatic.go +++ /dev/null @@ -1,23 +0,0 @@ -package qr - -import ( - "fmt" - - "github.com/boombuler/barcode/utils" -) - -func encodeAuto(content string, ecl ErrorCorrectionLevel) (*utils.BitList, *versionInfo, error) { - bits, vi, _ := Numeric.getEncoder()(content, ecl) - if bits != nil && vi != nil { - return bits, vi, nil - } - bits, vi, _ = AlphaNumeric.getEncoder()(content, ecl) - if bits != nil && vi != nil { - return bits, vi, nil - } - bits, vi, _ = Unicode.getEncoder()(content, ecl) - if bits != nil && vi != nil { - return bits, vi, nil - } - return nil, nil, fmt.Errorf("No encoding found to encode \"%s\"", content) -} diff --git a/vendor/github.com/boombuler/barcode/qr/blocks.go b/vendor/github.com/boombuler/barcode/qr/blocks.go deleted file mode 100644 index d317378..0000000 --- a/vendor/github.com/boombuler/barcode/qr/blocks.go +++ /dev/null @@ -1,59 +0,0 @@ -package qr - -type block struct { - data []byte - ecc []byte -} -type blockList []*block - -func splitToBlocks(data <-chan byte, vi *versionInfo) blockList { - result := make(blockList, vi.NumberOfBlocksInGroup1+vi.NumberOfBlocksInGroup2) - - for b := 0; b < int(vi.NumberOfBlocksInGroup1); b++ { - blk := new(block) - blk.data = make([]byte, vi.DataCodeWordsPerBlockInGroup1) - for cw := 0; cw < int(vi.DataCodeWordsPerBlockInGroup1); cw++ { - blk.data[cw] = <-data - } - blk.ecc = ec.calcECC(blk.data, vi.ErrorCorrectionCodewordsPerBlock) - result[b] = blk - } - - for b := 0; b < int(vi.NumberOfBlocksInGroup2); b++ { - blk := new(block) - blk.data = make([]byte, vi.DataCodeWordsPerBlockInGroup2) - for cw := 0; cw < int(vi.DataCodeWordsPerBlockInGroup2); cw++ { - blk.data[cw] = <-data - } - blk.ecc = ec.calcECC(blk.data, vi.ErrorCorrectionCodewordsPerBlock) - result[int(vi.NumberOfBlocksInGroup1)+b] = blk - } - - return result -} - -func (bl blockList) interleave(vi *versionInfo) []byte { - var maxCodewordCount int - if vi.DataCodeWordsPerBlockInGroup1 > vi.DataCodeWordsPerBlockInGroup2 { - maxCodewordCount = int(vi.DataCodeWordsPerBlockInGroup1) - } else { - maxCodewordCount = int(vi.DataCodeWordsPerBlockInGroup2) - } - resultLen := (vi.DataCodeWordsPerBlockInGroup1+vi.ErrorCorrectionCodewordsPerBlock)*vi.NumberOfBlocksInGroup1 + - (vi.DataCodeWordsPerBlockInGroup2+vi.ErrorCorrectionCodewordsPerBlock)*vi.NumberOfBlocksInGroup2 - - result := make([]byte, 0, resultLen) - for i := 0; i < maxCodewordCount; i++ { - for b := 0; b < len(bl); b++ { - if len(bl[b].data) > i { - result = append(result, bl[b].data[i]) - } - } - } - for i := 0; i < int(vi.ErrorCorrectionCodewordsPerBlock); i++ { - for b := 0; b < len(bl); b++ { - result = append(result, bl[b].ecc[i]) - } - } - return result -} diff --git a/vendor/github.com/boombuler/barcode/qr/encoder.go b/vendor/github.com/boombuler/barcode/qr/encoder.go deleted file mode 100644 index 81ceb88..0000000 --- a/vendor/github.com/boombuler/barcode/qr/encoder.go +++ /dev/null @@ -1,420 +0,0 @@ -// Package qr can be used to create QR barcodes. -package qr - -import ( - "image" - - "github.com/boombuler/barcode" - "github.com/boombuler/barcode/utils" -) - -type encodeFn func(content string, eccLevel ErrorCorrectionLevel) (*utils.BitList, *versionInfo, error) - -// Encoding mode for QR Codes. -type Encoding byte - -const ( - // Auto will choose ths best matching encoding - Auto Encoding = iota - // Numeric encoding only encodes numbers [0-9] - Numeric - // AlphaNumeric encoding only encodes uppercase letters, numbers and [Space], $, %, *, +, -, ., /, : - AlphaNumeric - // Unicode encoding encodes the string as utf-8 - Unicode - // only for testing purpose - unknownEncoding -) - -func (e Encoding) getEncoder() encodeFn { - switch e { - case Auto: - return encodeAuto - case Numeric: - return encodeNumeric - case AlphaNumeric: - return encodeAlphaNumeric - case Unicode: - return encodeUnicode - } - return nil -} - -func (e Encoding) String() string { - switch e { - case Auto: - return "Auto" - case Numeric: - return "Numeric" - case AlphaNumeric: - return "AlphaNumeric" - case Unicode: - return "Unicode" - } - return "" -} - -// Encode returns a QR barcode with the given content and color scheme, error correction level and uses the given encoding -func EncodeWithColor(content string, level ErrorCorrectionLevel, mode Encoding, color barcode.ColorScheme) (barcode.Barcode, error) { - bits, vi, err := mode.getEncoder()(content, level) - if err != nil { - return nil, err - } - - blocks := splitToBlocks(bits.IterateBytes(), vi) - data := blocks.interleave(vi) - result := render(data, vi, color) - result.content = content - return result, nil -} - -func Encode(content string, level ErrorCorrectionLevel, mode Encoding) (barcode.Barcode, error) { - return EncodeWithColor(content, level, mode, barcode.ColorScheme16) -} - -func render(data []byte, vi *versionInfo, color barcode.ColorScheme) *qrcode { - dim := vi.modulWidth() - results := make([]*qrcode, 8) - for i := 0; i < 8; i++ { - results[i] = newBarCodeWithColor(dim, color) - } - - occupied := newBarCodeWithColor(dim, color) - - setAll := func(x int, y int, val bool) { - occupied.Set(x, y, true) - for i := 0; i < 8; i++ { - results[i].Set(x, y, val) - } - } - - drawFinderPatterns(vi, setAll) - drawAlignmentPatterns(occupied, vi, setAll) - - //Timing Pattern: - var i int - for i = 0; i < dim; i++ { - if !occupied.Get(i, 6) { - setAll(i, 6, i%2 == 0) - } - if !occupied.Get(6, i) { - setAll(6, i, i%2 == 0) - } - } - // Dark Module - setAll(8, dim-8, true) - - drawVersionInfo(vi, setAll) - drawFormatInfo(vi, -1, occupied.Set) - for i := 0; i < 8; i++ { - drawFormatInfo(vi, i, results[i].Set) - } - - // Write the data - var curBitNo int - - for pos := range iterateModules(occupied) { - var curBit bool - if curBitNo < len(data)*8 { - curBit = ((data[curBitNo/8] >> uint(7-(curBitNo%8))) & 1) == 1 - } else { - curBit = false - } - - for i := 0; i < 8; i++ { - setMasked(pos.X, pos.Y, curBit, i, results[i].Set) - } - curBitNo++ - } - - lowestPenalty := ^uint(0) - lowestPenaltyIdx := -1 - for i := 0; i < 8; i++ { - p := results[i].calcPenalty() - if p < lowestPenalty { - lowestPenalty = p - lowestPenaltyIdx = i - } - } - return results[lowestPenaltyIdx] -} - -func setMasked(x, y int, val bool, mask int, set func(int, int, bool)) { - switch mask { - case 0: - val = val != (((y + x) % 2) == 0) - break - case 1: - val = val != ((y % 2) == 0) - break - case 2: - val = val != ((x % 3) == 0) - break - case 3: - val = val != (((y + x) % 3) == 0) - break - case 4: - val = val != (((y/2 + x/3) % 2) == 0) - break - case 5: - val = val != (((y*x)%2)+((y*x)%3) == 0) - break - case 6: - val = val != ((((y*x)%2)+((y*x)%3))%2 == 0) - break - case 7: - val = val != ((((y+x)%2)+((y*x)%3))%2 == 0) - } - set(x, y, val) -} - -func iterateModules(occupied *qrcode) <-chan image.Point { - result := make(chan image.Point) - allPoints := make(chan image.Point) - go func() { - curX := occupied.dimension - 1 - curY := occupied.dimension - 1 - isUpward := true - - for true { - if isUpward { - allPoints <- image.Pt(curX, curY) - allPoints <- image.Pt(curX-1, curY) - curY-- - if curY < 0 { - curY = 0 - curX -= 2 - if curX == 6 { - curX-- - } - if curX < 0 { - break - } - isUpward = false - } - } else { - allPoints <- image.Pt(curX, curY) - allPoints <- image.Pt(curX-1, curY) - curY++ - if curY >= occupied.dimension { - curY = occupied.dimension - 1 - curX -= 2 - if curX == 6 { - curX-- - } - isUpward = true - if curX < 0 { - break - } - } - } - } - - close(allPoints) - }() - go func() { - for pt := range allPoints { - if !occupied.Get(pt.X, pt.Y) { - result <- pt - } - } - close(result) - }() - return result -} - -func drawFinderPatterns(vi *versionInfo, set func(int, int, bool)) { - dim := vi.modulWidth() - drawPattern := func(xoff int, yoff int) { - for x := -1; x < 8; x++ { - for y := -1; y < 8; y++ { - val := (x == 0 || x == 6 || y == 0 || y == 6 || (x > 1 && x < 5 && y > 1 && y < 5)) && (x <= 6 && y <= 6 && x >= 0 && y >= 0) - - if x+xoff >= 0 && x+xoff < dim && y+yoff >= 0 && y+yoff < dim { - set(x+xoff, y+yoff, val) - } - } - } - } - drawPattern(0, 0) - drawPattern(0, dim-7) - drawPattern(dim-7, 0) -} - -func drawAlignmentPatterns(occupied *qrcode, vi *versionInfo, set func(int, int, bool)) { - drawPattern := func(xoff int, yoff int) { - for x := -2; x <= 2; x++ { - for y := -2; y <= 2; y++ { - val := x == -2 || x == 2 || y == -2 || y == 2 || (x == 0 && y == 0) - set(x+xoff, y+yoff, val) - } - } - } - positions := vi.alignmentPatternPlacements() - - for _, x := range positions { - for _, y := range positions { - if occupied.Get(x, y) { - continue - } - drawPattern(x, y) - } - } -} - -var formatInfos = map[ErrorCorrectionLevel]map[int][]bool{ - L: { - 0: []bool{true, true, true, false, true, true, true, true, true, false, false, false, true, false, false}, - 1: []bool{true, true, true, false, false, true, false, true, true, true, true, false, false, true, true}, - 2: []bool{true, true, true, true, true, false, true, true, false, true, false, true, false, true, false}, - 3: []bool{true, true, true, true, false, false, false, true, false, false, true, true, true, false, true}, - 4: []bool{true, true, false, false, true, true, false, false, false, true, false, true, true, true, true}, - 5: []bool{true, true, false, false, false, true, true, false, false, false, true, true, false, false, false}, - 6: []bool{true, true, false, true, true, false, false, false, true, false, false, false, false, false, true}, - 7: []bool{true, true, false, true, false, false, true, false, true, true, true, false, true, true, false}, - }, - M: { - 0: []bool{true, false, true, false, true, false, false, false, false, false, true, false, false, true, false}, - 1: []bool{true, false, true, false, false, false, true, false, false, true, false, false, true, false, true}, - 2: []bool{true, false, true, true, true, true, false, false, true, true, true, true, true, false, false}, - 3: []bool{true, false, true, true, false, true, true, false, true, false, false, true, false, true, true}, - 4: []bool{true, false, false, false, true, false, true, true, true, true, true, true, false, false, true}, - 5: []bool{true, false, false, false, false, false, false, true, true, false, false, true, true, true, false}, - 6: []bool{true, false, false, true, true, true, true, true, false, false, true, false, true, true, true}, - 7: []bool{true, false, false, true, false, true, false, true, false, true, false, false, false, false, false}, - }, - Q: { - 0: []bool{false, true, true, false, true, false, true, false, true, false, true, true, true, true, true}, - 1: []bool{false, true, true, false, false, false, false, false, true, true, false, true, false, false, false}, - 2: []bool{false, true, true, true, true, true, true, false, false, true, true, false, false, false, true}, - 3: []bool{false, true, true, true, false, true, false, false, false, false, false, false, true, true, false}, - 4: []bool{false, true, false, false, true, false, false, true, false, true, true, false, true, false, false}, - 5: []bool{false, true, false, false, false, false, true, true, false, false, false, false, false, true, true}, - 6: []bool{false, true, false, true, true, true, false, true, true, false, true, true, false, true, false}, - 7: []bool{false, true, false, true, false, true, true, true, true, true, false, true, true, false, true}, - }, - H: { - 0: []bool{false, false, true, false, true, true, false, true, false, false, false, true, false, false, true}, - 1: []bool{false, false, true, false, false, true, true, true, false, true, true, true, true, true, false}, - 2: []bool{false, false, true, true, true, false, false, true, true, true, false, false, true, true, true}, - 3: []bool{false, false, true, true, false, false, true, true, true, false, true, false, false, false, false}, - 4: []bool{false, false, false, false, true, true, true, false, true, true, false, false, false, true, false}, - 5: []bool{false, false, false, false, false, true, false, false, true, false, true, false, true, false, true}, - 6: []bool{false, false, false, true, true, false, true, false, false, false, false, true, true, false, false}, - 7: []bool{false, false, false, true, false, false, false, false, false, true, true, true, false, true, true}, - }, -} - -func drawFormatInfo(vi *versionInfo, usedMask int, set func(int, int, bool)) { - var formatInfo []bool - - if usedMask == -1 { - formatInfo = []bool{true, true, true, true, true, true, true, true, true, true, true, true, true, true, true} // Set all to true cause -1 --> occupied mask. - } else { - formatInfo = formatInfos[vi.Level][usedMask] - } - - if len(formatInfo) == 15 { - dim := vi.modulWidth() - set(0, 8, formatInfo[0]) - set(1, 8, formatInfo[1]) - set(2, 8, formatInfo[2]) - set(3, 8, formatInfo[3]) - set(4, 8, formatInfo[4]) - set(5, 8, formatInfo[5]) - set(7, 8, formatInfo[6]) - set(8, 8, formatInfo[7]) - set(8, 7, formatInfo[8]) - set(8, 5, formatInfo[9]) - set(8, 4, formatInfo[10]) - set(8, 3, formatInfo[11]) - set(8, 2, formatInfo[12]) - set(8, 1, formatInfo[13]) - set(8, 0, formatInfo[14]) - - set(8, dim-1, formatInfo[0]) - set(8, dim-2, formatInfo[1]) - set(8, dim-3, formatInfo[2]) - set(8, dim-4, formatInfo[3]) - set(8, dim-5, formatInfo[4]) - set(8, dim-6, formatInfo[5]) - set(8, dim-7, formatInfo[6]) - set(dim-8, 8, formatInfo[7]) - set(dim-7, 8, formatInfo[8]) - set(dim-6, 8, formatInfo[9]) - set(dim-5, 8, formatInfo[10]) - set(dim-4, 8, formatInfo[11]) - set(dim-3, 8, formatInfo[12]) - set(dim-2, 8, formatInfo[13]) - set(dim-1, 8, formatInfo[14]) - } -} - -var versionInfoBitsByVersion = map[byte][]bool{ - 7: []bool{false, false, false, true, true, true, true, true, false, false, true, false, false, true, false, true, false, false}, - 8: []bool{false, false, true, false, false, false, false, true, false, true, true, false, true, true, true, true, false, false}, - 9: []bool{false, false, true, false, false, true, true, false, true, false, true, false, false, true, true, false, false, true}, - 10: []bool{false, false, true, false, true, false, false, true, false, false, true, true, false, true, false, false, true, true}, - 11: []bool{false, false, true, false, true, true, true, false, true, true, true, true, true, true, false, true, true, false}, - 12: []bool{false, false, true, true, false, false, false, true, true, true, false, true, true, false, false, false, true, false}, - 13: []bool{false, false, true, true, false, true, true, false, false, false, false, true, false, false, false, true, true, true}, - 14: []bool{false, false, true, true, true, false, false, true, true, false, false, false, false, false, true, true, false, true}, - 15: []bool{false, false, true, true, true, true, true, false, false, true, false, false, true, false, true, false, false, false}, - 16: []bool{false, true, false, false, false, false, true, false, true, true, false, true, true, true, true, false, false, false}, - 17: []bool{false, true, false, false, false, true, false, true, false, false, false, true, false, true, true, true, false, true}, - 18: []bool{false, true, false, false, true, false, true, false, true, false, false, false, false, true, false, true, true, true}, - 19: []bool{false, true, false, false, true, true, false, true, false, true, false, false, true, true, false, false, true, false}, - 20: []bool{false, true, false, true, false, false, true, false, false, true, true, false, true, false, false, true, true, false}, - 21: []bool{false, true, false, true, false, true, false, true, true, false, true, false, false, false, false, false, true, true}, - 22: []bool{false, true, false, true, true, false, true, false, false, false, true, true, false, false, true, false, false, true}, - 23: []bool{false, true, false, true, true, true, false, true, true, true, true, true, true, false, true, true, false, false}, - 24: []bool{false, true, true, false, false, false, true, true, true, false, true, true, false, false, false, true, false, false}, - 25: []bool{false, true, true, false, false, true, false, false, false, true, true, true, true, false, false, false, false, true}, - 26: []bool{false, true, true, false, true, false, true, true, true, true, true, false, true, false, true, false, true, true}, - 27: []bool{false, true, true, false, true, true, false, false, false, false, true, false, false, false, true, true, true, false}, - 28: []bool{false, true, true, true, false, false, true, true, false, false, false, false, false, true, true, false, true, false}, - 29: []bool{false, true, true, true, false, true, false, false, true, true, false, false, true, true, true, true, true, true}, - 30: []bool{false, true, true, true, true, false, true, true, false, true, false, true, true, true, false, true, false, true}, - 31: []bool{false, true, true, true, true, true, false, false, true, false, false, true, false, true, false, false, false, false}, - 32: []bool{true, false, false, false, false, false, true, false, false, true, true, true, false, true, false, true, false, true}, - 33: []bool{true, false, false, false, false, true, false, true, true, false, true, true, true, true, false, false, false, false}, - 34: []bool{true, false, false, false, true, false, true, false, false, false, true, false, true, true, true, false, true, false}, - 35: []bool{true, false, false, false, true, true, false, true, true, true, true, false, false, true, true, true, true, true}, - 36: []bool{true, false, false, true, false, false, true, false, true, true, false, false, false, false, true, false, true, true}, - 37: []bool{true, false, false, true, false, true, false, true, false, false, false, false, true, false, true, true, true, false}, - 38: []bool{true, false, false, true, true, false, true, false, true, false, false, true, true, false, false, true, false, false}, - 39: []bool{true, false, false, true, true, true, false, true, false, true, false, true, false, false, false, false, false, true}, - 40: []bool{true, false, true, false, false, false, true, true, false, false, false, true, true, false, true, false, false, true}, -} - -func drawVersionInfo(vi *versionInfo, set func(int, int, bool)) { - versionInfoBits, ok := versionInfoBitsByVersion[vi.Version] - - if ok && len(versionInfoBits) > 0 { - for i := 0; i < len(versionInfoBits); i++ { - x := (vi.modulWidth() - 11) + i%3 - y := i / 3 - set(x, y, versionInfoBits[len(versionInfoBits)-i-1]) - set(y, x, versionInfoBits[len(versionInfoBits)-i-1]) - } - } - -} - -func addPaddingAndTerminator(bl *utils.BitList, vi *versionInfo) { - for i := 0; i < 4 && bl.Len() < vi.totalDataBytes()*8; i++ { - bl.AddBit(false) - } - - for bl.Len()%8 != 0 { - bl.AddBit(false) - } - - for i := 0; bl.Len() < vi.totalDataBytes()*8; i++ { - if i%2 == 0 { - bl.AddByte(236) - } else { - bl.AddByte(17) - } - } -} diff --git a/vendor/github.com/boombuler/barcode/qr/errorcorrection.go b/vendor/github.com/boombuler/barcode/qr/errorcorrection.go deleted file mode 100644 index 08ebf0c..0000000 --- a/vendor/github.com/boombuler/barcode/qr/errorcorrection.go +++ /dev/null @@ -1,29 +0,0 @@ -package qr - -import ( - "github.com/boombuler/barcode/utils" -) - -type errorCorrection struct { - rs *utils.ReedSolomonEncoder -} - -var ec = newErrorCorrection() - -func newErrorCorrection() *errorCorrection { - fld := utils.NewGaloisField(285, 256, 0) - return &errorCorrection{utils.NewReedSolomonEncoder(fld)} -} - -func (ec *errorCorrection) calcECC(data []byte, eccCount byte) []byte { - dataInts := make([]int, len(data)) - for i := 0; i < len(data); i++ { - dataInts[i] = int(data[i]) - } - res := ec.rs.Encode(dataInts, int(eccCount)) - result := make([]byte, len(res)) - for i := 0; i < len(res); i++ { - result[i] = byte(res[i]) - } - return result -} diff --git a/vendor/github.com/boombuler/barcode/qr/numeric.go b/vendor/github.com/boombuler/barcode/qr/numeric.go deleted file mode 100644 index 49b44cc..0000000 --- a/vendor/github.com/boombuler/barcode/qr/numeric.go +++ /dev/null @@ -1,56 +0,0 @@ -package qr - -import ( - "errors" - "fmt" - "strconv" - - "github.com/boombuler/barcode/utils" -) - -func encodeNumeric(content string, ecl ErrorCorrectionLevel) (*utils.BitList, *versionInfo, error) { - contentBitCount := (len(content) / 3) * 10 - switch len(content) % 3 { - case 1: - contentBitCount += 4 - case 2: - contentBitCount += 7 - } - vi := findSmallestVersionInfo(ecl, numericMode, contentBitCount) - if vi == nil { - return nil, nil, errors.New("To much data to encode") - } - res := new(utils.BitList) - res.AddBits(int(numericMode), 4) - res.AddBits(len(content), vi.charCountBits(numericMode)) - - for pos := 0; pos < len(content); pos += 3 { - var curStr string - if pos+3 <= len(content) { - curStr = content[pos : pos+3] - } else { - curStr = content[pos:] - } - - i, err := strconv.Atoi(curStr) - if err != nil || i < 0 { - return nil, nil, fmt.Errorf("\"%s\" can not be encoded as %s", content, Numeric) - } - var bitCnt byte - switch len(curStr) % 3 { - case 0: - bitCnt = 10 - case 1: - bitCnt = 4 - break - case 2: - bitCnt = 7 - break - } - - res.AddBits(i, bitCnt) - } - - addPaddingAndTerminator(res, vi) - return res, vi, nil -} diff --git a/vendor/github.com/boombuler/barcode/qr/qrcode.go b/vendor/github.com/boombuler/barcode/qr/qrcode.go deleted file mode 100644 index 2fb44ab..0000000 --- a/vendor/github.com/boombuler/barcode/qr/qrcode.go +++ /dev/null @@ -1,176 +0,0 @@ -package qr - -import ( - "image" - "image/color" - "math" - - "github.com/boombuler/barcode" - "github.com/boombuler/barcode/utils" -) - -type qrcode struct { - dimension int - data *utils.BitList - content string - color barcode.ColorScheme -} - -func (qr *qrcode) Content() string { - return qr.content -} - -func (qr *qrcode) Metadata() barcode.Metadata { - return barcode.Metadata{barcode.TypeQR, 2} -} - -func (qr *qrcode) ColorModel() color.Model { - return qr.color.Model -} - -func (c *qrcode) ColorScheme() barcode.ColorScheme { - return c.color -} - -func (qr *qrcode) Bounds() image.Rectangle { - return image.Rect(0, 0, qr.dimension, qr.dimension) -} - -func (qr *qrcode) At(x, y int) color.Color { - if qr.Get(x, y) { - return qr.color.Foreground - } - return qr.color.Background -} - -func (qr *qrcode) Get(x, y int) bool { - return qr.data.GetBit(x*qr.dimension + y) -} - -func (qr *qrcode) Set(x, y int, val bool) { - qr.data.SetBit(x*qr.dimension+y, val) -} - -func (qr *qrcode) calcPenalty() uint { - return qr.calcPenaltyRule1() + qr.calcPenaltyRule2() + qr.calcPenaltyRule3() + qr.calcPenaltyRule4() -} - -func (qr *qrcode) calcPenaltyRule1() uint { - var result uint - for x := 0; x < qr.dimension; x++ { - checkForX := false - var cntX uint - checkForY := false - var cntY uint - - for y := 0; y < qr.dimension; y++ { - if qr.Get(x, y) == checkForX { - cntX++ - } else { - checkForX = !checkForX - if cntX >= 5 { - result += cntX - 2 - } - cntX = 1 - } - - if qr.Get(y, x) == checkForY { - cntY++ - } else { - checkForY = !checkForY - if cntY >= 5 { - result += cntY - 2 - } - cntY = 1 - } - } - - if cntX >= 5 { - result += cntX - 2 - } - if cntY >= 5 { - result += cntY - 2 - } - } - - return result -} - -func (qr *qrcode) calcPenaltyRule2() uint { - var result uint - for x := 0; x < qr.dimension-1; x++ { - for y := 0; y < qr.dimension-1; y++ { - check := qr.Get(x, y) - if qr.Get(x, y+1) == check && qr.Get(x+1, y) == check && qr.Get(x+1, y+1) == check { - result += 3 - } - } - } - return result -} - -func (qr *qrcode) calcPenaltyRule3() uint { - pattern1 := []bool{true, false, true, true, true, false, true, false, false, false, false} - pattern2 := []bool{false, false, false, false, true, false, true, true, true, false, true} - - var result uint - for x := 0; x <= qr.dimension-len(pattern1); x++ { - for y := 0; y < qr.dimension; y++ { - pattern1XFound := true - pattern2XFound := true - pattern1YFound := true - pattern2YFound := true - - for i := 0; i < len(pattern1); i++ { - iv := qr.Get(x+i, y) - if iv != pattern1[i] { - pattern1XFound = false - } - if iv != pattern2[i] { - pattern2XFound = false - } - iv = qr.Get(y, x+i) - if iv != pattern1[i] { - pattern1YFound = false - } - if iv != pattern2[i] { - pattern2YFound = false - } - } - if pattern1XFound || pattern2XFound { - result += 40 - } - if pattern1YFound || pattern2YFound { - result += 40 - } - } - } - - return result -} - -func (qr *qrcode) calcPenaltyRule4() uint { - totalNum := qr.data.Len() - trueCnt := 0 - for i := 0; i < totalNum; i++ { - if qr.data.GetBit(i) { - trueCnt++ - } - } - percDark := float64(trueCnt) * 100 / float64(totalNum) - floor := math.Abs(math.Floor(percDark/5) - 10) - ceil := math.Abs(math.Ceil(percDark/5) - 10) - return uint(math.Min(floor, ceil) * 10) -} - -func newBarCodeWithColor(dim int, color barcode.ColorScheme) *qrcode { - res := new(qrcode) - res.dimension = dim - res.data = utils.NewBitList(dim * dim) - res.color = color - return res -} - -func newBarcode(dim int) *qrcode { - return newBarCodeWithColor(dim, barcode.ColorScheme16) -} diff --git a/vendor/github.com/boombuler/barcode/qr/unicode.go b/vendor/github.com/boombuler/barcode/qr/unicode.go deleted file mode 100644 index a9135ab..0000000 --- a/vendor/github.com/boombuler/barcode/qr/unicode.go +++ /dev/null @@ -1,27 +0,0 @@ -package qr - -import ( - "errors" - - "github.com/boombuler/barcode/utils" -) - -func encodeUnicode(content string, ecl ErrorCorrectionLevel) (*utils.BitList, *versionInfo, error) { - data := []byte(content) - - vi := findSmallestVersionInfo(ecl, byteMode, len(data)*8) - if vi == nil { - return nil, nil, errors.New("To much data to encode") - } - - // It's not correct to add the unicode bytes to the result directly but most readers can't handle the - // required ECI header... - res := new(utils.BitList) - res.AddBits(int(byteMode), 4) - res.AddBits(len(content), vi.charCountBits(byteMode)) - for _, b := range data { - res.AddByte(b) - } - addPaddingAndTerminator(res, vi) - return res, vi, nil -} diff --git a/vendor/github.com/boombuler/barcode/qr/versioninfo.go b/vendor/github.com/boombuler/barcode/qr/versioninfo.go deleted file mode 100644 index 6852a57..0000000 --- a/vendor/github.com/boombuler/barcode/qr/versioninfo.go +++ /dev/null @@ -1,310 +0,0 @@ -package qr - -import "math" - -// ErrorCorrectionLevel indicates the amount of "backup data" stored in the QR code -type ErrorCorrectionLevel byte - -const ( - // L recovers 7% of data - L ErrorCorrectionLevel = iota - // M recovers 15% of data - M - // Q recovers 25% of data - Q - // H recovers 30% of data - H -) - -func (ecl ErrorCorrectionLevel) String() string { - switch ecl { - case L: - return "L" - case M: - return "M" - case Q: - return "Q" - case H: - return "H" - } - return "unknown" -} - -type encodingMode byte - -const ( - numericMode encodingMode = 1 - alphaNumericMode encodingMode = 2 - byteMode encodingMode = 4 - kanjiMode encodingMode = 8 -) - -type versionInfo struct { - Version byte - Level ErrorCorrectionLevel - ErrorCorrectionCodewordsPerBlock byte - NumberOfBlocksInGroup1 byte - DataCodeWordsPerBlockInGroup1 byte - NumberOfBlocksInGroup2 byte - DataCodeWordsPerBlockInGroup2 byte -} - -var versionInfos = []*versionInfo{ - &versionInfo{1, L, 7, 1, 19, 0, 0}, - &versionInfo{1, M, 10, 1, 16, 0, 0}, - &versionInfo{1, Q, 13, 1, 13, 0, 0}, - &versionInfo{1, H, 17, 1, 9, 0, 0}, - &versionInfo{2, L, 10, 1, 34, 0, 0}, - &versionInfo{2, M, 16, 1, 28, 0, 0}, - &versionInfo{2, Q, 22, 1, 22, 0, 0}, - &versionInfo{2, H, 28, 1, 16, 0, 0}, - &versionInfo{3, L, 15, 1, 55, 0, 0}, - &versionInfo{3, M, 26, 1, 44, 0, 0}, - &versionInfo{3, Q, 18, 2, 17, 0, 0}, - &versionInfo{3, H, 22, 2, 13, 0, 0}, - &versionInfo{4, L, 20, 1, 80, 0, 0}, - &versionInfo{4, M, 18, 2, 32, 0, 0}, - &versionInfo{4, Q, 26, 2, 24, 0, 0}, - &versionInfo{4, H, 16, 4, 9, 0, 0}, - &versionInfo{5, L, 26, 1, 108, 0, 0}, - &versionInfo{5, M, 24, 2, 43, 0, 0}, - &versionInfo{5, Q, 18, 2, 15, 2, 16}, - &versionInfo{5, H, 22, 2, 11, 2, 12}, - &versionInfo{6, L, 18, 2, 68, 0, 0}, - &versionInfo{6, M, 16, 4, 27, 0, 0}, - &versionInfo{6, Q, 24, 4, 19, 0, 0}, - &versionInfo{6, H, 28, 4, 15, 0, 0}, - &versionInfo{7, L, 20, 2, 78, 0, 0}, - &versionInfo{7, M, 18, 4, 31, 0, 0}, - &versionInfo{7, Q, 18, 2, 14, 4, 15}, - &versionInfo{7, H, 26, 4, 13, 1, 14}, - &versionInfo{8, L, 24, 2, 97, 0, 0}, - &versionInfo{8, M, 22, 2, 38, 2, 39}, - &versionInfo{8, Q, 22, 4, 18, 2, 19}, - &versionInfo{8, H, 26, 4, 14, 2, 15}, - &versionInfo{9, L, 30, 2, 116, 0, 0}, - &versionInfo{9, M, 22, 3, 36, 2, 37}, - &versionInfo{9, Q, 20, 4, 16, 4, 17}, - &versionInfo{9, H, 24, 4, 12, 4, 13}, - &versionInfo{10, L, 18, 2, 68, 2, 69}, - &versionInfo{10, M, 26, 4, 43, 1, 44}, - &versionInfo{10, Q, 24, 6, 19, 2, 20}, - &versionInfo{10, H, 28, 6, 15, 2, 16}, - &versionInfo{11, L, 20, 4, 81, 0, 0}, - &versionInfo{11, M, 30, 1, 50, 4, 51}, - &versionInfo{11, Q, 28, 4, 22, 4, 23}, - &versionInfo{11, H, 24, 3, 12, 8, 13}, - &versionInfo{12, L, 24, 2, 92, 2, 93}, - &versionInfo{12, M, 22, 6, 36, 2, 37}, - &versionInfo{12, Q, 26, 4, 20, 6, 21}, - &versionInfo{12, H, 28, 7, 14, 4, 15}, - &versionInfo{13, L, 26, 4, 107, 0, 0}, - &versionInfo{13, M, 22, 8, 37, 1, 38}, - &versionInfo{13, Q, 24, 8, 20, 4, 21}, - &versionInfo{13, H, 22, 12, 11, 4, 12}, - &versionInfo{14, L, 30, 3, 115, 1, 116}, - &versionInfo{14, M, 24, 4, 40, 5, 41}, - &versionInfo{14, Q, 20, 11, 16, 5, 17}, - &versionInfo{14, H, 24, 11, 12, 5, 13}, - &versionInfo{15, L, 22, 5, 87, 1, 88}, - &versionInfo{15, M, 24, 5, 41, 5, 42}, - &versionInfo{15, Q, 30, 5, 24, 7, 25}, - &versionInfo{15, H, 24, 11, 12, 7, 13}, - &versionInfo{16, L, 24, 5, 98, 1, 99}, - &versionInfo{16, M, 28, 7, 45, 3, 46}, - &versionInfo{16, Q, 24, 15, 19, 2, 20}, - &versionInfo{16, H, 30, 3, 15, 13, 16}, - &versionInfo{17, L, 28, 1, 107, 5, 108}, - &versionInfo{17, M, 28, 10, 46, 1, 47}, - &versionInfo{17, Q, 28, 1, 22, 15, 23}, - &versionInfo{17, H, 28, 2, 14, 17, 15}, - &versionInfo{18, L, 30, 5, 120, 1, 121}, - &versionInfo{18, M, 26, 9, 43, 4, 44}, - &versionInfo{18, Q, 28, 17, 22, 1, 23}, - &versionInfo{18, H, 28, 2, 14, 19, 15}, - &versionInfo{19, L, 28, 3, 113, 4, 114}, - &versionInfo{19, M, 26, 3, 44, 11, 45}, - &versionInfo{19, Q, 26, 17, 21, 4, 22}, - &versionInfo{19, H, 26, 9, 13, 16, 14}, - &versionInfo{20, L, 28, 3, 107, 5, 108}, - &versionInfo{20, M, 26, 3, 41, 13, 42}, - &versionInfo{20, Q, 30, 15, 24, 5, 25}, - &versionInfo{20, H, 28, 15, 15, 10, 16}, - &versionInfo{21, L, 28, 4, 116, 4, 117}, - &versionInfo{21, M, 26, 17, 42, 0, 0}, - &versionInfo{21, Q, 28, 17, 22, 6, 23}, - &versionInfo{21, H, 30, 19, 16, 6, 17}, - &versionInfo{22, L, 28, 2, 111, 7, 112}, - &versionInfo{22, M, 28, 17, 46, 0, 0}, - &versionInfo{22, Q, 30, 7, 24, 16, 25}, - &versionInfo{22, H, 24, 34, 13, 0, 0}, - &versionInfo{23, L, 30, 4, 121, 5, 122}, - &versionInfo{23, M, 28, 4, 47, 14, 48}, - &versionInfo{23, Q, 30, 11, 24, 14, 25}, - &versionInfo{23, H, 30, 16, 15, 14, 16}, - &versionInfo{24, L, 30, 6, 117, 4, 118}, - &versionInfo{24, M, 28, 6, 45, 14, 46}, - &versionInfo{24, Q, 30, 11, 24, 16, 25}, - &versionInfo{24, H, 30, 30, 16, 2, 17}, - &versionInfo{25, L, 26, 8, 106, 4, 107}, - &versionInfo{25, M, 28, 8, 47, 13, 48}, - &versionInfo{25, Q, 30, 7, 24, 22, 25}, - &versionInfo{25, H, 30, 22, 15, 13, 16}, - &versionInfo{26, L, 28, 10, 114, 2, 115}, - &versionInfo{26, M, 28, 19, 46, 4, 47}, - &versionInfo{26, Q, 28, 28, 22, 6, 23}, - &versionInfo{26, H, 30, 33, 16, 4, 17}, - &versionInfo{27, L, 30, 8, 122, 4, 123}, - &versionInfo{27, M, 28, 22, 45, 3, 46}, - &versionInfo{27, Q, 30, 8, 23, 26, 24}, - &versionInfo{27, H, 30, 12, 15, 28, 16}, - &versionInfo{28, L, 30, 3, 117, 10, 118}, - &versionInfo{28, M, 28, 3, 45, 23, 46}, - &versionInfo{28, Q, 30, 4, 24, 31, 25}, - &versionInfo{28, H, 30, 11, 15, 31, 16}, - &versionInfo{29, L, 30, 7, 116, 7, 117}, - &versionInfo{29, M, 28, 21, 45, 7, 46}, - &versionInfo{29, Q, 30, 1, 23, 37, 24}, - &versionInfo{29, H, 30, 19, 15, 26, 16}, - &versionInfo{30, L, 30, 5, 115, 10, 116}, - &versionInfo{30, M, 28, 19, 47, 10, 48}, - &versionInfo{30, Q, 30, 15, 24, 25, 25}, - &versionInfo{30, H, 30, 23, 15, 25, 16}, - &versionInfo{31, L, 30, 13, 115, 3, 116}, - &versionInfo{31, M, 28, 2, 46, 29, 47}, - &versionInfo{31, Q, 30, 42, 24, 1, 25}, - &versionInfo{31, H, 30, 23, 15, 28, 16}, - &versionInfo{32, L, 30, 17, 115, 0, 0}, - &versionInfo{32, M, 28, 10, 46, 23, 47}, - &versionInfo{32, Q, 30, 10, 24, 35, 25}, - &versionInfo{32, H, 30, 19, 15, 35, 16}, - &versionInfo{33, L, 30, 17, 115, 1, 116}, - &versionInfo{33, M, 28, 14, 46, 21, 47}, - &versionInfo{33, Q, 30, 29, 24, 19, 25}, - &versionInfo{33, H, 30, 11, 15, 46, 16}, - &versionInfo{34, L, 30, 13, 115, 6, 116}, - &versionInfo{34, M, 28, 14, 46, 23, 47}, - &versionInfo{34, Q, 30, 44, 24, 7, 25}, - &versionInfo{34, H, 30, 59, 16, 1, 17}, - &versionInfo{35, L, 30, 12, 121, 7, 122}, - &versionInfo{35, M, 28, 12, 47, 26, 48}, - &versionInfo{35, Q, 30, 39, 24, 14, 25}, - &versionInfo{35, H, 30, 22, 15, 41, 16}, - &versionInfo{36, L, 30, 6, 121, 14, 122}, - &versionInfo{36, M, 28, 6, 47, 34, 48}, - &versionInfo{36, Q, 30, 46, 24, 10, 25}, - &versionInfo{36, H, 30, 2, 15, 64, 16}, - &versionInfo{37, L, 30, 17, 122, 4, 123}, - &versionInfo{37, M, 28, 29, 46, 14, 47}, - &versionInfo{37, Q, 30, 49, 24, 10, 25}, - &versionInfo{37, H, 30, 24, 15, 46, 16}, - &versionInfo{38, L, 30, 4, 122, 18, 123}, - &versionInfo{38, M, 28, 13, 46, 32, 47}, - &versionInfo{38, Q, 30, 48, 24, 14, 25}, - &versionInfo{38, H, 30, 42, 15, 32, 16}, - &versionInfo{39, L, 30, 20, 117, 4, 118}, - &versionInfo{39, M, 28, 40, 47, 7, 48}, - &versionInfo{39, Q, 30, 43, 24, 22, 25}, - &versionInfo{39, H, 30, 10, 15, 67, 16}, - &versionInfo{40, L, 30, 19, 118, 6, 119}, - &versionInfo{40, M, 28, 18, 47, 31, 48}, - &versionInfo{40, Q, 30, 34, 24, 34, 25}, - &versionInfo{40, H, 30, 20, 15, 61, 16}, -} - -func (vi *versionInfo) totalDataBytes() int { - g1Data := int(vi.NumberOfBlocksInGroup1) * int(vi.DataCodeWordsPerBlockInGroup1) - g2Data := int(vi.NumberOfBlocksInGroup2) * int(vi.DataCodeWordsPerBlockInGroup2) - return (g1Data + g2Data) -} - -func (vi *versionInfo) charCountBits(m encodingMode) byte { - switch m { - case numericMode: - if vi.Version < 10 { - return 10 - } else if vi.Version < 27 { - return 12 - } - return 14 - - case alphaNumericMode: - if vi.Version < 10 { - return 9 - } else if vi.Version < 27 { - return 11 - } - return 13 - - case byteMode: - if vi.Version < 10 { - return 8 - } - return 16 - - case kanjiMode: - if vi.Version < 10 { - return 8 - } else if vi.Version < 27 { - return 10 - } - return 12 - default: - return 0 - } -} - -func (vi *versionInfo) modulWidth() int { - return ((int(vi.Version) - 1) * 4) + 21 -} - -func (vi *versionInfo) alignmentPatternPlacements() []int { - if vi.Version == 1 { - return make([]int, 0) - } - - first := 6 - last := vi.modulWidth() - 7 - space := float64(last - first) - count := int(math.Ceil(space/28)) + 1 - - result := make([]int, count) - result[0] = first - result[len(result)-1] = last - if count > 2 { - step := int(math.Ceil(float64(last-first) / float64(count-1))) - if step%2 == 1 { - frac := float64(last-first) / float64(count-1) - _, x := math.Modf(frac) - if x >= 0.5 { - frac = math.Ceil(frac) - } else { - frac = math.Floor(frac) - } - - if int(frac)%2 == 0 { - step-- - } else { - step++ - } - } - - for i := 1; i <= count-2; i++ { - result[i] = last - (step * (count - 1 - i)) - } - } - - return result -} - -func findSmallestVersionInfo(ecl ErrorCorrectionLevel, mode encodingMode, dataBits int) *versionInfo { - dataBits = dataBits + 4 // mode indicator - for _, vi := range versionInfos { - if vi.Level == ecl { - if (vi.totalDataBytes() * 8) >= (dataBits + int(vi.charCountBits(mode))) { - return vi - } - } - } - return nil -} diff --git a/vendor/github.com/boombuler/barcode/scaledbarcode.go b/vendor/github.com/boombuler/barcode/scaledbarcode.go deleted file mode 100644 index 491cc3f..0000000 --- a/vendor/github.com/boombuler/barcode/scaledbarcode.go +++ /dev/null @@ -1,145 +0,0 @@ -package barcode - -import ( - "errors" - "fmt" - "image" - "image/color" - "math" -) - -type wrapFunc func(x, y int) color.Color - -type scaledBarcode struct { - wrapped Barcode - wrapperFunc wrapFunc - rect image.Rectangle -} - -type intCSscaledBC struct { - scaledBarcode -} - -func (bc *scaledBarcode) Content() string { - return bc.wrapped.Content() -} - -func (bc *scaledBarcode) Metadata() Metadata { - return bc.wrapped.Metadata() -} - -func (bc *scaledBarcode) ColorModel() color.Model { - return bc.wrapped.ColorModel() -} - -func (bc *scaledBarcode) Bounds() image.Rectangle { - return bc.rect -} - -func (bc *scaledBarcode) At(x, y int) color.Color { - return bc.wrapperFunc(x, y) -} - -func (bc *intCSscaledBC) CheckSum() int { - if cs, ok := bc.wrapped.(BarcodeIntCS); ok { - return cs.CheckSum() - } - return 0 -} - -// Scale returns a resized barcode with the given width and height. -func Scale(bc Barcode, width, height int) (Barcode, error) { - var fill color.Color - if v, ok := bc.(BarcodeColor); ok { - fill = v.ColorScheme().Background - } else { - fill = color.White - } - return ScaleWithFill(bc, width, height, fill) -} - -// Scale returns a resized barcode with the given width, height and fill color. -func ScaleWithFill(bc Barcode, width, height int, fill color.Color) (Barcode, error) { - switch bc.Metadata().Dimensions { - case 1: - return scale1DCode(bc, width, height, fill) - case 2: - return scale2DCode(bc, width, height, fill) - } - - return nil, errors.New("unsupported barcode format") -} - -func newScaledBC(wrapped Barcode, wrapperFunc wrapFunc, rect image.Rectangle) Barcode { - result := &scaledBarcode{ - wrapped: wrapped, - wrapperFunc: wrapperFunc, - rect: rect, - } - - if _, ok := wrapped.(BarcodeIntCS); ok { - return &intCSscaledBC{*result} - } - return result -} - -func scale2DCode(bc Barcode, width, height int, fill color.Color) (Barcode, error) { - orgBounds := bc.Bounds() - orgWidth := orgBounds.Max.X - orgBounds.Min.X - orgHeight := orgBounds.Max.Y - orgBounds.Min.Y - - factor := int(math.Min(float64(width)/float64(orgWidth), float64(height)/float64(orgHeight))) - if factor <= 0 { - return nil, fmt.Errorf("can not scale barcode to an image smaller than %dx%d", orgWidth, orgHeight) - } - - offsetX := (width - (orgWidth * factor)) / 2 - offsetY := (height - (orgHeight * factor)) / 2 - - wrap := func(x, y int) color.Color { - if x < offsetX || y < offsetY { - return fill - } - x = (x - offsetX) / factor - y = (y - offsetY) / factor - if x >= orgWidth || y >= orgHeight { - return fill - } - return bc.At(x, y) - } - - return newScaledBC( - bc, - wrap, - image.Rect(0, 0, width, height), - ), nil -} - -func scale1DCode(bc Barcode, width, height int, fill color.Color) (Barcode, error) { - orgBounds := bc.Bounds() - orgWidth := orgBounds.Max.X - orgBounds.Min.X - factor := int(float64(width) / float64(orgWidth)) - - if factor <= 0 { - return nil, fmt.Errorf("can not scale barcode to an image smaller than %dx1", orgWidth) - } - offsetX := (width - (orgWidth * factor)) / 2 - - wrap := func(x, y int) color.Color { - if x < offsetX { - return fill - } - x = (x - offsetX) / factor - - if x >= orgWidth { - return fill - } - return bc.At(x, 0) - } - - return newScaledBC( - bc, - wrap, - image.Rect(0, 0, width, height), - ), nil -} diff --git a/vendor/github.com/boombuler/barcode/utils/base1dcode.go b/vendor/github.com/boombuler/barcode/utils/base1dcode.go deleted file mode 100644 index 1b77e4f..0000000 --- a/vendor/github.com/boombuler/barcode/utils/base1dcode.go +++ /dev/null @@ -1,72 +0,0 @@ -// Package utils contain some utilities which are needed to create barcodes -package utils - -import ( - "image" - "image/color" - - "github.com/boombuler/barcode" -) - -type base1DCode struct { - *BitList - kind string - content string - color barcode.ColorScheme -} - -type base1DCodeIntCS struct { - base1DCode - checksum int -} - -func (c *base1DCode) Content() string { - return c.content -} - -func (c *base1DCode) Metadata() barcode.Metadata { - return barcode.Metadata{c.kind, 1} -} - -func (c *base1DCode) ColorModel() color.Model { - return c.color.Model -} - -func (c *base1DCode) ColorScheme() barcode.ColorScheme { - return c.color -} - -func (c *base1DCode) Bounds() image.Rectangle { - return image.Rect(0, 0, c.Len(), 1) -} - -func (c *base1DCode) At(x, y int) color.Color { - if c.GetBit(x) { - return c.color.Foreground - } - return c.color.Background -} - -func (c *base1DCodeIntCS) CheckSum() int { - return c.checksum -} - -// New1DCodeIntCheckSum creates a new 1D barcode where the bars are represented by the bits in the bars BitList -func New1DCodeIntCheckSum(codeKind, content string, bars *BitList, checksum int) barcode.BarcodeIntCS { - return &base1DCodeIntCS{base1DCode{bars, codeKind, content, barcode.ColorScheme16}, checksum} -} - -// New1DCodeIntCheckSum creates a new 1D barcode where the bars are represented by the bits in the bars BitList -func New1DCodeIntCheckSumWithColor(codeKind, content string, bars *BitList, checksum int, color barcode.ColorScheme) barcode.BarcodeIntCS { - return &base1DCodeIntCS{base1DCode{bars, codeKind, content, color}, checksum} -} - -// New1DCode creates a new 1D barcode where the bars are represented by the bits in the bars BitList -func New1DCode(codeKind, content string, bars *BitList) barcode.Barcode { - return &base1DCode{bars, codeKind, content, barcode.ColorScheme16} -} - -// New1DCode creates a new 1D barcode where the bars are represented by the bits in the bars BitList -func New1DCodeWithColor(codeKind, content string, bars *BitList, color barcode.ColorScheme) barcode.Barcode { - return &base1DCode{bars, codeKind, content, color} -} diff --git a/vendor/github.com/boombuler/barcode/utils/bitlist.go b/vendor/github.com/boombuler/barcode/utils/bitlist.go deleted file mode 100644 index bb05e53..0000000 --- a/vendor/github.com/boombuler/barcode/utils/bitlist.go +++ /dev/null @@ -1,119 +0,0 @@ -package utils - -// BitList is a list that contains bits -type BitList struct { - count int - data []int32 -} - -// NewBitList returns a new BitList with the given length -// all bits are initialize with false -func NewBitList(capacity int) *BitList { - bl := new(BitList) - bl.count = capacity - x := 0 - if capacity%32 != 0 { - x = 1 - } - bl.data = make([]int32, capacity/32+x) - return bl -} - -// Len returns the number of contained bits -func (bl *BitList) Len() int { - return bl.count -} - -func (bl *BitList) grow() { - growBy := len(bl.data) - if growBy < 128 { - growBy = 128 - } else if growBy >= 1024 { - growBy = 1024 - } - - nd := make([]int32, len(bl.data)+growBy) - copy(nd, bl.data) - bl.data = nd -} - -// AddBit appends the given bits to the end of the list -func (bl *BitList) AddBit(bits ...bool) { - for _, bit := range bits { - itmIndex := bl.count / 32 - for itmIndex >= len(bl.data) { - bl.grow() - } - bl.SetBit(bl.count, bit) - bl.count++ - } -} - -// SetBit sets the bit at the given index to the given value -func (bl *BitList) SetBit(index int, value bool) { - itmIndex := index / 32 - itmBitShift := 31 - (index % 32) - if value { - bl.data[itmIndex] = bl.data[itmIndex] | 1< > uint(itmBitShift)) & 1) == 1 -} - -// AddByte appends all 8 bits of the given byte to the end of the list -func (bl *BitList) AddByte(b byte) { - for i := 7; i >= 0; i-- { - bl.AddBit(((b >> uint(i)) & 1) == 1) - } -} - -// AddBits appends the last (LSB) 'count' bits of 'b' the the end of the list -func (bl *BitList) AddBits(b int, count byte) { - for i := int(count) - 1; i >= 0; i-- { - bl.AddBit(((b >> uint(i)) & 1) == 1) - } -} - -// GetBytes returns all bits of the BitList as a []byte -func (bl *BitList) GetBytes() []byte { - len := bl.count >> 3 - if (bl.count % 8) != 0 { - len++ - } - result := make([]byte, len) - for i := 0; i < len; i++ { - shift := (3 - (i % 4)) * 8 - result[i] = (byte)((bl.data[i/4] >> uint(shift)) & 0xFF) - } - return result -} - -// IterateBytes iterates through all bytes contained in the BitList -func (bl *BitList) IterateBytes() <-chan byte { - res := make(chan byte) - - go func() { - c := bl.count - shift := 24 - i := 0 - for c > 0 { - res <- byte((bl.data[i] >> uint(shift)) & 0xFF) - shift -= 8 - if shift < 0 { - shift = 24 - i++ - } - c -= 8 - } - close(res) - }() - - return res -} diff --git a/vendor/github.com/boombuler/barcode/utils/galoisfield.go b/vendor/github.com/boombuler/barcode/utils/galoisfield.go deleted file mode 100644 index 68726fb..0000000 --- a/vendor/github.com/boombuler/barcode/utils/galoisfield.go +++ /dev/null @@ -1,65 +0,0 @@ -package utils - -// GaloisField encapsulates galois field arithmetics -type GaloisField struct { - Size int - Base int - ALogTbl []int - LogTbl []int -} - -// NewGaloisField creates a new galois field -func NewGaloisField(pp, fieldSize, b int) *GaloisField { - result := new(GaloisField) - - result.Size = fieldSize - result.Base = b - result.ALogTbl = make([]int, fieldSize) - result.LogTbl = make([]int, fieldSize) - - x := 1 - for i := 0; i < fieldSize; i++ { - result.ALogTbl[i] = x - x = x * 2 - if x >= fieldSize { - x = (x ^ pp) & (fieldSize - 1) - } - } - - for i := 0; i < fieldSize; i++ { - result.LogTbl[result.ALogTbl[i]] = int(i) - } - - return result -} - -func (gf *GaloisField) Zero() *GFPoly { - return NewGFPoly(gf, []int{0}) -} - -// AddOrSub add or substract two numbers -func (gf *GaloisField) AddOrSub(a, b int) int { - return a ^ b -} - -// Multiply multiplys two numbers -func (gf *GaloisField) Multiply(a, b int) int { - if a == 0 || b == 0 { - return 0 - } - return gf.ALogTbl[(gf.LogTbl[a]+gf.LogTbl[b])%(gf.Size-1)] -} - -// Divide divides two numbers -func (gf *GaloisField) Divide(a, b int) int { - if b == 0 { - panic("divide by zero") - } else if a == 0 { - return 0 - } - return gf.ALogTbl[(gf.LogTbl[a]-gf.LogTbl[b])%(gf.Size-1)] -} - -func (gf *GaloisField) Invers(num int) int { - return gf.ALogTbl[(gf.Size-1)-gf.LogTbl[num]] -} diff --git a/vendor/github.com/boombuler/barcode/utils/gfpoly.go b/vendor/github.com/boombuler/barcode/utils/gfpoly.go deleted file mode 100644 index c56bb40..0000000 --- a/vendor/github.com/boombuler/barcode/utils/gfpoly.go +++ /dev/null @@ -1,103 +0,0 @@ -package utils - -type GFPoly struct { - gf *GaloisField - Coefficients []int -} - -func (gp *GFPoly) Degree() int { - return len(gp.Coefficients) - 1 -} - -func (gp *GFPoly) Zero() bool { - return gp.Coefficients[0] == 0 -} - -// GetCoefficient returns the coefficient of x ^ degree -func (gp *GFPoly) GetCoefficient(degree int) int { - return gp.Coefficients[gp.Degree()-degree] -} - -func (gp *GFPoly) AddOrSubstract(other *GFPoly) *GFPoly { - if gp.Zero() { - return other - } else if other.Zero() { - return gp - } - smallCoeff := gp.Coefficients - largeCoeff := other.Coefficients - if len(smallCoeff) > len(largeCoeff) { - largeCoeff, smallCoeff = smallCoeff, largeCoeff - } - sumDiff := make([]int, len(largeCoeff)) - lenDiff := len(largeCoeff) - len(smallCoeff) - copy(sumDiff, largeCoeff[:lenDiff]) - for i := lenDiff; i < len(largeCoeff); i++ { - sumDiff[i] = int(gp.gf.AddOrSub(int(smallCoeff[i-lenDiff]), int(largeCoeff[i]))) - } - return NewGFPoly(gp.gf, sumDiff) -} - -func (gp *GFPoly) MultByMonominal(degree int, coeff int) *GFPoly { - if coeff == 0 { - return gp.gf.Zero() - } - size := len(gp.Coefficients) - result := make([]int, size+degree) - for i := 0; i < size; i++ { - result[i] = int(gp.gf.Multiply(int(gp.Coefficients[i]), int(coeff))) - } - return NewGFPoly(gp.gf, result) -} - -func (gp *GFPoly) Multiply(other *GFPoly) *GFPoly { - if gp.Zero() || other.Zero() { - return gp.gf.Zero() - } - aCoeff := gp.Coefficients - aLen := len(aCoeff) - bCoeff := other.Coefficients - bLen := len(bCoeff) - product := make([]int, aLen+bLen-1) - for i := 0; i < aLen; i++ { - ac := int(aCoeff[i]) - for j := 0; j < bLen; j++ { - bc := int(bCoeff[j]) - product[i+j] = int(gp.gf.AddOrSub(int(product[i+j]), gp.gf.Multiply(ac, bc))) - } - } - return NewGFPoly(gp.gf, product) -} - -func (gp *GFPoly) Divide(other *GFPoly) (quotient *GFPoly, remainder *GFPoly) { - quotient = gp.gf.Zero() - remainder = gp - fld := gp.gf - denomLeadTerm := other.GetCoefficient(other.Degree()) - inversDenomLeadTerm := fld.Invers(int(denomLeadTerm)) - for remainder.Degree() >= other.Degree() && !remainder.Zero() { - degreeDiff := remainder.Degree() - other.Degree() - scale := int(fld.Multiply(int(remainder.GetCoefficient(remainder.Degree())), inversDenomLeadTerm)) - term := other.MultByMonominal(degreeDiff, scale) - itQuot := NewMonominalPoly(fld, degreeDiff, scale) - quotient = quotient.AddOrSubstract(itQuot) - remainder = remainder.AddOrSubstract(term) - } - return -} - -func NewMonominalPoly(field *GaloisField, degree int, coeff int) *GFPoly { - if coeff == 0 { - return field.Zero() - } - result := make([]int, degree+1) - result[0] = coeff - return NewGFPoly(field, result) -} - -func NewGFPoly(field *GaloisField, coefficients []int) *GFPoly { - for len(coefficients) > 1 && coefficients[0] == 0 { - coefficients = coefficients[1:] - } - return &GFPoly{field, coefficients} -} diff --git a/vendor/github.com/boombuler/barcode/utils/reedsolomon.go b/vendor/github.com/boombuler/barcode/utils/reedsolomon.go deleted file mode 100644 index 53af91a..0000000 --- a/vendor/github.com/boombuler/barcode/utils/reedsolomon.go +++ /dev/null @@ -1,44 +0,0 @@ -package utils - -import ( - "sync" -) - -type ReedSolomonEncoder struct { - gf *GaloisField - polynomes []*GFPoly - m *sync.Mutex -} - -func NewReedSolomonEncoder(gf *GaloisField) *ReedSolomonEncoder { - return &ReedSolomonEncoder{ - gf, []*GFPoly{NewGFPoly(gf, []int{1})}, new(sync.Mutex), - } -} - -func (rs *ReedSolomonEncoder) getPolynomial(degree int) *GFPoly { - rs.m.Lock() - defer rs.m.Unlock() - - if degree >= len(rs.polynomes) { - last := rs.polynomes[len(rs.polynomes)-1] - for d := len(rs.polynomes); d <= degree; d++ { - next := last.Multiply(NewGFPoly(rs.gf, []int{1, rs.gf.ALogTbl[d-1+rs.gf.Base]})) - rs.polynomes = append(rs.polynomes, next) - last = next - } - } - return rs.polynomes[degree] -} - -func (rs *ReedSolomonEncoder) Encode(data []int, eccCount int) []int { - generator := rs.getPolynomial(eccCount) - info := NewGFPoly(rs.gf, data) - info = info.MultByMonominal(eccCount, 1) - _, remainder := info.Divide(generator) - - result := make([]int, eccCount) - numZero := int(eccCount) - len(remainder.Coefficients) - copy(result[numZero:], remainder.Coefficients) - return result -} diff --git a/vendor/github.com/boombuler/barcode/utils/runeint.go b/vendor/github.com/boombuler/barcode/utils/runeint.go deleted file mode 100644 index d2e5e61..0000000 --- a/vendor/github.com/boombuler/barcode/utils/runeint.go +++ /dev/null @@ -1,19 +0,0 @@ -package utils - -// RuneToInt converts a rune between '0' and '9' to an integer between 0 and 9 -// If the rune is outside of this range -1 is returned. -func RuneToInt(r rune) int { - if r >= '0' && r <= '9' { - return int(r - '0') - } - return -1 -} - -// IntToRune converts a digit 0 - 9 to the rune '0' - '9'. If the given int is outside -// of this range 'F' is returned! -func IntToRune(i int) rune { - if i >= 0 && i <= 9 { - return rune(i + '0') - } - return 'F' -} diff --git a/vendor/github.com/couchbase/vellum/.travis.yml b/vendor/github.com/couchbase/vellum/.travis.yml deleted file mode 100644 index 229edf2..0000000 --- a/vendor/github.com/couchbase/vellum/.travis.yml +++ /dev/null @@ -1,22 +0,0 @@ -sudo: false - -language: go - -go: - - "1.9.x" - - "1.10.x" - - "1.11.x" - -script: - - go get github.com/mattn/goveralls - - go get -u github.com/kisielk/errcheck - - go test -v $(go list ./... | grep -v vendor/) - - go test -race - - go vet - - errcheck - - go test -coverprofile=profile.out -covermode=count - - 'if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then goveralls -service=travis-ci -coverprofile=profile.out -repotoken $COVERALLS; fi' - -notifications: - email: - - marty.schoch@gmail.com diff --git a/vendor/github.com/couchbase/vellum/CONTRIBUTING.md b/vendor/github.com/couchbase/vellum/CONTRIBUTING.md deleted file mode 100644 index b85ec82..0000000 --- a/vendor/github.com/couchbase/vellum/CONTRIBUTING.md +++ /dev/null @@ -1,16 +0,0 @@ -# Contributing to Vellum - -We look forward to your contributions, but ask that you first review these guidelines. - -### Sign the CLA - -As Vellum is a Couchbase project we require contributors accept the [Couchbase Contributor License Agreement](http://review.couchbase.org/static/individual_agreement.html). To sign this agreement log into the Couchbase [code review tool](http://review.couchbase.org/). The Vellum project does not use this code review tool but it is still used to track acceptance of the contributor license agreements. - -### Submitting a Pull Request - -All types of contributions are welcome, but please keep the following in mind: - -- If you're planning a large change, you should really discuss it in a github issue first. This helps avoid duplicate effort and spending time on something that may not be merged. -- Existing tests should continue to pass, new tests for the contribution are nice to have. -- All code should have gone through `go fmt` -- All code should pass `go vet` diff --git a/vendor/github.com/couchbase/vellum/LICENSE b/vendor/github.com/couchbase/vellum/LICENSE deleted file mode 100644 index 7a4a3ea..0000000 --- a/vendor/github.com/couchbase/vellum/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/vendor/github.com/couchbase/vellum/README.md b/vendor/github.com/couchbase/vellum/README.md deleted file mode 100644 index e5c4a8b..0000000 --- a/vendor/github.com/couchbase/vellum/README.md +++ /dev/null @@ -1,183 +0,0 @@ -#  vellum - -[](https://github.com/couchbase/vellum/actions?query=workflow%3ATests+event%3Apush+branch%3Amaster) -[](https://coveralls.io/github/couchbase/vellum?branch=master) -[](https://godoc.org/github.com/couchbase/vellum) -[](https://goreportcard.com/report/github.com/couchbase/vellum) -[](https://opensource.org/licenses/Apache-2.0) - -A Go library implementing an FST (finite state transducer) capable of: - - mapping between keys ([]byte) and a value (uint64) - - enumerating keys in lexicographic order - -Some additional goals of this implementation: - - bounded memory use while building the FST - - streaming out FST data while building - - mmap FST runtime to support very large FTSs (optional) - -## Usage - -### Building an FST - -To build an FST, create a new builder using the `New()` method. This method takes an `io.Writer` as an argument. As the FST is being built, data will be streamed to the writer as soon as possible. With this builder you **MUST** insert keys in lexicographic order. Inserting keys out of order will result in an error. After inserting the last key into the builder, you **MUST** call `Close()` on the builder. This will flush all remaining data to the underlying writer. - -In memory: -```go - var buf bytes.Buffer - builder, err := vellum.New(&buf, nil) - if err != nil { - log.Fatal(err) - } -``` - -To disk: -```go - f, err := os.Create("/tmp/vellum.fst") - if err != nil { - log.Fatal(err) - } - builder, err := vellum.New(f, nil) - if err != nil { - log.Fatal(err) - } -``` - -**MUST** insert keys in lexicographic order: -```go -err = builder.Insert([]byte("cat"), 1) -if err != nil { - log.Fatal(err) -} - -err = builder.Insert([]byte("dog"), 2) -if err != nil { - log.Fatal(err) -} - -err = builder.Insert([]byte("fish"), 3) -if err != nil { - log.Fatal(err) -} - -err = builder.Close() -if err != nil { - log.Fatal(err) -} -``` - -### Using an FST - -After closing the builder, the data can be used to instantiate an FST. If the data was written to disk, you can use the `Open()` method to mmap the file. If the data is already in memory, or you wish to load/mmap the data yourself, you can instantiate the FST with the `Load()` method. - -Load in memory: -```go - fst, err := vellum.Load(buf.Bytes()) - if err != nil { - log.Fatal(err) - } -``` - -Open from disk: -```go - fst, err := vellum.Open("/tmp/vellum.fst") - if err != nil { - log.Fatal(err) - } -``` - -Get key/value: -```go - val, exists, err = fst.Get([]byte("dog")) - if err != nil { - log.Fatal(err) - } - if exists { - fmt.Printf("contains dog with val: %d\n", val) - } else { - fmt.Printf("does not contain dog") - } -``` - -Iterate key/values: -```go - itr, err := fst.Iterator(startKeyInclusive, endKeyExclusive) - for err == nil { - key, val := itr.Current() - fmt.Printf("contains key: %s val: %d", key, val) - err = itr.Next() - } - if err != nil { - log.Fatal(err) - } -``` - -### How does the FST get built? - -A full example of the implementation is beyond the scope of this README, but let's consider a small example where we want to insert 3 key/value pairs. - -First we insert "are" with the value 4. - - - -Next, we insert "ate" with the value 2. - - - -Notice how the values associated with the transitions were adjusted so that by summing them while traversing we still get the expected value. - -At this point, we see that state 5 looks like state 3, and state 4 looks like state 2. But, we cannot yet combine them because future inserts could change this. - -Now, we insert "see" with value 3. Once it has been added, we now know that states 5 and 4 can longer change. Since they are identical to 3 and 2, we replace them. - - - -Again, we see that states 7 and 8 appear to be identical to 2 and 3. - -Having inserted our last key, we call `Close()` on the builder. - - - -Now, states 7 and 8 can safely be replaced with 2 and 3. - -For additional information, see the references at the bottom of this document. - -### What does the serialized format look like? - -We've broken out a separate document on the [vellum disk format v1](docs/format.md). - -### What if I want to use this on a system that doesn't have mmap? - -The mmap library itself is guarded with system/architecture build tags, but we've also added an additional build tag in vellum. If you'd like to Open() a file based representation of an FST, but not use mmap, you can build the library with the `nommap` build tag. NOTE: if you do this, the entire FST will be read into memory. - -### Can I use this with Unicode strings? - -Yes, however this implementation is only aware of the byte representation you choose. In order to find matches, you must work with some canonical byte representation of the string. In the future, some encoding-aware traversals may be possible on top of the lower-level byte transitions. - -### How did this library come to be? - -In my work on the [Bleve](https://github.com/blevesearch/bleve) project I became aware of the power of the FST for many search-related tasks. The obvious starting point for such a thing in Go was the [mafsa](https://github.com/smartystreets/mafsa) project. While working with mafsa I encountered some issues. First, it did not stream data to disk while building. Second, it chose to use a rune as the fundamental unit of transition in the FST, but I felt using a byte would be more powerful in the end. My hope is that higher-level encoding-aware traversals will be possible when necessary. Finally, as I reported bugs and submitted PRs I learned that the mafsa project was mainly a research project and no longer being maintained. I wanted to build something that could be used in production. As the project advanced more and more techniques from the [BurntSushi/fst](https://github.com/BurntSushi/fst) were adapted to our implementation. - -### Are there tools to work with vellum files? - -Under the cmd/vellum subdirectory, there's a command-line tool which -features subcommands that can allow you to create, inspect and query -vellum files. - -### How can I generate a state transition diagram from a vellum file? - -The vellum command-line tool has a "dot" subcommand that can emit -graphviz dot output data from an input vellum file. The dot file can -in turn be converted into an image using graphviz tools. Example... - - $ vellum dot myFile.vellum > output.dot - $ dot -Tpng output.dot -o output.png - -## Related Work - -Much credit goes to two existing projects: - - [mafsa](https://github.com/smartystreets/mafsa) - - [BurntSushi/fst](https://github.com/BurntSushi/fst) - -Most of the original implementation here started with my digging into the internals of mafsa. As the implementation progressed, I continued to borrow ideas/approaches from the BurntSushi/fst library as well. - -For a great introduction to this topic, please read the blog post [Index 1,600,000,000 Keys with Automata and Rust](http://blog.burntsushi.net/transducers/) diff --git a/vendor/github.com/couchbase/vellum/automaton.go b/vendor/github.com/couchbase/vellum/automaton.go deleted file mode 100644 index 70398f2..0000000 --- a/vendor/github.com/couchbase/vellum/automaton.go +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package vellum - -// Automaton represents the general contract of a byte-based finite automaton -type Automaton interface { - - // Start returns the start state - Start() int - - // IsMatch returns true if and only if the state is a match - IsMatch(int) bool - - // CanMatch returns true if and only if it is possible to reach a match - // in zero or more steps - CanMatch(int) bool - - // WillAlwaysMatch returns true if and only if the current state matches - // and will always match no matter what steps are taken - WillAlwaysMatch(int) bool - - // Accept returns the next state given the input to the specified state - Accept(int, byte) int -} - -// AutomatonContains implements an generic Contains() method which works -// on any implementation of Automaton -func AutomatonContains(a Automaton, k []byte) bool { - i := 0 - curr := a.Start() - for a.CanMatch(curr) && i < len(k) { - curr = a.Accept(curr, k[i]) - if curr == noneAddr { - break - } - i++ - } - if i != len(k) { - return false - } - return a.IsMatch(curr) -} - -// AlwaysMatch is an Automaton implementation which always matches -type AlwaysMatch struct{} - -// Start returns the AlwaysMatch start state -func (m *AlwaysMatch) Start() int { - return 0 -} - -// IsMatch always returns true -func (m *AlwaysMatch) IsMatch(int) bool { - return true -} - -// CanMatch always returns true -func (m *AlwaysMatch) CanMatch(int) bool { - return true -} - -// WillAlwaysMatch always returns true -func (m *AlwaysMatch) WillAlwaysMatch(int) bool { - return true -} - -// Accept returns the next AlwaysMatch state -func (m *AlwaysMatch) Accept(int, byte) int { - return 0 -} - -// creating an alwaysMatchAutomaton to avoid unnecessary repeated allocations. -var alwaysMatchAutomaton = &AlwaysMatch{} diff --git a/vendor/github.com/couchbase/vellum/builder.go b/vendor/github.com/couchbase/vellum/builder.go deleted file mode 100644 index f793329..0000000 --- a/vendor/github.com/couchbase/vellum/builder.go +++ /dev/null @@ -1,452 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package vellum - -import ( - "bytes" - "io" -) - -var defaultBuilderOpts = &BuilderOpts{ - Encoder: 1, - RegistryTableSize: 10000, - RegistryMRUSize: 2, -} - -// A Builder is used to build a new FST. When possible data is -// streamed out to the underlying Writer as soon as possible. -type Builder struct { - unfinished *unfinishedNodes - registry *registry - last []byte - len int - - lastAddr int - - encoder encoder - opts *BuilderOpts - - builderNodePool *builderNodePool -} - -const noneAddr = 1 -const emptyAddr = 0 - -// NewBuilder returns a new Builder which will stream out the -// underlying representation to the provided Writer as the set is built. -func newBuilder(w io.Writer, opts *BuilderOpts) (*Builder, error) { - if opts == nil { - opts = defaultBuilderOpts - } - builderNodePool := &builderNodePool{} - rv := &Builder{ - unfinished: newUnfinishedNodes(builderNodePool), - registry: newRegistry(builderNodePool, opts.RegistryTableSize, opts.RegistryMRUSize), - builderNodePool: builderNodePool, - opts: opts, - lastAddr: noneAddr, - } - - var err error - rv.encoder, err = loadEncoder(opts.Encoder, w) - if err != nil { - return nil, err - } - err = rv.encoder.start() - if err != nil { - return nil, err - } - return rv, nil -} - -func (b *Builder) Reset(w io.Writer) error { - b.unfinished.Reset() - b.registry.Reset() - b.lastAddr = noneAddr - b.encoder.reset(w) - b.last = nil - b.len = 0 - - err := b.encoder.start() - if err != nil { - return err - } - return nil -} - -// Insert the provided value to the set being built. -// NOTE: values must be inserted in lexicographical order. -func (b *Builder) Insert(key []byte, val uint64) error { - // ensure items are added in lexicographic order - if bytes.Compare(key, b.last) < 0 { - return ErrOutOfOrder - } - if len(key) == 0 { - b.len = 1 - b.unfinished.setRootOutput(val) - return nil - } - - prefixLen, out := b.unfinished.findCommonPrefixAndSetOutput(key, val) - b.len++ - err := b.compileFrom(prefixLen) - if err != nil { - return err - } - b.copyLastKey(key) - b.unfinished.addSuffix(key[prefixLen:], out) - - return nil -} - -func (b *Builder) copyLastKey(key []byte) { - if b.last == nil { - b.last = make([]byte, 0, 64) - } else { - b.last = b.last[:0] - } - b.last = append(b.last, key...) -} - -// Close MUST be called after inserting all values. -func (b *Builder) Close() error { - err := b.compileFrom(0) - if err != nil { - return err - } - root := b.unfinished.popRoot() - rootAddr, err := b.compile(root) - if err != nil { - return err - } - return b.encoder.finish(b.len, rootAddr) -} - -func (b *Builder) compileFrom(iState int) error { - addr := noneAddr - for iState+1 < len(b.unfinished.stack) { - var node *builderNode - if addr == noneAddr { - node = b.unfinished.popEmpty() - } else { - node = b.unfinished.popFreeze(addr) - } - var err error - addr, err = b.compile(node) - if err != nil { - return nil - } - } - b.unfinished.topLastFreeze(addr) - return nil -} - -func (b *Builder) compile(node *builderNode) (int, error) { - if node.final && len(node.trans) == 0 && - node.finalOutput == 0 { - return 0, nil - } - found, addr, entry := b.registry.entry(node) - if found { - return addr, nil - } - addr, err := b.encoder.encodeState(node, b.lastAddr) - if err != nil { - return 0, err - } - - b.lastAddr = addr - entry.addr = addr - return addr, nil -} - -type unfinishedNodes struct { - stack []*builderNodeUnfinished - - // cache allocates a reasonable number of builderNodeUnfinished - // objects up front and tries to keep reusing them - // because the main data structure is a stack, we assume the - // same access pattern, and don't track items separately - // this means calls get() and pushXYZ() must be paired, - // as well as calls put() and popXYZ() - cache []builderNodeUnfinished - - builderNodePool *builderNodePool -} - -func (u *unfinishedNodes) Reset() { - u.stack = u.stack[:0] - for i := 0; i < len(u.cache); i++ { - u.cache[i] = builderNodeUnfinished{} - } - u.pushEmpty(false) -} - -func newUnfinishedNodes(p *builderNodePool) *unfinishedNodes { - rv := &unfinishedNodes{ - stack: make([]*builderNodeUnfinished, 0, 64), - cache: make([]builderNodeUnfinished, 64), - builderNodePool: p, - } - rv.pushEmpty(false) - return rv -} - -// get new builderNodeUnfinished, reusing cache if possible -func (u *unfinishedNodes) get() *builderNodeUnfinished { - if len(u.stack) < len(u.cache) { - return &u.cache[len(u.stack)] - } - // full now allocate a new one - return &builderNodeUnfinished{} -} - -// return builderNodeUnfinished, clearing it for reuse -func (u *unfinishedNodes) put() { - if len(u.stack) >= len(u.cache) { - return - // do nothing, not part of cache - } - u.cache[len(u.stack)] = builderNodeUnfinished{} -} - -func (u *unfinishedNodes) findCommonPrefixAndSetOutput(key []byte, - out uint64) (int, uint64) { - var i int - for i < len(key) { - if i >= len(u.stack) { - break - } - var addPrefix uint64 - if !u.stack[i].hasLastT { - break - } - if u.stack[i].lastIn == key[i] { - commonPre := outputPrefix(u.stack[i].lastOut, out) - addPrefix = outputSub(u.stack[i].lastOut, commonPre) - out = outputSub(out, commonPre) - u.stack[i].lastOut = commonPre - i++ - } else { - break - } - - if addPrefix != 0 { - u.stack[i].addOutputPrefix(addPrefix) - } - } - - return i, out -} - -func (u *unfinishedNodes) pushEmpty(final bool) { - next := u.get() - next.node = u.builderNodePool.Get() - next.node.final = final - u.stack = append(u.stack, next) -} - -func (u *unfinishedNodes) popRoot() *builderNode { - l := len(u.stack) - var unfinished *builderNodeUnfinished - u.stack, unfinished = u.stack[:l-1], u.stack[l-1] - rv := unfinished.node - u.put() - return rv -} - -func (u *unfinishedNodes) popFreeze(addr int) *builderNode { - l := len(u.stack) - var unfinished *builderNodeUnfinished - u.stack, unfinished = u.stack[:l-1], u.stack[l-1] - unfinished.lastCompiled(addr) - rv := unfinished.node - u.put() - return rv -} - -func (u *unfinishedNodes) popEmpty() *builderNode { - l := len(u.stack) - var unfinished *builderNodeUnfinished - u.stack, unfinished = u.stack[:l-1], u.stack[l-1] - rv := unfinished.node - u.put() - return rv -} - -func (u *unfinishedNodes) setRootOutput(out uint64) { - u.stack[0].node.final = true - u.stack[0].node.finalOutput = out -} - -func (u *unfinishedNodes) topLastFreeze(addr int) { - last := len(u.stack) - 1 - u.stack[last].lastCompiled(addr) -} - -func (u *unfinishedNodes) addSuffix(bs []byte, out uint64) { - if len(bs) == 0 { - return - } - last := len(u.stack) - 1 - u.stack[last].hasLastT = true - u.stack[last].lastIn = bs[0] - u.stack[last].lastOut = out - for _, b := range bs[1:] { - next := u.get() - next.node = u.builderNodePool.Get() - next.hasLastT = true - next.lastIn = b - next.lastOut = 0 - u.stack = append(u.stack, next) - } - u.pushEmpty(true) -} - -type builderNodeUnfinished struct { - node *builderNode - lastOut uint64 - lastIn byte - hasLastT bool -} - -func (b *builderNodeUnfinished) lastCompiled(addr int) { - if b.hasLastT { - transIn := b.lastIn - transOut := b.lastOut - b.hasLastT = false - b.lastOut = 0 - b.node.trans = append(b.node.trans, transition{ - in: transIn, - out: transOut, - addr: addr, - }) - } -} - -func (b *builderNodeUnfinished) addOutputPrefix(prefix uint64) { - if b.node.final { - b.node.finalOutput = outputCat(prefix, b.node.finalOutput) - } - for i := range b.node.trans { - b.node.trans[i].out = outputCat(prefix, b.node.trans[i].out) - } - if b.hasLastT { - b.lastOut = outputCat(prefix, b.lastOut) - } -} - -type builderNode struct { - finalOutput uint64 - trans []transition - final bool - - // intrusive linked list - next *builderNode -} - -// reset resets the receiver builderNode to a re-usable state. -func (n *builderNode) reset() { - n.final = false - n.finalOutput = 0 - for i := range n.trans { - n.trans[i] = emptyTransition - } - n.trans = n.trans[:0] - n.next = nil -} - -func (n *builderNode) equiv(o *builderNode) bool { - if n.final != o.final { - return false - } - if n.finalOutput != o.finalOutput { - return false - } - if len(n.trans) != len(o.trans) { - return false - } - for i, ntrans := range n.trans { - otrans := o.trans[i] - if ntrans.in != otrans.in { - return false - } - if ntrans.addr != otrans.addr { - return false - } - if ntrans.out != otrans.out { - return false - } - } - return true -} - -var emptyTransition = transition{} - -type transition struct { - out uint64 - addr int - in byte -} - -func outputPrefix(l, r uint64) uint64 { - if l < r { - return l - } - return r -} - -func outputSub(l, r uint64) uint64 { - return l - r -} - -func outputCat(l, r uint64) uint64 { - return l + r -} - -// builderNodePool pools builderNodes using a singly linked list. -// -// NB: builderNode lifecylce is described by the following interactions - -// +------------------------+ +----------------------+ -// | Unfinished Nodes | Transfer once | Registry | -// |(not frozen builderNode)|-----builderNode is ------->| (frozen builderNode) | -// +------------------------+ marked frozen +----------------------+ -// ^ | -// | | -// | Put() -// | Get() on +-------------------+ when -// +-new char--------| builderNode Pool |<-----------evicted -// +-------------------+ -type builderNodePool struct { - head *builderNode -} - -func (p *builderNodePool) Get() *builderNode { - if p.head == nil { - return &builderNode{} - } - head := p.head - p.head = p.head.next - return head -} - -func (p *builderNodePool) Put(v *builderNode) { - if v == nil { - return - } - v.reset() - v.next = p.head - p.head = v -} diff --git a/vendor/github.com/couchbase/vellum/common.go b/vendor/github.com/couchbase/vellum/common.go deleted file mode 100644 index cd3e6a0..0000000 --- a/vendor/github.com/couchbase/vellum/common.go +++ /dev/null @@ -1,547 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package vellum - -const maxCommon = 1<<6 - 1 - -func encodeCommon(in byte) byte { - val := byte((int(commonInputs[in]) + 1) % 256) - if val > maxCommon { - return 0 - } - return val -} - -func decodeCommon(in byte) byte { - return commonInputsInv[in-1] -} - -var commonInputs = []byte{ - 84, // '\x00' - 85, // '\x01' - 86, // '\x02' - 87, // '\x03' - 88, // '\x04' - 89, // '\x05' - 90, // '\x06' - 91, // '\x07' - 92, // '\x08' - 93, // '\t' - 94, // '\n' - 95, // '\x0b' - 96, // '\x0c' - 97, // '\r' - 98, // '\x0e' - 99, // '\x0f' - 100, // '\x10' - 101, // '\x11' - 102, // '\x12' - 103, // '\x13' - 104, // '\x14' - 105, // '\x15' - 106, // '\x16' - 107, // '\x17' - 108, // '\x18' - 109, // '\x19' - 110, // '\x1a' - 111, // '\x1b' - 112, // '\x1c' - 113, // '\x1d' - 114, // '\x1e' - 115, // '\x1f' - 116, // ' ' - 80, // '!' - 117, // '"' - 118, // '#' - 79, // '$' - 39, // '%' - 30, // '&' - 81, // "'" - 75, // '(' - 74, // ')' - 82, // '*' - 57, // '+' - 66, // ',' - 16, // '-' - 12, // '.' - 2, // '/' - 19, // '0' - 20, // '1' - 21, // '2' - 27, // '3' - 32, // '4' - 29, // '5' - 35, // '6' - 36, // '7' - 37, // '8' - 34, // '9' - 24, // ':' - 73, // ';' - 119, // '<' - 23, // '=' - 120, // '>' - 40, // '?' - 83, // '@' - 44, // 'A' - 48, // 'B' - 42, // 'C' - 43, // 'D' - 49, // 'E' - 46, // 'F' - 62, // 'G' - 61, // 'H' - 47, // 'I' - 69, // 'J' - 68, // 'K' - 58, // 'L' - 56, // 'M' - 55, // 'N' - 59, // 'O' - 51, // 'P' - 72, // 'Q' - 54, // 'R' - 45, // 'S' - 52, // 'T' - 64, // 'U' - 65, // 'V' - 63, // 'W' - 71, // 'X' - 67, // 'Y' - 70, // 'Z' - 77, // '[' - 121, // '\\' - 78, // ']' - 122, // '^' - 31, // '_' - 123, // '`' - 4, // 'a' - 25, // 'b' - 9, // 'c' - 17, // 'd' - 1, // 'e' - 26, // 'f' - 22, // 'g' - 13, // 'h' - 7, // 'i' - 50, // 'j' - 38, // 'k' - 14, // 'l' - 15, // 'm' - 10, // 'n' - 3, // 'o' - 8, // 'p' - 60, // 'q' - 6, // 'r' - 5, // 's' - 0, // 't' - 18, // 'u' - 33, // 'v' - 11, // 'w' - 41, // 'x' - 28, // 'y' - 53, // 'z' - 124, // '{' - 125, // '|' - 126, // '}' - 76, // '~' - 127, // '\x7f' - 128, // '\x80' - 129, // '\x81' - 130, // '\x82' - 131, // '\x83' - 132, // '\x84' - 133, // '\x85' - 134, // '\x86' - 135, // '\x87' - 136, // '\x88' - 137, // '\x89' - 138, // '\x8a' - 139, // '\x8b' - 140, // '\x8c' - 141, // '\x8d' - 142, // '\x8e' - 143, // '\x8f' - 144, // '\x90' - 145, // '\x91' - 146, // '\x92' - 147, // '\x93' - 148, // '\x94' - 149, // '\x95' - 150, // '\x96' - 151, // '\x97' - 152, // '\x98' - 153, // '\x99' - 154, // '\x9a' - 155, // '\x9b' - 156, // '\x9c' - 157, // '\x9d' - 158, // '\x9e' - 159, // '\x9f' - 160, // '\xa0' - 161, // '¡' - 162, // '¢' - 163, // '£' - 164, // '¤' - 165, // '¥' - 166, // '¦' - 167, // '§' - 168, // '¨' - 169, // '©' - 170, // 'ª' - 171, // '«' - 172, // '¬' - 173, // '\xad' - 174, // '®' - 175, // '¯' - 176, // '°' - 177, // '±' - 178, // '²' - 179, // '³' - 180, // '´' - 181, // 'µ' - 182, // '¶' - 183, // '·' - 184, // '¸' - 185, // '¹' - 186, // 'º' - 187, // '»' - 188, // '¼' - 189, // '½' - 190, // '¾' - 191, // '¿' - 192, // 'À' - 193, // 'Á' - 194, // 'Â' - 195, // 'Ã' - 196, // 'Ä' - 197, // 'Å' - 198, // 'Æ' - 199, // 'Ç' - 200, // 'È' - 201, // 'É' - 202, // 'Ê' - 203, // 'Ë' - 204, // 'Ì' - 205, // 'Í' - 206, // 'Î' - 207, // 'Ï' - 208, // 'Ð' - 209, // 'Ñ' - 210, // 'Ò' - 211, // 'Ó' - 212, // 'Ô' - 213, // 'Õ' - 214, // 'Ö' - 215, // '×' - 216, // 'Ø' - 217, // 'Ù' - 218, // 'Ú' - 219, // 'Û' - 220, // 'Ü' - 221, // 'Ý' - 222, // 'Þ' - 223, // 'ß' - 224, // 'à' - 225, // 'á' - 226, // 'â' - 227, // 'ã' - 228, // 'ä' - 229, // 'å' - 230, // 'æ' - 231, // 'ç' - 232, // 'è' - 233, // 'é' - 234, // 'ê' - 235, // 'ë' - 236, // 'ì' - 237, // 'í' - 238, // 'î' - 239, // 'ï' - 240, // 'ð' - 241, // 'ñ' - 242, // 'ò' - 243, // 'ó' - 244, // 'ô' - 245, // 'õ' - 246, // 'ö' - 247, // '÷' - 248, // 'ø' - 249, // 'ù' - 250, // 'ú' - 251, // 'û' - 252, // 'ü' - 253, // 'ý' - 254, // 'þ' - 255, // 'ÿ' -} - -var commonInputsInv = []byte{ - 't', - 'e', - '/', - 'o', - 'a', - 's', - 'r', - 'i', - 'p', - 'c', - 'n', - 'w', - '.', - 'h', - 'l', - 'm', - '-', - 'd', - 'u', - '0', - '1', - '2', - 'g', - '=', - ':', - 'b', - 'f', - '3', - 'y', - '5', - '&', - '_', - '4', - 'v', - '9', - '6', - '7', - '8', - 'k', - '%', - '?', - 'x', - 'C', - 'D', - 'A', - 'S', - 'F', - 'I', - 'B', - 'E', - 'j', - 'P', - 'T', - 'z', - 'R', - 'N', - 'M', - '+', - 'L', - 'O', - 'q', - 'H', - 'G', - 'W', - 'U', - 'V', - ',', - 'Y', - 'K', - 'J', - 'Z', - 'X', - 'Q', - ';', - ')', - '(', - '~', - '[', - ']', - '$', - '!', - '\'', - '*', - '@', - '\x00', - '\x01', - '\x02', - '\x03', - '\x04', - '\x05', - '\x06', - '\x07', - '\x08', - '\t', - '\n', - '\x0b', - '\x0c', - '\r', - '\x0e', - '\x0f', - '\x10', - '\x11', - '\x12', - '\x13', - '\x14', - '\x15', - '\x16', - '\x17', - '\x18', - '\x19', - '\x1a', - '\x1b', - '\x1c', - '\x1d', - '\x1e', - '\x1f', - ' ', - '"', - '#', - '<', - '>', - '\\', - '^', - '`', - '{', - '|', - '}', - '\x7f', - '\x80', - '\x81', - '\x82', - '\x83', - '\x84', - '\x85', - '\x86', - '\x87', - '\x88', - '\x89', - '\x8a', - '\x8b', - '\x8c', - '\x8d', - '\x8e', - '\x8f', - '\x90', - '\x91', - '\x92', - '\x93', - '\x94', - '\x95', - '\x96', - '\x97', - '\x98', - '\x99', - '\x9a', - '\x9b', - '\x9c', - '\x9d', - '\x9e', - '\x9f', - '\xa0', - '\xa1', - '\xa2', - '\xa3', - '\xa4', - '\xa5', - '\xa6', - '\xa7', - '\xa8', - '\xa9', - '\xaa', - '\xab', - '\xac', - '\xad', - '\xae', - '\xaf', - '\xb0', - '\xb1', - '\xb2', - '\xb3', - '\xb4', - '\xb5', - '\xb6', - '\xb7', - '\xb8', - '\xb9', - '\xba', - '\xbb', - '\xbc', - '\xbd', - '\xbe', - '\xbf', - '\xc0', - '\xc1', - '\xc2', - '\xc3', - '\xc4', - '\xc5', - '\xc6', - '\xc7', - '\xc8', - '\xc9', - '\xca', - '\xcb', - '\xcc', - '\xcd', - '\xce', - '\xcf', - '\xd0', - '\xd1', - '\xd2', - '\xd3', - '\xd4', - '\xd5', - '\xd6', - '\xd7', - '\xd8', - '\xd9', - '\xda', - '\xdb', - '\xdc', - '\xdd', - '\xde', - '\xdf', - '\xe0', - '\xe1', - '\xe2', - '\xe3', - '\xe4', - '\xe5', - '\xe6', - '\xe7', - '\xe8', - '\xe9', - '\xea', - '\xeb', - '\xec', - '\xed', - '\xee', - '\xef', - '\xf0', - '\xf1', - '\xf2', - '\xf3', - '\xf4', - '\xf5', - '\xf6', - '\xf7', - '\xf8', - '\xf9', - '\xfa', - '\xfb', - '\xfc', - '\xfd', - '\xfe', - '\xff', -} diff --git a/vendor/github.com/couchbase/vellum/decoder_v1.go b/vendor/github.com/couchbase/vellum/decoder_v1.go deleted file mode 100644 index d56e61d..0000000 --- a/vendor/github.com/couchbase/vellum/decoder_v1.go +++ /dev/null @@ -1,314 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package vellum - -import ( - "bytes" - "encoding/binary" - "fmt" - "strconv" -) - -func init() { - registerDecoder(versionV1, func(data []byte) decoder { - return newDecoderV1(data) - }) -} - -type decoderV1 struct { - data []byte -} - -func newDecoderV1(data []byte) *decoderV1 { - return &decoderV1{ - data: data, - } -} - -func (d *decoderV1) getRoot() int { - if len(d.data) < footerSizeV1 { - return noneAddr - } - footer := d.data[len(d.data)-footerSizeV1:] - root := binary.LittleEndian.Uint64(footer[8:]) - return int(root) -} - -func (d *decoderV1) getLen() int { - if len(d.data) < footerSizeV1 { - return 0 - } - footer := d.data[len(d.data)-footerSizeV1:] - dlen := binary.LittleEndian.Uint64(footer) - return int(dlen) -} - -func (d *decoderV1) stateAt(addr int, prealloc fstState) (fstState, error) { - state, ok := prealloc.(*fstStateV1) - if ok && state != nil { - *state = fstStateV1{} // clear the struct - } else { - state = &fstStateV1{} - } - err := state.at(d.data, addr) - if err != nil { - return nil, err - } - return state, nil -} - -type fstStateV1 struct { - data []byte - top int - bottom int - numTrans int - - // single trans only - singleTransChar byte - singleTransNext bool - singleTransAddr uint64 - singleTransOut uint64 - - // shared - transSize int - outSize int - - // multiple trans only - final bool - transTop int - transBottom int - destTop int - destBottom int - outTop int - outBottom int - outFinal int -} - -func (f *fstStateV1) isEncodedSingle() bool { - if f.data[f.top]>>7 > 0 { - return true - } - return false -} - -func (f *fstStateV1) at(data []byte, addr int) error { - f.data = data - if addr == emptyAddr { - return f.atZero() - } else if addr == noneAddr { - return f.atNone() - } - if addr > len(data) || addr < 16 { - return fmt.Errorf("invalid address %d/%d", addr, len(data)) - } - f.top = addr - f.bottom = addr - if f.isEncodedSingle() { - return f.atSingle(data, addr) - } - return f.atMulti(data, addr) -} - -func (f *fstStateV1) atZero() error { - f.top = 0 - f.bottom = 1 - f.numTrans = 0 - f.final = true - f.outFinal = 0 - return nil -} - -func (f *fstStateV1) atNone() error { - f.top = 0 - f.bottom = 1 - f.numTrans = 0 - f.final = false - f.outFinal = 0 - return nil -} - -func (f *fstStateV1) atSingle(data []byte, addr int) error { - // handle single transition case - f.numTrans = 1 - f.singleTransNext = data[f.top]&transitionNext > 0 - f.singleTransChar = data[f.top] & maxCommon - if f.singleTransChar == 0 { - f.bottom-- // extra byte for uncommon - f.singleTransChar = data[f.bottom] - } else { - f.singleTransChar = decodeCommon(f.singleTransChar) - } - if f.singleTransNext { - // now we know the bottom, can compute next addr - f.singleTransAddr = uint64(f.bottom - 1) - f.singleTransOut = 0 - } else { - f.bottom-- // extra byte with pack sizes - f.transSize, f.outSize = decodePackSize(data[f.bottom]) - f.bottom -= f.transSize // exactly one trans - f.singleTransAddr = readPackedUint(data[f.bottom : f.bottom+f.transSize]) - if f.outSize > 0 { - f.bottom -= f.outSize // exactly one out (could be length 0 though) - f.singleTransOut = readPackedUint(data[f.bottom : f.bottom+f.outSize]) - } else { - f.singleTransOut = 0 - } - // need to wait till we know bottom - if f.singleTransAddr != 0 { - f.singleTransAddr = uint64(f.bottom) - f.singleTransAddr - } - } - return nil -} - -func (f *fstStateV1) atMulti(data []byte, addr int) error { - // handle multiple transitions case - f.final = data[f.top]&stateFinal > 0 - f.numTrans = int(data[f.top] & maxNumTrans) - if f.numTrans == 0 { - f.bottom-- // extra byte for number of trans - f.numTrans = int(data[f.bottom]) - if f.numTrans == 1 { - // can't really be 1 here, this is special case that means 256 - f.numTrans = 256 - } - } - f.bottom-- // extra byte with pack sizes - f.transSize, f.outSize = decodePackSize(data[f.bottom]) - - f.transTop = f.bottom - f.bottom -= f.numTrans // one byte for each transition - f.transBottom = f.bottom - - f.destTop = f.bottom - f.bottom -= f.numTrans * f.transSize - f.destBottom = f.bottom - - if f.outSize > 0 { - f.outTop = f.bottom - f.bottom -= f.numTrans * f.outSize - f.outBottom = f.bottom - if f.final { - f.bottom -= f.outSize - f.outFinal = f.bottom - } - } - return nil -} - -func (f *fstStateV1) Address() int { - return f.top -} - -func (f *fstStateV1) Final() bool { - return f.final -} - -func (f *fstStateV1) FinalOutput() uint64 { - if f.final && f.outSize > 0 { - return readPackedUint(f.data[f.outFinal : f.outFinal+f.outSize]) - } - return 0 -} - -func (f *fstStateV1) NumTransitions() int { - return f.numTrans -} - -func (f *fstStateV1) TransitionAt(i int) byte { - if f.isEncodedSingle() { - return f.singleTransChar - } - transitionKeys := f.data[f.transBottom:f.transTop] - return transitionKeys[f.numTrans-i-1] -} - -func (f *fstStateV1) TransitionFor(b byte) (int, int, uint64) { - if f.isEncodedSingle() { - if f.singleTransChar == b { - return 0, int(f.singleTransAddr), f.singleTransOut - } - return -1, noneAddr, 0 - } - transitionKeys := f.data[f.transBottom:f.transTop] - pos := bytes.IndexByte(transitionKeys, b) - if pos < 0 { - return -1, noneAddr, 0 - } - transDests := f.data[f.destBottom:f.destTop] - dest := int(readPackedUint(transDests[pos*f.transSize : pos*f.transSize+f.transSize])) - if dest > 0 { - // convert delta - dest = f.bottom - dest - } - transVals := f.data[f.outBottom:f.outTop] - var out uint64 - if f.outSize > 0 { - out = readPackedUint(transVals[pos*f.outSize : pos*f.outSize+f.outSize]) - } - return f.numTrans - pos - 1, dest, out -} - -func (f *fstStateV1) String() string { - rv := "" - rv += fmt.Sprintf("State: %d (%#x)", f.top, f.top) - if f.final { - rv += " final" - fout := f.FinalOutput() - if fout != 0 { - rv += fmt.Sprintf(" (%d)", fout) - } - } - rv += "\n" - rv += fmt.Sprintf("Data: % x\n", f.data[f.bottom:f.top+1]) - - for i := 0; i < f.numTrans; i++ { - transChar := f.TransitionAt(i) - _, transDest, transOut := f.TransitionFor(transChar) - rv += fmt.Sprintf(" - %d (%#x) '%s' ---> %d (%#x) with output: %d", transChar, transChar, string(transChar), transDest, transDest, transOut) - rv += "\n" - } - if f.numTrans == 0 { - rv += "\n" - } - return rv -} - -func (f *fstStateV1) DotString(num int) string { - rv := "" - label := fmt.Sprintf("%d", num) - final := "" - if f.final { - final = ",peripheries=2" - } - rv += fmt.Sprintf(" %d [label=\"%s\"%s];\n", f.top, label, final) - - for i := 0; i < f.numTrans; i++ { - transChar := f.TransitionAt(i) - _, transDest, transOut := f.TransitionFor(transChar) - out := "" - if transOut != 0 { - out = fmt.Sprintf("/%d", transOut) - } - rv += fmt.Sprintf(" %d -> %d [label=\"%s%s\"];\n", f.top, transDest, escapeInput(transChar), out) - } - - return rv -} - -func escapeInput(b byte) string { - x := strconv.AppendQuoteRune(nil, rune(b)) - return string(x[1:(len(x) - 1)]) -} diff --git a/vendor/github.com/couchbase/vellum/encoder_v1.go b/vendor/github.com/couchbase/vellum/encoder_v1.go deleted file mode 100644 index 0651fc8..0000000 --- a/vendor/github.com/couchbase/vellum/encoder_v1.go +++ /dev/null @@ -1,227 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package vellum - -import ( - "encoding/binary" - "fmt" - "io" -) - -const versionV1 = 1 -const oneTransition = 1 << 7 -const transitionNext = 1 << 6 -const stateFinal = 1 << 6 -const footerSizeV1 = 16 - -func init() { - registerEncoder(versionV1, func(w io.Writer) encoder { - return newEncoderV1(w) - }) -} - -type encoderV1 struct { - bw *writer -} - -func newEncoderV1(w io.Writer) *encoderV1 { - return &encoderV1{ - bw: newWriter(w), - } -} - -func (e *encoderV1) reset(w io.Writer) { - e.bw.Reset(w) -} - -func (e *encoderV1) start() error { - header := make([]byte, headerSize) - binary.LittleEndian.PutUint64(header, versionV1) - binary.LittleEndian.PutUint64(header[8:], uint64(0)) // type - n, err := e.bw.Write(header) - if err != nil { - return err - } - if n != headerSize { - return fmt.Errorf("short write of header %d/%d", n, headerSize) - } - return nil -} - -func (e *encoderV1) encodeState(s *builderNode, lastAddr int) (int, error) { - if len(s.trans) == 0 && s.final && s.finalOutput == 0 { - return 0, nil - } else if len(s.trans) != 1 || s.final { - return e.encodeStateMany(s) - } else if !s.final && s.trans[0].out == 0 && s.trans[0].addr == lastAddr { - return e.encodeStateOneFinish(s, transitionNext) - } - return e.encodeStateOne(s) -} - -func (e *encoderV1) encodeStateOne(s *builderNode) (int, error) { - start := uint64(e.bw.counter) - outPackSize := 0 - if s.trans[0].out != 0 { - outPackSize = packedSize(s.trans[0].out) - err := e.bw.WritePackedUintIn(s.trans[0].out, outPackSize) - if err != nil { - return 0, err - } - } - delta := deltaAddr(start, uint64(s.trans[0].addr)) - transPackSize := packedSize(delta) - err := e.bw.WritePackedUintIn(delta, transPackSize) - if err != nil { - return 0, err - } - - packSize := encodePackSize(transPackSize, outPackSize) - err = e.bw.WriteByte(packSize) - if err != nil { - return 0, err - } - - return e.encodeStateOneFinish(s, 0) -} - -func (e *encoderV1) encodeStateOneFinish(s *builderNode, next byte) (int, error) { - enc := encodeCommon(s.trans[0].in) - - // not a common input - if enc == 0 { - err := e.bw.WriteByte(s.trans[0].in) - if err != nil { - return 0, err - } - } - err := e.bw.WriteByte(oneTransition | next | enc) - if err != nil { - return 0, err - } - - return e.bw.counter - 1, nil -} - -func (e *encoderV1) encodeStateMany(s *builderNode) (int, error) { - start := uint64(e.bw.counter) - transPackSize := 0 - outPackSize := packedSize(s.finalOutput) - anyOutputs := s.finalOutput != 0 - for i := range s.trans { - delta := deltaAddr(start, uint64(s.trans[i].addr)) - tsize := packedSize(delta) - if tsize > transPackSize { - transPackSize = tsize - } - osize := packedSize(s.trans[i].out) - if osize > outPackSize { - outPackSize = osize - } - anyOutputs = anyOutputs || s.trans[i].out != 0 - } - if !anyOutputs { - outPackSize = 0 - } - - if anyOutputs { - // output final value - if s.final { - err := e.bw.WritePackedUintIn(s.finalOutput, outPackSize) - if err != nil { - return 0, err - } - } - // output transition values (in reverse) - for j := len(s.trans) - 1; j >= 0; j-- { - err := e.bw.WritePackedUintIn(s.trans[j].out, outPackSize) - if err != nil { - return 0, err - } - } - } - - // output transition dests (in reverse) - for j := len(s.trans) - 1; j >= 0; j-- { - delta := deltaAddr(start, uint64(s.trans[j].addr)) - err := e.bw.WritePackedUintIn(delta, transPackSize) - if err != nil { - return 0, err - } - } - - // output transition keys (in reverse) - for j := len(s.trans) - 1; j >= 0; j-- { - err := e.bw.WriteByte(s.trans[j].in) - if err != nil { - return 0, err - } - } - - packSize := encodePackSize(transPackSize, outPackSize) - err := e.bw.WriteByte(packSize) - if err != nil { - return 0, err - } - - numTrans := encodeNumTrans(len(s.trans)) - - // if number of transitions wont fit in edge header byte - // write out separately - if numTrans == 0 { - if len(s.trans) == 256 { - // this wouldn't fit in single byte, but reuse value 1 - // which would have always fit in the edge header instead - err = e.bw.WriteByte(1) - if err != nil { - return 0, err - } - } else { - err = e.bw.WriteByte(byte(len(s.trans))) - if err != nil { - return 0, err - } - } - } - - // finally write edge header - if s.final { - numTrans |= stateFinal - } - err = e.bw.WriteByte(numTrans) - if err != nil { - return 0, err - } - - return e.bw.counter - 1, nil -} - -func (e *encoderV1) finish(count, rootAddr int) error { - footer := make([]byte, footerSizeV1) - binary.LittleEndian.PutUint64(footer, uint64(count)) // root addr - binary.LittleEndian.PutUint64(footer[8:], uint64(rootAddr)) // root addr - n, err := e.bw.Write(footer) - if err != nil { - return err - } - if n != footerSizeV1 { - return fmt.Errorf("short write of footer %d/%d", n, footerSizeV1) - } - err = e.bw.Flush() - if err != nil { - return err - } - return nil -} diff --git a/vendor/github.com/couchbase/vellum/encoding.go b/vendor/github.com/couchbase/vellum/encoding.go deleted file mode 100644 index 988d486..0000000 --- a/vendor/github.com/couchbase/vellum/encoding.go +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package vellum - -import ( - "encoding/binary" - "fmt" - "io" -) - -const headerSize = 16 - -type encoderConstructor func(w io.Writer) encoder -type decoderConstructor func([]byte) decoder - -var encoders = map[int]encoderConstructor{} -var decoders = map[int]decoderConstructor{} - -type encoder interface { - start() error - encodeState(s *builderNode, addr int) (int, error) - finish(count, rootAddr int) error - reset(w io.Writer) -} - -func loadEncoder(ver int, w io.Writer) (encoder, error) { - if cons, ok := encoders[ver]; ok { - return cons(w), nil - } - return nil, fmt.Errorf("no encoder for version %d registered", ver) -} - -func registerEncoder(ver int, cons encoderConstructor) { - encoders[ver] = cons -} - -type decoder interface { - getRoot() int - getLen() int - stateAt(addr int, prealloc fstState) (fstState, error) -} - -func loadDecoder(ver int, data []byte) (decoder, error) { - if cons, ok := decoders[ver]; ok { - return cons(data), nil - } - return nil, fmt.Errorf("no decoder for version %d registered", ver) -} - -func registerDecoder(ver int, cons decoderConstructor) { - decoders[ver] = cons -} - -func decodeHeader(header []byte) (ver int, typ int, err error) { - if len(header) < headerSize { - err = fmt.Errorf("invalid header < 16 bytes") - return - } - ver = int(binary.LittleEndian.Uint64(header[0:8])) - typ = int(binary.LittleEndian.Uint64(header[8:16])) - return -} - -// fstState represents a state inside the FTS runtime -// It is the main contract between the FST impl and the decoder -// The FST impl should work only with this interface, while only the decoder -// impl knows the physical representation. -type fstState interface { - Address() int - Final() bool - FinalOutput() uint64 - NumTransitions() int - TransitionFor(b byte) (int, int, uint64) - TransitionAt(i int) byte -} diff --git a/vendor/github.com/couchbase/vellum/fst.go b/vendor/github.com/couchbase/vellum/fst.go deleted file mode 100644 index 64ee21a..0000000 --- a/vendor/github.com/couchbase/vellum/fst.go +++ /dev/null @@ -1,300 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package vellum - -import ( - "io" - - "github.com/willf/bitset" -) - -// FST is an in-memory representation of a finite state transducer, -// capable of returning the uint64 value associated with -// each []byte key stored, as well as enumerating all of the keys -// in order. -type FST struct { - f io.Closer - ver int - len int - typ int - data []byte - decoder decoder -} - -func new(data []byte, f io.Closer) (rv *FST, err error) { - rv = &FST{ - data: data, - f: f, - } - - rv.ver, rv.typ, err = decodeHeader(data) - if err != nil { - return nil, err - } - - rv.decoder, err = loadDecoder(rv.ver, rv.data) - if err != nil { - return nil, err - } - - rv.len = rv.decoder.getLen() - - return rv, nil -} - -// Contains returns true if this FST contains the specified key. -func (f *FST) Contains(val []byte) (bool, error) { - _, exists, err := f.Get(val) - return exists, err -} - -// Get returns the value associated with the key. NOTE: a value of zero -// does not imply the key does not exist, you must consult the second -// return value as well. -func (f *FST) Get(input []byte) (uint64, bool, error) { - return f.get(input, nil) -} - -func (f *FST) get(input []byte, prealloc fstState) (uint64, bool, error) { - var total uint64 - curr := f.decoder.getRoot() - state, err := f.decoder.stateAt(curr, prealloc) - if err != nil { - return 0, false, err - } - for _, c := range input { - _, curr, output := state.TransitionFor(c) - if curr == noneAddr { - return 0, false, nil - } - - state, err = f.decoder.stateAt(curr, state) - if err != nil { - return 0, false, err - } - - total += output - } - - if state.Final() { - total += state.FinalOutput() - return total, true, nil - } - return 0, false, nil -} - -// Version returns the encoding version used by this FST instance. -func (f *FST) Version() int { - return f.ver -} - -// Len returns the number of entries in this FST instance. -func (f *FST) Len() int { - return f.len -} - -// Type returns the type of this FST instance. -func (f *FST) Type() int { - return f.typ -} - -// Close will unmap any mmap'd data (if managed by vellum) and it will close -// the backing file (if managed by vellum). You MUST call Close() for any -// FST instance that is created. -func (f *FST) Close() error { - if f.f != nil { - err := f.f.Close() - if err != nil { - return err - } - } - f.data = nil - f.decoder = nil - return nil -} - -// Start returns the start state of this Automaton -func (f *FST) Start() int { - return f.decoder.getRoot() -} - -// IsMatch returns if this state is a matching state in this Automaton -func (f *FST) IsMatch(addr int) bool { - match, _ := f.IsMatchWithVal(addr) - return match -} - -// CanMatch returns if this state can ever transition to a matching state -// in this Automaton -func (f *FST) CanMatch(addr int) bool { - if addr == noneAddr { - return false - } - return true -} - -// WillAlwaysMatch returns if from this state the Automaton will always -// be in a matching state -func (f *FST) WillAlwaysMatch(int) bool { - return false -} - -// Accept returns the next state for this Automaton on input of byte b -func (f *FST) Accept(addr int, b byte) int { - next, _ := f.AcceptWithVal(addr, b) - return next -} - -// IsMatchWithVal returns if this state is a matching state in this Automaton -// and also returns the final output value for this state -func (f *FST) IsMatchWithVal(addr int) (bool, uint64) { - s, err := f.decoder.stateAt(addr, nil) - if err != nil { - return false, 0 - } - return s.Final(), s.FinalOutput() -} - -// AcceptWithVal returns the next state for this Automaton on input of byte b -// and also returns the output value for the transition -func (f *FST) AcceptWithVal(addr int, b byte) (int, uint64) { - s, err := f.decoder.stateAt(addr, nil) - if err != nil { - return noneAddr, 0 - } - _, next, output := s.TransitionFor(b) - return next, output -} - -// Iterator returns a new Iterator capable of enumerating the key/value pairs -// between the provided startKeyInclusive and endKeyExclusive. -func (f *FST) Iterator(startKeyInclusive, endKeyExclusive []byte) (*FSTIterator, error) { - return newIterator(f, startKeyInclusive, endKeyExclusive, nil) -} - -// Search returns a new Iterator capable of enumerating the key/value pairs -// between the provided startKeyInclusive and endKeyExclusive that also -// satisfy the provided automaton. -func (f *FST) Search(aut Automaton, startKeyInclusive, endKeyExclusive []byte) (*FSTIterator, error) { - return newIterator(f, startKeyInclusive, endKeyExclusive, aut) -} - -// Debug is only intended for debug purposes, it simply asks the underlying -// decoder visit each state, and pass it to the provided callback. -func (f *FST) Debug(callback func(int, interface{}) error) error { - - addr := f.decoder.getRoot() - set := bitset.New(uint(addr)) - stack := addrStack{addr} - - stateNumber := 0 - stack, addr = stack[:len(stack)-1], stack[len(stack)-1] - for addr != noneAddr { - if set.Test(uint(addr)) { - stack, addr = stack.Pop() - continue - } - set.Set(uint(addr)) - state, err := f.decoder.stateAt(addr, nil) - if err != nil { - return err - } - err = callback(stateNumber, state) - if err != nil { - return err - } - for i := 0; i < state.NumTransitions(); i++ { - tchar := state.TransitionAt(i) - _, dest, _ := state.TransitionFor(tchar) - stack = append(stack, dest) - } - stateNumber++ - stack, addr = stack.Pop() - } - - return nil -} - -type addrStack []int - -func (a addrStack) Pop() (addrStack, int) { - l := len(a) - if l < 1 { - return a, noneAddr - } - return a[:l-1], a[l-1] -} - -// Reader() returns a Reader instance that a single thread may use to -// retrieve data from the FST -func (f *FST) Reader() (*Reader, error) { - return &Reader{f: f}, nil -} - -func (f *FST) GetMinKey() ([]byte, error) { - var rv []byte - - curr := f.decoder.getRoot() - state, err := f.decoder.stateAt(curr, nil) - if err != nil { - return nil, err - } - - for !state.Final() { - nextTrans := state.TransitionAt(0) - _, curr, _ = state.TransitionFor(nextTrans) - state, err = f.decoder.stateAt(curr, state) - if err != nil { - return nil, err - } - - rv = append(rv, nextTrans) - } - - return rv, nil -} - -func (f *FST) GetMaxKey() ([]byte, error) { - var rv []byte - - curr := f.decoder.getRoot() - state, err := f.decoder.stateAt(curr, nil) - if err != nil { - return nil, err - } - - for state.NumTransitions() > 0 { - nextTrans := state.TransitionAt(state.NumTransitions() - 1) - _, curr, _ = state.TransitionFor(nextTrans) - state, err = f.decoder.stateAt(curr, state) - if err != nil { - return nil, err - } - - rv = append(rv, nextTrans) - } - - return rv, nil -} - -// A Reader is meant for a single threaded use -type Reader struct { - f *FST - prealloc fstStateV1 -} - -func (r *Reader) Get(input []byte) (uint64, bool, error) { - return r.f.get(input, &r.prealloc) -} diff --git a/vendor/github.com/couchbase/vellum/fst_iterator.go b/vendor/github.com/couchbase/vellum/fst_iterator.go deleted file mode 100644 index 2c6b0d6..0000000 --- a/vendor/github.com/couchbase/vellum/fst_iterator.go +++ /dev/null @@ -1,303 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package vellum - -import ( - "bytes" -) - -// Iterator represents a means of visiting key/value pairs in order. -type Iterator interface { - - // Current() returns the key/value pair currently pointed to. - // The []byte of the key is ONLY guaranteed to be valid until - // another call to Next/Seek/Close. If you need it beyond that - // point you MUST make a copy. - Current() ([]byte, uint64) - - // Next() advances the iterator to the next key/value pair. - // If no more key/value pairs exist, ErrIteratorDone is returned. - Next() error - - // Seek() advances the iterator the specified key, or the next key - // if it does not exist. - // If no keys exist after that point, ErrIteratorDone is returned. - Seek(key []byte) error - - // Reset resets the Iterator' internal state to allow for iterator - // reuse (e.g. pooling). - Reset(f *FST, startKeyInclusive, endKeyExclusive []byte, aut Automaton) error - - // Close() frees any resources held by this iterator. - Close() error -} - -// FSTIterator is a structure for iterating key/value pairs in this FST in -// lexicographic order. Iterators should be constructed with the FSTIterator -// method on the parent FST structure. -type FSTIterator struct { - f *FST - aut Automaton - - startKeyInclusive []byte - endKeyExclusive []byte - - statesStack []fstState - keysStack []byte - keysPosStack []int - valsStack []uint64 - autStatesStack []int - - nextStart []byte -} - -func newIterator(f *FST, startKeyInclusive, endKeyExclusive []byte, - aut Automaton) (*FSTIterator, error) { - - rv := &FSTIterator{} - err := rv.Reset(f, startKeyInclusive, endKeyExclusive, aut) - if err != nil { - return nil, err - } - return rv, nil -} - -// Reset resets the Iterator' internal state to allow for iterator -// reuse (e.g. pooling). -func (i *FSTIterator) Reset(f *FST, - startKeyInclusive, endKeyExclusive []byte, aut Automaton) error { - if aut == nil { - aut = alwaysMatchAutomaton - } - - i.f = f - i.startKeyInclusive = startKeyInclusive - i.endKeyExclusive = endKeyExclusive - i.aut = aut - - return i.pointTo(startKeyInclusive) -} - -// pointTo attempts to point us to the specified location -func (i *FSTIterator) pointTo(key []byte) error { - // tried to seek before start - if bytes.Compare(key, i.startKeyInclusive) < 0 { - key = i.startKeyInclusive - } - - // tried to see past end - if i.endKeyExclusive != nil && - bytes.Compare(key, i.endKeyExclusive) > 0 { - key = i.endKeyExclusive - } - - // reset any state, pointTo always starts over - i.statesStack = i.statesStack[:0] - i.keysStack = i.keysStack[:0] - i.keysPosStack = i.keysPosStack[:0] - i.valsStack = i.valsStack[:0] - i.autStatesStack = i.autStatesStack[:0] - - root, err := i.f.decoder.stateAt(i.f.decoder.getRoot(), nil) - if err != nil { - return err - } - - autStart := i.aut.Start() - - maxQ := -1 - // root is always part of the path - i.statesStack = append(i.statesStack, root) - i.autStatesStack = append(i.autStatesStack, autStart) - for j := 0; j < len(key); j++ { - keyJ := key[j] - curr := i.statesStack[len(i.statesStack)-1] - autCurr := i.autStatesStack[len(i.autStatesStack)-1] - - pos, nextAddr, nextVal := curr.TransitionFor(keyJ) - if nextAddr == noneAddr { - // needed transition doesn't exist - // find last trans before the one we needed - for q := curr.NumTransitions() - 1; q >= 0; q-- { - if curr.TransitionAt(q) < keyJ { - maxQ = q - break - } - } - break - } - autNext := i.aut.Accept(autCurr, keyJ) - - next, err := i.f.decoder.stateAt(nextAddr, nil) - if err != nil { - return err - } - - i.statesStack = append(i.statesStack, next) - i.keysStack = append(i.keysStack, keyJ) - i.keysPosStack = append(i.keysPosStack, pos) - i.valsStack = append(i.valsStack, nextVal) - i.autStatesStack = append(i.autStatesStack, autNext) - continue - } - - if !i.statesStack[len(i.statesStack)-1].Final() || - !i.aut.IsMatch(i.autStatesStack[len(i.autStatesStack)-1]) || - bytes.Compare(i.keysStack, key) < 0 { - return i.next(maxQ) - } - - return nil -} - -// Current returns the key and value currently pointed to by the iterator. -// If the iterator is not pointing at a valid value (because Iterator/Next/Seek) -// returned an error previously, it may return nil,0. -func (i *FSTIterator) Current() ([]byte, uint64) { - curr := i.statesStack[len(i.statesStack)-1] - if curr.Final() { - var total uint64 - for _, v := range i.valsStack { - total += v - } - total += curr.FinalOutput() - return i.keysStack, total - } - return nil, 0 -} - -// Next advances this iterator to the next key/value pair. If there is none -// or the advancement goes beyond the configured endKeyExclusive, then -// ErrIteratorDone is returned. -func (i *FSTIterator) Next() error { - return i.next(-1) -} - -func (i *FSTIterator) next(lastOffset int) error { - // remember where we started with keysStack in this next() call - i.nextStart = append(i.nextStart[:0], i.keysStack...) - - nextOffset := lastOffset + 1 - allowCompare := false - -OUTER: - for true { - curr := i.statesStack[len(i.statesStack)-1] - autCurr := i.autStatesStack[len(i.autStatesStack)-1] - - if curr.Final() && i.aut.IsMatch(autCurr) && allowCompare { - // check to see if new keystack might have gone too far - if i.endKeyExclusive != nil && - bytes.Compare(i.keysStack, i.endKeyExclusive) >= 0 { - return ErrIteratorDone - } - - cmp := bytes.Compare(i.keysStack, i.nextStart) - if cmp > 0 { - // in final state greater than start key - return nil - } - } - - numTrans := curr.NumTransitions() - - INNER: - for nextOffset < numTrans { - t := curr.TransitionAt(nextOffset) - - autNext := i.aut.Accept(autCurr, t) - if !i.aut.CanMatch(autNext) { - // TODO: potential optimization to skip nextOffset - // forwards more directly to something that the - // automaton likes rather than a linear scan? - nextOffset += 1 - continue INNER - } - - pos, nextAddr, v := curr.TransitionFor(t) - - // the next slot in the statesStack might have an - // fstState instance that we can reuse - var nextPrealloc fstState - if len(i.statesStack) < cap(i.statesStack) { - nextPrealloc = i.statesStack[0:cap(i.statesStack)][len(i.statesStack)] - } - - // push onto stack - next, err := i.f.decoder.stateAt(nextAddr, nextPrealloc) - if err != nil { - return err - } - - i.statesStack = append(i.statesStack, next) - i.keysStack = append(i.keysStack, t) - i.keysPosStack = append(i.keysPosStack, pos) - i.valsStack = append(i.valsStack, v) - i.autStatesStack = append(i.autStatesStack, autNext) - - nextOffset = 0 - allowCompare = true - - continue OUTER - } - - // no more transitions, so need to backtrack and stack pop - if len(i.statesStack) <= 1 { - // stack len is 1 (root), can't go back further, we're done - break - } - - // if the top of the stack represents a linear chain of states - // (i.e., a suffix of nodes linked by single transitions), - // then optimize by popping the suffix in one shot without - // going back all the way to the OUTER loop - var popNum int - for j := len(i.statesStack) - 1; j > 0; j-- { - if j == 1 || i.statesStack[j].NumTransitions() != 1 { - popNum = len(i.statesStack) - 1 - j - break - } - } - if popNum < 1 { // always pop at least 1 entry from the stacks - popNum = 1 - } - - nextOffset = i.keysPosStack[len(i.keysPosStack)-popNum] + 1 - allowCompare = false - - i.statesStack = i.statesStack[:len(i.statesStack)-popNum] - i.keysStack = i.keysStack[:len(i.keysStack)-popNum] - i.keysPosStack = i.keysPosStack[:len(i.keysPosStack)-popNum] - i.valsStack = i.valsStack[:len(i.valsStack)-popNum] - i.autStatesStack = i.autStatesStack[:len(i.autStatesStack)-popNum] - } - - return ErrIteratorDone -} - -// Seek advances this iterator to the specified key/value pair. If this key -// is not in the FST, Current() will return the next largest key. If this -// seek operation would go past the last key, or outside the configured -// startKeyInclusive/endKeyExclusive then ErrIteratorDone is returned. -func (i *FSTIterator) Seek(key []byte) error { - return i.pointTo(key) -} - -// Close will free any resources held by this iterator. -func (i *FSTIterator) Close() error { - // at the moment we don't do anything, - // but wanted this for API completeness - return nil -} diff --git a/vendor/github.com/couchbase/vellum/levenshtein/LICENSE b/vendor/github.com/couchbase/vellum/levenshtein/LICENSE deleted file mode 100644 index 6b0b127..0000000 --- a/vendor/github.com/couchbase/vellum/levenshtein/LICENSE +++ /dev/null @@ -1,203 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - diff --git a/vendor/github.com/couchbase/vellum/levenshtein/README.md b/vendor/github.com/couchbase/vellum/levenshtein/README.md deleted file mode 100644 index 582b69c..0000000 --- a/vendor/github.com/couchbase/vellum/levenshtein/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# levenshtein -levenshtein automaton - -This package makes it fast and simple to build a finite determinic automaton that computes the levenshtein distance from a given string. - -# Sample usage: - -``` -// build a re-usable builder -lb := NewLevenshteinAutomatonBuilder(2, false) - -origTerm := "couchbasefts" -dfa := lb.BuildDfa("couchbases", 2) -ed := dfa.eval([]byte(origTerm)) -if ed.distance() != 2 { - log.Errorf("expected distance 2, actual: %d", ed.distance()) -} - -``` - -This implementation is inspired by [blog post](https://fulmicoton.com/posts/levenshtein/) and is intended to be -a port of original rust implementation: https://github.com/tantivy-search/levenshtein-automata - - -Micro Benchmark Results against the current vellum/levenshtein is as below. - -``` -BenchmarkNewEditDistance1-8 30000 52684 ns/op 89985 B/op 295 allocs/op -BenchmarkOlderEditDistance1-8 10000 132931 ns/op 588892 B/op 363 allocs/op - -BenchmarkNewEditDistance2-8 10000 199127 ns/op 377532 B/op 1019 allocs/op -BenchmarkOlderEditDistance2-8 2000 988109 ns/op 4236609 B/op 1898 allocs/op -``` diff --git a/vendor/github.com/couchbase/vellum/levenshtein/alphabet.go b/vendor/github.com/couchbase/vellum/levenshtein/alphabet.go deleted file mode 100644 index ec28512..0000000 --- a/vendor/github.com/couchbase/vellum/levenshtein/alphabet.go +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright (c) 2018 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package levenshtein - -import ( - "fmt" - "sort" - "unicode/utf8" -) - -type FullCharacteristicVector []uint32 - -func (fcv FullCharacteristicVector) shiftAndMask(offset, mask uint32) uint32 { - bucketID := offset / 32 - align := offset - bucketID*32 - if align == 0 { - return fcv[bucketID] & mask - } - left := fcv[bucketID] >> align - right := fcv[bucketID+1] << (32 - align) - return (left | right) & mask -} - -type tuple struct { - char rune - fcv FullCharacteristicVector -} - -type sortRunes []rune - -func (s sortRunes) Less(i, j int) bool { - return s[i] < s[j] -} - -func (s sortRunes) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} - -func (s sortRunes) Len() int { - return len(s) -} - -func sortRune(r []rune) []rune { - sort.Sort(sortRunes(r)) - return r -} - -type Alphabet struct { - charset []tuple - index uint32 -} - -func (a *Alphabet) resetNext() { - a.index = 0 -} - -func (a *Alphabet) next() (rune, FullCharacteristicVector, error) { - if int(a.index) >= len(a.charset) { - return 0, nil, fmt.Errorf("eof") - } - - rv := a.charset[a.index] - a.index++ - return rv.char, rv.fcv, nil -} - -func dedupe(in string) string { - lookUp := make(map[rune]struct{}, len(in)) - var rv string - for len(in) > 0 { - r, size := utf8.DecodeRuneInString(in) - in = in[size:] - if _, ok := lookUp[r]; !ok { - rv += string(r) - lookUp[r] = struct{}{} - } - } - return rv -} - -func queryChars(qChars string) Alphabet { - chars := dedupe(qChars) - inChars := sortRune([]rune(chars)) - charsets := make([]tuple, 0, len(inChars)) - - for _, c := range inChars { - tempChars := qChars - var bits []uint32 - for len(tempChars) > 0 { - var chunk string - if len(tempChars) > 32 { - chunk = tempChars[0:32] - tempChars = tempChars[32:] - } else { - chunk = tempChars - tempChars = tempChars[:0] - } - - chunkBits := uint32(0) - bit := uint32(1) - for _, chr := range chunk { - if chr == c { - chunkBits |= bit - } - bit <<= 1 - } - bits = append(bits, chunkBits) - } - bits = append(bits, 0) - charsets = append(charsets, tuple{char: c, fcv: FullCharacteristicVector(bits)}) - } - return Alphabet{charset: charsets} -} diff --git a/vendor/github.com/couchbase/vellum/levenshtein/dfa.go b/vendor/github.com/couchbase/vellum/levenshtein/dfa.go deleted file mode 100644 index d0e43ca..0000000 --- a/vendor/github.com/couchbase/vellum/levenshtein/dfa.go +++ /dev/null @@ -1,250 +0,0 @@ -// Copyright (c) 2018 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package levenshtein - -import ( - "fmt" - "math" -) - -const SinkState = uint32(0) - -type DFA struct { - transitions [][256]uint32 - distances []Distance - initState int - ed uint8 -} - -/// Returns the initial state -func (d *DFA) initialState() int { - return d.initState -} - -/// Returns the Levenshtein distance associated to the -/// current state. -func (d *DFA) distance(stateId int) Distance { - return d.distances[stateId] -} - -/// Returns the number of states in the `DFA`. -func (d *DFA) numStates() int { - return len(d.transitions) -} - -/// Returns the destination state reached after consuming a given byte. -func (d *DFA) transition(fromState int, b uint8) int { - return int(d.transitions[fromState][b]) -} - -func (d *DFA) eval(bytes []uint8) Distance { - state := d.initialState() - - for _, b := range bytes { - state = d.transition(state, b) - } - - return d.distance(state) -} - -func (d *DFA) Start() int { - return int(d.initialState()) -} - -func (d *DFA) IsMatch(state int) bool { - if _, ok := d.distance(state).(Exact); ok { - return true - } - return false -} - -func (d *DFA) CanMatch(state int) bool { - return state > 0 && state < d.numStates() -} - -func (d *DFA) Accept(state int, b byte) int { - return int(d.transition(state, b)) -} - -// WillAlwaysMatch returns if the specified state will always end in a -// matching state. -func (d *DFA) WillAlwaysMatch(state int) bool { - return false -} - -func fill(dest []uint32, val uint32) { - for i := range dest { - dest[i] = val - } -} - -func fillTransitions(dest *[256]uint32, val uint32) { - for i := range dest { - dest[i] = val - } -} - -type Utf8DFAStateBuilder struct { - dfaBuilder *Utf8DFABuilder - stateID uint32 - defaultSuccessor []uint32 -} - -func (sb *Utf8DFAStateBuilder) addTransitionID(fromStateID uint32, b uint8, - toStateID uint32) { - sb.dfaBuilder.transitions[fromStateID][b] = toStateID -} - -func (sb *Utf8DFAStateBuilder) addTransition(in rune, toStateID uint32) { - fromStateID := sb.stateID - chars := []byte(string(in)) - lastByte := chars[len(chars)-1] - - for i, ch := range chars[:len(chars)-1] { - remNumBytes := len(chars) - i - 1 - defaultSuccessor := sb.defaultSuccessor[remNumBytes] - intermediateStateID := sb.dfaBuilder.transitions[fromStateID][ch] - - if intermediateStateID == defaultSuccessor { - intermediateStateID = sb.dfaBuilder.allocate() - fillTransitions(&sb.dfaBuilder.transitions[intermediateStateID], - sb.defaultSuccessor[remNumBytes-1]) - } - - sb.addTransitionID(fromStateID, ch, intermediateStateID) - fromStateID = intermediateStateID - } - - toStateIDDecoded := sb.dfaBuilder.getOrAllocate(original(toStateID)) - sb.addTransitionID(fromStateID, lastByte, toStateIDDecoded) -} - -type Utf8StateId uint32 - -func original(stateId uint32) Utf8StateId { - return predecessor(stateId, 0) -} - -func predecessor(stateId uint32, numSteps uint8) Utf8StateId { - return Utf8StateId(stateId*4 + uint32(numSteps)) -} - -// Utf8DFABuilder makes it possible to define a DFA -// that takes unicode character, and build a `DFA` -// that operates on utf-8 encoded -type Utf8DFABuilder struct { - index []uint32 - distances []Distance - transitions [][256]uint32 - initialState uint32 - numStates uint32 - maxNumStates uint32 -} - -func withMaxStates(maxStates uint32) *Utf8DFABuilder { - rv := &Utf8DFABuilder{ - index: make([]uint32, maxStates*2+100), - distances: make([]Distance, 0, maxStates), - transitions: make([][256]uint32, 0, maxStates), - maxNumStates: maxStates, - } - - for i := range rv.index { - rv.index[i] = math.MaxUint32 - } - - return rv -} - -func (dfab *Utf8DFABuilder) allocate() uint32 { - newState := dfab.numStates - dfab.numStates++ - - dfab.distances = append(dfab.distances, Atleast{d: 255}) - dfab.transitions = append(dfab.transitions, [256]uint32{}) - - return newState -} - -func (dfab *Utf8DFABuilder) getOrAllocate(state Utf8StateId) uint32 { - if int(state) >= cap(dfab.index) { - cloneIndex := make([]uint32, int(state)*2) - copy(cloneIndex, dfab.index) - dfab.index = cloneIndex - } - if dfab.index[state] != math.MaxUint32 { - return dfab.index[state] - } - - nstate := dfab.allocate() - dfab.index[state] = nstate - - return nstate -} - -func (dfab *Utf8DFABuilder) setInitialState(iState uint32) { - decodedID := dfab.getOrAllocate(original(iState)) - dfab.initialState = decodedID -} - -func (dfab *Utf8DFABuilder) build(ed uint8) *DFA { - return &DFA{ - transitions: dfab.transitions, - distances: dfab.distances, - initState: int(dfab.initialState), - ed: ed, - } -} - -func (dfab *Utf8DFABuilder) addState(state, default_suc_orig uint32, - distance Distance) (*Utf8DFAStateBuilder, error) { - if state > dfab.maxNumStates { - return nil, fmt.Errorf("State id is larger than maxNumStates") - } - - stateID := dfab.getOrAllocate(original(state)) - dfab.distances[stateID] = distance - - defaultSuccID := dfab.getOrAllocate(original(default_suc_orig)) - // creates a chain of states of predecessors of `default_suc_orig`. - // Accepting k-bytes (whatever the bytes are) from `predecessor_states[k-1]` - // leads to the `default_suc_orig` state. - predecessorStates := []uint32{defaultSuccID, - defaultSuccID, - defaultSuccID, - defaultSuccID} - - for numBytes := uint8(1); numBytes < 4; numBytes++ { - predecessorState := predecessor(default_suc_orig, numBytes) - predecessorStateID := dfab.getOrAllocate(predecessorState) - predecessorStates[numBytes] = predecessorStateID - succ := predecessorStates[numBytes-1] - fillTransitions(&dfab.transitions[predecessorStateID], succ) - } - - // 1-byte encoded chars. - fill(dfab.transitions[stateID][0:192], predecessorStates[0]) - // 2-bytes encoded chars. - fill(dfab.transitions[stateID][192:224], predecessorStates[1]) - // 3-bytes encoded chars. - fill(dfab.transitions[stateID][224:240], predecessorStates[2]) - // 4-bytes encoded chars. - fill(dfab.transitions[stateID][240:256], predecessorStates[3]) - - return &Utf8DFAStateBuilder{ - dfaBuilder: dfab, - stateID: stateID, - defaultSuccessor: predecessorStates}, nil -} diff --git a/vendor/github.com/couchbase/vellum/levenshtein/levenshtein.go b/vendor/github.com/couchbase/vellum/levenshtein/levenshtein.go deleted file mode 100644 index aa652df..0000000 --- a/vendor/github.com/couchbase/vellum/levenshtein/levenshtein.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) 2018 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package levenshtein - -import "fmt" - -// StateLimit is the maximum number of states allowed -const StateLimit = 10000 - -// ErrTooManyStates is returned if you attempt to build a Levenshtein -// automaton which requires too many states. -var ErrTooManyStates = fmt.Errorf("dfa contains more than %d states", - StateLimit) - -// LevenshteinAutomatonBuilder wraps a precomputed -// datastructure that allows to produce small (but not minimal) DFA. -type LevenshteinAutomatonBuilder struct { - pDfa *ParametricDFA -} - -// NewLevenshteinAutomatonBuilder creates a -// reusable, threadsafe Levenshtein automaton builder. -// `maxDistance` - maximum distance considered by the automaton. -// `transposition` - assign a distance of 1 for transposition -// -// Building this automaton builder is computationally intensive. -// While it takes only a few milliseconds for `d=2`, it grows -// exponentially with `d`. It is only reasonable to `d <= 5`. -func NewLevenshteinAutomatonBuilder(maxDistance uint8, - transposition bool) (*LevenshteinAutomatonBuilder, error) { - lnfa := newLevenshtein(maxDistance, transposition) - - pdfa, err := fromNfa(lnfa) - if err != nil { - return nil, err - } - - return &LevenshteinAutomatonBuilder{pDfa: pdfa}, nil -} - -// BuildDfa builds the levenshtein automaton for serving -// queries with a given edit distance. -func (lab *LevenshteinAutomatonBuilder) BuildDfa(query string, - fuzziness uint8) (*DFA, error) { - return lab.pDfa.buildDfa(query, fuzziness, false) -} - -// MaxDistance returns the MaxEdit distance supported by the -// LevenshteinAutomatonBuilder builder. -func (lab *LevenshteinAutomatonBuilder) MaxDistance() uint8 { - return lab.pDfa.maxDistance -} diff --git a/vendor/github.com/couchbase/vellum/levenshtein/levenshtein_nfa.go b/vendor/github.com/couchbase/vellum/levenshtein/levenshtein_nfa.go deleted file mode 100644 index 68db5d1..0000000 --- a/vendor/github.com/couchbase/vellum/levenshtein/levenshtein_nfa.go +++ /dev/null @@ -1,292 +0,0 @@ -// Copyright (c) 2018 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package levenshtein - -import ( - "math" - "sort" -) - -/// Levenshtein Distance computed by a Levenshtein Automaton. -/// -/// Levenshtein automata can only compute the exact Levenshtein distance -/// up to a given `max_distance`. -/// -/// Over this distance, the automaton will invariably -/// return `Distance::AtLeast(max_distance + 1)`. -type Distance interface { - distance() uint8 -} - -type Exact struct { - d uint8 -} - -func (e Exact) distance() uint8 { - return e.d -} - -type Atleast struct { - d uint8 -} - -func (a Atleast) distance() uint8 { - return a.d -} - -func characteristicVector(query []rune, c rune) uint64 { - chi := uint64(0) - for i := 0; i < len(query); i++ { - if query[i] == c { - chi |= 1 << uint64(i) - } - } - return chi -} - -type NFAState struct { - Offset uint32 - Distance uint8 - InTranspose bool -} - -type NFAStates []NFAState - -func (ns NFAStates) Len() int { - return len(ns) -} - -func (ns NFAStates) Less(i, j int) bool { - if ns[i].Offset != ns[j].Offset { - return ns[i].Offset < ns[j].Offset - } - - if ns[i].Distance != ns[j].Distance { - return ns[i].Distance < ns[j].Distance - } - - return !ns[i].InTranspose && ns[j].InTranspose -} - -func (ns NFAStates) Swap(i, j int) { - ns[i], ns[j] = ns[j], ns[i] -} - -func (ns *NFAState) imply(other NFAState) bool { - transposeImply := ns.InTranspose - if !other.InTranspose { - transposeImply = !other.InTranspose - } - - deltaOffset := ns.Offset - other.Offset - if ns.Offset < other.Offset { - deltaOffset = other.Offset - ns.Offset - } - - if transposeImply { - return uint32(other.Distance) >= (uint32(ns.Distance) + deltaOffset) - } - - return uint32(other.Distance) > (uint32(ns.Distance) + deltaOffset) -} - -type MultiState struct { - states []NFAState -} - -func (ms *MultiState) States() []NFAState { - return ms.states -} - -func (ms *MultiState) Clear() { - ms.states = ms.states[:0] -} - -func newMultiState() *MultiState { - return &MultiState{states: make([]NFAState, 0)} -} - -func (ms *MultiState) normalize() uint32 { - minOffset := uint32(math.MaxUint32) - - for _, s := range ms.states { - if s.Offset < minOffset { - minOffset = s.Offset - } - } - if minOffset == uint32(math.MaxUint32) { - minOffset = 0 - } - - for i := 0; i < len(ms.states); i++ { - ms.states[i].Offset -= minOffset - } - - sort.Sort(NFAStates(ms.states)) - - return minOffset -} - -func (ms *MultiState) addStates(nState NFAState) { - - for _, s := range ms.states { - if s.imply(nState) { - return - } - } - - i := 0 - for i < len(ms.states) { - if nState.imply(ms.states[i]) { - ms.states = append(ms.states[:i], ms.states[i+1:]...) - } else { - i++ - } - } - ms.states = append(ms.states, nState) - -} - -func extractBit(bitset uint64, pos uint8) bool { - shift := bitset >> pos - bit := shift & 1 - return bit == uint64(1) -} - -func dist(left, right uint32) uint32 { - if left > right { - return left - right - } - return right - left -} - -type LevenshteinNFA struct { - mDistance uint8 - damerau bool -} - -func newLevenshtein(maxD uint8, transposition bool) *LevenshteinNFA { - return &LevenshteinNFA{mDistance: maxD, - damerau: transposition, - } -} - -func (la *LevenshteinNFA) maxDistance() uint8 { - return la.mDistance -} - -func (la *LevenshteinNFA) msDiameter() uint8 { - return 2*la.mDistance + 1 -} - -func (la *LevenshteinNFA) initialStates() *MultiState { - ms := MultiState{} - nfaState := NFAState{} - ms.addStates(nfaState) - return &ms -} - -func (la *LevenshteinNFA) multistateDistance(ms *MultiState, - queryLen uint32) Distance { - minDistance := Atleast{d: la.mDistance + 1} - for _, s := range ms.states { - t := s.Distance + uint8(dist(queryLen, s.Offset)) - if t <= uint8(la.mDistance) { - if minDistance.distance() > t { - minDistance.d = t - } - } - } - - if minDistance.distance() == la.mDistance+1 { - return Atleast{d: la.mDistance + 1} - } - - return minDistance -} - -func (la *LevenshteinNFA) simpleTransition(state NFAState, - symbol uint64, ms *MultiState) { - - if state.Distance < la.mDistance { - // insertion - ms.addStates(NFAState{Offset: state.Offset, - Distance: state.Distance + 1, - InTranspose: false}) - - // substitution - ms.addStates(NFAState{Offset: state.Offset + 1, - Distance: state.Distance + 1, - InTranspose: false}) - - n := la.mDistance + 1 - state.Distance - for d := uint8(1); d < n; d++ { - if extractBit(symbol, d) { - // for d > 0, as many deletion and character match - ms.addStates(NFAState{Offset: state.Offset + 1 + uint32(d), - Distance: state.Distance + d, - InTranspose: false}) - } - } - - if la.damerau && extractBit(symbol, 1) { - ms.addStates(NFAState{ - Offset: state.Offset, - Distance: state.Distance + 1, - InTranspose: true}) - } - - } - - if extractBit(symbol, 0) { - ms.addStates(NFAState{Offset: state.Offset + 1, - Distance: state.Distance, - InTranspose: false}) - } - - if state.InTranspose && extractBit(symbol, 0) { - ms.addStates(NFAState{Offset: state.Offset + 2, - Distance: state.Distance, - InTranspose: false}) - } - -} - -func (la *LevenshteinNFA) transition(cState *MultiState, - dState *MultiState, scv uint64) { - dState.Clear() - mask := (uint64(1) << la.msDiameter()) - uint64(1) - - for _, state := range cState.states { - cv := (scv >> state.Offset) & mask - la.simpleTransition(state, cv, dState) - } - - sort.Sort(NFAStates(dState.states)) -} - -func (la *LevenshteinNFA) computeDistance(query, other []rune) Distance { - cState := la.initialStates() - nState := newMultiState() - - for _, i := range other { - nState.Clear() - chi := characteristicVector(query, i) - la.transition(cState, nState, chi) - cState, nState = nState, cState - } - - return la.multistateDistance(cState, uint32(len(query))) -} diff --git a/vendor/github.com/couchbase/vellum/levenshtein/parametric_dfa.go b/vendor/github.com/couchbase/vellum/levenshtein/parametric_dfa.go deleted file mode 100644 index d08e5da..0000000 --- a/vendor/github.com/couchbase/vellum/levenshtein/parametric_dfa.go +++ /dev/null @@ -1,349 +0,0 @@ -// Copyright (c) 2018 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package levenshtein - -import ( - "crypto/md5" - "encoding/json" - "fmt" - "math" -) - -type ParametricState struct { - shapeID uint32 - offset uint32 -} - -func newParametricState() ParametricState { - return ParametricState{} -} - -func (ps *ParametricState) isDeadEnd() bool { - return ps.shapeID == 0 -} - -type Transition struct { - destShapeID uint32 - deltaOffset uint32 -} - -func (t *Transition) apply(state ParametricState) ParametricState { - ps := ParametricState{ - shapeID: t.destShapeID} - // don't need any offset if we are in the dead state, - // this ensures we have only one dead state. - if t.destShapeID != 0 { - ps.offset = state.offset + t.deltaOffset - } - - return ps -} - -type ParametricStateIndex struct { - stateIndex []uint32 - stateQueue []ParametricState - numOffsets uint32 -} - -func newParametricStateIndex(queryLen, - numParamState uint32) ParametricStateIndex { - numOffsets := queryLen + 1 - if numParamState == 0 { - numParamState = numOffsets - } - maxNumStates := numParamState * numOffsets - psi := ParametricStateIndex{ - stateIndex: make([]uint32, maxNumStates), - stateQueue: make([]ParametricState, 0, 150), - numOffsets: numOffsets, - } - - for i := uint32(0); i < maxNumStates; i++ { - psi.stateIndex[i] = math.MaxUint32 - } - return psi -} - -func (psi *ParametricStateIndex) numStates() int { - return len(psi.stateQueue) -} - -func (psi *ParametricStateIndex) maxNumStates() int { - return len(psi.stateIndex) -} - -func (psi *ParametricStateIndex) get(stateID uint32) ParametricState { - return psi.stateQueue[stateID] -} - -func (psi *ParametricStateIndex) getOrAllocate(ps ParametricState) uint32 { - bucket := ps.shapeID*psi.numOffsets + ps.offset - if bucket < uint32(len(psi.stateIndex)) && - psi.stateIndex[bucket] != math.MaxUint32 { - return psi.stateIndex[bucket] - } - nState := uint32(len(psi.stateQueue)) - psi.stateQueue = append(psi.stateQueue, ps) - - psi.stateIndex[bucket] = nState - return nState -} - -type ParametricDFA struct { - distance []uint8 - transitions []Transition - maxDistance uint8 - transitionStride uint32 - diameter uint32 -} - -func (pdfa *ParametricDFA) initialState() ParametricState { - return ParametricState{shapeID: 1} -} - -// Returns true iff whatever characters come afterward, -// we will never reach a shorter distance -func (pdfa *ParametricDFA) isPrefixSink(state ParametricState, queryLen uint32) bool { - if state.isDeadEnd() { - return true - } - - remOffset := queryLen - state.offset - if remOffset < pdfa.diameter { - stateDistances := pdfa.distance[pdfa.diameter*state.shapeID:] - prefixDistance := stateDistances[remOffset] - if prefixDistance > pdfa.maxDistance { - return false - } - - for _, d := range stateDistances { - if d < prefixDistance { - return false - } - } - return true - } - return false -} - -func (pdfa *ParametricDFA) numStates() int { - return len(pdfa.transitions) / int(pdfa.transitionStride) -} - -func min(x, y uint32) uint32 { - if x < y { - return x - } - return y -} - -func (pdfa *ParametricDFA) transition(state ParametricState, - chi uint32) Transition { - return pdfa.transitions[pdfa.transitionStride*state.shapeID+chi] -} - -func (pdfa *ParametricDFA) getDistance(state ParametricState, - qLen uint32) Distance { - remainingOffset := qLen - state.offset - if state.isDeadEnd() || remainingOffset >= pdfa.diameter { - return Atleast{d: pdfa.maxDistance + 1} - } - dist := pdfa.distance[int(pdfa.diameter*state.shapeID)+int(remainingOffset)] - if dist > pdfa.maxDistance { - return Atleast{d: dist} - } - return Exact{d: dist} -} - -func (pdfa *ParametricDFA) computeDistance(left, right string) Distance { - state := pdfa.initialState() - leftChars := []rune(left) - for _, chr := range []rune(right) { - start := state.offset - stop := min(start+pdfa.diameter, uint32(len(leftChars))) - chi := characteristicVector(leftChars[start:stop], chr) - transition := pdfa.transition(state, uint32(chi)) - state = transition.apply(state) - if state.isDeadEnd() { - return Atleast{d: pdfa.maxDistance + 1} - } - } - return pdfa.getDistance(state, uint32(len(left))) -} - -func (pdfa *ParametricDFA) buildDfa(query string, distance uint8, - prefix bool) (*DFA, error) { - qLen := uint32(len([]rune(query))) - alphabet := queryChars(query) - - psi := newParametricStateIndex(qLen, uint32(pdfa.numStates())) - maxNumStates := psi.maxNumStates() - deadEndStateID := psi.getOrAllocate(newParametricState()) - if deadEndStateID != 0 { - return nil, fmt.Errorf("Invalid dead end state") - } - - initialStateID := psi.getOrAllocate(pdfa.initialState()) - dfaBuilder := withMaxStates(uint32(maxNumStates)) - mask := uint32((1 << pdfa.diameter) - 1) - - var stateID int - for stateID = 0; stateID < StateLimit; stateID++ { - if stateID == psi.numStates() { - break - } - state := psi.get(uint32(stateID)) - if prefix && pdfa.isPrefixSink(state, qLen) { - distance := pdfa.getDistance(state, qLen) - dfaBuilder.addState(uint32(stateID), uint32(stateID), distance) - } else { - transition := pdfa.transition(state, 0) - defSuccessor := transition.apply(state) - defSuccessorID := psi.getOrAllocate(defSuccessor) - distance := pdfa.getDistance(state, qLen) - stateBuilder, err := dfaBuilder.addState(uint32(stateID), defSuccessorID, distance) - - if err != nil { - return nil, fmt.Errorf("parametric_dfa: buildDfa, err: %v", err) - } - - alphabet.resetNext() - chr, cv, err := alphabet.next() - for err == nil { - chi := cv.shiftAndMask(state.offset, mask) - - transition := pdfa.transition(state, chi) - - destState := transition.apply(state) - - destStateID := psi.getOrAllocate(destState) - - stateBuilder.addTransition(chr, destStateID) - - chr, cv, err = alphabet.next() - } - } - } - - if stateID == StateLimit { - return nil, ErrTooManyStates - } - - dfaBuilder.setInitialState(initialStateID) - return dfaBuilder.build(distance), nil -} - -func fromNfa(nfa *LevenshteinNFA) (*ParametricDFA, error) { - lookUp := newHash() - lookUp.getOrAllocate(*newMultiState()) - initialState := nfa.initialStates() - lookUp.getOrAllocate(*initialState) - - maxDistance := nfa.maxDistance() - msDiameter := nfa.msDiameter() - - numChi := 1 << msDiameter - chiValues := make([]uint64, numChi) - for i := 0; i < numChi; i++ { - chiValues[i] = uint64(i) - } - - transitions := make([]Transition, 0, numChi*int(msDiameter)) - var stateID int - for stateID = 0; stateID < StateLimit; stateID++ { - if stateID == len(lookUp.items) { - break - } - - for _, chi := range chiValues { - destMs := newMultiState() - - ms := lookUp.getFromID(stateID) - - nfa.transition(ms, destMs, chi) - - translation := destMs.normalize() - - destID := lookUp.getOrAllocate(*destMs) - - transitions = append(transitions, Transition{ - destShapeID: uint32(destID), - deltaOffset: translation, - }) - } - } - - if stateID == StateLimit { - return nil, ErrTooManyStates - } - - ns := len(lookUp.items) - diameter := int(msDiameter) - - distances := make([]uint8, 0, diameter*ns) - for stateID := 0; stateID < ns; stateID++ { - ms := lookUp.getFromID(stateID) - for offset := 0; offset < diameter; offset++ { - dist := nfa.multistateDistance(ms, uint32(offset)) - distances = append(distances, dist.distance()) - } - } - - return &ParametricDFA{ - diameter: uint32(msDiameter), - transitions: transitions, - maxDistance: maxDistance, - transitionStride: uint32(numChi), - distance: distances, - }, nil -} - -type hash struct { - index map[[16]byte]int - items []MultiState -} - -func newHash() *hash { - return &hash{ - index: make(map[[16]byte]int, 100), - items: make([]MultiState, 0, 100), - } -} - -func (h *hash) getOrAllocate(m MultiState) int { - size := len(h.items) - var exists bool - var pos int - md5 := getHash(&m) - if pos, exists = h.index[md5]; !exists { - h.index[md5] = size - pos = size - h.items = append(h.items, m) - } - return pos -} - -func (h *hash) getFromID(id int) *MultiState { - return &h.items[id] -} - -func getHash(ms *MultiState) [16]byte { - msBytes := []byte{} - for _, state := range ms.states { - jsonBytes, _ := json.Marshal(&state) - msBytes = append(msBytes, jsonBytes...) - } - return md5.Sum(msBytes) -} diff --git a/vendor/github.com/couchbase/vellum/merge_iterator.go b/vendor/github.com/couchbase/vellum/merge_iterator.go deleted file mode 100644 index f00f778..0000000 --- a/vendor/github.com/couchbase/vellum/merge_iterator.go +++ /dev/null @@ -1,188 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package vellum - -import ( - "bytes" -) - -// MergeFunc is used to choose the new value for a key when merging a slice -// of iterators, and the same key is observed with multiple values. -// Values presented to the MergeFunc will be in the same order as the -// original slice creating the MergeIterator. This allows some MergeFunc -// implementations to prioritize one iterator over another. -type MergeFunc func([]uint64) uint64 - -// MergeIterator implements the Iterator interface by traversing a slice -// of iterators and merging the contents of them. If the same key exists -// in mulitipe underlying iterators, a user-provided MergeFunc will be -// invoked to choose the new value. -type MergeIterator struct { - itrs []Iterator - f MergeFunc - currKs [][]byte - currVs []uint64 - - lowK []byte - lowV uint64 - lowIdxs []int - - mergeV []uint64 -} - -// NewMergeIterator creates a new MergeIterator over the provided slice of -// Iterators and with the specified MergeFunc to resolve duplicate keys. -func NewMergeIterator(itrs []Iterator, f MergeFunc) (*MergeIterator, error) { - rv := &MergeIterator{ - itrs: itrs, - f: f, - currKs: make([][]byte, len(itrs)), - currVs: make([]uint64, len(itrs)), - lowIdxs: make([]int, 0, len(itrs)), - mergeV: make([]uint64, 0, len(itrs)), - } - rv.init() - if rv.lowK == nil { - return rv, ErrIteratorDone - } - return rv, nil -} - -func (m *MergeIterator) init() { - for i, itr := range m.itrs { - m.currKs[i], m.currVs[i] = itr.Current() - } - m.updateMatches() -} - -func (m *MergeIterator) updateMatches() { - if len(m.itrs) < 1 { - return - } - m.lowK = m.currKs[0] - m.lowIdxs = m.lowIdxs[:0] - m.lowIdxs = append(m.lowIdxs, 0) - for i := 1; i < len(m.itrs); i++ { - if m.currKs[i] == nil { - continue - } - cmp := bytes.Compare(m.currKs[i], m.lowK) - if m.lowK == nil || cmp < 0 { - // reached a new low - m.lowK = m.currKs[i] - m.lowIdxs = m.lowIdxs[:0] - m.lowIdxs = append(m.lowIdxs, i) - } else if cmp == 0 { - m.lowIdxs = append(m.lowIdxs, i) - } - } - if len(m.lowIdxs) > 1 { - // merge multiple values - m.mergeV = m.mergeV[:0] - for _, vi := range m.lowIdxs { - m.mergeV = append(m.mergeV, m.currVs[vi]) - } - m.lowV = m.f(m.mergeV) - } else if len(m.lowIdxs) == 1 { - m.lowV = m.currVs[m.lowIdxs[0]] - } -} - -// Current returns the key and value currently pointed to by this iterator. -// If the iterator is not pointing at a valid value (because Iterator/Next/Seek) -// returned an error previously, it may return nil,0. -func (m *MergeIterator) Current() ([]byte, uint64) { - return m.lowK, m.lowV -} - -// Next advances this iterator to the next key/value pair. If there is none, -// then ErrIteratorDone is returned. -func (m *MergeIterator) Next() error { - // move all the current low iterators to next - for _, vi := range m.lowIdxs { - err := m.itrs[vi].Next() - if err != nil && err != ErrIteratorDone { - return err - } - m.currKs[vi], m.currVs[vi] = m.itrs[vi].Current() - } - m.updateMatches() - if m.lowK == nil { - return ErrIteratorDone - } - return nil -} - -// Seek advances this iterator to the specified key/value pair. If this key -// is not in the FST, Current() will return the next largest key. If this -// seek operation would go past the last key, then ErrIteratorDone is returned. -func (m *MergeIterator) Seek(key []byte) error { - for i := range m.itrs { - err := m.itrs[i].Seek(key) - if err != nil && err != ErrIteratorDone { - return err - } - } - m.updateMatches() - if m.lowK == nil { - return ErrIteratorDone - } - return nil -} - -// Close will attempt to close all the underlying Iterators. If any errors -// are encountered, the first will be returned. -func (m *MergeIterator) Close() error { - var rv error - for i := range m.itrs { - // close all iterators, return first error if any - err := m.itrs[i].Close() - if rv == nil { - rv = err - } - } - return rv -} - -// MergeMin chooses the minimum value -func MergeMin(vals []uint64) uint64 { - rv := vals[0] - for _, v := range vals[1:] { - if v < rv { - rv = v - } - } - return rv -} - -// MergeMax chooses the maximum value -func MergeMax(vals []uint64) uint64 { - rv := vals[0] - for _, v := range vals[1:] { - if v > rv { - rv = v - } - } - return rv -} - -// MergeSum sums the values -func MergeSum(vals []uint64) uint64 { - rv := vals[0] - for _, v := range vals[1:] { - rv += v - } - return rv -} diff --git a/vendor/github.com/couchbase/vellum/pack.go b/vendor/github.com/couchbase/vellum/pack.go deleted file mode 100644 index 78f3dcd..0000000 --- a/vendor/github.com/couchbase/vellum/pack.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package vellum - -func deltaAddr(base, trans uint64) uint64 { - // transition dest of 0 is special case - if trans == 0 { - return 0 - } - return base - trans -} - -const packOutMask = 1<<4 - 1 - -func encodePackSize(transSize, outSize int) byte { - var rv byte - rv = byte(transSize << 4) - rv |= byte(outSize) - return rv -} - -func decodePackSize(pack byte) (transSize int, packSize int) { - transSize = int(pack >> 4) - packSize = int(pack & packOutMask) - return -} - -const maxNumTrans = 1<<6 - 1 - -func encodeNumTrans(n int) byte { - if n <= maxNumTrans { - return byte(n) - } - return 0 -} - -func readPackedUint(data []byte) (rv uint64) { - for i := range data { - shifted := uint64(data[i]) << uint(i*8) - rv |= shifted - } - return -} diff --git a/vendor/github.com/couchbase/vellum/regexp/compile.go b/vendor/github.com/couchbase/vellum/regexp/compile.go deleted file mode 100644 index 92284d0..0000000 --- a/vendor/github.com/couchbase/vellum/regexp/compile.go +++ /dev/null @@ -1,343 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package regexp - -import ( - "regexp/syntax" - "unicode" - - unicode_utf8 "unicode/utf8" - - "github.com/couchbase/vellum/utf8" -) - -type compiler struct { - sizeLimit uint - insts prog - instsPool []inst - - sequences utf8.Sequences - rangeStack utf8.RangeStack - startBytes []byte - endBytes []byte -} - -func newCompiler(sizeLimit uint) *compiler { - return &compiler{ - sizeLimit: sizeLimit, - startBytes: make([]byte, unicode_utf8.UTFMax), - endBytes: make([]byte, unicode_utf8.UTFMax), - } -} - -func (c *compiler) compile(ast *syntax.Regexp) (prog, error) { - err := c.c(ast) - if err != nil { - return nil, err - } - inst := c.allocInst() - inst.op = OpMatch - c.insts = append(c.insts, inst) - return c.insts, nil -} - -func (c *compiler) c(ast *syntax.Regexp) (err error) { - if ast.Flags&syntax.NonGreedy > 1 { - return ErrNoLazy - } - - switch ast.Op { - case syntax.OpEndLine, syntax.OpBeginLine, - syntax.OpBeginText, syntax.OpEndText: - return ErrNoEmpty - case syntax.OpWordBoundary, syntax.OpNoWordBoundary: - return ErrNoWordBoundary - case syntax.OpEmptyMatch: - return nil - case syntax.OpLiteral: - for _, r := range ast.Rune { - if ast.Flags&syntax.FoldCase > 0 { - next := syntax.Regexp{ - Op: syntax.OpCharClass, - Flags: ast.Flags & syntax.FoldCase, - Rune0: [2]rune{r, r}, - } - next.Rune = next.Rune0[0:2] - // try to find more folded runes - for r1 := unicode.SimpleFold(r); r1 != r; r1 = unicode.SimpleFold(r1) { - next.Rune = append(next.Rune, r1, r1) - } - err = c.c(&next) - if err != nil { - return err - } - } else { - c.sequences, c.rangeStack, err = utf8.NewSequencesPrealloc( - r, r, c.sequences, c.rangeStack, c.startBytes, c.endBytes) - if err != nil { - return err - } - for _, seq := range c.sequences { - c.compileUtf8Ranges(seq) - } - } - } - case syntax.OpAnyChar: - next := syntax.Regexp{ - Op: syntax.OpCharClass, - Flags: ast.Flags & syntax.FoldCase, - Rune0: [2]rune{0, unicode.MaxRune}, - } - next.Rune = next.Rune0[:2] - return c.c(&next) - case syntax.OpAnyCharNotNL: - next := syntax.Regexp{ - Op: syntax.OpCharClass, - Flags: ast.Flags & syntax.FoldCase, - Rune: []rune{0, 0x09, 0x0B, unicode.MaxRune}, - } - return c.c(&next) - case syntax.OpCharClass: - return c.compileClass(ast) - case syntax.OpCapture: - return c.c(ast.Sub[0]) - case syntax.OpConcat: - for _, sub := range ast.Sub { - err := c.c(sub) - if err != nil { - return err - } - } - return nil - case syntax.OpAlternate: - if len(ast.Sub) == 0 { - return nil - } - jmpsToEnd := make([]uint, 0, len(ast.Sub)-1) - // does not handle last entry - for i := 0; i < len(ast.Sub)-1; i++ { - sub := ast.Sub[i] - split := c.emptySplit() - j1 := c.top() - err := c.c(sub) - if err != nil { - return err - } - jmpsToEnd = append(jmpsToEnd, c.emptyJump()) - j2 := c.top() - c.setSplit(split, j1, j2) - } - // handle last entry - err := c.c(ast.Sub[len(ast.Sub)-1]) - if err != nil { - return err - } - end := uint(len(c.insts)) - for _, jmpToEnd := range jmpsToEnd { - c.setJump(jmpToEnd, end) - } - case syntax.OpQuest: - split := c.emptySplit() - j1 := c.top() - err := c.c(ast.Sub[0]) - if err != nil { - return err - } - j2 := c.top() - c.setSplit(split, j1, j2) - - case syntax.OpStar: - j1 := c.top() - split := c.emptySplit() - j2 := c.top() - err := c.c(ast.Sub[0]) - if err != nil { - return err - } - jmp := c.emptyJump() - j3 := uint(len(c.insts)) - - c.setJump(jmp, j1) - c.setSplit(split, j2, j3) - - case syntax.OpPlus: - j1 := c.top() - err := c.c(ast.Sub[0]) - if err != nil { - return err - } - split := c.emptySplit() - j2 := c.top() - c.setSplit(split, j1, j2) - - case syntax.OpRepeat: - if ast.Max == -1 { - for i := 0; i < ast.Min; i++ { - err := c.c(ast.Sub[0]) - if err != nil { - return err - } - } - next := syntax.Regexp{ - Op: syntax.OpStar, - Flags: ast.Flags, - Sub: ast.Sub, - Sub0: ast.Sub0, - Rune: ast.Rune, - Rune0: ast.Rune0, - } - return c.c(&next) - } - for i := 0; i < ast.Min; i++ { - err := c.c(ast.Sub[0]) - if err != nil { - return err - } - } - splits := make([]uint, 0, ast.Max-ast.Min) - starts := make([]uint, 0, ast.Max-ast.Min) - for i := ast.Min; i < ast.Max; i++ { - splits = append(splits, c.emptySplit()) - starts = append(starts, uint(len(c.insts))) - err := c.c(ast.Sub[0]) - if err != nil { - return err - } - } - end := uint(len(c.insts)) - for i := 0; i < len(splits); i++ { - c.setSplit(splits[i], starts[i], end) - } - - } - - return c.checkSize() -} - -func (c *compiler) checkSize() error { - if uint(len(c.insts)*instSize) > c.sizeLimit { - return ErrCompiledTooBig - } - return nil -} - -func (c *compiler) compileClass(ast *syntax.Regexp) error { - if len(ast.Rune) == 0 { - return nil - } - jmps := make([]uint, 0, len(ast.Rune)-2) - // does not do last pair - for i := 0; i < len(ast.Rune)-2; i += 2 { - rstart := ast.Rune[i] - rend := ast.Rune[i+1] - - split := c.emptySplit() - j1 := c.top() - err := c.compileClassRange(rstart, rend) - if err != nil { - return err - } - jmps = append(jmps, c.emptyJump()) - j2 := c.top() - c.setSplit(split, j1, j2) - } - // handle last pair - rstart := ast.Rune[len(ast.Rune)-2] - rend := ast.Rune[len(ast.Rune)-1] - err := c.compileClassRange(rstart, rend) - if err != nil { - return err - } - end := c.top() - for _, jmp := range jmps { - c.setJump(jmp, end) - } - return nil -} - -func (c *compiler) compileClassRange(startR, endR rune) (err error) { - c.sequences, c.rangeStack, err = utf8.NewSequencesPrealloc( - startR, endR, c.sequences, c.rangeStack, c.startBytes, c.endBytes) - if err != nil { - return err - } - jmps := make([]uint, 0, len(c.sequences)-1) - // does not do last entry - for i := 0; i < len(c.sequences)-1; i++ { - seq := c.sequences[i] - split := c.emptySplit() - j1 := c.top() - c.compileUtf8Ranges(seq) - jmps = append(jmps, c.emptyJump()) - j2 := c.top() - c.setSplit(split, j1, j2) - } - // handle last entry - c.compileUtf8Ranges(c.sequences[len(c.sequences)-1]) - end := c.top() - for _, jmp := range jmps { - c.setJump(jmp, end) - } - - return nil -} - -func (c *compiler) compileUtf8Ranges(seq utf8.Sequence) { - for _, r := range seq { - inst := c.allocInst() - inst.op = OpRange - inst.rangeStart = r.Start - inst.rangeEnd = r.End - c.insts = append(c.insts, inst) - } -} - -func (c *compiler) emptySplit() uint { - inst := c.allocInst() - inst.op = OpSplit - c.insts = append(c.insts, inst) - return c.top() - 1 -} - -func (c *compiler) emptyJump() uint { - inst := c.allocInst() - inst.op = OpJmp - c.insts = append(c.insts, inst) - return c.top() - 1 -} - -func (c *compiler) setSplit(i, pc1, pc2 uint) { - split := c.insts[i] - split.splitA = pc1 - split.splitB = pc2 -} - -func (c *compiler) setJump(i, pc uint) { - jmp := c.insts[i] - jmp.to = pc -} - -func (c *compiler) top() uint { - return uint(len(c.insts)) -} - -func (c *compiler) allocInst() *inst { - if len(c.instsPool) <= 0 { - c.instsPool = make([]inst, 16) - } - inst := &c.instsPool[0] - c.instsPool = c.instsPool[1:] - return inst -} diff --git a/vendor/github.com/couchbase/vellum/regexp/dfa.go b/vendor/github.com/couchbase/vellum/regexp/dfa.go deleted file mode 100644 index 7e6fb29..0000000 --- a/vendor/github.com/couchbase/vellum/regexp/dfa.go +++ /dev/null @@ -1,196 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package regexp - -import ( - "encoding/binary" - "fmt" -) - -// StateLimit is the maximum number of states allowed -const StateLimit = 10000 - -// ErrTooManyStates is returned if you attempt to build a Levenshtein -// automaton which requires too many states. -var ErrTooManyStates = fmt.Errorf("dfa contains more than %d states", - StateLimit) - -type dfaBuilder struct { - dfa *dfa - cache map[string]int - keyBuf []byte -} - -func newDfaBuilder(insts prog) *dfaBuilder { - d := &dfaBuilder{ - dfa: &dfa{ - insts: insts, - states: make([]state, 0, 16), - }, - cache: make(map[string]int, 1024), - } - // add 0 state that is invalid - d.dfa.states = append(d.dfa.states, state{ - next: make([]int, 256), - match: false, - }) - return d -} - -func (d *dfaBuilder) build() (*dfa, error) { - cur := newSparseSet(uint(len(d.dfa.insts))) - next := newSparseSet(uint(len(d.dfa.insts))) - - d.dfa.add(cur, 0) - ns, instsReuse := d.cachedState(cur, nil) - states := intStack{ns} - seen := make(map[int]struct{}) - var s int - states, s = states.Pop() - for s != 0 { - for b := 0; b < 256; b++ { - var ns int - ns, instsReuse = d.runState(cur, next, s, byte(b), instsReuse) - if ns != 0 { - if _, ok := seen[ns]; !ok { - seen[ns] = struct{}{} - states = states.Push(ns) - } - } - if len(d.dfa.states) > StateLimit { - return nil, ErrTooManyStates - } - } - states, s = states.Pop() - } - return d.dfa, nil -} - -func (d *dfaBuilder) runState(cur, next *sparseSet, state int, b byte, instsReuse []uint) ( - int, []uint) { - cur.Clear() - for _, ip := range d.dfa.states[state].insts { - cur.Add(ip) - } - d.dfa.run(cur, next, b) - var nextState int - nextState, instsReuse = d.cachedState(next, instsReuse) - d.dfa.states[state].next[b] = nextState - return nextState, instsReuse -} - -func instsKey(insts []uint, buf []byte) []byte { - if cap(buf) < 8*len(insts) { - buf = make([]byte, 8*len(insts)) - } else { - buf = buf[0 : 8*len(insts)] - } - for i, inst := range insts { - binary.LittleEndian.PutUint64(buf[i*8:], uint64(inst)) - } - return buf -} - -func (d *dfaBuilder) cachedState(set *sparseSet, - instsReuse []uint) (int, []uint) { - insts := instsReuse[:0] - if cap(insts) == 0 { - insts = make([]uint, 0, set.Len()) - } - var isMatch bool - for i := uint(0); i < uint(set.Len()); i++ { - ip := set.Get(i) - switch d.dfa.insts[ip].op { - case OpRange: - insts = append(insts, ip) - case OpMatch: - isMatch = true - insts = append(insts, ip) - } - } - if len(insts) == 0 { - return 0, insts - } - d.keyBuf = instsKey(insts, d.keyBuf) - v, ok := d.cache[string(d.keyBuf)] - if ok { - return v, insts - } - d.dfa.states = append(d.dfa.states, state{ - insts: insts, - next: make([]int, 256), - match: isMatch, - }) - newV := len(d.dfa.states) - 1 - d.cache[string(d.keyBuf)] = newV - return newV, nil -} - -type dfa struct { - insts prog - states []state -} - -func (d *dfa) add(set *sparseSet, ip uint) { - if set.Contains(ip) { - return - } - set.Add(ip) - switch d.insts[ip].op { - case OpJmp: - d.add(set, d.insts[ip].to) - case OpSplit: - d.add(set, d.insts[ip].splitA) - d.add(set, d.insts[ip].splitB) - } -} - -func (d *dfa) run(from, to *sparseSet, b byte) bool { - to.Clear() - var isMatch bool - for i := uint(0); i < uint(from.Len()); i++ { - ip := from.Get(i) - switch d.insts[ip].op { - case OpMatch: - isMatch = true - case OpRange: - if d.insts[ip].rangeStart <= b && - b <= d.insts[ip].rangeEnd { - d.add(to, ip+1) - } - } - } - return isMatch -} - -type state struct { - insts []uint - next []int - match bool -} - -type intStack []int - -func (s intStack) Push(v int) intStack { - return append(s, v) -} - -func (s intStack) Pop() (intStack, int) { - l := len(s) - if l < 1 { - return s, 0 - } - return s[:l-1], s[l-1] -} diff --git a/vendor/github.com/couchbase/vellum/regexp/inst.go b/vendor/github.com/couchbase/vellum/regexp/inst.go deleted file mode 100644 index 36f2e60..0000000 --- a/vendor/github.com/couchbase/vellum/regexp/inst.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package regexp - -import "fmt" - -// instOp represents a instruction operation -type instOp int - -// the enumeration of operations -const ( - OpMatch instOp = iota - OpJmp - OpSplit - OpRange -) - -// instSize is the approximate size of the an inst struct in bytes -const instSize = 40 - -type inst struct { - op instOp - to uint - splitA uint - splitB uint - rangeStart byte - rangeEnd byte -} - -func (i *inst) String() string { - switch i.op { - case OpJmp: - return fmt.Sprintf("JMP: %d", i.to) - case OpSplit: - return fmt.Sprintf("SPLIT: %d - %d", i.splitA, i.splitB) - case OpRange: - return fmt.Sprintf("RANGE: %x - %x", i.rangeStart, i.rangeEnd) - } - return "MATCH" -} - -type prog []*inst - -func (p prog) String() string { - rv := "\n" - for i, pi := range p { - rv += fmt.Sprintf("%d %v\n", i, pi) - } - return rv -} diff --git a/vendor/github.com/couchbase/vellum/regexp/regexp.go b/vendor/github.com/couchbase/vellum/regexp/regexp.go deleted file mode 100644 index 920ddc3..0000000 --- a/vendor/github.com/couchbase/vellum/regexp/regexp.go +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package regexp - -import ( - "fmt" - "regexp/syntax" -) - -// ErrNoEmpty returned when "zero width assertions" are used -var ErrNoEmpty = fmt.Errorf("zero width assertions not allowed") - -// ErrNoWordBoundary returned when word boundaries are used -var ErrNoWordBoundary = fmt.Errorf("word boundaries are not allowed") - -// ErrNoBytes returned when byte literals are used -var ErrNoBytes = fmt.Errorf("byte literals are not allowed") - -// ErrNoLazy returned when lazy quantifiers are used -var ErrNoLazy = fmt.Errorf("lazy quantifiers are not allowed") - -// ErrCompiledTooBig returned when regular expression parses into -// too many instructions -var ErrCompiledTooBig = fmt.Errorf("too many instructions") - -var DefaultLimit = uint(10 * (1 << 20)) - -// Regexp implements the vellum.Automaton interface for matcing a user -// specified regular expression. -type Regexp struct { - orig string - dfa *dfa -} - -// NewRegexp creates a new Regular Expression automaton with the specified -// expression. By default it is limited to approximately 10MB for the -// compiled finite state automaton. If this size is exceeded, -// ErrCompiledTooBig will be returned. -func New(expr string) (*Regexp, error) { - return NewWithLimit(expr, DefaultLimit) -} - -// NewRegexpWithLimit creates a new Regular Expression automaton with -// the specified expression. The size of the compiled finite state -// automaton exceeds the user specified size, ErrCompiledTooBig will be -// returned. -func NewWithLimit(expr string, size uint) (*Regexp, error) { - parsed, err := syntax.Parse(expr, syntax.Perl) - if err != nil { - return nil, err - } - return NewParsedWithLimit(expr, parsed, size) -} - -func NewParsedWithLimit(expr string, parsed *syntax.Regexp, size uint) (*Regexp, error) { - compiler := newCompiler(size) - insts, err := compiler.compile(parsed) - if err != nil { - return nil, err - } - dfaBuilder := newDfaBuilder(insts) - dfa, err := dfaBuilder.build() - if err != nil { - return nil, err - } - return &Regexp{ - orig: expr, - dfa: dfa, - }, nil -} - -// Start returns the start state of this automaton. -func (r *Regexp) Start() int { - return 1 -} - -// IsMatch returns if the specified state is a matching state. -func (r *Regexp) IsMatch(s int) bool { - if s < len(r.dfa.states) { - return r.dfa.states[s].match - } - return false -} - -// CanMatch returns if the specified state can ever transition to a matching -// state. -func (r *Regexp) CanMatch(s int) bool { - if s < len(r.dfa.states) && s > 0 { - return true - } - return false -} - -// WillAlwaysMatch returns if the specified state will always end in a -// matching state. -func (r *Regexp) WillAlwaysMatch(int) bool { - return false -} - -// Accept returns the new state, resulting from the transition byte b -// when currently in the state s. -func (r *Regexp) Accept(s int, b byte) int { - if s < len(r.dfa.states) { - return r.dfa.states[s].next[b] - } - return 0 -} diff --git a/vendor/github.com/couchbase/vellum/regexp/sparse.go b/vendor/github.com/couchbase/vellum/regexp/sparse.go deleted file mode 100644 index 7afbfce..0000000 --- a/vendor/github.com/couchbase/vellum/regexp/sparse.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package regexp - -type sparseSet struct { - dense []uint - sparse []uint - size uint -} - -func newSparseSet(size uint) *sparseSet { - return &sparseSet{ - dense: make([]uint, size), - sparse: make([]uint, size), - size: 0, - } -} - -func (s *sparseSet) Len() int { - return int(s.size) -} - -func (s *sparseSet) Add(ip uint) uint { - i := s.size - s.dense[i] = ip - s.sparse[ip] = i - s.size++ - return i -} - -func (s *sparseSet) Get(i uint) uint { - return s.dense[i] -} - -func (s *sparseSet) Contains(ip uint) bool { - i := s.sparse[ip] - return i < s.size && s.dense[i] == ip -} - -func (s *sparseSet) Clear() { - s.size = 0 -} diff --git a/vendor/github.com/couchbase/vellum/registry.go b/vendor/github.com/couchbase/vellum/registry.go deleted file mode 100644 index f5b9b4d..0000000 --- a/vendor/github.com/couchbase/vellum/registry.go +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package vellum - -type registryCell struct { - addr int - node *builderNode -} - -type registry struct { - builderNodePool *builderNodePool - table []registryCell - tableSize uint - mruSize uint -} - -func newRegistry(p *builderNodePool, tableSize, mruSize int) *registry { - nsize := tableSize * mruSize - rv := ®istry{ - builderNodePool: p, - table: make([]registryCell, nsize), - tableSize: uint(tableSize), - mruSize: uint(mruSize), - } - return rv -} - -func (r *registry) Reset() { - var empty registryCell - for i := range r.table { - r.builderNodePool.Put(r.table[i].node) - r.table[i] = empty - } -} - -func (r *registry) entry(node *builderNode) (bool, int, *registryCell) { - if len(r.table) == 0 { - return false, 0, nil - } - bucket := r.hash(node) - start := r.mruSize * uint(bucket) - end := start + r.mruSize - rc := registryCache(r.table[start:end]) - return rc.entry(node, r.builderNodePool) -} - -const fnvPrime = 1099511628211 - -func (r *registry) hash(b *builderNode) int { - var final uint64 - if b.final { - final = 1 - } - - var h uint64 = 14695981039346656037 - h = (h ^ final) * fnvPrime - h = (h ^ b.finalOutput) * fnvPrime - for _, t := range b.trans { - h = (h ^ uint64(t.in)) * fnvPrime - h = (h ^ t.out) * fnvPrime - h = (h ^ uint64(t.addr)) * fnvPrime - } - return int(h % uint64(r.tableSize)) -} - -type registryCache []registryCell - -func (r registryCache) entry(node *builderNode, pool *builderNodePool) (bool, int, *registryCell) { - if len(r) == 1 { - if r[0].node != nil && r[0].node.equiv(node) { - return true, r[0].addr, nil - } - pool.Put(r[0].node) - r[0].node = node - return false, 0, &r[0] - } - for i := range r { - if r[i].node != nil && r[i].node.equiv(node) { - addr := r[i].addr - r.promote(i) - return true, addr, nil - } - } - // no match - last := len(r) - 1 - pool.Put(r[last].node) - r[last].node = node // discard LRU - r.promote(last) - return false, 0, &r[0] - -} - -func (r registryCache) promote(i int) { - for i > 0 { - r.swap(i-1, i) - i-- - } -} - -func (r registryCache) swap(i, j int) { - r[i], r[j] = r[j], r[i] -} diff --git a/vendor/github.com/couchbase/vellum/transducer.go b/vendor/github.com/couchbase/vellum/transducer.go deleted file mode 100644 index 753c422..0000000 --- a/vendor/github.com/couchbase/vellum/transducer.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package vellum - -// Transducer represents the general contract of a byte-based finite transducer -type Transducer interface { - - // all transducers are also automatons - Automaton - - // IsMatchWithValue returns true if and only if the state is a match - // additionally it returns a states final value (if any) - IsMatchWithVal(int) (bool, uint64) - - // Accept returns the next state given the input to the specified state - // additionally it returns the value associated with the transition - AcceptWithVal(int, byte) (int, uint64) -} - -// TransducerGet implements an generic Get() method which works -// on any implementation of Transducer -// The caller MUST check the boolean return value for a match. -// Zero is a valid value regardless of match status, -// and if it is NOT a match, the value collected so far is returned. -func TransducerGet(t Transducer, k []byte) (bool, uint64) { - var total uint64 - i := 0 - curr := t.Start() - for t.CanMatch(curr) && i < len(k) { - var transVal uint64 - curr, transVal = t.AcceptWithVal(curr, k[i]) - if curr == noneAddr { - break - } - total += transVal - i++ - } - if i != len(k) { - return false, total - } - match, finalVal := t.IsMatchWithVal(curr) - return match, total + finalVal -} diff --git a/vendor/github.com/couchbase/vellum/utf8/utf8.go b/vendor/github.com/couchbase/vellum/utf8/utf8.go deleted file mode 100644 index 54e23b9..0000000 --- a/vendor/github.com/couchbase/vellum/utf8/utf8.go +++ /dev/null @@ -1,268 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package utf8 - -import ( - "fmt" - "unicode/utf8" -) - -// Sequences is a collection of Sequence -type Sequences []Sequence - -// NewSequences constructs a collection of Sequence which describe the -// byte ranges covered between the start and end runes. -func NewSequences(start, end rune) (Sequences, error) { - rv, _, err := NewSequencesPrealloc(start, end, nil, nil, nil, nil) - return rv, err -} - -func NewSequencesPrealloc(start, end rune, - preallocSequences Sequences, - preallocRangeStack RangeStack, - preallocStartBytes, preallocEndBytes []byte) (Sequences, RangeStack, error) { - rv := preallocSequences[:0] - - startBytes := preallocStartBytes - if cap(startBytes) < utf8.UTFMax { - startBytes = make([]byte, utf8.UTFMax) - } - startBytes = startBytes[:utf8.UTFMax] - - endBytes := preallocEndBytes - if cap(endBytes) < utf8.UTFMax { - endBytes = make([]byte, utf8.UTFMax) - } - endBytes = endBytes[:utf8.UTFMax] - - rangeStack := preallocRangeStack[:0] - rangeStack = rangeStack.Push(scalarRange{start, end}) - - rangeStack, r := rangeStack.Pop() -TOP: - for r != nilScalarRange { - INNER: - for { - r1, r2 := r.split() - if r1 != nilScalarRange { - rangeStack = rangeStack.Push(scalarRange{r2.start, r2.end}) - r.start = r1.start - r.end = r1.end - continue INNER - } - if !r.valid() { - rangeStack, r = rangeStack.Pop() - continue TOP - } - for i := 1; i < utf8.UTFMax; i++ { - max := maxScalarValue(i) - if r.start <= max && max < r.end { - rangeStack = rangeStack.Push(scalarRange{max + 1, r.end}) - r.end = max - continue INNER - } - } - asciiRange := r.ascii() - if asciiRange != nilRange { - rv = append(rv, Sequence{ - asciiRange, - }) - rangeStack, r = rangeStack.Pop() - continue TOP - } - for i := uint(1); i < utf8.UTFMax; i++ { - m := rune((1 << (6 * i)) - 1) - if (r.start & ^m) != (r.end & ^m) { - if (r.start & m) != 0 { - rangeStack = rangeStack.Push(scalarRange{(r.start | m) + 1, r.end}) - r.end = r.start | m - continue INNER - } - if (r.end & m) != m { - rangeStack = rangeStack.Push(scalarRange{r.end & ^m, r.end}) - r.end = (r.end & ^m) - 1 - continue INNER - } - } - } - n, m := r.encode(startBytes, endBytes) - seq, err := SequenceFromEncodedRange(startBytes[0:n], endBytes[0:m]) - if err != nil { - return nil, nil, err - } - rv = append(rv, seq) - rangeStack, r = rangeStack.Pop() - continue TOP - } - } - - return rv, rangeStack, nil -} - -// Sequence is a collection of Range -type Sequence []Range - -// SequenceFromEncodedRange creates sequence from the encoded bytes -func SequenceFromEncodedRange(start, end []byte) (Sequence, error) { - if len(start) != len(end) { - return nil, fmt.Errorf("byte slices must be the same length") - } - switch len(start) { - case 2: - return Sequence{ - Range{start[0], end[0]}, - Range{start[1], end[1]}, - }, nil - case 3: - return Sequence{ - Range{start[0], end[0]}, - Range{start[1], end[1]}, - Range{start[2], end[2]}, - }, nil - case 4: - return Sequence{ - Range{start[0], end[0]}, - Range{start[1], end[1]}, - Range{start[2], end[2]}, - Range{start[3], end[3]}, - }, nil - } - - return nil, fmt.Errorf("invalid encoded byte length") -} - -// Matches checks to see if the provided byte slice matches the Sequence -func (u Sequence) Matches(bytes []byte) bool { - if len(bytes) < len(u) { - return false - } - for i := 0; i < len(u); i++ { - if !u[i].matches(bytes[i]) { - return false - } - } - return true -} - -func (u Sequence) String() string { - switch len(u) { - case 1: - return fmt.Sprintf("%v", u[0]) - case 2: - return fmt.Sprintf("%v%v", u[0], u[1]) - case 3: - return fmt.Sprintf("%v%v%v", u[0], u[1], u[2]) - case 4: - return fmt.Sprintf("%v%v%v%v", u[0], u[1], u[2], u[3]) - default: - return fmt.Sprintf("invalid utf8 sequence") - } -} - -// Range describes a single range of byte values -type Range struct { - Start byte - End byte -} - -var nilRange = Range{0xff, 0} - -func (u Range) matches(b byte) bool { - if u.Start <= b && b <= u.End { - return true - } - return false -} - -func (u Range) String() string { - if u.Start == u.End { - return fmt.Sprintf("[%X]", u.Start) - } - return fmt.Sprintf("[%X-%X]", u.Start, u.End) -} - -type scalarRange struct { - start rune - end rune -} - -var nilScalarRange = scalarRange{0xffff, 0} - -func (s *scalarRange) String() string { - return fmt.Sprintf("ScalarRange(%d,%d)", s.start, s.end) -} - -// split this scalar range if it overlaps with a surrogate codepoint -func (s *scalarRange) split() (scalarRange, scalarRange) { - if s.start < 0xe000 && s.end > 0xd7ff { - return scalarRange{ - start: s.start, - end: 0xd7ff, - }, - scalarRange{ - start: 0xe000, - end: s.end, - } - } - return nilScalarRange, nilScalarRange -} - -func (s *scalarRange) valid() bool { - return s.start <= s.end -} - -func (s *scalarRange) ascii() Range { - if s.valid() && s.end <= 0x7f { - return Range{ - Start: byte(s.start), - End: byte(s.end), - } - } - return nilRange -} - -// start and end MUST have capacity for utf8.UTFMax bytes -func (s *scalarRange) encode(start, end []byte) (int, int) { - n := utf8.EncodeRune(start, s.start) - m := utf8.EncodeRune(end, s.end) - return n, m -} - -type RangeStack []scalarRange - -func (s RangeStack) Push(v scalarRange) RangeStack { - return append(s, v) -} - -func (s RangeStack) Pop() (RangeStack, scalarRange) { - l := len(s) - if l < 1 { - return s, nilScalarRange - } - return s[:l-1], s[l-1] -} - -func maxScalarValue(nbytes int) rune { - switch nbytes { - case 1: - return 0x007f - case 2: - return 0x07FF - case 3: - return 0xFFFF - default: - return 0x10FFFF - } -} diff --git a/vendor/github.com/couchbase/vellum/vellum.go b/vendor/github.com/couchbase/vellum/vellum.go deleted file mode 100644 index b2537b3..0000000 --- a/vendor/github.com/couchbase/vellum/vellum.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/* -Package vellum is a library for building, serializing and executing an FST (finite -state transducer). - -There are two distinct phases, building an FST and using it. - -When building an FST, you insert keys ([]byte) and their associated value -(uint64). Insert operations MUST be done in lexicographic order. While -building the FST, data is streamed to an underlying Writer. At the conclusion -of building, you MUST call Close() on the builder. - -After completion of the build phase, you can either Open() the FST if you -serialized it to disk. Alternatively, if you already have the bytes in -memory, you can use Load(). By default, Open() will use mmap to avoid loading -the entire file into memory. - -Once the FST is ready, you can use the Contains() method to see if a keys is -in the FST. You can use the Get() method to see if a key is in the FST and -retrieve it's associated value. And, you can use the Iterator method to -enumerate key/value pairs within a specified range. - -*/ -package vellum - -import ( - "errors" - "io" -) - -// ErrOutOfOrder is returned when values are not inserted in -// lexicographic order. -var ErrOutOfOrder = errors.New("values not inserted in lexicographic order") - -// ErrIteratorDone is returned by Iterator/Next/Seek methods when the -// Current() value pointed to by the iterator is greater than the last -// key in this FST, or outside the configured startKeyInclusive/endKeyExclusive -// range of the Iterator. -var ErrIteratorDone = errors.New("iterator-done") - -// BuilderOpts is a structure to let advanced users customize the behavior -// of the builder and some aspects of the generated FST. -type BuilderOpts struct { - Encoder int - RegistryTableSize int - RegistryMRUSize int -} - -// New returns a new Builder which will stream out the -// underlying representation to the provided Writer as the set is built. -func New(w io.Writer, opts *BuilderOpts) (*Builder, error) { - return newBuilder(w, opts) -} - -// Open loads the FST stored in the provided path -func Open(path string) (*FST, error) { - return open(path) -} - -// Load will return the FST represented by the provided byte slice. -func Load(data []byte) (*FST, error) { - return new(data, nil) -} - -// Merge will iterate through the provided Iterators, merge duplicate keys -// with the provided MergeFunc, and build a new FST to the provided Writer. -func Merge(w io.Writer, opts *BuilderOpts, itrs []Iterator, f MergeFunc) error { - builder, err := New(w, opts) - if err != nil { - return err - } - - itr, err := NewMergeIterator(itrs, f) - for err == nil { - k, v := itr.Current() - err = builder.Insert(k, v) - if err != nil { - return err - } - err = itr.Next() - } - - if err != nil && err != ErrIteratorDone { - return err - } - - err = itr.Close() - if err != nil { - return err - } - - err = builder.Close() - if err != nil { - return err - } - - return nil -} diff --git a/vendor/github.com/couchbase/vellum/vellum_mmap.go b/vendor/github.com/couchbase/vellum/vellum_mmap.go deleted file mode 100644 index 81ea165..0000000 --- a/vendor/github.com/couchbase/vellum/vellum_mmap.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build !nommap - -package vellum - -import ( - "os" - - mmap "github.com/blevesearch/mmap-go" -) - -type mmapWrapper struct { - f *os.File - mm mmap.MMap -} - -func (m *mmapWrapper) Close() (err error) { - if m.mm != nil { - err = m.mm.Unmap() - } - // try to close file even if unmap failed - if m.f != nil { - err2 := m.f.Close() - if err == nil { - // try to return first error - err = err2 - } - } - return -} - -func open(path string) (*FST, error) { - f, err := os.Open(path) - if err != nil { - return nil, err - } - mm, err := mmap.Map(f, mmap.RDONLY, 0) - if err != nil { - // mmap failed, try to close the file - _ = f.Close() - return nil, err - } - return new(mm, &mmapWrapper{ - f: f, - mm: mm, - }) -} diff --git a/vendor/github.com/couchbase/vellum/vellum_nommap.go b/vendor/github.com/couchbase/vellum/vellum_nommap.go deleted file mode 100644 index e985272..0000000 --- a/vendor/github.com/couchbase/vellum/vellum_nommap.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build nommap - -package vellum - -import "io/ioutil" - -func open(path string) (*FST, error) { - data, err := ioutil.ReadFile(string) - if err != nil { - return nil, err - } - return new(data, nil) -} diff --git a/vendor/github.com/couchbase/vellum/writer.go b/vendor/github.com/couchbase/vellum/writer.go deleted file mode 100644 index d655d47..0000000 --- a/vendor/github.com/couchbase/vellum/writer.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright (c) 2017 Couchbase, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package vellum - -import ( - "bufio" - "io" -) - -// A writer is a buffered writer used by vellum. It counts how many bytes have -// been written and has some convenience methods used for encoding the data. -type writer struct { - w *bufio.Writer - counter int -} - -func newWriter(w io.Writer) *writer { - return &writer{ - w: bufio.NewWriter(w), - } -} - -func (w *writer) Reset(newWriter io.Writer) { - w.w.Reset(newWriter) - w.counter = 0 -} - -func (w *writer) WriteByte(c byte) error { - err := w.w.WriteByte(c) - if err != nil { - return err - } - w.counter++ - return nil -} - -func (w *writer) Write(p []byte) (int, error) { - n, err := w.w.Write(p) - w.counter += n - return n, err -} - -func (w *writer) Flush() error { - return w.w.Flush() -} - -func (w *writer) WritePackedUintIn(v uint64, n int) error { - for shift := uint(0); shift < uint(n*8); shift += 8 { - err := w.WriteByte(byte(v >> shift)) - if err != nil { - return err - } - } - - return nil -} - -func (w *writer) WritePackedUint(v uint64) error { - n := packedSize(v) - return w.WritePackedUintIn(v, n) -} - -func packedSize(n uint64) int { - if n < 1<<8 { - return 1 - } else if n < 1<<16 { - return 2 - } else if n < 1<<24 { - return 3 - } else if n < 1<<32 { - return 4 - } else if n < 1<<40 { - return 5 - } else if n < 1<<48 { - return 6 - } else if n < 1<<56 { - return 7 - } - return 8 -} diff --git a/vendor/github.com/cpuguy83/go-md2man/v2/md2man/debug.go b/vendor/github.com/cpuguy83/go-md2man/v2/md2man/debug.go deleted file mode 100644 index 0ec4b12..0000000 --- a/vendor/github.com/cpuguy83/go-md2man/v2/md2man/debug.go +++ /dev/null @@ -1,62 +0,0 @@ -package md2man - -import ( - "fmt" - "io" - "os" - "strings" - - "github.com/russross/blackfriday/v2" -) - -func fmtListFlags(flags blackfriday.ListType) string { - knownFlags := []struct { - name string - flag blackfriday.ListType - }{ - {"ListTypeOrdered", blackfriday.ListTypeOrdered}, - {"ListTypeDefinition", blackfriday.ListTypeDefinition}, - {"ListTypeTerm", blackfriday.ListTypeTerm}, - {"ListItemContainsBlock", blackfriday.ListItemContainsBlock}, - {"ListItemBeginningOfList", blackfriday.ListItemBeginningOfList}, - {"ListItemEndOfList", blackfriday.ListItemEndOfList}, - } - - var f []string - for _, kf := range knownFlags { - if flags&kf.flag != 0 { - f = append(f, kf.name) - flags &^= kf.flag - } - } - if flags != 0 { - f = append(f, fmt.Sprintf("Unknown(%#x)", flags)) - } - return strings.Join(f, "|") -} - -type debugDecorator struct { - blackfriday.Renderer -} - -func depth(node *blackfriday.Node) int { - d := 0 - for n := node.Parent; n != nil; n = n.Parent { - d++ - } - return d -} - -func (d *debugDecorator) RenderNode(w io.Writer, node *blackfriday.Node, entering bool) blackfriday.WalkStatus { - fmt.Fprintf(os.Stderr, "%s%s %v %v\n", - strings.Repeat(" ", depth(node)), - map[bool]string{true: "+", false: "-"}[entering], - node, - fmtListFlags(node.ListFlags)) - var b strings.Builder - status := d.Renderer.RenderNode(io.MultiWriter(&b, w), node, entering) - if b.Len() > 0 { - fmt.Fprintf(os.Stderr, ">> %q\n", b.String()) - } - return status -} diff --git a/vendor/github.com/cpuguy83/go-md2man/v2/md2man/md2man.go b/vendor/github.com/cpuguy83/go-md2man/v2/md2man/md2man.go deleted file mode 100644 index 5673f5c..0000000 --- a/vendor/github.com/cpuguy83/go-md2man/v2/md2man/md2man.go +++ /dev/null @@ -1,24 +0,0 @@ -// Package md2man aims in converting markdown into roff (man pages). -package md2man - -import ( - "os" - "strconv" - - "github.com/russross/blackfriday/v2" -) - -// Render converts a markdown document into a roff formatted document. -func Render(doc []byte) []byte { - renderer := NewRoffRenderer() - var r blackfriday.Renderer = renderer - if v, _ := strconv.ParseBool(os.Getenv("MD2MAN_DEBUG")); v { - r = &debugDecorator{Renderer: r} - } - - return blackfriday.Run(doc, - []blackfriday.Option{ - blackfriday.WithRenderer(r), - blackfriday.WithExtensions(renderer.GetExtensions()), - }...) -} diff --git a/vendor/github.com/cpuguy83/go-md2man/v2/md2man/roff.go b/vendor/github.com/cpuguy83/go-md2man/v2/md2man/roff.go deleted file mode 100644 index 4f1070f..0000000 --- a/vendor/github.com/cpuguy83/go-md2man/v2/md2man/roff.go +++ /dev/null @@ -1,416 +0,0 @@ -package md2man - -import ( - "bufio" - "bytes" - "fmt" - "io" - "os" - "strings" - - "github.com/russross/blackfriday/v2" -) - -// roffRenderer implements the blackfriday.Renderer interface for creating -// roff format (manpages) from markdown text -type roffRenderer struct { - listCounters []int - firstHeader bool - listDepth int -} - -const ( - titleHeader = ".TH " - topLevelHeader = "\n\n.SH " - secondLevelHdr = "\n.SH " - otherHeader = "\n.SS " - crTag = "\n" - emphTag = "\\fI" - emphCloseTag = "\\fP" - strongTag = "\\fB" - strongCloseTag = "\\fP" - breakTag = "\n.br\n" - paraTag = "\n.PP\n" - hruleTag = "\n.ti 0\n\\l'\\n(.lu'\n" - linkTag = "\n\\[la]" - linkCloseTag = "\\[ra]" - codespanTag = "\\fB" - codespanCloseTag = "\\fR" - codeTag = "\n.EX\n" - codeCloseTag = ".EE\n" // Do not prepend a newline character since code blocks, by definition, include a newline already (or at least as how blackfriday gives us on). - quoteTag = "\n.PP\n.RS\n" - quoteCloseTag = "\n.RE\n" - listTag = "\n.RS\n" - listCloseTag = ".RE\n" - dtTag = "\n.TP\n" - dd2Tag = "\n" - tableStart = "\n.TS\nallbox;\n" - tableEnd = ".TE\n" - tableCellStart = "T{\n" - tableCellEnd = "\nT}" - tablePreprocessor = `'\" t` -) - -// NewRoffRenderer creates a new blackfriday Renderer for generating roff documents -// from markdown -func NewRoffRenderer() *roffRenderer { - return &roffRenderer{} -} - -// GetExtensions returns the list of extensions used by this renderer implementation -func (*roffRenderer) GetExtensions() blackfriday.Extensions { - return blackfriday.NoIntraEmphasis | - blackfriday.Tables | - blackfriday.FencedCode | - blackfriday.SpaceHeadings | - blackfriday.Footnotes | - blackfriday.Titleblock | - blackfriday.DefinitionLists -} - -// RenderHeader handles outputting the header at document start -func (r *roffRenderer) RenderHeader(w io.Writer, ast *blackfriday.Node) { - // We need to walk the tree to check if there are any tables. - // If there are, we need to enable the roff table preprocessor. - ast.Walk(func(node *blackfriday.Node, entering bool) blackfriday.WalkStatus { - if node.Type == blackfriday.Table { - out(w, tablePreprocessor+"\n") - return blackfriday.Terminate - } - return blackfriday.GoToNext - }) - - // disable hyphenation - out(w, ".nh\n") -} - -// RenderFooter handles outputting the footer at the document end; the roff -// renderer has no footer information -func (r *roffRenderer) RenderFooter(w io.Writer, ast *blackfriday.Node) { -} - -// RenderNode is called for each node in a markdown document; based on the node -// type the equivalent roff output is sent to the writer -func (r *roffRenderer) RenderNode(w io.Writer, node *blackfriday.Node, entering bool) blackfriday.WalkStatus { - walkAction := blackfriday.GoToNext - - switch node.Type { - case blackfriday.Text: - // Special case: format the NAME section as required for proper whatis parsing. - // Refer to the lexgrog(1) and groff_man(7) manual pages for details. - if node.Parent != nil && - node.Parent.Type == blackfriday.Paragraph && - node.Parent.Prev != nil && - node.Parent.Prev.Type == blackfriday.Heading && - node.Parent.Prev.FirstChild != nil && - bytes.EqualFold(node.Parent.Prev.FirstChild.Literal, []byte("NAME")) { - before, after, found := bytesCut(node.Literal, []byte(" - ")) - escapeSpecialChars(w, before) - if found { - out(w, ` \- `) - escapeSpecialChars(w, after) - } - } else { - escapeSpecialChars(w, node.Literal) - } - case blackfriday.Softbreak: - out(w, crTag) - case blackfriday.Hardbreak: - out(w, breakTag) - case blackfriday.Emph: - if entering { - out(w, emphTag) - } else { - out(w, emphCloseTag) - } - case blackfriday.Strong: - if entering { - out(w, strongTag) - } else { - out(w, strongCloseTag) - } - case blackfriday.Link: - // Don't render the link text for automatic links, because this - // will only duplicate the URL in the roff output. - // See https://daringfireball.net/projects/markdown/syntax#autolink - if !bytes.Equal(node.LinkData.Destination, node.FirstChild.Literal) { - out(w, string(node.FirstChild.Literal)) - } - // Hyphens in a link must be escaped to avoid word-wrap in the rendered man page. - escapedLink := strings.ReplaceAll(string(node.LinkData.Destination), "-", "\\-") - out(w, linkTag+escapedLink+linkCloseTag) - walkAction = blackfriday.SkipChildren - case blackfriday.Image: - // ignore images - walkAction = blackfriday.SkipChildren - case blackfriday.Code: - out(w, codespanTag) - escapeSpecialChars(w, node.Literal) - out(w, codespanCloseTag) - case blackfriday.Document: - break - case blackfriday.Paragraph: - if entering { - if r.listDepth > 0 { - // roff .PP markers break lists - if node.Prev != nil { // continued paragraph - if node.Prev.Type == blackfriday.List && node.Prev.ListFlags&blackfriday.ListTypeDefinition == 0 { - out(w, ".IP\n") - } else { - out(w, crTag) - } - } - } else if node.Prev != nil && node.Prev.Type == blackfriday.Heading { - out(w, crTag) - } else { - out(w, paraTag) - } - } else { - if node.Next == nil || node.Next.Type != blackfriday.List { - out(w, crTag) - } - } - case blackfriday.BlockQuote: - if entering { - out(w, quoteTag) - } else { - out(w, quoteCloseTag) - } - case blackfriday.Heading: - r.handleHeading(w, node, entering) - case blackfriday.HorizontalRule: - out(w, hruleTag) - case blackfriday.List: - r.handleList(w, node, entering) - case blackfriday.Item: - r.handleItem(w, node, entering) - case blackfriday.CodeBlock: - out(w, codeTag) - escapeSpecialChars(w, node.Literal) - out(w, codeCloseTag) - case blackfriday.Table: - r.handleTable(w, node, entering) - case blackfriday.TableHead: - case blackfriday.TableBody: - case blackfriday.TableRow: - // no action as cell entries do all the nroff formatting - return blackfriday.GoToNext - case blackfriday.TableCell: - r.handleTableCell(w, node, entering) - case blackfriday.HTMLSpan: - // ignore other HTML tags - case blackfriday.HTMLBlock: - if bytes.HasPrefix(node.Literal, []byte("|" - processingInstruction = "[<][?].*?[?][>]" - singleQuotedValue = "'[^']*'" - tagName = "[A-Za-z][A-Za-z0-9-]*" - unquotedValue = "[^\"'=<>`\\x00-\\x20]+" -) - -// HTMLRendererParameters is a collection of supplementary parameters tweaking -// the behavior of various parts of HTML renderer. -type HTMLRendererParameters struct { - // Prepend this text to each relative URL. - AbsolutePrefix string - // Add this text to each footnote anchor, to ensure uniqueness. - FootnoteAnchorPrefix string - // Show this text inside the tag for a footnote return link, if the - // HTML_FOOTNOTE_RETURN_LINKS flag is enabled. If blank, the string - // [return] is used. - FootnoteReturnLinkContents string - // If set, add this text to the front of each Heading ID, to ensure - // uniqueness. - HeadingIDPrefix string - // If set, add this text to the back of each Heading ID, to ensure uniqueness. - HeadingIDSuffix string - // Increase heading levels: if the offset is 1, becomes
etc. - // Negative offset is also valid. - // Resulting levels are clipped between 1 and 6. - HeadingLevelOffset int - - Title string // Document title (used if CompletePage is set) - CSS string // Optional CSS file URL (used if CompletePage is set) - Icon string // Optional icon file URL (used if CompletePage is set) - - Flags HTMLFlags // Flags allow customizing this renderer's behavior -} - -// HTMLRenderer is a type that implements the Renderer interface for HTML output. -// -// Do not create this directly, instead use the NewHTMLRenderer function. -type HTMLRenderer struct { - HTMLRendererParameters - - closeTag string // how to end singleton tags: either " />" or ">" - - // Track heading IDs to prevent ID collision in a single generation. - headingIDs map[string]int - - lastOutputLen int - disableTags int - - sr *SPRenderer -} - -const ( - xhtmlClose = " />" - htmlClose = ">" -) - -// NewHTMLRenderer creates and configures an HTMLRenderer object, which -// satisfies the Renderer interface. -func NewHTMLRenderer(params HTMLRendererParameters) *HTMLRenderer { - // configure the rendering engine - closeTag := htmlClose - if params.Flags&UseXHTML != 0 { - closeTag = xhtmlClose - } - - if params.FootnoteReturnLinkContents == "" { - // U+FE0E is VARIATION SELECTOR-15. - // It suppresses automatic emoji presentation of the preceding - // U+21A9 LEFTWARDS ARROW WITH HOOK on iOS and iPadOS. - params.FootnoteReturnLinkContents = "↩\ufe0e" - } - - return &HTMLRenderer{ - HTMLRendererParameters: params, - - closeTag: closeTag, - headingIDs: make(map[string]int), - - sr: NewSmartypantsRenderer(params.Flags), - } -} - -func isHTMLTag(tag []byte, tagname string) bool { - found, _ := findHTMLTagPos(tag, tagname) - return found -} - -// Look for a character, but ignore it when it's in any kind of quotes, it -// might be JavaScript -func skipUntilCharIgnoreQuotes(html []byte, start int, char byte) int { - inSingleQuote := false - inDoubleQuote := false - inGraveQuote := false - i := start - for i < len(html) { - switch { - case html[i] == char && !inSingleQuote && !inDoubleQuote && !inGraveQuote: - return i - case html[i] == '\'': - inSingleQuote = !inSingleQuote - case html[i] == '"': - inDoubleQuote = !inDoubleQuote - case html[i] == '`': - inGraveQuote = !inGraveQuote - } - i++ - } - return start -} - -func findHTMLTagPos(tag []byte, tagname string) (bool, int) { - i := 0 - if i < len(tag) && tag[0] != '<' { - return false, -1 - } - i++ - i = skipSpace(tag, i) - - if i < len(tag) && tag[i] == '/' { - i++ - } - - i = skipSpace(tag, i) - j := 0 - for ; i < len(tag); i, j = i+1, j+1 { - if j >= len(tagname) { - break - } - - if strings.ToLower(string(tag[i]))[0] != tagname[j] { - return false, -1 - } - } - - if i == len(tag) { - return false, -1 - } - - rightAngle := skipUntilCharIgnoreQuotes(tag, i, '>') - if rightAngle >= i { - return true, rightAngle - } - - return false, -1 -} - -func skipSpace(tag []byte, i int) int { - for i < len(tag) && isspace(tag[i]) { - i++ - } - return i -} - -func isRelativeLink(link []byte) (yes bool) { - // a tag begin with '#' - if link[0] == '#' { - return true - } - - // link begin with '/' but not '//', the second maybe a protocol relative link - if len(link) >= 2 && link[0] == '/' && link[1] != '/' { - return true - } - - // only the root '/' - if len(link) == 1 && link[0] == '/' { - return true - } - - // current directory : begin with "./" - if bytes.HasPrefix(link, []byte("./")) { - return true - } - - // parent directory : begin with "../" - if bytes.HasPrefix(link, []byte("../")) { - return true - } - - return false -} - -func (r *HTMLRenderer) ensureUniqueHeadingID(id string) string { - for count, found := r.headingIDs[id]; found; count, found = r.headingIDs[id] { - tmp := fmt.Sprintf("%s-%d", id, count+1) - - if _, tmpFound := r.headingIDs[tmp]; !tmpFound { - r.headingIDs[id] = count + 1 - id = tmp - } else { - id = id + "-1" - } - } - - if _, found := r.headingIDs[id]; !found { - r.headingIDs[id] = 0 - } - - return id -} - -func (r *HTMLRenderer) addAbsPrefix(link []byte) []byte { - if r.AbsolutePrefix != "" && isRelativeLink(link) && link[0] != '.' { - newDest := r.AbsolutePrefix - if link[0] != '/' { - newDest += "/" - } - newDest += string(link) - return []byte(newDest) - } - return link -} - -func appendLinkAttrs(attrs []string, flags HTMLFlags, link []byte) []string { - if isRelativeLink(link) { - return attrs - } - val := []string{} - if flags&NofollowLinks != 0 { - val = append(val, "nofollow") - } - if flags&NoreferrerLinks != 0 { - val = append(val, "noreferrer") - } - if flags&NoopenerLinks != 0 { - val = append(val, "noopener") - } - if flags&HrefTargetBlank != 0 { - attrs = append(attrs, "target=\"_blank\"") - } - if len(val) == 0 { - return attrs - } - attr := fmt.Sprintf("rel=%q", strings.Join(val, " ")) - return append(attrs, attr) -} - -func isMailto(link []byte) bool { - return bytes.HasPrefix(link, []byte("mailto:")) -} - -func needSkipLink(flags HTMLFlags, dest []byte) bool { - if flags&SkipLinks != 0 { - return true - } - return flags&Safelink != 0 && !isSafeLink(dest) && !isMailto(dest) -} - -func isSmartypantable(node *Node) bool { - pt := node.Parent.Type - return pt != Link && pt != CodeBlock && pt != Code -} - -func appendLanguageAttr(attrs []string, info []byte) []string { - if len(info) == 0 { - return attrs - } - endOfLang := bytes.IndexAny(info, "\t ") - if endOfLang < 0 { - endOfLang = len(info) - } - return append(attrs, fmt.Sprintf("class=\"language-%s\"", info[:endOfLang])) -} - -func (r *HTMLRenderer) tag(w io.Writer, name []byte, attrs []string) { - w.Write(name) - if len(attrs) > 0 { - w.Write(spaceBytes) - w.Write([]byte(strings.Join(attrs, " "))) - } - w.Write(gtBytes) - r.lastOutputLen = 1 -} - -func footnoteRef(prefix string, node *Node) []byte { - urlFrag := prefix + string(slugify(node.Destination)) - anchor := fmt.Sprintf(`%d`, urlFrag, node.NoteID) - return []byte(fmt.Sprintf(`%s`, urlFrag, anchor)) -} - -func footnoteItem(prefix string, slug []byte) []byte { - return []byte(fmt.Sprintf(`
`, prefix, slug)) -} - -func footnoteReturnLink(prefix, returnLink string, slug []byte) []byte { - const format = ` %s` - return []byte(fmt.Sprintf(format, prefix, slug, returnLink)) -} - -func itemOpenCR(node *Node) bool { - if node.Prev == nil { - return false - } - ld := node.Parent.ListData - return !ld.Tight && ld.ListFlags&ListTypeDefinition == 0 -} - -func skipParagraphTags(node *Node) bool { - grandparent := node.Parent.Parent - if grandparent == nil || grandparent.Type != List { - return false - } - tightOrTerm := grandparent.Tight || node.Parent.ListFlags&ListTypeTerm != 0 - return grandparent.Type == List && tightOrTerm -} - -func cellAlignment(align CellAlignFlags) string { - switch align { - case TableAlignmentLeft: - return "left" - case TableAlignmentRight: - return "right" - case TableAlignmentCenter: - return "center" - default: - return "" - } -} - -func (r *HTMLRenderer) out(w io.Writer, text []byte) { - if r.disableTags > 0 { - w.Write(htmlTagRe.ReplaceAll(text, []byte{})) - } else { - w.Write(text) - } - r.lastOutputLen = len(text) -} - -func (r *HTMLRenderer) cr(w io.Writer) { - if r.lastOutputLen > 0 { - r.out(w, nlBytes) - } -} - -var ( - nlBytes = []byte{'\n'} - gtBytes = []byte{'>'} - spaceBytes = []byte{' '} -) - -var ( - brTag = []byte("
") - brXHTMLTag = []byte("
") - emTag = []byte("") - emCloseTag = []byte("") - strongTag = []byte("") - strongCloseTag = []byte("") - delTag = []byte("") - delCloseTag = []byte("") - ttTag = []byte("") - ttCloseTag = []byte("") - aTag = []byte("") - preTag = []byte("") - preCloseTag = []byte("") - codeTag = []byte("") - codeCloseTag = []byte("") - pTag = []byte("") - pCloseTag = []byte("
") - blockquoteTag = []byte("") - blockquoteCloseTag = []byte("") - hrTag = []byte("
") - hrXHTMLTag = []byte("
") - ulTag = []byte("") - ulCloseTag = []byte("
") - olTag = []byte("") - olCloseTag = []byte("
") - dlTag = []byte("") - dlCloseTag = []byte("
") - liTag = []byte("") - liCloseTag = []byte(" ") - ddTag = []byte("") - ddCloseTag = []byte(" ") - dtTag = []byte("") - dtCloseTag = []byte(" ") - tableTag = []byte("") - tableCloseTag = []byte("
") - tdTag = []byte("") - thTag = []byte(" ") - theadTag = []byte("") - theadCloseTag = []byte("") - tbodyTag = []byte(" ") - tbodyCloseTag = []byte("") - trTag = []byte("") - trCloseTag = []byte(" ") - h1Tag = []byte("") - h2Tag = []byte("
") - h3Tag = []byte("
") - h4Tag = []byte("
") - h5Tag = []byte("
") - h6Tag = []byte("
") - - footnotesDivBytes = []byte("\n
\n\n") - footnotesCloseDivBytes = []byte("\n\n") -) - -func headingTagsFromLevel(level int) ([]byte, []byte) { - if level <= 1 { - return h1Tag, h1CloseTag - } - switch level { - case 2: - return h2Tag, h2CloseTag - case 3: - return h3Tag, h3CloseTag - case 4: - return h4Tag, h4CloseTag - case 5: - return h5Tag, h5CloseTag - } - return h6Tag, h6CloseTag -} - -func (r *HTMLRenderer) outHRTag(w io.Writer) { - if r.Flags&UseXHTML == 0 { - r.out(w, hrTag) - } else { - r.out(w, hrXHTMLTag) - } -} - -// RenderNode is a default renderer of a single node of a syntax tree. For -// block nodes it will be called twice: first time with entering=true, second -// time with entering=false, so that it could know when it's working on an open -// tag and when on close. It writes the result to w. -// -// The return value is a way to tell the calling walker to adjust its walk -// pattern: e.g. it can terminate the traversal by returning Terminate. Or it -// can ask the walker to skip a subtree of this node by returning SkipChildren. -// The typical behavior is to return GoToNext, which asks for the usual -// traversal to the next node. -func (r *HTMLRenderer) RenderNode(w io.Writer, node *Node, entering bool) WalkStatus { - attrs := []string{} - switch node.Type { - case Text: - if r.Flags&Smartypants != 0 { - var tmp bytes.Buffer - escapeHTML(&tmp, node.Literal) - r.sr.Process(w, tmp.Bytes()) - } else { - if node.Parent.Type == Link { - escLink(w, node.Literal) - } else { - escapeHTML(w, node.Literal) - } - } - case Softbreak: - r.cr(w) - // TODO: make it configurable via out(renderer.softbreak) - case Hardbreak: - if r.Flags&UseXHTML == 0 { - r.out(w, brTag) - } else { - r.out(w, brXHTMLTag) - } - r.cr(w) - case Emph: - if entering { - r.out(w, emTag) - } else { - r.out(w, emCloseTag) - } - case Strong: - if entering { - r.out(w, strongTag) - } else { - r.out(w, strongCloseTag) - } - case Del: - if entering { - r.out(w, delTag) - } else { - r.out(w, delCloseTag) - } - case HTMLSpan: - if r.Flags&SkipHTML != 0 { - break - } - r.out(w, node.Literal) - case Link: - // mark it but don't link it if it is not a safe link: no smartypants - dest := node.LinkData.Destination - if needSkipLink(r.Flags, dest) { - if entering { - r.out(w, ttTag) - } else { - r.out(w, ttCloseTag) - } - } else { - if entering { - dest = r.addAbsPrefix(dest) - var hrefBuf bytes.Buffer - hrefBuf.WriteString("href=\"") - escLink(&hrefBuf, dest) - hrefBuf.WriteByte('"') - attrs = append(attrs, hrefBuf.String()) - if node.NoteID != 0 { - r.out(w, footnoteRef(r.FootnoteAnchorPrefix, node)) - break - } - attrs = appendLinkAttrs(attrs, r.Flags, dest) - if len(node.LinkData.Title) > 0 { - var titleBuff bytes.Buffer - titleBuff.WriteString("title=\"") - escapeHTML(&titleBuff, node.LinkData.Title) - titleBuff.WriteByte('"') - attrs = append(attrs, titleBuff.String()) - } - r.tag(w, aTag, attrs) - } else { - if node.NoteID != 0 { - break - } - r.out(w, aCloseTag) - } - } - case Image: - if r.Flags&SkipImages != 0 { - return SkipChildren - } - if entering { - dest := node.LinkData.Destination - dest = r.addAbsPrefix(dest) - if r.disableTags == 0 { - //if options.safe && potentiallyUnsafe(dest) { - //out(w, ``)) - } - } - case Code: - r.out(w, codeTag) - escapeAllHTML(w, node.Literal) - r.out(w, codeCloseTag) - case Document: - break - case Paragraph: - if skipParagraphTags(node) { - break - } - if entering { - // TODO: untangle this clusterfuck about when the newlines need - // to be added and when not. - if node.Prev != nil { - switch node.Prev.Type { - case HTMLBlock, List, Paragraph, Heading, CodeBlock, BlockQuote, HorizontalRule: - r.cr(w) - } - } - if node.Parent.Type == BlockQuote && node.Prev == nil { - r.cr(w) - } - r.out(w, pTag) - } else { - r.out(w, pCloseTag) - if !(node.Parent.Type == Item && node.Next == nil) { - r.cr(w) - } - } - case BlockQuote: - if entering { - r.cr(w) - r.out(w, blockquoteTag) - } else { - r.out(w, blockquoteCloseTag) - r.cr(w) - } - case HTMLBlock: - if r.Flags&SkipHTML != 0 { - break - } - r.cr(w) - r.out(w, node.Literal) - r.cr(w) - case Heading: - headingLevel := r.HTMLRendererParameters.HeadingLevelOffset + node.Level - openTag, closeTag := headingTagsFromLevel(headingLevel) - if entering { - if node.IsTitleblock { - attrs = append(attrs, `class="title"`) - } - if node.HeadingID != "" { - id := r.ensureUniqueHeadingID(node.HeadingID) - if r.HeadingIDPrefix != "" { - id = r.HeadingIDPrefix + id - } - if r.HeadingIDSuffix != "" { - id = id + r.HeadingIDSuffix - } - attrs = append(attrs, fmt.Sprintf(`id="%s"`, id)) - } - r.cr(w) - r.tag(w, openTag, attrs) - } else { - r.out(w, closeTag) - if !(node.Parent.Type == Item && node.Next == nil) { - r.cr(w) - } - } - case HorizontalRule: - r.cr(w) - r.outHRTag(w) - r.cr(w) - case List: - openTag := ulTag - closeTag := ulCloseTag - if node.ListFlags&ListTypeOrdered != 0 { - openTag = olTag - closeTag = olCloseTag - } - if node.ListFlags&ListTypeDefinition != 0 { - openTag = dlTag - closeTag = dlCloseTag - } - if entering { - if node.IsFootnotesList { - r.out(w, footnotesDivBytes) - r.outHRTag(w) - r.cr(w) - } - r.cr(w) - if node.Parent.Type == Item && node.Parent.Parent.Tight { - r.cr(w) - } - r.tag(w, openTag[:len(openTag)-1], attrs) - r.cr(w) - } else { - r.out(w, closeTag) - //cr(w) - //if node.parent.Type != Item { - // cr(w) - //} - if node.Parent.Type == Item && node.Next != nil { - r.cr(w) - } - if node.Parent.Type == Document || node.Parent.Type == BlockQuote { - r.cr(w) - } - if node.IsFootnotesList { - r.out(w, footnotesCloseDivBytes) - } - } - case Item: - openTag := liTag - closeTag := liCloseTag - if node.ListFlags&ListTypeDefinition != 0 { - openTag = ddTag - closeTag = ddCloseTag - } - if node.ListFlags&ListTypeTerm != 0 { - openTag = dtTag - closeTag = dtCloseTag - } - if entering { - if itemOpenCR(node) { - r.cr(w) - } - if node.ListData.RefLink != nil { - slug := slugify(node.ListData.RefLink) - r.out(w, footnoteItem(r.FootnoteAnchorPrefix, slug)) - break - } - r.out(w, openTag) - } else { - if node.ListData.RefLink != nil { - slug := slugify(node.ListData.RefLink) - if r.Flags&FootnoteReturnLinks != 0 { - r.out(w, footnoteReturnLink(r.FootnoteAnchorPrefix, r.FootnoteReturnLinkContents, slug)) - } - } - r.out(w, closeTag) - r.cr(w) - } - case CodeBlock: - attrs = appendLanguageAttr(attrs, node.Info) - r.cr(w) - r.out(w, preTag) - r.tag(w, codeTag[:len(codeTag)-1], attrs) - escapeAllHTML(w, node.Literal) - r.out(w, codeCloseTag) - r.out(w, preCloseTag) - if node.Parent.Type != Item { - r.cr(w) - } - case Table: - if entering { - r.cr(w) - r.out(w, tableTag) - } else { - r.out(w, tableCloseTag) - r.cr(w) - } - case TableCell: - openTag := tdTag - closeTag := tdCloseTag - if node.IsHeader { - openTag = thTag - closeTag = thCloseTag - } - if entering { - align := cellAlignment(node.Align) - if align != "" { - attrs = append(attrs, fmt.Sprintf(`align="%s"`, align)) - } - if node.Prev == nil { - r.cr(w) - } - r.tag(w, openTag, attrs) - } else { - r.out(w, closeTag) - r.cr(w) - } - case TableHead: - if entering { - r.cr(w) - r.out(w, theadTag) - } else { - r.out(w, theadCloseTag) - r.cr(w) - } - case TableBody: - if entering { - r.cr(w) - r.out(w, tbodyTag) - // XXX: this is to adhere to a rather silly test. Should fix test. - if node.FirstChild == nil { - r.cr(w) - } - } else { - r.out(w, tbodyCloseTag) - r.cr(w) - } - case TableRow: - if entering { - r.cr(w) - r.out(w, trTag) - } else { - r.out(w, trCloseTag) - r.cr(w) - } - default: - panic("Unknown node type " + node.Type.String()) - } - return GoToNext -} - -// RenderHeader writes HTML document preamble and TOC if requested. -func (r *HTMLRenderer) RenderHeader(w io.Writer, ast *Node) { - r.writeDocumentHeader(w) - if r.Flags&TOC != 0 { - r.writeTOC(w, ast) - } -} - -// RenderFooter writes HTML document footer. -func (r *HTMLRenderer) RenderFooter(w io.Writer, ast *Node) { - if r.Flags&CompletePage == 0 { - return - } - io.WriteString(w, "\n